我使用SetWindowPos
函数来执行自动化任务,以显示窗口。我知道Windows提供了两种方法来做到这一点:
SetWindowPos
或ShowWindow
。SetWindowPos
与SWP_ASYNCWINDOWPOS
或ShowWindowAsync
。现在,我想充分利用这两个方面的优势:我希望能够同步显示窗口,因为我希望在函数返回时完成它。但是--我不希望调用挂起我的进程--如果需要太长时间,我希望能够中止调用。
现在,在寻找答案时,我唯一能想到的就是使用单独的线程并使用SendMessageTimeout
,但是即使这样,如果线程挂起,除了TerminateProcess
之外,我也没有什么办法来结束它,这不是一个干净的解决方案。
我也见过this answer,但据我所知,对于原生WinAPI,它别无选择。
发布于 2015-07-10 21:44:30
您链接到的问题中的答案只是循环,直到出现所需的条件或超时为止。它每次迭代都使用Sleep()
,以避免占用处理器。因此,WinAPI的版本可以编写得非常简单,如下所示:
bool ShowWindowAndWait(HWND hWnd, DWORD dwTimeout) {
if (IsWindowVisible(hWnd)) return true;
if (!ShowWindowAsync(hWnd, SW_SHOW)) return false;
DWORD dwTick = GetTickCount();
do {
if (IsWindowVisible(hWnd)) return true;
Sleep(15);
} while (dwTimeout != 0 && GetTickCount() - dwTick < dwTimeout);
return false;
}
不幸的是,我认为这是你能得到的最好的。SendMessageTimeout
实际上不能用于此目的,因为(据我所知)没有实际的消息可以用来显示目标窗口。ShowWindowAsync
和SWP_ASYNCWINDOWPOS
都是通过调度内部窗口事件来工作的,并且这个API没有公开。
https://stackoverflow.com/questions/31349530
复制相似问题