当程序成为前台窗口时,我的代码会截取程序的屏幕截图。屏幕截图的时间出现了一个小问题
Posted
技术标签:
【中文标题】当程序成为前台窗口时,我的代码会截取程序的屏幕截图。屏幕截图的时间出现了一个小问题【英文标题】:My code takes a screenshot of a program when it becomes the foreground window. Running into a small issue with the timing of the screenshots 【发布时间】:2013-09-18 19:14:40 【问题描述】:我的 main 方法中有这行代码:
IntPtr hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);
然后我的课堂上有这个:
delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
// filter out non-HWND namechanges... (eg. items within a listbox)
if (idObject != 0 || idChild != 0)
return;
SaveImage(Capture(hwnd), hwnd);
Console.WriteLine("Handle: 0:x8", hwnd.ToInt32());
我对这段代码有一个小问题,很难说清楚,所以请耐心等待。这段代码背后的基本思想是,我想在前台截取当前应用程序的屏幕截图并将其保存到 C 盘上的某个位置。到目前为止,我的代码允许我这样做,但它并不总是完全按照我想要的方式工作。问题是,有时当我单击应用程序(因此将其置于前台)时,它会在窗口有时间完全最大化之前拍摄照片。这导致我的屏幕截图文件夹中充满了应用程序背后的桌面屏幕截图。
有没有办法等到窗口完全最大化后再调用我的截图函数?
【问题讨论】:
【参考方案1】:您可以使用SetWindowsHookEx
和WH_CALLWNDPROCRET
来了解窗口何时处理了WM_PAINT
。或者,您可以在截取屏幕截图之前稍作延迟来破解它,从实际的角度来看,这可能就是您真正需要的。
【讨论】:
我的老板告诉我不要使用延迟,但我会尝试你的后一个建议,谢谢!【参考方案2】:这就是你要找的吗? http://msdn.microsoft.com/en-us/library/system.windows.uielement.isvisible.aspx
user32.dll 包括 IsWindowVisible http://msdn.microsoft.com/en-us/library/windows/desktop/ms633530(v=vs.85).aspx
【讨论】:
哦,我认为您发布的第二个链接正是我所需要的。非常感谢! 发布到外部资源的链接很好。但是,作为问答网站的 *** 应该是自包含的。如果您发布链接,您还应该提供一个简短的解释。 MSDN: 如果窗口被其他窗口遮挡或被其父窗口剪裁,则任何绘制到具有 WS_VISIBLE 样式的窗口的窗口都不会显示。 这不是这里要问的。我认为 WH_CALLWNDPROCRET 钩子类型的 jltrems 想法是您应该采用的方式。以上是关于当程序成为前台窗口时,我的代码会截取程序的屏幕截图。屏幕截图的时间出现了一个小问题的主要内容,如果未能解决你的问题,请参考以下文章