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

时间:2013-07-04 15:54:21

标签: c++ windows qt

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

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

AutoHotkey有一个功能WinActivate可以完成我想要的功能。

3 个答案:

答案 0 :(得分:4)

以下代码在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);
}

答案 1 :(得分:2)

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

这似乎很棘手 - 延迟通话:

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位上,这对我不起作用。

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

作者写道

  

它始终将窗口带到前面,但焦点在某处   在系统中:-(在其他一些应用程序......

我可以确认一下。

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

答案 2 :(得分:0)

搜索WinActivate会导致AutoHotkey forum post链接到WinAPI的GetForegroundWindowSetForegroundWindow

BOOL WINAPI SetForegroundWindow(
   _In_  HWND hWnd
);

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

  • 需要一个窗口句柄(如何通过窗口标题获取它?)
  • 拥有有限的权限(流程所有权欺骗性必要:herehere

后一个链接非常复杂,但作者似乎放弃了。

相关问题