代码之家  ›  专栏  ›  技术社区  ›  Felipe Palermo

Ctrl键仍被按下,按键事件()

  •  -1
  • Felipe Palermo  · 技术社区  · 2 年前

    我试图帮助一位朋友为他的鼠标制作宏,但我一直在纠结一个错误。

    但当我使用:

    if(GetAsyncKeyState(VK_XBUTTON2)){
    
    keybd_event(VK_LCONTROL, 0xA2, 0x0001, 0); 
        Sleep(50);
    
    keybd_event(VK_LCONTROL, 0xA2, 0x0002, 0);
        Sleep(50); }
    

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

    1 回复  |  直到 2 年前
        1
  •  0
  •   Remy Lebeau    2 年前

    不要使用 magic numbers 在你的代码中,这会使阅读和理解变得更加困难。改用命名常量。在这种情况下, KEYEVENTF_EXTENDEDKEY KEYEVENTF_KEYUP 。然后您会注意到您没有指定 KEYEVENTF_扩展键 释放钥匙时标记。使用 | (按位或)运算符来组合标志。

    此外,不要硬编码扫描代码,因为它可能在不同的机器上有所不同。使用 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);
    }