键盘的SendInput()-仅大写 [英] SendInput() for keyboard - only uppercase

查看:150
本文介绍了键盘的SendInput()-仅大写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

很有趣.几分钟前我刚刚在这里问过 SendInput()用于键盘-仅小写,如何发送字母大写.解决的办法是先换班.但是在打开换档后我无法将其关闭...

Quite funny. I just asked few minutes ago here SendInput() for keyboard - only lowercase, how to send letters upper case. The solution was to send shift before letter. But after turning shift on I can't turn it off...

我正在尝试使用KEYEVENTF_KEYUP标志,如下所示:

I'm trying hard with KEYEVENTF_KEYUP flag like this:

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.

but it seems to not work at all. It always sends AA.

谢谢.

推荐答案

问题出在

Input.mi.dwFlags

应该是

Input.ki.dwFlags

感谢Rodrigo.

另一种方法是使用KEYEVENTF_SCANCODE标志.然后,我们必须使用VkKeyScan()- http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v = vs.85).aspx ,它为我们提供了低字节和低状态的虚拟密钥代码(移位,Ctrl等)的高字节.

Another way is to use KEYEVENTF_SCANCODE flag. Then we have to scan our char using VkKeyScan() - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx, which gives us virtual key code in low byte and state (shift, ctrl etc.) in high byte.

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

Due to using scan codes we have to map our virtual code to scan code by using MapVirtualKey() with MAPVK_VK_TO_VSC value, MSDN says:

uCode是虚拟密钥代码,并被转换为扫描代码.如果它 是不区分左键和左键的虚拟键代码 右键,则返回左扫描代码.如果没有 翻译后,该函数返回0.

uCode is a virtual-key code and is translated into a scan code. If it is a virtual-key code that does not distinguish between left- and right-hand keys, the left-hand scan code is returned. If there is no translation, the function returns 0.

然后将其传递到Input.ki结构的wScan字段,因为根据MSDN,如果我们使用扫描代码,它将忽略wVk并使用wScan,MSDN说:

and then pass it to the wScan field of the Input.ki structure, because according to MSDN if we use scan codes it ignores wVk and uses wScan, MSDN says:

如果已指定,则wScan会识别密钥,而wVk将被忽略.

If specified, wScan identifies the key and wVk is ignored.

因此,代码看起来可能像这样:

Therefore the code can look something like this:

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

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

If I have said something wrong, please correct me.

这篇关于键盘的SendInput()-仅大写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆