SendInput隐藏重复的符号(似乎不执行KEYUP事件)
本文关键字:执行 KEYUP 事件 隐藏 符号 SendInput | 更新日期: 2023-09-27 17:57:59
我有一个将字符输入发送到另一个应用程序的应用程序。一切都很好,但如果文本包含重复字符(例如"app"),则只有一个字母"p"会到达目的地窗口。
发送"app"时,我收到"ap"。在网上搜索后,我发现这是因为错过了KEYUP事件。但我在下面的代码中肯定有一个。怎么了?
void SendText(string text)
{
int len = text.Length;
int inputsSize = len * 2;
INPUT[] inputs = new INPUT[inputsSize];
for (int i = 0; i < len; i++)
{
INPUT inp = new INPUT();
inp.type = 1; //INPUT_KEYBOARD;
inp.U.ki.dwFlags = KEYEVENTF.UNICODE;
inp.U.ki.time = 0;
inp.U.ki.wVk = 0;
inp.U.ki.wScan = (short)text[i];
inp.U.ki.dwExtraInfo = GetMessageExtraInfo();
inputs[i] = inp;
INPUT inpUp = inp;
inpUp.U.ki.dwFlags = KEYEVENTF.UNICODE | KEYEVENTF.KEYUP;
inputs[i + 1] = inpUp;
}
SendInput((uint)inputsSize, inputs, INPUT.Size);
}
嗯。。我自己找到了决定。但我仍然不知道为什么第一个代码不起作用。以下是工作示例。正如您所看到的,每个keyevent都是由单独的SendInput而不是一个keyevent包发送的。按我需要工作。
void SendText(string text)
{
int len = text.Length;
int inputsSize = len * 2;
//INPUT[] inputs = new INPUT[inputsSize];
INPUT[] inputs = new INPUT[1];
for (int i = 0; i < len; i++)
{
INPUT inp = new INPUT();
inp.type = 1; //INPUT_KEYBOARD;
inp.U.ki.dwFlags = KEYEVENTF.UNICODE;
inp.U.ki.time = 0;
inp.U.ki.wVk = 0;
inp.U.ki.wScan = (short)text[i];
inp.U.ki.dwExtraInfo = GetMessageExtraInfo();
//inputs[i] = inp;
inputs[0] = inp;
SendInput(1, inputs, INPUT.Size);
inp = new INPUT();
inp.type = 1; //INPUT_KEYBOARD;
inp.U.ki.dwFlags = KEYEVENTF.KEYUP | KEYEVENTF.UNICODE;
inp.U.ki.time = 0;
inp.U.ki.wVk = 0;
inp.U.ki.wScan = (short)text[i];
inp.U.ki.dwExtraInfo = GetMessageExtraInfo();
//inputs[i + 1] = inp;
inputs[0] = inp;
SendInput(1, inputs, INPUT.Size);
}
//SendInput((uint)inputsSize, inputs, INPUT.Size);
}