【问题标题】:KEYEVENTF_KEYUP does not work if KEYEVENTF_EXTENDEDKEY is used如果使用 KEYEVENTF_EXTENDEDKEY,则 KEYEVENTF_KEYUP 不起作用
【发布时间】:2014-11-03 03:28:07
【问题描述】:

我尝试模拟 CTRL+NumENTER。我用键盘测试程序(PassMark KeyboardTest)检查了代码,似乎按下了 NumENTER 但没有释放。如果我不使用 KEYEVENTF_EXTENDEDKEY 一切都会被释放,但我会得到正常的返回。

这是我的代码:

INPUT *ip = new INPUT[2];                   // set up input 1

(ip)->type = INPUT_KEYBOARD;                // set up keyboard event
(ip)->ki.wScan = 0;
(ip)->ki.time = 0;
(ip)->ki.dwExtraInfo = 0;

(ip)->ki.wVk = VK_CONTROL;                  // set ip[0] to CTRL
(ip)->ki.dwFlags = 0;

Sleep(100);

(ip+1)->type = INPUT_KEYBOARD;              // set up keyboard event
(ip+1)->ki.wScan = 0;
(ip+1)->ki.time = 0;
(ip+1)->ki.dwExtraInfo = 0;

(ip+1)->ki.wVk = VK_RETURN;                 // set ip[1] to ENTER
(ip+1)->ki.dwFlags = KEYEVENTF_EXTENDEDKEY; // make ENTER to NumENTER

Sleep(100);

SendInput(2, ip, sizeof(INPUT));            // send key

Sleep(100);

(ip)->ki.dwFlags = KEYEVENTF_KEYUP;         // event for keyrelease     
(ip+1)->ki.dwFlags = KEYEVENTF_KEYUP;       // event for keyrelease

Sleep(100);

SendInput(2, ip, sizeof(INPUT));            // release keys

return 0;

【问题讨论】:

  • 大部分应用都是通过扫码来区分这两个键的。

标签: c++ input keyboard keyevent


【解决方案1】:

使用位或来设置dwFlagsKEYEVENTF_EXTENDEDKEY 将前缀 (0xE0 (224)) 添加到 scanCode

(ip)->ki.dwFlags |= KEYEVENTF_KEYUP;         // event for keyrelease     
(ip+1)->ki.dwFlags |= KEYEVENTF_KEYUP;       // event for keyrelease

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2018-01-14
    • 2018-08-02
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2013-12-30
    • 2016-01-21
    相关资源
    最近更新 更多