在C#中获取DWM绘制的像素的颜色

时间:2014-02-09 13:55:43

标签: c# colors screenshot pixel dwm

我想获得通过direct3d或opengl使用绘图的另一个应用程序的可能隐藏窗口的屏幕截图。我尝试了很多方法来接收这个窗口内容但只有黑色或透明图片。我得到的最接近的是在这里使用DWM示例 http://bartdesmet.net/blogs/bart/archive/2006/10/05/4495.aspx 这将窗口绘制到我的c#表单上,但我无法获得像素颜色。如果生病了,请执行form.drawtobitmap,缺少dwm绘制的像素。

他们以任何方式使用DWM将捕获重新捕获到图像中 或者将图像绘制到我的表格上?

1 个答案:

答案 0 :(得分:3)

回答你的问题: 你可以使用GetPixel()Win32函数。但在这种情况下这是过度的。

Pinvoke GetPixel

MSDN GetPixel

正确的方法是获取设备上下文并咬住内容。

修改

我使用PrintWindow将一些代码放在一起。似乎工作得很好,即使是媒体播放器也是如此。请注意,GetWindowRect为最小化的Windows返回无效矩形。但这是一个不错的开始。

    [StructLayout(LayoutKind.Sequential)]
    public struct Rect
    {
        internal Rect(int left, int top, int right, int bottom)
        {
            Left = left;
            Top = top;
            Right = right;
            Bottom = bottom;
        }

        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowRect(IntPtr hwnd, out Rect lpRect);

    public void DumpWindow(IntPtr hwndSource, string filename)
    {
        Rect rc;
        GetWindowRect(hwndSource, out rc);

        var bmp = new Bitmap(rc.Right - rc.Left, rc.Bottom - rc.Top, PixelFormat.Format32bppArgb);
        using (Graphics gBmp = Graphics.FromImage(bmp))
        {
            IntPtr hdcBmp = gBmp.GetHdc();

            PrintWindow(hwndSource, hdcBmp, 0);

            gBmp.ReleaseHdc(hdcBmp);
        }

        bmp.Save(filename);
    }

<强> EDIT2: 如果您向DWM演示表单添加第二个按钮,请插入:

private void button1_Click(object sender, EventArgs e)
{
    var w = (Window)lstWindows.SelectedItem;
    DumpWindow(w.Handle, "test.bmp");
    Process.Start("test.bmp");
}

它仍显示空图像?