1

我有将字符输入发送到另一个应用程序的应用程序。一切正常,但如果文本包含重复字符(例如“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);
}
4

1 回答 1

0

嗯..我自己找到了决定。但我仍然不知道为什么第一个代码不起作用。这是工作示例。如您所见 - 每个 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);
}
于 2013-02-08T06:34:50.477 回答