我已在 Visual Studio 中使单个实例运行Qt应用程序(Qt版本5.11.1)。第一次执行后,我的主窗口将打开,我正在关闭它。它一直在后台运行。
第二次运行.exe时,我想打开我第一次打开的上一个mainWindow。
我正在枚举可用的窗口标题,并且正在获取“测试窗口” 标题。但是我想使用此 HWND 来使用SetForegroundWindow(hwnd);
设置在每个其他窗口顶部的前景中。
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (IsWindowVisible(hwnd)) // check whether window is visible
{
char wnd_title[256];
GetWindowText(hwnd, wnd_title, sizeof(wnd_title));
MessageBox(0, wnd_title, "Installation Error", MB_OK | MB_ICONEXCLAMATION);
if (strcmp(wnd_title, "Test Window") == 0)
{
SetForegroundWindow(hwnd);
int err = GetLastError();
string msg = "error code " + std::to_string(err);
MessageBox(0, msg.c_str(),"Installation Error ", MB_OK | MB_ICONEXCLAMATION);
return false;
}
}
return true; // function must return true if you want to continue enumeration
}
第二次运行时,如何在所有其他窗口顶部的 Qt MainWindow 上打开
。答案 0 :(得分:1)
检出在https://github.com/qtproject/qt-solutions中找到的项目QtSingleApplication。
在QtSingleApplication类中,有一个名为 activateWindow 的方法。在 Loader 示例中,只要运行程序的第二个实例,就会调用此方法。
要在尝试打开第二个实例时使主窗口位于顶部,必须像这样修改此方法。
void QtSingleApplication::activateWindow()
{
if (actWin) {
actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);
actWin->activateWindow();
actWin->raise();
//winapi call
SetWindowPos((HWND)actWin->winId() , HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
//hack to prevent sticking window to the fore
SetWindowPos((HWND)actWin->winId() , HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
}
警告:这是仅Windows的解决方案,它可以在我的机器上使用。还要确保在实施中包括 windows.h 。
[edit]我的代码有一个问题,即一旦激活,窗口就会脱颖而出。这种hack修复。