سؤال

I have app that sends character input into another app. Everything goes fine, but if text contain repeating characters (for example "app") then only one letter 'p' will arrive into destination window.

When sending "app" i receive "ap". After searching the web i've found that this is because missing KEYUP event. But i definitely have one in the code below. What's wrong?

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);
}
هل كانت مفيدة؟

المحلول

Hm.. I've found decision myself. But I still don't know why first code didn't work. Here's working example. As you can see - each keyevent is sent by separate SendInput instead of one keyevent package. Works as i needed.

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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top