4

GUI ユーザー (GI ユーザー?) が既知の使いやすいアプリケーションに (キーボード ショートカットなどで) 直接切り替えられるようにしたいと考えています。理想的には、私のアプリケーションは、名前またはメイン ウィンドウのタイトル文字列「XYZ」でアプリケーションを表示するように OS / Windows に要求します。

手動のアクション パスは、ALT + TABを押して Windowsタスク スイッチャーを開き、目的のアプリケーション アイコンを見つけて移動し、最終的にアクティブなプログラム ウィンドウの最前面に表示することです。または、タスク バーによるナビゲーション。

AutoHotkey には、私が達成したい機能WinActivateがあります。

4

3 に答える 3

5

次のコードは、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);
}
于 2013-07-04T19:08:17.330 に答える
3

アプリケーションが本当に友好的である場合、つまり、両方が自分の制御下にある場合、より簡単な解決策は、通信ソケットまたは共有ライブラリを使用して、他のアプリケーションを起動できるようにすることです。

これは十分に注意が必要なようです -- 通話を遅らせます:

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>

これは確認できます。


編集: Windows の動作は、レジストリを介してグローバルに変更できます (すべきではありません! ? ) 。 _behavior_under_windows

于 2013-07-04T16:22:46.027 に答える
0

WinActivate を検索すると、WinAPI のGetForegroundWindowおよびSetForegroundWindowにリンクするAutoHotkey フォーラムの投稿につながりました。

BOOL WINAPI SetForegroundWindow(
   _In_  HWND hWnd
);

ただし、これはまだ真の解決策ではありません。

  • ウィンドウ ハンドルが必要です (ウィンドウ タイトルで取得する方法は?)
  • 権限が制限されています(プロセス所有権のトリッキーが必要です:こちらこちら

後者のリンクはかなり手の込んだものですが、作者はあきらめたようです。

于 2013-07-04T15:54:20.710 に答える