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

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

我正在制作一个程序,其中 C++ 自动为我按下键盘上的键。我对键盘上的每个键都这样做了。除了我尝试使用方括号“[”之外,它工作得很好。如果我告诉计算机打印出一个方括号,它会按预期打印出方括号,但它也会按下 Windows 开始按钮,因此打开开始菜单?经过一些调试后,我发现开始菜单仅在使用 SendInput 函数释放键后弹出,而不是在按下时弹出。所以我的问题是为什么会这样? 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!

最佳答案

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

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

无论键盘布局如何,这都可以工作,但在技术上与模拟按键有点不同,因此使用它取决于你到底想做什么。

关于c++ - SendInput() 发送 '[' 时按下开始按钮 ?? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038338/

相关文章:

c++ - 从数组中读取值有困难

c++ - 如何在我自己的代码中使用 _DEBUG_ERROR?

python - 在 Python 中查找最相似的形状

c++ - 失败和错误的类型转换

c++ - 新建和删除混淆

c++ - 同一函数的模板化和非模板化版本是否被视为重载?

visual-studio - Visual Studio 不允许我使用某些变量名

c++ - 给定表达式 : `cond ? *this : throw()` 返回对类型的引用时出错

javascript - 黑莓网络工程 : strange behavior when closing the keyboard