Ctrl 仍然按下 keyb_event()

Ctrl still pressed with keyb_event()

我正试图帮助一个朋友为他的鼠标创建一个宏,但我一直在为一个错误而苦苦挣扎。

但是当我使用 :

if(GetAsyncKeyState(VK_XBUTTON2)){

keybd_event(VK_LCONTROL, 0xA2, 0x0001, 0); 
    Sleep(50);

keybd_event(VK_LCONTROL, 0xA2, 0x0002, 0);
    Sleep(50); }

除非我在我的控制台中单击并再次按下 ctrl,否则我的 ctrl 仍然保持不变。

不要在您的代码中使用 magic numbers,这会增加阅读和理解的难度。请改用命名常量。在这种情况下,KEYEVENTF_EXTENDEDKEYKEYEVENTF_KEYUP。然后你会注意到你在释放密钥时没有指定 KEYEVENTF_EXTENDEDKEY 标志。使用 |(按位或)运算符组合标志。

另外,不要hard-code扫描代码,因为它可能在不同的机器上有所不同。请改用 MapVirtualKey()

试试这个:

const BYTE scanCode = MapVirtualKey(VK_LCONTROL, MAPVK_VK_TO_VSC);

...

if (GetAsyncKeyState(VK_XBUTTON2)){

    keybd_event(VK_LCONTROL, scanCode, KEYEVENTF_EXTENDEDKEY, 0); 
    Sleep(50);

    keybd_event(VK_LCONTROL, scanCode, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    Sleep(50);
}

也就是说,keybd_event() 已弃用,请改用 SendInput()

INPUT input = {};
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LCONTROL;
input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;

...

if (GetAsyncKeyState(VK_XBUTTON2)){

    input.ki.dwFlags &= ~KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(INPUT));
    Sleep(50);

    input.ki.dwFlags |= KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(INPUT));
    Sleep(50);
}