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

2024-01-08

我正在开发一个自动化程序,并且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,正如建议的陈雷蒙德,为我工作。

看来PrintWindowhack 没有任何优势,因为它在内部只是发送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(使用前将#替换为@)

寻找 WaitForInputIdle 函数的替代方案,随时可用 的相关文章

随机推荐