【问题标题】:SendInput doesn't send chars or numbersSendInput 不发送字符或数字
【发布时间】:2012-02-10 19:31:32
【问题描述】:

我有类似的东西:

void generateKeybdEvent(int vk, bool extended) {
    KEYBDINPUT kb = {0};
    INPUT Input = {0};

    if ( extended )
        kb.dwFlags = KEYEVENTF_EXTENDEDKEY;
    kb.wVk = vk;
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;
    SendInput(1, &Input, sizeof(Input));

    ZeroMemory(&kb, sizeof(KEYBDINPUT));
    ZeroMemory(&Input, sizeof(INPUT));
    kb.dwFlags = KEYEVENTF_KEYUP;
    if ( extended )
        kb.dwFlags |= KEYEVENTF_EXTENDEDKEY;

    kb.wVk = vk;
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;
    SendInput(1, &Input, sizeof(Input));
}

当我发送输入“A”、CapsLock、“A”时:

generateKeybdEvent ('A', false);
generateKeybdEvent (VK_CAPITAL, true);
generateKeybdEvent ('A', false);

唯一的效果是我的数字锁切换了。

为什么我不能向应用发送字符或数字?

注意我使用的是带有波兰语键盘布局的 Windows 7 和带有 MinGW 的 Qt。

【问题讨论】:

    标签: c++ windows keyboard


    【解决方案1】:

    VK_CAPITAL 不是扩展密钥。
    如果(vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93),则扩展密钥。

    ZeroMemory 也可以在此处省略,因此您的函数可能如下所示:

    KEYBDINPUT kb = {0};
    INPUT Input = {0};
    
    if ( (vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93) )
        kb.dwFlags = KEYEVENTF_EXTENDEDKEY;
    
    kb.wVk = vk;
    Input.type = INPUT_KEYBOARD;
    Input.ki = kb;
    
    SendInput(1, &Input, sizeof(Input));
    kb.dwFlags |= KEYEVENTF_KEYUP;
    SendInput(1, &Input, sizeof(Input));
    

    还有最重要的一点:问题可能不在此函数中。我猜输入已发送,但发送到错误的窗口。使用SetFocus 函数来引导这个输入(在调用SendInput 之前调用它)。

    您还应该检查SendInput pinvoke.net

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 2019-12-30
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多