c# 捕获系统快捷键
private void GlobalKeyCapture_KeyDown(object sender, KeyEventArgs e) { //判断当前进程是否是活动进程,以决定是否响应 var currentProcess = getActiveProcess(); if (currentProcess.Id != Process.GetCurrentProcess().Id) return; if (e.KeyCode == Keys.F) { var ctrl = Control.ModifierKeys.HasFlag(Keys.Control); if (ctrl) menuItemFind_Click(menuItemFind, new EventArgs()); } } private void GlobalKeyCapture_KeyUp(object sender, KeyEventArgs e) { //判断当前进程是否是活动进程,以决定是否响应 var currentProcess = getActiveProcess(); if (currentProcess.Id != Process.GetCurrentProcess().Id) return; if (e.KeyCode == Keys.F12) { } else if (e.KeyCode == Keys.F5) { } else if (e.KeyCode == Keys.Escape) { } }
核心类:
public class GlobalKeyCapture : NativeWindow { private const int WM_KEYDOWN = 0x0100; private const int WM_KEYUP = 0x0101; public event EventHandler<KeyEventArgs> KeyUp; public event EventHandler<KeyEventArgs> KeyDown; public GlobalKeyCapture() { CreateHandle(new CreateParams()); } protected override void WndProc(ref Message m) { if (m.Msg == WM_KEYUP) { Keys key = (Keys)m.WParam; OnKeyUp(new KeyEventArgs(key)); } else if (m.Msg == WM_KEYDOWN) { Keys key = (Keys)m.WParam; OnKeyDown(new KeyEventArgs(key)); } base.WndProc(ref m); } protected virtual void OnKeyUp(KeyEventArgs e) { KeyUp?.Invoke(this, e); } protected virtual void OnKeyDown(KeyEventArgs e) { KeyDown?.Invoke(this, e); } [DllImport("user32.dll")] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); [DllImport("user32.dll")] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll")] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(string lpModuleName); private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private const int WH_KEYBOARD_LL = 13; private const int WM_SYSKEYDOWN = 0x0104; private const int WM_SYSKEYUP = 0x0105; private IntPtr hookId = IntPtr.Zero; private LowLevelKeyboardProc proc; public void StartCapturing() { proc = HookCallback; hookId = SetHook(proc); } public void StopCapturing() { UnhookWindowsHookEx(hookId); } private IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { int vkCode = Marshal.ReadInt32(lParam); Keys key = (Keys)vkCode; if (wParam.ToInt32() == WM_KEYUP || wParam.ToInt32() == WM_SYSKEYUP) { OnKeyUp(new KeyEventArgs(key)); } else if (wParam.ToInt32() == WM_KEYDOWN || wParam.ToInt32() == WM_SYSKEYDOWN) { OnKeyDown(new KeyEventArgs(key)); } } return CallNextHookEx(hookId, nCode, wParam, lParam); } }
桂棹兮兰桨,击空明兮溯流光。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2016-10-11 asp.net 自定义控件 嵌入资源文件 备忘
2014-10-11 vb6获取字符串长度