2010-12-01 21 views
4

他のWPFアセンブリをたくさん使用するWPF(プリズム)アプリケーションと、他のウィンドウ(wpfとwin32)を含むwin32 dllもあります。wpf/win32の混在アプリケーションでアプリケーション全体のホットキーを定義

ユーザーがファンクションキー(F2〜F12)を押すと、特定のプログラム機能を開きたいとします。このような

何か:

RoutedCommand commandF4 = new RoutedCommand(); 
commandF4.InputGestures.Add(new KeyGesture(Key.F4)); 
Application.Current.MainWindow.CommandBindings.Add(new CommandBinding(commandF4, CallCommandF4)); 

問題がある:メインウィンドウにフォーカスがあるときにのみ動作ありません。私がセカンダリWPFウィンドウ(またはwin32ウィンドウ)を開くと、キーバインディングはそれ以上適用されません。

F4(またはその他のキー)にアプリケーション全体のホットキーを追加する方法はありますか?
または少なくともWPFワイドのホットキーですか?

+0

[入力:

はちょうどあなたが.NET 4.0を使用している場合、あなたは代わりにHMODのPARAM、使用として

Assembly.GetExecutingAssembly().GetModules()[0] 

を使用するのでは、SetWindowsHookExを使用することに注意してフォーカスは、任意の時点で1つのウィンドウにしか存在できません。](http://msdn.microsoft.com/en-us/library/ms754010.aspx#focus)セカンダリウィンドウでキーバインドをキャッチし、[メッセージング](http://www.google.com/search?q=mvvm+messaging)を使用して、キーが押されたことをMainWindowに伝えることができます。 Win32ウィンドウには、より低いレベルのキーボードフックとソートが必要な場合があります。 –

答えて

3

私は、キーボードにフックを書くと思うことができますし、このフックをアプリケーションのスレッドからのキーボードメッセージを聞くために添付してみてください。

これはインスピレーションのための本当に良い例です:http://www.codeproject.com/KB/cs/globalhook.aspx

Process.GetCurrentProcess().MainModule.BaseAddress 
+1

ああ、ちょうど質問が一歳だと気づいた:) – PompolutZ

関連する問題