我在Windows XP上,我正试图限制一个窗口。
但是当我捕获一个窗口时,我得到了窗口标题(Name& Icon),但窗口的整个内容都是黑色的。
尝试保存图像时,整个图像都是透明的。
这是我的代码:
[DllImport("User32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr handle, ref Rectangle rect);
public void CaptureWindow(IntPtr handle)
{
Rectangle rect = new Rectangle();
GetWindowRect(handle, ref rect);
rect.Width = rect.Width - rect.X;
rect.Height = rect.Height - rect.Y;
try
{
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics memoryGraphics = Graphics.FromImage(bmp);
IntPtr hdc = memoryGraphics.GetHdc();
PrintWindow(handle, hdc, 0);
ResultsPB.Image = bmp;
memoryGraphics.ReleaseHdc(hdc);
}
catch (Exception)
{
throw;
}
}
答案 0 :(得分:2)
看看C# Capturing Direct 3D Screen。 打印屏幕捕获可见区域,而不是手柄。
DirectX和OpenGL通过硬件直接绘制。使用PrintScreen,您只能捕获由Windows管理的手柄屏幕。
如果您只需要可见区域,请使用Graphics.CaptureFromScreen。
我使用http://magnum.dimajix.de/download/demos.shtml的OpenGL演示尝试过BitBlt和PrintScreen但没有成功。 PrintScreen只返回一个空白位图,BitBlt返回一个旧的捕获(可能来自第一个和唯一的WM_PAINT消息)。
尝试启动游戏并收听它的窗口消息。您将看到没有WM_PAINT消息。所以Windows甚至不知道是否有任何改变。