如何为鼠标按键设置全局热键?左Ctrl+左键触发事件遇问题
解决左鼠标+Ctrl组合键重复检测问题
你的代码存在两个关键问题:
- 未同时检测Ctrl键的按下状态
- 错误使用
GetAsyncKeyState的返回值,导致无法重复捕获按键操作
修正后的代码
using System; using System.Runtime.InteropServices; using System.Threading; class KeyDetector { [DllImport("user32.dll")] static extern short GetAsyncKeyState(int virtualKeyCode); const int VK_LBUTTON = 0x01; const int VK_CONTROL = 0x11; static void Main() { bool wasPressed = false; while (true) { // 判断左鼠标和Ctrl是否处于按下状态 bool isLButtonDown = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0; bool isCtrlDown = (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0; bool currentState = isLButtonDown && isCtrlDown; // 仅当状态从"未按下"变为"按下"时触发事件 if (currentState && !wasPressed) { DoJob(); } wasPressed = currentState; Thread.Sleep(50); // 降低CPU占用 } } static void DoJob() { Console.WriteLine("左鼠标+Ctrl组合键触发"); // 替换为你的业务逻辑 } }
关键说明
GetAsyncKeyState返回值的最高位(0x8000)表示按键当前是否按下,用按位与操作精准判断状态- 引入
wasPressed变量记录上一轮状态,避免按住按键时重复触发,同时保证能捕获每一次新的按下动作 - 添加
Thread.Sleep减少循环对CPU的消耗 - 同时检测左鼠标和Ctrl键的状态,确保只有组合键按下时才触发事件
内容的提问来源于stack exchange,提问作者VindE
相关产品推荐
相关产品推荐

