首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SendInput()表示仅键盘大写

SendInput()表示仅键盘大写
EN

Stack Overflow用户
提问于 2012-07-12 02:03:17
回答 1查看 5.9K关注 0票数 1

很好笑。我几分钟前刚刚在这里问过SendInput() for keyboard - only lowercase,如何发送大写字母。解决方案是在字母之前发送shift。但在打开shift后我无法关闭它...

我正在努力使用KEYEVENTF_KEYUP标志,如下所示:

代码语言:javascript
复制
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。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-12 03:20:14

问题出在

代码语言:javascript
复制
Input.mi.dwFlags

它应该是

代码语言:javascript
复制
Input.ki.dwFlags

感谢罗德里戈。

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

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

uCode是一个虚拟键码,它被翻译成一个扫描码。如果它是不区分左键和右键的虚拟键代码,则返回左侧扫描代码。如果没有转换,该函数将返回0。

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

如果指定,则wScan标识密钥,而忽略wVk。

因此,代码可能如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11438677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档