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



所以你不能只从 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

您还必须为每个 keydown 发送一个 keyup。

脚注:

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

10-08 08:21