2014-10-19 107 views
0

我想按住一个不确定的时间并在此之后释放它。 伪代码:在不确定的时间持续按下一个按键

SendKey(VK_RIGHT, KEY_DOWN); 

// Do something 

SendKey(VK_RIGHT, KEY_UP) 

我使用Visual Studio 2012和Windows 7 64位。 我已经搜查了大量的时间和尝试是这样的:

#include <Windows.h> 
#include <WinUser.h> 
using namespace std; 

[...] 

INPUT Event = {0}; 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = 0; 
Event.ki.wScan = ::MapVirtualKey(VK_RIGHT, MAPVK_VK_TO_VSC); 
Event.ki.time = 2000;         // hold 2 sek. ? 
Event.ki.dwExtraInfo = 0; 
Event.ki.wVk = VK_RIGHT;         // (Right-Arrow) 

SendInput(1, &Event, sizeof(Event));  // hold 
Sleep(1000);        // do something (waiting in this case) 
Event.ki.dwFlags = KEYEVENTF_KEYUP;   // release 
SendInput(1, &Event, sizeof(Event)); 

但这并没有工作,没有料到,我不知道什么是错。 按键正确按下,但没有按住。 在此先感谢。

+0

只是一个观察,你应该使用'VK_'符号而不是幻数。 – 2014-10-19 16:37:43

回答

0

根据documentationtime字段是时间戳而不是持续时间(请参阅here)。该文档实际上没有说出由于某种原因时间戳的格式。我总是使用0作为这个值,它让系统选择适当的时间戳。

我也相信你将需要设置:

Event.ki.dwFlags = KEYEVENTF_EXTENDEDKEY; 
... 
Event.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY; 

的箭头键码的工作。

此外,与上述Captain一样,使用适当的VK_宏(VK_LEFT)。请注意,0x27实际上定义为VK_RIGHT,这可能是您的代码中的另一个问题。

+1

“时间”成员允许输入源(通常是硬件设备)在输入事件旁边发送时间信息。窗口管理器使用此信息来执行诸如检测双击之类的操作。保存时间信息以使事件的处理对延迟更具适应性是有用的。它不能用于延迟合成输入的播放。附加信息:[当您使用SendInput合成输入时,您也在合成时间戳](http://blogs.msdn.com/b/oldnewthing/archive/2012/11/01/10364713.aspx)。 – IInspectable 2014-10-19 21:16:36

相关问题