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

时间:2009-05-19 03:47:41

标签: c# windows desktop screenshot

我想在我的应用程序中为用户提供桌面的缩小版截图。

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

我正在用C#写作,但如果有另一种语言的更好的解决方案,我会接受它。

为了澄清,我需要一个Windows桌面的截图 - 这只是壁纸和图标;没有应用程序或任何有重点的东西。

5 个答案:

答案 0 :(得分:16)

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

还有an article描述了如何以编程方式拍摄快照。

回复编辑:我误解了“桌面”的含义。如果你想拍摄桌面照片,你必须:

  1. Minimize all windows using the Win32API(先发送MIN_ALL条消息)
  2. 拍摄快照
  3. 然后撤消最小化全部(发送MIN_ALL_UNDO消息)。

  4. 更好的方法不会打扰其他窗口,而是直接从桌面窗口复制图像。 GetDesktopWindow in User32将返回桌面的句柄。获得窗口句柄后,获取它的设备上下文并将图像复制到新的位图。

    an excellent example on CodeProject如何从中复制图像。在“捕获窗口内容”部分中查找有关获取和创建设备上下文的示例代码。

答案 1 :(得分:10)

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

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;

    }

根据多种显示器情况进行调整(虽然听起来这应该适用于您的应用程序)。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

所有以前的答案都是完全错误的(尽量减少应用程序是荒谬的
只需使用SHW api:一行代码(缓存桌面位图,api只是将它暴露给你的HDC ......)

答案 4 :(得分:0)

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