【问题标题】:ShowWindowAsync doesn't activate a hidden+minimized window?ShowWindowAsync 不激活隐藏+最小化窗口?
【发布时间】:2011-09-26 22:51:42
【问题描述】:

给定的外部(不属于当前进程)窗口(@98​​7654321@)首先被最小化,然后隐藏:

ShowWindowAsync(hWnd, SW_MINIMIZE);
// wait loop inserted here
ShowWindowAsync(hWnd, SW_HIDE);

以下调用正确地将其恢复到未最小化(恢复)状态:

ShowWindow(hWnd, SW_RESTORE);

但是,此调用不会:

ShowWindowAsync(hWnd, SW_RESTORE);

ShowWindowAsync() 的第二个实例中,窗口未最小化且不再隐藏,但未激活(保留在其他现有窗口之后)。相反,第一个ShowWindow() 调用正确地激活了窗口。

这是预期的行为吗? 如何在不依赖同步(阻塞)ShowWindow() 的情况下恢复窗口(到前台)?(示例中的等待循环可以有超时,而ShowWindow() 没有允许指定超时。)

(WinXP SP3)

【问题讨论】:

  • 调用 ShowWindow() + SetForegroundWindow().
  • @HansPassant:这是一个阻塞(同步)调用,我试图避免。

标签: winapi shell windows-xp window


【解决方案1】:

ShowWindowAsync 将 show-window 事件发布到给定窗口的消息队列。特别是,窗口由其线程而不是您的线程显示。不同的是,你的线程是前台线程,因此可以激活另一个窗口,它不能自己做。

【讨论】:

    【解决方案2】:

    这是使用的解决方案:

    ShowWindowAsync(hWnd, SW_SHOW);
    // wait loop inserted here
    ShowWindowAsync(hWnd, SW_RESTORE);
    

    这本质上是用来隐藏窗口的sn-p的反转:

    ShowWindowAsync(hWnd, SW_MINIMIZE);
    // wait loop inserted here
    ShowWindowAsync(hWnd, SW_HIDE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2010-10-24
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多