简体   繁体   English

SendInput不发送字符或数字

[英]SendInput doesn't send chars or numbers

I've got something like that: 我有类似的东西:

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));
}

When I send inputs 'A', CapsLock, 'A': 当我发送输入“ A”,CapsLock,“ A”时:

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

The only effect is that my num lock toggles. 唯一的效果是我的数字锁定切换了。

Why I cant send characters or numbers to apps? 为什么我无法向应用程序发送字符或数字?

Note I'm using Windows 7 with Polish keyboard layout and Qt with MinGW. 注意我正在使用Windows 7波兰语键盘布局和Qt与MinGW。

VK_CAPITAL is not extended key. VK_CAPITAL不是扩展密钥。
Key is extended if (vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93) 如果(vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93)则扩展键 (vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93) . (vk >= 33 && vk <= 46) || (vk >= 91 && vk <= 93)

Also ZeroMemory can be omitted here, so your function could look like this: 另外, 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));

And the most important thing: Problem is probably not in this function . 最重要的是: 问题可能不在此功能中 I guess that input is sent, but to the wrong window. 我猜输入已发送,但发送到错误的窗口。 Use SetFocus function to direct this input (call it before you call SendInput ). 使用SetFocus函数来定向此输入(在调用SendInput之前先调用它)。

You should also check SendInput on pinvoke.net 您还应该在pinvoke.net上检查SendInput

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM