8

(app.xaml.csのどこかで)任意のキーをキャプチャし、それが開いているウィンドウを押した場合、それは可能ですか?

手伝ってくれてありがとう!

4

3 に答える 3

8

より良い方法があります。これはMSフォーラムで見つかりました。チャームのように機能します。

このコードをアプリケーションの起動に配置します。

EventManager.RegisterClassHandler(typeof(Window),
     Keyboard.KeyUpEvent,new KeyEventHandler(keyUp), true);

private void keyUp(object sender, KeyEventArgs e)
{
      //Your code...
}
于 2017-02-27T11:43:00.147 に答える
4

この要点のようなものを使用して、グローバルフックを登録できます。アプリケーションの実行中に指定されたキーが押されるたびに起動します。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
    }
}
于 2012-12-19T18:28:22.137 に答える
3

はいといいえ。

フォーカスは、特定のキーが処理される順序で役割を果たします。最初のキー押下をキャプチャするコントロールは、キーを渡さないことを選択できます。これにより、最上位レベルでキーをキャプチャできなくなります。さらに、特定のシナリオで特定のキーを飲み込むコントロールが.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);
}

アプリケーションが大きい場合は、ここで詳しく説明するようにグローバルフックを試すことができますが、前述の警告がまだ存在する可能性があることを理解してください。

于 2012-12-19T18:20:32.780 に答える