2014-10-19 79 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

相關問題