gpt4 book ai didi

c++ - SendInput() 不是 "sending"正确的移位字符吗?

转载 作者:可可西里 更新时间:2023-11-01 18:27:44 26 4
gpt4 key购买 nike

void WriteChar(char c)
{
INPUT input = {0};
input.type = INPUT_KEYBOARD;
input.ki.wVk= VkKeyScanEx(c, GetKeyboardLayout(0) ) ;
SendInput(1,&input, sizeof(INPUT));
}

VkKeyScanEx 为 '/' 和 '?'(相同的键)返回不同的键码,但是如果您尝试使用此方法写入包含 '?' 的消息,它只会写入 '/'。我不知道发生了什么。 ';' 也会发生同样的事情和“:”。

键码和扫码部分看不懂。大多数字符都有一个虚拟键码,但是我找不到类似的问号。它们必须存在,但没有列出?

最佳答案

扫描码是从键盘返回的原始键 ID。因此,101 键键盘(理论上)将具有 101 个可以返回的唯一扫描码。 (见脚注 1)

虚拟键码是一组独立的代码,代表理想化键盘上的一个键。无论 TAB 键在真实键盘的哪个位置,以及使用什么扫描码,虚拟键码始终为 VK_TAB。 windows.h为不可打印的虚拟键定义了VK_xxx编码,对于可打印的虚拟键,虚拟键码与ASCII值相同。

但虚拟键码仍然是键码。 'A' 和 'a' 具有相同的虚拟键码,因此如果您想发送 'A',则必须向下发送 VK_SHIFT,然后向下发送 'a',然后向上发送 'a',然后向上发送 VK_SHIFT。

VkKeyScanEx() 将字符转换为扫描键和移位状态 请参阅本页下面的引用 http://msdn.microsoft.com/en-us/library/ms646332(VS.85).aspx

If the function succeeds, the low-order byte of the return value contains the virtual-key code and the high-order byte contains the shift state, which can be a combination of the following flag bits.

所以您不能只从 VkKeyScanEx() 获取返回值,您需要检查它是否标记了 shift 键。并将 shift 键作为单独的击键

发送
SHORT vk = VkKeyScanEx(c, ...);
if (vk & 0x100) // check upper byte for shift flag
{
// send a shift key down
}
if (vk & 0x200) // check for ctrl flag
{
// send a ctrl key down
}
input.ki.wVk = vk & 0xFF;

// send keyup for each of the keydown

您还必须为每个按键发送一个按键。

脚注:

1 这只是理论上的,在实践中,标准 PC 键盘模拟了您甚至无法再使用的旧 IBM 键盘,因此某些键可以根据另一个键返回 2 个不同的扫描码,而在其他情况下,两个键可以返回相同的扫描码。

关于c++ - SendInput() 不是 "sending"正确的移位字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com