我正在使用自动化任务的SetWindowPos函数来显示窗口。我知道Windows提供了两种方法:
同步:SetWindowPosShowWindow
异步:SetWindowPosSWP_ASYNCWINDOWPOSShowWindowAsync一起。
现在,我希望两个世界都能做到最好:我希望能够同步显示窗口,因为我希望在函数返回时完成。但我不希望调用挂起我的进程-如果时间太长,我希望能够中止调用。
现在,在寻找答案时,我唯一能想到的是使用一个单独的线程并使用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实际上不能用于此目的,因为(据我所知)您不能用它发送任何会导致显示目标窗口的实际消息。ShowWindowAsyncSWP_ASYNCWINDOWPOS都是通过调度内部窗口事件来工作的,并且此API不公开。

关于c - 带有超时的SetWindowPos/ShowWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31349530/

10-12 00:33