首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置具有超时的SetWindowPos/ShowWindow

设置具有超时的SetWindowPos/ShowWindow
EN

Stack Overflow用户
提问于 2015-07-10 20:15:17
回答 1查看 833关注 0票数 1

我使用SetWindowPos函数来执行自动化任务,以显示窗口。我知道Windows提供了两种方法来做到这一点:

  • 同步:SetWindowPosShowWindow
  • 异步:SetWindowPosSWP_ASYNCWINDOWPOSShowWindowAsync

现在,我想充分利用这两个方面的优势:我希望能够同步显示窗口,因为我希望在函数返回时完成它。但是--我不希望调用挂起我的进程--如果需要太长时间,我希望能够中止调用。

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

我也见过this answer,但据我所知,对于原生WinAPI,它别无选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-10 21:44:30

您链接到的问题中的答案只是循环,直到出现所需的条件或超时为止。它每次迭代都使用Sleep(),以避免占用处理器。因此,WinAPI的版本可以编写得非常简单,如下所示:

代码语言:javascript
运行
复制
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没有公开。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31349530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档