我使用SetWindowPos
功能进行自动化任务以显示窗口。我知道Windows提供了两种方法来实现此目的:
SetWindowPos
或ShowWindow
。SetWindowPos
SWP_ASYNCWINDOWPOS
或ShowWindowAsync
。现在,我想要充分利用两个世界:我希望能够同步显示窗口,因为我希望在函数返回时完成它。 但是我不希望电话挂断我的流程 - 如果耗时太长,我希望能够中止通话。
现在,在寻找答案时,我唯一能想到的就是使用一个单独的线程并使用SendMessageTimeout
,但即使这样,如果线程挂起,我也不能除了TerminateProcess
之外,它会结束它,这不是一个干净的解决方案。
我也看过this answer,但就我所知,它对原生WinAPI没有其他选择。
答案 0 :(得分:2)
您链接到的问题中的答案只是循环,直到出现所需条件或超时到期为止。它每次迭代都使用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未公开公开。