我想让我的 GUI 用户(GI 用户?)直接切换到已知的、友好的应用程序,例如通过键盘快捷键。理想情况下,我的应用程序会请求操作系统/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()
会导致更持久的闪烁任务栏图标,但不会引发应用程序。
这之前已经尝试过:
后者建议:
showNormal();
raise();
activateWindow();
但这不适用于带有 Qt 4.8.1 和 MSVC++ 2010 的 Windows 7 64 位。
这是我认为其他问题中也提到的代码:
作者写道
它总是把窗口带到前面,但焦点在系统的某个地方:-(在其他一些应用程序中……</p>
这一点我可以确认。
搜索 WinActivate 导致AutoHotkey 论坛帖子链接到 WinAPI 的GetForegroundWindow和SetForegroundWindow。
BOOL WINAPI SetForegroundWindow(
_In_ HWND hWnd
);
然而,这还不是一个真正的解决方案,因为它
后面的链接比较精细,但是作者好像放弃了。