【问题标题】:Restore a minimized window of another application (C++ WinAPI)恢复另一个应用程序的最小化窗口(C++ WinAPI)
【发布时间】:2014-06-30 08:42:23
【问题描述】:

我正在开发一个启动 .NET Winforms 应用程序的 C++ 程序。

如果应用程序已经在运行,我想恢复窗口。我抓住 .NET 应用程序的窗口句柄并使用 SetForegroundWindow() 将其带到前面。

这在应用程序被最小化时有效。

我尝试了以下组合:

ShowWindow(windowHandle, SW_SHOW);
ShowWindow(windowHandle, SW_RESTORE);

SendMessage(windowHandle, WM_SYSCOMMAND, SC_RESTORE, 0);        

但是,当执行此代码时,事件会卡住。在托盘中,我看到".NET-BroadcastEventWindow.2.0.0.0.378734a.0" 与我的 .NET 应用程序一起作为托盘中的第二个窗口出现,并且该应用程序永远不会正确恢复。

这仅在我尝试发送 SW/SC_RESTORESHOW 事件时发生。 SetForegroundWindow() 没有问题。

以前有没有其他人见过这个问题?

【问题讨论】:

  • Windows 已经实施了重要的措施来防止焦点窃取(无论是为了可用性 - 用户对自发的焦点变化感到恼火 - 以及为了安全 - 在登录框上弹出的聊天窗口中输入密码都会坏)。请参阅blogs.msdn.com/b/oldnewthing/archive/2009/02/20/9435239.aspx 了解更多信息。

标签: c++ winapi


【解决方案1】:

过去我遇到过类似的问题,我使用 Get/SetWindowPlacement() 解决了:

// Ensure that the given window is not minimized.
// If it is minimized, restore it to its normal state.
void EnsureNotMinimized(HWND hWnd)
{
   WINDOWPLACEMENT placement;
   placement.length = sizeof(placement);

   if(!GetWindowPlacement(hWnd, &placement))
      return;

   BOOL minimized = (placement.showCmd & SW_SHOWMINIMIZED) != 0;
   if(!minimized)
      return;

   placement.showCmd = SW_SHOWNORMAL;
   SetWindowPlacement(hWnd, &placement);
}

但是,我只将它用于属于我自己的应用程序的窗口。我不知道安全性是否允许它被外人使用。

【讨论】:

  • 我相当有信心,由于我的链接中解释的原因,这不会跨进程工作,但我还没有真正尝试过。
猜你喜欢
  • 2012-02-24
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多