
hotkey.csusing System; using System.Runtime.InteropServices; using System.Windows.Forms; public partial class Form1 : Form { // 1. 聲明 API [DllImport(user32.dll, SetLastError true)] private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport(user32.dll, SetLastError true)] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); // 常量定義 private const int WM_HOTKEY 0x0312; private const uint MOD_CONTROL 0x0002; private const uint MOD_ALT 0x0001; private const uint MOD_SHIFT 0x0004; private const uint MOD_WIN 0x0008; private const uint MOD_NOREPEAT 0x4000; // 防止長按重復觸發(fā) private const int HOTKEY_ID 100; // 熱鍵唯一ID public Form1() { // 注意不要在構造函數里注冊等窗體句柄創(chuàng)建完成后再注冊 this.Load Form1_Load; this.FormClosed Form1_FormClosed; } private void Form1_Load(object sender, EventArgs e) { // 2. 注冊熱鍵Ctrl Alt F12 bool success RegisterHotKey(this.Handle, HOTKEY_ID, MOD_CONTROL | MOD_ALT | MOD_NOREPEAT, 0x7B); // 0x7B F12 if (!success) { MessageBox.Show(熱鍵注冊失敗可能已被其他程序占用。); } } // 3. 重寫 WndProc 捕獲熱鍵消息 protected override void WndProc(ref Message m) { base.WndProc(ref m); // 必須調用基類 if (m.Msg WM_HOTKEY m.WParam.ToInt32() HOTKEY_ID) { // 在這里寫你的業(yè)務邏輯建議用 BeginInvoke 異步處理避免阻塞 UI this.BeginInvoke((MethodInvoker)delegate { // 比如呼出窗口、顯示通知等 this.Show(); this.WindowState FormWindowState.Normal; this.Activate(); }); } } // 4. 退出時注銷熱鍵 private void Form1_FormClosed(object sender, FormClosedEventArgs e) { UnregisterHotKey(this.Handle, HOTKEY_ID); } } static class Program { static void Main() { Application.Run(new Form1()); } }編譯C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /target:winexe /out:hotkey.exe hotkey.cs運行hotkey效果Ctrl Alt F12 顯示窗口