2012-07-11 109 views
0

非常有趣。我剛纔在這裏問幾分鐘前這裏SendInput() for keyboard - only lowercase,如何發信大寫。解決的辦法是在信件發送前發送轉移。但轉彎移載上我不能把它關掉...SendInput()用於鍵盤 - 只有大寫

後,我與這樣的KEYEVENTF_KEYUP標誌努力:

INPUT Input = { 0 }; 
Input.type  = INPUT_KEYBOARD; 
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY; 
Input.ki.wVk = VK_LSHIFT; 
SendInput(1, &Input, sizeof(INPUT)); 

Input.type  = INPUT_KEYBOARD; 
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY; 
Input.ki.wVk = 'A'; 
SendInput(1, &Input, sizeof(INPUT)); 

Input.type  = INPUT_KEYBOARD; 
Input.mi.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY; 
Input.ki.wVk = VK_LSHIFT; 
SendInput(1, &Input, sizeof(INPUT)); 

Input.type  = INPUT_KEYBOARD; 
Input.mi.dwFlags = KEYEVENTF_EXTENDEDKEY; 
Input.ki.wVk = 'A'; 
SendInput(1, &Input, sizeof(INPUT)); 

,但它似乎不工作。它總是發送AA。

謝謝。

+0

左移鍵不是KEYEVENTF_EXTENDEDKEY。 A也不是。 – 2012-07-11 19:02:48

+0

此外,你發送「下」A「兩次。 – 2012-07-11 19:14:46

回答

0

的問題是與

Input.mi.dwFlags 

應該

Input.ki.dwFlags 

感謝羅德里戈。

另一種方法是使用KEYEVENTF_SCANCODE標誌。然後,我們必須使用VkKeyScan() - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx掃描我們的字符,這使我們能夠在低字節和高字節狀態(shift,ctrl等)中獲得虛擬鍵碼。

由於我們有映射我們的虛擬代碼使用MapVirtualKey()與MAPVK_VK_TO_VSC值掃描代碼中使用的掃描碼,MS​​DN說:

UCODE是一個虛擬鍵碼,並將其轉換掃描碼。如果它 是一個虛擬鍵代碼,它不區分左側鍵和 右側鍵,則返回左側掃描代碼。如果沒有 翻譯,函數返回0

,然後將它傳遞給Input.ki結構的wScan領域,因爲根據MSDN如果我們使用的掃描碼它忽略WVK並使用wScan,MSDN說:

如果指定,wScan標識密鑰和wVk被忽略。

因此,代碼可以是這個樣子:

INPUT Event = { 0 }; 

const SHORT key = VkKeyScan('a'); 
const UINT mappedKey = MapVirtualKey(LOBYTE(key), 0); 

// Press shift key 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = KEYEVENTF_SCANCODE; 
Event.ki.wScan = MapVirtualKey(VK_LSHIFT, 0); 
SendInput(1, &Event, sizeof(Event)); 

// upper case 'A' (press down) 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = KEYEVENTF_SCANCODE; 
Event.ki.wScan = mappedKey; 
SendInput(1, &Event, sizeof(Event)); 

// release 'A' 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; 
Event.ki.wScan = mappedKey; 
SendInput(1, &Event, sizeof(Event)); 

// Release shift key 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; 
Event.ki.wScan = MapVirtualKey(VK_LSHIFT, 0); 
SendInput(1, &Event, sizeof(Event)); 

const SHORT key1 = VkKeyScan('a'); 
const UINT mappedKey1 = MapVirtualKey(LOBYTE(key1), 0); 

// lower case 'a' (press down) 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = KEYEVENTF_SCANCODE; 
Event.ki.wScan = mappedKey1; 
SendInput(1, &Event, sizeof(Event)); 

// release 'a' 
Event.type = INPUT_KEYBOARD; 
Event.ki.dwFlags = KEYEVENTF_SCANCODE; 
Event.ki.wScan = mappedKey1; 
SendInput(1, &Event, sizeof(Event)); 

如果我說了一些錯誤,歡迎指正。

+1

您已經錯過了SendInput的全部要點,即放入不能被實際輸入事件中斷的輸入事件的數組。 – 2013-09-06 18:00:13

+0

您忘記了放置一元OR KEYEVENTF_KEYUP來釋放'a'。 @tobi,檢查我的編輯 – xiriusly 2013-10-03 07:23:49