【发布时间】:2017-03-11 01:12:27
【问题描述】:
我正在构建一个 WinForms 应用程序,该应用程序通过每 500 毫秒截屏一次来记录外部进程的步骤。我正在使用以下代码:
Bitmap bmp = new Bitmap(width, height,PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.left,
rect.top,
0,
0,
new Size(width, height),
CopyPixelOperation.SourceCopy);
代码工作正常,但唯一的问题是当我从外部进程的窗口打开一个对话框时(例如:在记事本中打开Save As... 对话框),屏幕截图冻结到原始窗口而不是显示对话框盒子。
我的理论是,由于我使用以下代码来检测应用程序是否失去焦点,然后恢复到上次保存的屏幕截图:
if (GetForegroundWindow() != proc.MainWindowHandle) //proc is just a process from system process list by Process.GetProcessesByName()
{
return LastScreenShot;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
但此代码对于仅向用户显示正在录制的应用程序而不是在录制区域内被拖动的任何其他应用程序或录制区域内的桌面部分是必需的。此外,当我单击菜单时,有时会显示菜单冻结在褪色位置,有时根本不显示或显示但在屏幕截图中不显示导航突出显示。
那么有什么办法可以解决这个问题吗?
这里提出了类似的问题 Screen Capture Not Capturing Dialog Boxes in My application 但这并不能解决我的问题,因为答案是使用相同的代码 而且我的应用程序不会截取整个桌面的屏幕截图。
【问题讨论】:
-
这可能值得一试:stackoverflow.com/questions/1363167/…。因此,也许您可以针对所有子窗口进行验证,而不仅仅是针对 proc.MainWindowHandle
-
@Johan 感谢您的链接,但我已经阅读了该主题。我正在获取子窗口的句柄,但问题是如何将它们包含在主窗口的屏幕截图中?我也在验证,但 OpenFileDialog 和 SaveFileDialog 等对话框仍然没有出现在屏幕截图中。
-
啊,好吧。我想到了你所说的你认为这可能是因为当主句柄不是前台窗口时你恢复到上次保存的屏幕截图。
-
@Johan 问题是当我打开主菜单和对话框时它们变成了前台窗口。
-
如您所说,也许只是您的测试
GetForegroundWindow() != proc.MainWindowHandle无效。为什么不检查前景或模态窗口是否属于您正在录制的进程? (您可以在这里使用我的回答中的GetModalWindow:stackoverflow.com/questions/19147/…)