【问题标题】:Keyboard simulation fail键盘模拟失败
【发布时间】:2016-06-27 05:07:02
【问题描述】:

我正在制作一个程序,我需要它从数组中输入一个随机字母。这就是我尝试这样做的方式:

{
srand ( time(NULL) );
WORD arrayNum[4] = {0x41, 0x42, 0x43, 0x44};
int RandIndex = rand() % 4;

INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.wVk = arrayNum; 
ip.ki.dwFlags = 0; 
SendInput(1, &ip, sizeof(INPUT));
ip.ki.dwFlags = KEYEVENTF_KEYUP; 
SendInput(1, &ip, sizeof(INPUT));
}

我必须说我是新手,我真的不知道该怎么办。我得到的错误是:

invalid conversion from 'WORD* {aka short unsigned int*}' to 'WORD {aka short unsigned int}' [-fpermissive]

这让我很困惑..

【问题讨论】:

  • 使用1nInputs 参数连续调用SendInput 完全违背了它的目的。你可以继续使用keybd_event 并遭受SendInput 打算解决的问题。

标签: c arrays winapi random keyboard


【解决方案1】:

我认为这里的问题在于这一行:

ip.ki.wVk = arrayNum;

这里是wVk 字段is supposed to be a WORD representing the virtual key code to send。但是,您已为其分配了arrayNum,它是WORDs 的数组。根据您的代码,我认为您的意思是

ip.ki.wVk = arrayNum[RandIndex];

因为您没有在任何地方使用RandIndex。展望未来,我建议编译时将警告级别调高,因为它可能会标记代码中未使用 RandIndex

(另外,如果您确实在 Stack Overflow 上提出了更多问题,请尝试包含有关错误消息的更多信息。我必须查找文档以确定特定错误发生在哪一行。这对人们来说容易得多如果他们能看到问题所在的具体线路,请提供帮助。)

【讨论】:

  • 这只能如图所示工作,因为虚拟键代码VK_A..VK_D 发生与ASCII字符A..@具有相同的数值987654333@。使用SendInput() 发送文本时,您应该考虑使用KEYEVENTF_UNICODE 标志发送实际的Unicode 字符。
【解决方案2】:

当您应该传递数组的特定元素时,您将实际数组本身传递给wVk

ip.ki.wVk = arrayNum[RandIndex]; 

话虽如此,我建议在使用SendInput() 发送文本字符时使用KEYEVENTF_UNICODE 标志,不要使用虚拟键码。你应该在一次调用SendInput() 时传递 2 个INPUT 结构,就像@IInspectable 建议的那样。不要为每个INPUT 调用两次SendInput(),这会破坏使用SendInput() 的一些好处:

srand ( time(NULL) );
LPCWSTR chars = L"ABCD";
int RandIndex = rand() % 4;

INPUT ip[2];
memset(ip, 0, sizeof(ip));

ip[0].type = INPUT_KEYBOARD;
ip[0].ki.wScan = (WORD) chars[RandIndex]; 
ip[0].ki.dwFlags = KEYEVENTF_UNICODE;

memcpy(&ip[1], &ip[0], sizeof(INPUT));
ip[1].ki.dwFlags |= KEYEVENTF_KEYUP; 

SendInput(2, ip, sizeof(INPUT));

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2012-03-13
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多