フックを使用して実装されたシステム全体のホットキーを介してアプリケーションを起動するための小さな WPF ベースのプログラムに取り組んでいます。C# と Visual Studio 2010 で実装しています。
特定のキー押下を検出したら、Process.Start(...) を使用してアプリケーションを実行します。これは、Visual Studio がアクティブな間は正常に機能し、予想どおり、新しいアプリケーションを入力フォーカスでフォアグラウンドに配置します。ランチャーがバックグラウンド (別のアクティブなプログラムの背後) にある場合でも、キーを検出し、他のすべての前にアプリケーションを正しく起動します。
問題は、Visual Studio をアクティブにせずにランチャーを実行すると、ランチャー アプリケーションが前面になく、アプリケーションも起動しないことです。それらはランチャーの前に表示されますが、アクティブなアプリケーションの後ろに表示されます。
AutoHotkey などの他のソフトウェアがこの動作でホットキー起動を実行できることはわかりますが、何が間違っているのかわかりません。
更新:私の開発環境で機能するこの問題の解決策を見つけました。最初に、ランチャーのメイン ウィンドウ ハンドルを使用して、Windows API RegisterHotKey を通じてグローバル ホットキーを登録します。キーは任意ですが、通常は物理的に存在しないもの、私の場合は F24 にする必要があります。次に、アプリを起動するフックを介してキープレスを検出するたびに、最初に keybd_event を呼び出して、ホットキーのキープレスを「偽造」します。
WPF を使用する場合:
keybd_event((byte)KeyInterop.VirtualKeyFromKey(Key.F24),0,KEYEVENTF_KEYUP,0);
WinForms で使用する場合:
keybd_event((byte)Keys.F24,0,KEYEVENTF_KEYUP,0);
これにより、ランチャーに十分なフォーカスがもたらされるため、Process.Start(...) は実行されたプログラムを前面に出します。ランチャー ウィンドウを前面に表示したり、ランチャーに入力を受け入れさせたりすることはありません。
メイン ウィンドウで keybd_event() の後に Activate() が呼び出されると、ユーザーがタスクを切り替えたかのように、メイン ウィンドウが前面に表示され、キーボード入力が可能になります。