【发布时间】:2013-06-22 22:37:22
【问题描述】:
我正在开发一个自动化程序,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));
我真的希望有比这更好的东西。
【问题讨论】:
-
向窗口发送 WM_NULL 消息。
-
谢谢雷蒙德,这对我的情况有用。事实上,我考虑过使用 WM_NULL,但我认为它不会起作用,因为发送的消息可以在各种意想不到的场景中处理,例如
TrackPopupMenu、SendMessage可能还有其他我不知道的功能。 -
它与您的
PrintWindow方法一样有效,该方法发送WM_PAINT消息。 (WM_PAINT主要是发布,但如果有人在等待结果,就会发送,就像你一样。) -
“我想过发布一条虚拟消息,但我认为没有办法找出它何时从队列中删除。” - 您可以为此使用 WH_GETMESSAGE 挂钩。您可以使用 GetWindowThreadProcessId() 将挂钩限制为仅拥有您要发布到的窗口的线程。
-
WH_XXX 挂钩涉及 DLL 注入,这对我的需求来说太重了。事实上,我偶然发现了
WH_FOREGROUNDIDLE,这可能正是我所需要的,但出于同样的原因它不适合。目前我使用的是WM_NULL方法,对于特定的应用程序-GetUpdateRect方法。
标签: winapi