如何在Windows上切换到另一个应用程序(使用C++,Qt)
How to switch to another application on Windows (using C++, Qt)?
我想让我的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
);
然而,这还不是一个真正的解决方案,因为它是
- 需要窗口句柄(如何通过窗口标题获得它?)
- 具有有限的权限(需要处理所有权欺骗:此处和此处)
后一个环节相当详细,但作者似乎已经放弃了。
相关文章:
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 使用VerQueryValue检索应用程序的文件描述
- 使用调试/崩溃报告将应用程序部署到客户端
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 在不使用系统的情况下从C++应用程序格式化 Linux 中的 SD 卡
- QSerialPort 在应用程序启动之前正在使用中
- 使用嵌入式猫鼬服务器托管应用程序
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 使用 Visual Studio 2019 构建 Hello World wxwidgets 应用程序时出错
- 强制系统 QT 库使用应用程序附带的 openssl 库
- 使用C++应用程序加载 DLL
- 如何在web服务器中使用c++应用程序
- 使用应用程序验证程序调试时应用程序挂起
- 如何在InterAppCommunication中使用C++应用程序中的Acrobat插件
- 使用 C 应用程序加载的C++插件中的C++库
- 如何使用 c++ 应用程序运行控制台
- 无效句柄(使用应用程序验证程序)
- 如何使用C++应用程序和系统函数来执行java控制台应用程序
- 使用应用程序类的优点是什么?
- 使用C应用程序中的Qt库