我正在开发一个自动化程序,并且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));
我真的希望有比这更好的东西。
Edit:发送WM_NULL
,正如建议的陈雷蒙德,为我工作。
看来PrintWindow
hack 没有任何优势,因为它在内部只是发送WM_PAINT
信息。
旧消息:我想出了一个解决方案来解决我的问题,仍然是一个黑客,但没有那么丑陋。
这个想法被滥用了PrintWindow
函数,基本上 posts 发送 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)