gpt4 book ai didi

c - 带超时的 SetWindowPos/ShowWindow

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:31 28 4
gpt4 key购买 nike

我正在使用 SetWindowPos 函数执行自动化任务以显示窗口。我知道 Windows 提供了两种方法来执行此操作:

  • 同步:SetWindowPosShowWindow
  • 异步:SetWindowPosSWP_ASYNCWINDOWPOSShowWindowAsync

现在,我想两全其美:我希望能够同步显示窗口,因为我希望它在函数返回时完成。 但是我不希望调用挂起我的进程 - 如果花费的时间太长,我希望能够中止调用。

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

我也看到了this answer ,但据我了解,它无法替代 native 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com