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);
}

SendInput隐藏重复的符号(似乎不执行KEYUP事件)

嗯。。我自己找到了决定。但我仍然不知道为什么第一个代码不起作用。以下是工作示例。正如您所看到的,每个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);
}