我正在开发一个启动.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_RESTORE
或SHOW
事件时才会发生这种情况。 SetForegroundWindow()
没有问题。
之前有其他人见过这个问题吗?
答案 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。我不知道安全是否允许它在外人身上使用。