2012-07-11 97 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