SetWindowPos / ShowWindow超时

时间:2015-07-10 20:15:17

标签: c windows multithreading winapi

我使用SetWindowPos功能进行自动化任务以显示窗口。我知道Windows提供了两种方法来实现此目的:

  • 同步:SetWindowPosShowWindow
  • 异步:SetWindowPos SWP_ASYNCWINDOWPOSShowWindowAsync

现在,我想要充分利用两个世界:我希望能够同步显示窗口,因为我希望在函数返回时完成它。 但是我不希望电话挂断我的流程 - 如果耗时太长,我希望能够中止通话。

现在,在寻找答案时,我唯一能想到的就是使用一个单独的线程并使用SendMessageTimeout,但即使这样,如果线程挂起,我也不能除了TerminateProcess之外,它会结束它,这不是一个干净的解决方案。

我也看过this answer,但就我所知,它对原生WinAPI没有其他选择。

1 个答案:

答案 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实际上不能用于此目的,因为(据我所知),没有可以发送的实际消息会导致显示目标窗口。 ShowWindowAsyncSWP_ASYNCWINDOWPOS都通过安排内部窗口事件来工作,并且此API未公开公开。