Tastendruckereignis mit SendInput mit C # simulieren

Befolgen Sie die Ratschläge aus diesem Thread:Unterscheiden Sie zwischen dem realen und virtuellen Tastendruck der Tastatur

Ich versuche, ein Programm zu erstellen, mit dem die Tastendruckereignisse der Tastatur gesendet werdenSendInput () Methode.

Das Problem ist jedoch, dass, wenn ich versuche, ein Tastendruckereignis zu simulieren, überhaupt nichts passiert. Soweit ist das mein Code:

<code>    [DllImport("user32.dll")]
    static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);

    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
        public short wScan; public int dwFlags;
        public int time; public IntPtr dwExtraInfo;
    }

    [StructLayout(LayoutKind.Explicit)]
    struct INPUT
    {
        [FieldOffset(0)] public int type;
        [FieldOffset(8)]  public KEYBDINPUT ki; //x64 - 8, x32 - 4
    }

    const int KEYEVENTF_DOWN = 0; //key UP
    const int KEYEVENTF_EXTENDEDKEY = 0x0001;
    const int KEYEVENTF_KEYUP = 0x0002; //key UP
    const int KEYEVENTF_UNICODE = 0x0004;
    const int KEYEVENTF_SCANCODE = 0x0008; // scancode

    public void Send_Key(short Keycode)
    {
        INPUT[] InputData = new INPUT[1];
        InputData[0].type = 1;
        InputData[0].ki.wScan = Keycode;
        InputData[0].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
        InputData[0].ki.time = 0;
        InputData[0].ki.dwExtraInfo = IntPtr.Zero;
        SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT)));
    }
</code>

Um die Scancodes zu entschlüsseln, habe ich das Programm heruntergeladen, das in diesem Thread vorgeschlagen wurde:

https://superuser.com/questions/293609/windows-7-tool-to-capture-keyboard-scan-codes

Laut diesem Programm lautet der Code einer Taste für meine Tastatur "65".

Mein Programm soll ein Tastendruckereignis auslösen, wenn der Text im Textfeld geändert wird. Wenn Sie also "q" eingeben, ändert sich der Text in "q" plus dem Ergebnis von send_key (), d. H. "Qa":

<code>    private void textBox2_TextChanged(object sender, EventArgs e)
    {
        Send_Key(0x0065); // nothing happens (0x65 also fails)
    }
</code>

Was mache ich falsch? In Zukunft werde ich diesen Code ändern, damit ich die Haltezeit (zwischen DOWN- und UP-Ereignissen) festlegen kann. aber im Moment simuliere ich zu Testzwecken nur das keyUP-Ereignis.

BEARBEITEN: Hans, nach deinem Rat ist hier die Bearbeitung - aber es klappt leider nicht.

<code> public void Send_Key(short Keycode)
        {
            INPUT[] InputData = new INPUT[1];
            InputData[0].type = 1;
            InputData[0].ki.wScan = Keycode;
            InputData[0].ki.dwFlags = KEYEVENTF_DOWN;
            InputData[0].ki.time = 0;
            InputData[0].ki.dwExtraInfo = IntPtr.Zero;

            uint intReturn = SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT)));

            if (intReturn == 0) //!=1
            {
                throw new Exception("Could not send keyDOWN: " + Keycode);
            }

            INPUT[] InputData2 = new INPUT[1];
            InputData2[0].type = 1;
            InputData2[0].ki.wScan = Keycode;
            InputData2[0].mi.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
            InputData2[0].ki.time = 0;
            InputData2[0].ki.dwExtraInfo = IntPtr.Zero;

            uint intReturn2 = SendInput(1, InputData2, Marshal.SizeOf(typeof(INPUT)));

            if (intReturn2 == 0) //!=1
            {
                throw new Exception("Could not send keyUP: " + Keycode);
            }
        }
</code>

keine fehler .. und keine ausgabe.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage