寻找WaitForInputIdle函数的替代方法,随时可用

时间:2013-06-22 04:38:57

标签: winapi

我正在开发一个自动化程序,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));

我真的希望有更好的东西。

1 个答案:

答案 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);