(app.xaml.csのどこかで)任意のキーをキャプチャし、それが開いているウィンドウを押した場合、それは可能ですか?
手伝ってくれてありがとう!
より良い方法があります。これはMSフォーラムで見つかりました。チャームのように機能します。
このコードをアプリケーションの起動に配置します。
EventManager.RegisterClassHandler(typeof(Window),
Keyboard.KeyUpEvent,new KeyEventHandler(keyUp), true);
private void keyUp(object sender, KeyEventArgs e)
{
//Your code...
}
この要点のようなものを使用して、グローバルフックを登録できます。アプリケーションの実行中に指定されたキーが押されるたびに起動します。App
次のようにクラスで使用できます。
public partial class App
{
private HotKey _hotKey;
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
RegisterHotKeys();
}
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
UnregisterHotKeys();
}
private void RegisterHotKeys()
{
if (_hotKey != null) return;
_hotKey = new HotKey(ModifierKeys.Control | ModifierKeys.Shift, Key.V, Current.MainWindow);
_hotKey.HotKeyPressed += OnHotKeyPressed;
}
private void UnregisterHotKeys()
{
if (_hotKey == null) return;
_hotKey.HotKeyPressed -= OnHotKeyPressed;
_hotKey.Dispose();
}
private void OnHotKeyPressed(HotKey hotKey)
{
// Do whatever you want to do here
}
}
はいといいえ。
フォーカスは、特定のキーが処理される順序で役割を果たします。最初のキー押下をキャプチャするコントロールは、キーを渡さないことを選択できます。これにより、最上位レベルでキーをキャプチャできなくなります。さらに、特定のシナリオで特定のキーを飲み込むコントロールが.NET Framework内にありますが、特定のインスタンスを呼び出すことができません。
アプリケーションが小さく、奥行きがボタン付きのウィンドウにすぎない場合、これは確かに達成可能であり、WPFアプリケーション内のキーストロークをキャプチャするための標準的なアプローチに従います。
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
myVariable = true;
if (ctrl && e.Key == Key.S)
base.OnKeyDown(e);
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
myVariable = false;
base.OnKeyUp(e);
}
アプリケーションが大きい場合は、ここで詳しく説明するようにグローバルフックを試すことができますが、前述の警告がまだ存在する可能性があることを理解してください。