我做了一个程序,在电脑上输入一个字符串。一切正常,但我有两个问题: 1.当我放大写字母时,它不写大写字母。2.当我写两封相同的信时,其中一封没有写出来。我读了很多Windows文档,但什么也找不到。有人能帮我解决这些问题吗?
#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");
}发布于 2021-12-21 14:46:24
VkKeyScan返回16位信息,上面8是关于需要按哪个修饰符键的信息,在您的例子中,最有可能是“shift”。KEYEVENTF_KEYUP来释放键。KEYEVENTF_UNICODE标志的文本输入,这样就不必处理键盘移位状态。只使用Unicode标志很容易。手动设置键盘状态容易出错,这是一种半心半意的尝试:
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);
}https://stackoverflow.com/questions/70437084
复制相似问题