首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 註冊系統熱鍵:使用 RegisterHotKey 實作全域快速鍵

     編輯:關於C語言

全域熱鍵註冊完整範例

透過 P/Invoke 呼叫 user32.dll 的 RegisterHotKey 與 UnregisterHotKey,在 WinForms 應用程式中註冊系統層級熱鍵,即使視窗未具焦點也能觸發。

核心類別實作

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public partial class HotKeyForm : Form
{
    // 匯入 API
    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);

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

    // 修飾鍵列舉
    private enum KeyModifiers : uint
    {
        None = 0,
        Alt = 1,
        Control = 2,
        Shift = 4,
        Windows = 8
    }

    private const int WM_HOTKEY = 0x0312;
    private const int HOTKEY_ID_1 = 100;
    private const int HOTKEY_ID_2 = 200;

    public HotKeyForm()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_HOTKEY)
        {
            int id = m.WParam.ToInt32();
            switch (id)
            {
                case HOTKEY_ID_1:
                    MessageBox.Show("觸發熱鍵 1 (Ctrl+A)");
                    break;
                case HOTKEY_ID_2:
                    MessageBox.Show("觸發熱鍵 2 (Ctrl+B)");
                    break;
            }
        }
        base.WndProc(ref m);
    }

    private void HotKeyForm_Load(object sender, EventArgs e)
    {
        // 註冊 Ctrl+A 與 Ctrl+B
        RegisterHotKey(Handle, HOTKEY_ID_1, (uint)KeyModifiers.Control, Keys.A);
        RegisterHotKey(Handle, HOTKEY_ID_2, (uint)KeyModifiers.Control, Keys.B);
    }

    private void HotKeyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        // 卸載熱鍵
        UnregisterHotKey(Handle, HOTKEY_ID_1);
        UnregisterHotKey(Handle, HOTKEY_ID_2);
    }

    private void btnResetHotkey_Click(object sender, EventArgs e)
    {
        UnregisterHotKey(Handle, HOTKEY_ID_1);
        RegisterHotKey(Handle, HOTKEY_ID_1, (uint)KeyModifiers.Control, Keys.C); // 改為 Ctrl+C
    }
}

關鍵點總結

  • 熱鍵 ID 在同一執行緒範圍 0x0000~0xBFFF 必須唯一。
  • 修飾鍵可組合:Alt | Control 代表 Alt+Ctrl。
  • 必須在 FormClosing 卸載熱鍵,否則系統保留導致重複註冊失敗。
  • 覆寫 WndProc 攔截 WM_HOTKEY 訊息處理觸發邏輯。

應用場景: 螢幕截圖工具、快速啟動器、媒體播放器控制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved