【问题标题】:SendInput() pressing the start button when sending '[' ?? c++SendInput() 发送'['时按下开始按钮?? C++
【发布时间】:2014-03-29 02:25:32
【问题描述】:

我正在制作一个程序,其中 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!

【问题讨论】:

  • 你在使用 WinAPI 吗?也许您也应该放置按键事件,Windows 需要它来释放按键
  • 这些都是戳键的变幻莫测,你很容易成为键盘状态的受害者。按 Ctrl+[ 是一种生成 Escape 控制代码的方法。并且 Ctrl+Escape 激活“开始”菜单。类似的东西。
  • 请提供更多代码。可能结构设置不正确。

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


【解决方案1】:

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

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

检查这是否对您有用,看看它是您的程序问题还是某种键盘布局问题。

这会在我的 PC 上正确按下 [ 并且不会打开开始菜单,但请注意,它取决于键盘布局映射 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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多