ホームページ >バックエンド開発 >C++ >.NET Framework 3.5 を使用して WPF アプリケーションにグローバル ホットキーを登録する方法

.NET Framework 3.5 を使用して WPF アプリケーションにグローバル ホットキーを登録する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-14 06:48:42970ブラウズ

How to Register Global Hotkeys in WPF Applications using .NET Framework 3.5?

.NET Framework 3.5 を使用して WPF アプリケーションにグローバル ホットキーを登録する

チャレンジ:

.NET Framework 3.5 を使用して開発された WPF アプリケーションでは、特定のキー押下にバインドし、Windows キーにバインドする方法を決定する方法が必要です。

解決策:

WPF および .NET Framework 3.5 でグローバル ホットキーを登録するには、次の手順に従います。

  1. 必要な DLL をインポートします:
<code class="language-csharp">using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;</code>
  1. ヘルパーメソッドと定数を宣言します:
<code class="language-csharp">[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, UInt32 fsModifiers, UInt32 vlc);

[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

const int WmHotKey = 0x0312;</code>
  1. ホットキーの登録と使用を管理する HotKey クラスを作成します:
<code class="language-csharp">public class HotKey : IDisposable
{
    private bool _disposed;
    private Key _key;
    private KeyModifier _keyModifiers;
    private Action<HotKey> _action;
    private int _id;
    private static Dictionary<int, HotKey> _dictHotKeyToCalBackProc;

    public HotKey(Key k, KeyModifier keyModifiers, Action<HotKey> action, bool register = true)
    {
        _key = k;
        _keyModifiers = keyModifiers;
        _action = action;
        if (register)
            Register();
    }

    public bool Register()
    {
        int virtualKeyCode = KeyInterop.VirtualKeyFromKey(_key);
        _id = virtualKeyCode + ((int)_keyModifiers * 0x10000);
        bool result = RegisterHotKey(IntPtr.Zero, _id, (UInt32)_keyModifiers, (UInt32)virtualKeyCode);

        if (_dictHotKeyToCalBackProc == null)
        {
            _dictHotKeyToCalBackProc = new Dictionary<int, HotKey>();
            ComponentDispatcher.ThreadFilterMessage += ComponentDispatcherThreadFilterMessage;
        }

        _dictHotKeyToCalBackProc.Add(_id, this);
        return result;
    }

    public void Unregister()
    {
        _dictHotKeyToCalBackProc.Remove(_id);
        UnregisterHotKey(IntPtr.Zero, _id);
    }

    private static void ComponentDispatcherThreadFilterMessage(ref MSG msg, ref bool handled)
    {
        if (msg.message == WmHotKey)
        {
            HotKey hotKey;

            if (_dictHotKeyToCalBackProc.TryGetValue((int)msg.wParam, out hotKey))
            {
                hotKey._action.Invoke(hotKey);
                handled = true;
            }
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                Unregister();
            }
            _disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}</code>
  1. HotKey クラスを使用して、ホットキー イベントを登録および処理します。例:
<code class="language-csharp">// 注册CTRL+SHIFT+F9热键
HotKey hotKey = new HotKey(Key.F9, KeyModifier.Shift | KeyModifier.Ctrl, OnHotKeyHandler);

private void OnHotKeyHandler(HotKey hotKey)
{
    // 按下热键时执行操作
}</code>

このコードは、元のテキストにわずかな調整を加えて、よりスムーズで読みやすくし、Unregister メソッドの辞書からホットキーを削除するロジックの追加や リソースの正しいリリースを保証するためのメソッド。 主要なロジックとコードは変更されず、原文の疑似オリジナル バージョンが実現されます。 Dispose

以上が.NET Framework 3.5 を使用して WPF アプリケーションにグローバル ホットキーを登録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。