2013-07-04 78 views
4

我想讓我的GUI用戶(GI用戶?)直接切換到已知的友好應用程序,例如,通過鍵盤快捷鍵。理想情況下,我的應用程序會要求OS/Windows按名稱或主窗口標題字符串「XYZ」顯示應用程序。如何切換到Windows上的其他應用程序(使用C++,Qt)?

行動的手動路徑是ALT+TAB打開Windows 任務切換然後定位並導航到所需的應用程序圖標,最終使其活動程序窗口的前景。或者,通過Task Bar導航。

AutoHotkey有一個功能WinActivate,它可以實現我想要的功能。

回答

3

下面的代碼在這裏工作沒有問題在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); 
} 
+0

謝謝,它的確如此。 [FindWindow doc](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx)。 – handle

0

正在搜索WinActivate導致鏈接到WinAPI的GetForegroundWindowSetForegroundWindowAutoHotkey forum post

BOOL WINAPI SetForegroundWindow(
    _In_ HWND hWnd 
); 

然而,這是不是一個真正的解決方案還因爲它

  • 需要一個窗口句柄(如何通過窗口標題怎麼做呢?)
  • 具有有限的權限(流程所有權掛羊頭賣狗肉neccessary: herehere

後者的鏈接相當詳細,但作者似乎已經放棄。

2

如果應用程序確實是友好的,即兩者都在您的控制之下,更簡單的解決方案可能會使用通信套接字或共享庫,以允許其他應用程序自行啓動。

這似乎是棘手足夠 - 延遲調用:

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

這個插槽:

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

這將顯示任務欄,不久突出的應用程序圖標。它不切換到應用程序。

Qt自己的activateWindow()會產生更持久的閃爍任務欄圖標,但不會引發應用程序。

這已經嘗試之前:

後者建議:

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

b在Windows 7 64位上使用Qt 4.8.1和MSVC++ 2010不適用於我。

下面是代碼,我想在其他問題也提到:

作者寫道

它總是將窗口前面,但重點是系統中的某處 :-(在某些其他應用程序中...

這個我可以確認。


編輯: Windows的行爲(不應該!?)在全球範圍內通過註冊表來更改: https://stackoverflow.com/a/6087923/1619432http://qt-project.org/faq/answer/qwidget_activatewindow_-_behavior_under_windows

相關問題