keybd_event显示奇怪的行为

时间:2014-04-30 05:19:45

标签: c++ windows winapi

我正在尝试使用以下代码模拟输入按键:

keybd_event(VK_RETURN , 0, 0, 0);
keybd_event(VK_RETURN , 0, KEYEVENTF_KEYUP, 0);

它在我的32位Windows XP操作系统中运行良好但是当我在Windows 8 x64机器上尝试时,模拟空格键按键而不是输入键。

我该怎么做才能得到正确的结果?

我也尝试使用SendInput,如下所示,但我面临同样的问题。

void typeKey(short virtualKey)
{

 INPUT ip;
 ip.type = INPUT_KEYBOARD;
 ip.ki.wScan = 0; 
 ip.ki.time = 0;
 ip.ki.dwExtraInfo = 0;
 ip.ki.wVk = virtualKey; // virtual-key code for the character
 ip.ki.dwFlags = 0;
 SendInput(1, &ip, sizeof(INPUT));
 ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
 SendInput(1, &ip, sizeof(INPUT));
}

//function call
typeKey(VK_RETURN);

注意:我正在XP机器上编译32位可执行文件,并在Windows 8上使用相同的可执行文件。

2 个答案:

答案 0 :(得分:0)

这只是一个有根据的猜测,但您的旧函数使用长度从x86到x64不同的参数类型。这可能是个问题。聆听说:

的文档
  

注意此功能已被取代。请改用SendInput

答案 1 :(得分:0)

我在64位Windows 8.1上确认您的观察结果。出于某种原因,VK_RETURN无法与SendInput()一起正常工作。

解决方案似乎是提供扫描码,如下所示:

ip.ki.wScan = MapVirtualKey(virtualKey, MAPVK_VK_TO_VSC);