键盘模拟失败

时间:2016-03-11 20:05:06

标签: c arrays winapi random keyboard

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

{
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]

这让我很困惑..

2 个答案:

答案 0 :(得分:1)

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

<source>

此处为ip.ki.wVk = arrayNum; 字段is supposed to be a WORD representing the virtual key code to send。但是,您已为其分配了wVk,它是arrayNum数组。基于你的代码,我认为你的意思是

WORD

因为你没有在任何地方使用ip.ki.wVk = arrayNum[RandIndex]; 。展望未来,我建议编译警告级别一直向上,因为它可能会标记代码中不使用RandIndex

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

答案 1 :(得分:0)

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

ip.ki.wVk = arrayNum[RandIndex]; 

话虽这么说,我建议在使用KEYEVENTF_UNICODE发送文字字符时使用SendInput()标记,不要使用虚拟密钥代码。你应该在INPUT的一次调用中传递2 SendInput()个结构,就像@IInspectable建议的那样。不要为每个SendInput()致电INPUT两次,这会失去使用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));