我正在使用自动化任务的SetWindowPos
函数来显示窗口。我知道Windows提供了两种方法:
同步:SetWindowPos
或ShowWindow
。
异步:SetWindowPos
与SWP_ASYNCWINDOWPOS
或ShowWindowAsync
一起。
现在,我希望两个世界都能做到最好:我希望能够同步显示窗口,因为我希望在函数返回时完成。但我不希望调用挂起我的进程-如果时间太长,我希望能够中止调用。
现在,在寻找答案时,我唯一能想到的是使用一个单独的线程并使用SendMessageTimeout
,但即使这样,如果线程挂起,除了TerminateProcess
,我也没有什么办法结束它,这不是一个干净的解决方案。
我也看到过this answer,但据我所知,它没有替代本机WinAPI的选项。
最佳答案
您链接到的问题中的答案只是循环,直到所需条件出现或超时过期。它使用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不公开。关于c - 带有超时的SetWindowPos/ShowWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31349530/