有没有办法截取用户的Windows桌面?

我想在应用程序中为用户提供一个缩小的桌面屏幕截图

有没有办法截取当前用户的Windows桌面?

我正在用C#编写,但如果在另一种语言中有更好的解决scheme,我愿意接受。

为了澄清,我需要Windows桌面的屏幕截图 – 这只是壁纸和图标, 没有应用程序或任何重点。

您正在寻找Graphics.CopyFromScreen 。 创建一个正确大小的新位图,并传递要复制的区域的位图的图形对象屏幕坐标。

还有一篇文章描述如何以编程方式拍摄快照。

回应编辑 :我误解了你的意思是“桌面”。 如果你想拍摄桌面的照片,你必须:

  1. 首先使用Win32API最小化所有窗口 (发送MIN_ALL消息)
  2. 拍快照
  3. 然后撤消最小化全部(发送一个MIN_ALL_UNDO消息)。

更好的方法是不要打扰其他窗口,而是直接从桌面窗口复制图像。 User32中的GetDesktopWindow将返回一个桌面的句柄。 一旦你有窗口句柄,得到它的设备上下文,并复制图像到一个新的位图。

CodeProject上有一个关于如何从中复制图像的很好的例子 。 在“捕获窗口内容”部分中查找有关获取和创建设备上下文的示例代码。

我得到的印象是,你正在拍摄的实际桌面(墙纸和图标),而不是别的。

1)使用COM调用Shell32中的ToggleDesktop()
2)使用Graphics.CopyFromScreen复制当前的桌面区域
3)调用ToggleDesktop()恢复以前的桌面状态

编辑:是的,调用MinimizeAll()是好战的。

这是我一起鞭打的更新版本:

  /// <summary> /// Minimizes all running applications and captures desktop as image /// Note: Requires reference to "Microsoft Shell Controls and Automation" /// </summary> /// <returns>Image of desktop</returns> private Image CaptureDesktopImage() { //May want to play around with the delay. TimeSpan ToggleDesktopDelay = new TimeSpan(0, 0, 0, 0, 150); Shell32.ShellClass ShellReference = null; Bitmap WorkingImage = null; Graphics WorkingGraphics = null; Rectangle TargetArea = Screen.PrimaryScreen.WorkingArea; Image ReturnImage = null; try { ShellReference = new Shell32.ShellClass(); ShellReference.ToggleDesktop(); System.Threading.Thread.Sleep(ToggleDesktopDelay); WorkingImage = new Bitmap(TargetArea.Width, TargetArea.Height); WorkingGraphics = Graphics.FromImage(WorkingImage); WorkingGraphics.CopyFromScreen(TargetArea.X, TargetArea.X, 0, 0, TargetArea.Size); System.Threading.Thread.Sleep(ToggleDesktopDelay); ShellReference.ToggleDesktop(); ReturnImage = (Image)WorkingImage.Clone(); } catch { System.Diagnostics.Debugger.Break(); //... } finally { WorkingGraphics.Dispose(); WorkingImage.Dispose(); } return ReturnImage; } 

调整为多个监视器场景的味道(虽然听起来像这应该适用于您的应用程序很好)。

您可以通过p / invoke使用GetDesktopWindow ,然后获取设备上下文并获取快照。 这里有一个非常详细的教程。 这可能比扰乱现有的窗口更好。

所有以前的答案是完全错误的( 最小化应用程序是荒谬的
简单地使用SHW api: 一行代码(桌面位图被缓存,api只是将它抹到你的HDC上)

您可以在应用程序运行之前在Windows启动时捕获屏幕截图,或使用桌面切换使用其他桌面。 看看这里: http : //www.codeproject.com/Articles/7666/Desktop-Switching切换到其他桌面,拍照,记住你不需要显示它只是创建“DESKTOP”