3

我正在开发一个自动化程序,该WaitForInputIdle功能可以帮助我确定目标应用程序的窗口何时完成初始化。问题是,在我的情况下,它只适用于第一个窗口 - 这就是WaitForInputIdle工作方式,只有一次。

是否可以以不同的方式实现该功能,WaitForInputIdle以便每次目标进程忙时都可以调用它,并等到它完成?

我考虑过发布一条虚拟消息,但我认为没有办法找出它何时从队列中删除。

编辑:我想出了一些东西,一个看起来很有效的丑陋和hacky解决方案:

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

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

4

1 回答 1

1

编辑:根据Raymond ChenWM_NULL的建议,发送对我有用。

hack似乎PrintWindow没有任何优势,因为它只是在内部发送WM_PAINT消息。

旧消息:我想出了一个解决我的问题的解决方案,仍然是一个 hack,但没有那么难看。

这个想法是滥用该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);
于 2013-06-22T11:29:32.077 回答