还原另一个应用程序的最小化窗口(C ++ WinAPI)

时间:2014-05-12 20:31:32

标签: c++ winapi

我正在开发一个启动.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()没有问题。

之前有其他人见过这个问题吗?

1 个答案:

答案 0 :(得分:0)

过去我遇到类似的问题,我使用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);
}

但是,我只将它用于属于我自己的应用程序的Windows。我不知道安全是否允许它在外人身上使用。