我想获得通过direct3d或opengl使用绘图的另一个应用程序的可能隐藏窗口的屏幕截图。我尝试了很多方法来接收这个窗口内容但只有黑色或透明图片。我得到的最接近的是在这里使用DWM示例 http://bartdesmet.net/blogs/bart/archive/2006/10/05/4495.aspx 这将窗口绘制到我的c#表单上,但我无法获得像素颜色。如果生病了,请执行form.drawtobitmap,缺少dwm绘制的像素。
他们以任何方式使用DWM将捕获重新捕获到图像中 或者将图像绘制到我的表格上?
答案 0 :(得分:3)
回答你的问题: 你可以使用GetPixel()Win32函数。但在这种情况下这是过度的。
正确的方法是获取设备上下文并咬住内容。
修改强>
我使用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");
}
它仍显示空图像?