SendInput()键盘 - 只有大写(SendInput() for keyboard - on

2019-07-30 09:29发布

相当有趣。 我刚才问几分钟前这里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。

谢谢。

Answer 1:

问题是与

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 ) );

如果我说错了,请大家指正。



文章来源: SendInput() for keyboard - only uppercase