【问题标题】:Different Window Minimize Behavior With Different Shells不同的窗口最小化不同外壳的行为
【发布时间】:2014-05-10 04:44:54
【问题描述】:

我有一个自助服务终端式应用程序,用户/操作员可以在其中使用特殊键选择应用程序。

我有一个管理应用程序,它监控密钥(通过另一个 API)并尝试根据需要最小化和最大化其他应用程序窗口。

对于任何给定的应用程序,伪代码如下所示:

  foreach(var process in NotCurrentProcess())
  {
    ShowWindowAsync(process.MainWindowHandle, SW_FORCEMINIMIZE);
  }
  ShowWindowAsync(myProcess.MainWindowHandle, SW_SHOWMAXIMIZED);

这很适合测试。

对于部署,我的应用程序成为HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 的外壳

现在,当我最小化一个应用程序时,它没有任务栏可以转到,它浮动在顶部窗口上方。

谁能帮助解决这个问题的根本原因/修复?

【问题讨论】:

  • 你的shell需要响应HSHELL_GETMINRECT。
  • @RaymondChen 你能告诉我这个的意义吗?
  • 该通知控制最小化窗口的显示位置。
  • @RaymondChen 谢谢你 - 这种方法也可以奏效,但代价是必须通过 P/Invoke 处理另一条 WinApi 消息。

标签: windows winapi windows-7 registry


【解决方案1】:

我假设您只是想隐藏窗口,因为没有任务栏可以停靠它们,对吧?

与其最小化应用程序窗口,不如将其放置在屏幕外 10000 像素处,即现在使用SetWindowPos 的位置左侧。或者,您可以在 ShowWindow 调用中隐藏带有 SW_HIDE 标志的每个窗口。

for (process in NotCurrentProcess())
{
    SetWindowPos(process.MainWindowHandle, HWND_BOTTOM, -10000, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER);

    // OR call ShowWindow(process.MainWindowHandle, SW_HIDE);

}
SetWindowPos(myProcess.MainWindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
ShowWindowAsync(myProcess.MainWindowHandle, SW_SHOWMAXIMIZED);

【讨论】:

  • 非常感谢 - 我之前尝试过 SetWindowPos,但不知道正确使用 HWND_TOPSWP_NOSIZE 标志。现在验证这种方法...
  • 作品,精彩,谢谢。与已接受答案的唯一区别是我使用ShowWindow 而不是ShowWindowAsync,因为我的应用程序的主要目的是管理这些窗口,我更喜欢为此进行同步调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多