我正在开发一个自动化程序,WaitForInputIdle
函数帮助我确定目标应用程序的窗口何时完成初始化。问题在于,就我而言,它仅适用于第一个窗口 - 这就是WaitForInputIdle
的工作方式,只有一次。
WaitForInputIdle
的功能是否可以以不同的方式实现,以便每次目标进程繁忙时都可以调用它,并等待它完成?
我考虑发布一条虚拟消息,但我认为没有办法找出它何时从队列中删除。
编辑:我想出了一些似乎有效的丑陋和黑客的解决方案:
RECT rc;
if(!GetUpdateRect(hWnd, &rc, FALSE))
{
rc.left = rc.top = 0;
rc.right = rc.bottom = 1;
InvalidateRect(hWnd, &rc, FALSE);
}
do {
Sleep(100);
} while(GetUpdateRect(hWnd, &rc, FALSE));
我真的希望有更好的东西。
答案 0 :(得分:1)
编辑:按照 Raymond Chen 的建议发送WM_NULL
,对我有用。
似乎PrintWindow
黑客没有任何优势,因为内部它只发送WM_PAINT
消息。
旧消息:我想出了一个解决我的问题的解决方案,仍然是一个黑客,但不是那么难看。
这个想法是滥用PrintWindow
函数,基本上帖子发送WM_PAINT消息并等待窗口处理它 - 正是我需要的。
以下是包含一些信息性评论的代码。
它在Windows XP和Windows 8上进行了测试,它按预期工作,即使HDC值为NULL,也不会失败。
// BEWARE: HACK BELOW
// PrintWindow is misused here as a synchronization tool
// When calling it, the system sends WM_PAINT and waits for it to be processed
// Note: if hWnd is hung, the following call will hang as well
PrintWindow(hWnd, NULL, 0);