SendInput()在发送'['??时按下开始按钮C ++

时间:2014-02-26 10:21:20

标签: c++ visual-c++ virtual-keyboard

我正在制作一个程序,其中c ++自动为我按下键盘上的键。我用键盘上的每个键都做到了这一点。当我试图使用方括号'['时,它完美地工作除外。如果我告诉计算机打印出一个方括号,它会按预期打印出方括号,但它也会按下Windows开始按钮,因此打开开始菜单?经过一些调试后,我发现只有在SendInput函数用于RELEASE THE KEY后才会弹出开始菜单,而不是在按下它时。所以我的问题是为什么会发生这种情况? PS在任何人问之前,我的代码对于每个键都是100%正确的,所以我知道我正在使用的方法。

ip.ki.wVk = VK_OEM_4; // this is the '[' key
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT)); // the key has been pressed

ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT)); // the key is released, THE START MENU POPS UP!

1 个答案:

答案 0 :(得分:2)

我无法重现这一点,这是我的最小代码:

#include <Windows.h>

int main() {
    INPUT ip = {0};

    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = VK_OEM_4;

    Sleep(2000);

    SendInput(1, &ip, sizeof ip);

    ip.ki.dwFlags = KEYEVENTF_KEYUP;

    // Note: Adding some kind of delay here might be a good idea.

    SendInput(1, &ip, sizeof ip);

    return 0;
}

检查这是否适用于您是否存在程序问题或某种键盘布局问题。

这在我的电脑上正确按下[并且没有打开开始菜单,但请注意,这取决于键盘布局映射VK_OEM_4[,这可能不是这种情况一些布局。您可以使用VkKeyScanEx将字符转换为虚拟键代码。

有些人猜测你的程序为什么会像你描述的那样行事:也许你没有将INPUT结构归零(= {0}memset)并且它包含一些垃圾值,或者你是偶然模拟打开开始菜单时遇到的某种键组合,或者代码中可能存在其他错误,但由于没有显示完整的示例,因此无法判断,有很多可能性。

此外,如果您想发送字符,使用Unicode值可能更具可移植性:

#include <Windows.h>

int main() {
    INPUT ip = {0};

    ip.type = INPUT_KEYBOARD;
    ip.ki.dwFlags = KEYEVENTF_UNICODE;
    ip.ki.wScan = 0x5B; // unicode value for '['

    Sleep(2000);

    SendInput(1, &ip, sizeof ip);

    return 0;
}

无论键盘布局如何,这都有效,但技术上与模拟按键有点不同,所以使用它取决于你究竟想要做什么。