问题在于
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 值将我们的虚拟代码映射到扫描码,MSDN 说:
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 ) );
如果我说错了,请纠正我。