【问题标题】:C keyboard eventsC 键盘事件
【发布时间】:2022-01-22 21:04:13
【问题描述】:

这是我第一次使用 C 在 Windows API 中编程。我制作了这个简单的程序,它接受一个字符串并在您的计算机上再次键入它。我认为这可以更好地实现,因为我有很多 ifelse if 语句。我的问题是:这是构建这样一个程序的好方法吗?有没有更好的方法来做同样的事情?

#include <stdio.h>
#include <windows.h>

void keyboard(char *str)
{
    int x = strlen(str);

    INPUT inputStruct[x];
    ZeroMemory(inputStruct, sizeof(inputStruct));

    for (int i = 0; i < x; i++)
    {
        inputStruct[i].type = 1;

        if (str[i] == 'a')
            inputStruct[i].ki.wVk = 0x41;
        else if (str[i] == 'b')
            inputStruct[i].ki.wVk = 0x42;
        else if (str[i] == 'c')
            inputStruct[i].ki.wVk = 0x43;
        else if (str[i] == 'd')
            inputStruct[i].ki.wVk = 0x44;
        else if (str[i] == 'e')
            inputStruct[i].ki.wVk = 0x45;
        else if (str[i] == 'f')
            inputStruct[i].ki.wVk = 0x46;
        else if (str[i] == 'g')
            inputStruct[i].ki.wVk = 0x47;
        else if (str[i] == 'h')
            inputStruct[i].ki.wVk = 0x48;
        else if (str[i] == 'i')
            inputStruct[i].ki.wVk = 0x49;
        else if (str[i] == 'j')
            inputStruct[i].ki.wVk = 0x4A;
        else if (str[i] == 'k')
            inputStruct[i].ki.wVk = 0x4B;
        else if (str[i] == 'l')
            inputStruct[i].ki.wVk = 0x4C;
        else if (str[i] == 'm')
            inputStruct[i].ki.wVk = 0x4D;
        else if (str[i] == 'n')
            inputStruct[i].ki.wVk = 0x4E;
        else if (str[i] == 'o')
            inputStruct[i].ki.wVk = 0x4F;
        else if (str[i] == 'p')
            inputStruct[i].ki.wVk = 0x50;
        else if (str[i] == 'q')
            inputStruct[i].ki.wVk = 0x51;
        else if (str[i] == 'r')
            inputStruct[i].ki.wVk = 0x52;
        else if (str[i] == 's')
            inputStruct[i].ki.wVk = 0x53;
        else if (str[i] == 't')
            inputStruct[i].ki.wVk = 0x54;
        else if (str[i] == 'u')
            inputStruct[i].ki.wVk = 0x55;
        else if (str[i] == 'v')
            inputStruct[i].ki.wVk = 0x56;
        else if (str[i] == 'w')
            inputStruct[i].ki.wVk = 0x57;
        else if (str[i] == 'x')
            inputStruct[i].ki.wVk = 0x58;
        else if (str[i] == 'y')
            inputStruct[i].ki.wVk = 0x59;
        else if (str[i] == 'z')
            inputStruct[i].ki.wVk = 0x5A;
        else if (str[i] == ' ')
            inputStruct[i].ki.wVk = 0x20;
    }

    SendInput(x, inputStruct, sizeof(INPUT));
}

int main()
{
    keyboard("this is my test program");
}

【问题讨论】:

  • “有没有更好的方法来做同样的事情?”使用查找表。并且不要使用 1989 年的概念,例如没有返回类型的 main()conio.h
  • 什么是查找表?感谢您的帮助!
  • 您可能可以使用if ((str[i] == ' ') || islower((unsigned char)str[i])) inputStruct[i].ki.wVk = str[i];。请注意,超出范围的输入会将 inputStruct 保留为 zero

标签: c windows api events keyboard


【解决方案1】:

你可以使用

VkKeyScan

为了将您的字符转换为虚拟键代码

那就试试吧

inputStruct[i].ki.wVk = VkKeyScan(str[i]);

而不是像下面这样的一堆 if 子句

if (str[i] == ' ')
    inputStruct[i].ki.wVk = 0x20

所以最终代码如下所示

for (int i = 0; i < x; i++)
{
    inputStruct[i].type = 1;
    inputStruct[i].ki.wVk = VkKeyScan(str[i]);
}

您可以在发送键之前按shift,然后发送您希望被按下的键作为大写

下面的代码是你的第二个目的的演示

INPUT inputs[4] = { 0 };
ZeroMemory(inputs, sizeof(inputs));

inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_LSHIFT;

inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VkKeyScan(L'a');

inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = VkKeyScan(L'a');
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;

inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_LSHIFT;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;

UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));

【讨论】:

  • 如何让程序写大写字母?
  • 字母字符的取值范围是'a' - 'z' (97-122) 和'A' - 'Z'。 (65 - 90)。谷歌 ASCII 表。
  • @angelicasa 我已经为您的第二个目的编辑了答案
猜你喜欢
  • 2017-05-29
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多