如何在Windows上切换到另一个应用程序(使用C++,Qt)

How to switch to another application on Windows (using C++, Qt)?

本文关键字:使用 应用程序 C++ Qt 另一个 Windows      更新时间:2023-10-16

我想让我的GUI用户(GI用户?)直接切换到已知的友好应用程序,例如通过键盘快捷键。理想情况下,我的应用程序会请求OS/Windows按名称或主窗口标题字符串"XYZ"显示应用程序。

手动操作路径为ALT+TAB,打开Windows任务切换程序,然后定位并导航到所需的应用程序图标,最终将其带入活动程序窗口的前台。或者,通过任务栏进行导航。

AutoHotkey有一个WinActivate功能,可以实现我想要实现的功能。

以下代码在Windows 7上可以正常工作:

#include <windows.h>
[...]
// find window handle using the window title
HWND hWnd = ::FindWindow(NULL, L"Window Title");
if (hWnd) {
    // move to foreground
    ::SetForegroundWindow(hWnd);
}

如果应用程序真的很友好,即两者都在自己的控制之下,那么更简单的解决方案可能会使用通信套接字或共享库,允许其他应用程序自行启动。

这似乎已经足够棘手了——延迟通话:

QTimer::singleShot( 2000,
                    this,
                    SLOT( toForeground() )
                    );

到这个插槽:

void MainWindow::toForeground()
{
    qDebug() << SetForegroundWindow( this->winId() );
}

这将显示任务栏,并很快突出显示应用程序图标。它不会切换到应用程序。

Qt自己的activateWindow()导致任务栏图标持续闪烁,但不会引发应用程序。

这以前已经尝试过:

  • 将窗口置于最前面->raise()、show()、activateWindow()不起作用
  • Qt需要将从win32应用程序调用的Qt应用程序带到前台
  • http://qt-project.org/forums/viewthread/1971

后者建议:

showNormal();
raise();
activateWindow(); 

但这对我在带有Qt 4.8.1和MSVC++2010的Windows 7 64位上不起作用。

以下是我认为在其他问题中也提到的代码:

  • http://qt-project.org/forums/viewthread/1971/#9038

作者撰写

它总是把窗户带到前面,但焦点在某个地方在系统中:-(在其他应用程序中…

这一点我可以确认。


编辑:Windows的行为可以(不应该!?)通过注册表进行全局更改:https://stackoverflow.com/a/6087923/1619432指向http://qt-project.org/faq/answer/qwidget_activatewindow_-_behavior_under_windows

搜索WinActivate导致了一个AutoHotkey论坛帖子,链接到WinAPI的GetForegroundWindow和SetForegroundWindow。

BOOL WINAPI SetForegroundWindow(
   _In_  HWND hWnd
);

然而,这还不是一个真正的解决方案,因为它是

  • 需要窗口句柄(如何通过窗口标题获得它?)
  • 具有有限的权限(需要处理所有权欺骗:此处和此处)

后一个环节相当详细,但作者似乎已经放弃了。