首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C Windows API键盘

C Windows API键盘
EN

Stack Overflow用户
提问于 2021-12-21 14:30:51
回答 1查看 74关注 0票数 0

我做了一个程序,在电脑上输入一个字符串。一切正常,但我有两个问题: 1.当我放大写字母时,它不写大写字母。2.当我写两封相同的信时,其中一封没有写出来。我读了很多Windows文档,但什么也找不到。有人能帮我解决这些问题吗?

代码语言:javascript
复制
#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 = INPUT_KEYBOARD;
        inputStruct[i].ki.wVk = VkKeyScanA(str[i]);
    }

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

int main()
{
    keyboard("hoe is het");
}
EN

回答 1

Stack Overflow用户

发布于 2021-12-21 14:46:24

  • VkKeyScan返回16位信息,上面8是关于需要按哪个修饰符键的信息,在您的例子中,最有可能是“shift”。
  • 每个字符至少需要2个输入事件,最后一个需要设置KEYEVENTF_KEYUP来释放键。
  • 可以模拟带有KEYEVENTF_UNICODE标志的文本输入,这样就不必处理键盘移位状态。

只使用Unicode标志很容易。手动设置键盘状态容易出错,这是一种半心半意的尝试:

代码语言:javascript
复制
void SendTextInputASCII(LPCTSTR str)
{
    SIZE_T i;
    INPUT ki[2];
    ZeroMemory(&ki, sizeof(ki));
    for (i = 0; str[i]; ++i)
    {
        ki[0].type = INPUT_KEYBOARD;
        ki[0].ki.dwFlags = KEYEVENTF_UNICODE;
        ki[0].ki.wScan = str[i]; // TODO: To properly support non-ASCII you need to fill this with the correct Unicode codepoint.
        ki[1] = ki[0];
        ki[1].ki.dwFlags |= KEYEVENTF_KEYUP;
        SendInput(2, ki, sizeof(INPUT));
    }
}

void SendCharacterInput(TCHAR ch)
{
    UINT info = VkKeyScan(ch), wantshift, hadshift;
    INPUT ki[2];
    ZeroMemory(&ki, sizeof(ki));
    hadshift = GetAsyncKeyState(VK_SHIFT) < 0;
    wantshift = HIBYTE(info) & 1;
    if (wantshift != hadshift)
    {
        ki[0].type = INPUT_KEYBOARD;
        ki[0].ki.dwFlags = hadshift ? KEYEVENTF_KEYUP : 0;
        ki[0].ki.wVk = VK_LSHIFT;
        SendInput(1, ki, sizeof(INPUT));
    }
    // TODO: Should also handle Control and Alt keys!
    ki[0].type = INPUT_KEYBOARD;
    ki[0].ki.dwFlags = 0;
    ki[0].ki.wVk = LOBYTE(info);
    ki[1] = ki[0];
    ki[1].ki.dwFlags |= KEYEVENTF_KEYUP;
    SendInput(2, ki, sizeof(INPUT));
    if (wantshift != hadshift)
    {
        ki[0].type = INPUT_KEYBOARD;
        ki[0].ki.dwFlags = wantshift ? KEYEVENTF_KEYUP : 0;
        ki[0].ki.wVk = VK_LSHIFT;
        SendInput(1, ki, sizeof(INPUT));
    }
}

void SendCharactersInput(LPCTSTR str)
{
    SIZE_T i;
    for (i = 0; str[i]; ++i)
        SendCharacterInput(str[i]);
}

void Example()
{
    LPCTSTR text = TEXT("Hello World\n");
    WinExec("Notepad.exe", SW_SHOW);
    Sleep(2000);

    SendTextInputASCII(text);
    SendCharactersInput(text);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70437084

复制
相关文章

相似问题

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