键盘的SendInput() - 仅大写

时间:2012-07-11 18:03:17

标签: winapi keyboard sendinput

非常好笑。我刚刚在几分钟前问SendInput() for keyboard - only lowercase,如何发信大写。解决方案是在发信之前发送班次。但是在转向开启后我无法将其关闭......

我正在努力使用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。

感谢。

1 个答案:

答案 0 :(得分:0)

问题在于

Input.mi.dwFlags

应该是

Input.ki.dwFlags

感谢罗德里戈。

另一种方法是使用KEYEVENTF_SCANCODE标志。然后我们必须使用VkKeyScan() - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx扫描我们的char,它以高字节为低字节和状态(shift,ctrl等)提供虚拟键码。

由于使用扫描码,我们必须使用MAPVK_VK_TO_VSC值的MapVirtualKey()将我们的虚拟代码映射到扫描代码,MSDN说:

  

uCode是一个虚拟密钥代码,并被转换为扫描代码。如果它   是一个虚拟键代码,不区分left-和   右手键,返回左侧扫描码。如果没有   翻译,函数返回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 ) );

如果我说错了,请纠正我。