【问题标题】:How to switch to another application on Windows (using C++, Qt)?如何切换到 Windows 上的另一个应用程序(使用 C++、Qt)?
【发布时间】:2013-07-02 16:43:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ windows qt


    【解决方案1】:

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

    【讨论】:

      【解决方案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 的行为可以(不应该!?)通过注册表全局更改: https://stackoverflow.com/a/6087923/1619432 指向 http://qt-project.org/faq/answer/qwidget_activatewindow_-_behavior_under_windows

      【讨论】:

        【解决方案3】:

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

        BOOL WINAPI SetForegroundWindow(
           _In_  HWND hWnd
        );
        

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

        • 需要窗口句柄(如何通过窗口标题获取?)
        • 具有有限的权限(需要进程所有权诡计:herehere

        后面的链接写的比较详细,不过作者好像放弃了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-06
          • 2014-05-07
          • 2016-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多