我想拍一张全屏direct3D游戏的照片。我知道我需要创建一个"覆盖",这在c#中很难,我发现使用printscreen(而不是在mspaint中粘贴)确实可以捕获游戏窗口。
我最终得到了这个不稳定的代码:
try
{
SendKeys.SendWait("{PRTSC}");
Thread.Sleep(100);
if (Clipboard.ContainsImage())
return Clipboard.GetImage();
}
catch (Exception)
{
throw;
}
Bitmap bitmap = new Bitmap(1, 1);
return bitmap;
这段代码有时工作,有时抛出一个ExternalException,有时Clipboard.ContainsImage()返回false,它只是返回一个1,1大小的图像。
我想尝试改进这段代码,这样我就不必依赖于将某些内容复制到剪贴板所需的时间(使用thread.sleep(20000),它会工作,但这段代码只是每800ms执行一次的更大代码的一部分)。
所以我需要关于如何更可靠地发送密钥或获得printscreen使用的方法的想法。
public static class Win32
{
[DllImport("User32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
}
public Bitmap CaptureWindow()
{
Bitmap bmp = new Bitmap(this.Width,this.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
Win32.PrintWindow(this.Handle, g.GetHdc(), 0);
g.ReleaseHdc();
}
return bmp;
}