15 Stimmen

SendKeys Alternative, die unter Citrix funktioniert

Vor kurzem habe ich für einen Kunden eine Anwendung für eine virtuelle Tastatur entwickelt. Das Programm funktioniert gut mit fast allen Programmen, aber bestimmte Befehle wie {ENTER} o {DEL} arbeiten nicht mit Citrix zusammen. Gibt es einen Workaround oder eine Alternative zu SendKeys ?

Edit 1: Ich habe die SendInput-Methode ausprobiert (Windows Input Simulator verwendet SendInput) und die DEL-Taste sowie die Pfeiltasten funktionieren immer noch nicht. Die ENTER-Taste funktioniert jedoch.

Edit 2: Das Problem wurde gelöst. Getestet mit zwei verschiedenen Versionen von Citrix. Diese Frage hat mir sehr geholfen. :

Citrix Thin Clients verwendet den scancode Parameter von keybd_event, auch wenn MS sagt sagt, dass er unbenutzt ist und 0 sein sollte. Sie müssen müssen auch den physischen scancode angeben damit der Citrix-Client ihn erhält. Der Citrix-Client hat auch ein großes Problem mit Tastatureingaben, die mit der SendInput API.

Ich änderte den Code in Windows-Eingabe-Simulator :

// Function used to get the scan code
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);

/// <summary>
/// Calls the Win32 SendInput method ...
/// </summary>
/// <param name="keyCode">The VirtualKeyCode to press</param>
public static void SimulateKeyPress(VirtualKeyCode keyCode)
{
    var down = new INPUT();
    down.Type = (UInt32)InputType.KEYBOARD;
    down.Data.Keyboard = new KEYBDINPUT();
    down.Data.Keyboard.Vk = (UInt16)keyCode;
    // Scan Code here, was 0
    down.Data.Keyboard.Scan = (ushort) MapVirtualKey((UInt16)keyCode, 0);
    down.Data.Keyboard.Flags = 0;
    down.Data.Keyboard.Time = 0;
    down.Data.Keyboard.ExtraInfo = IntPtr.Zero;

    var up = new INPUT();
    up.Type = (UInt32)InputType.KEYBOARD;
    up.Data.Keyboard = new KEYBDINPUT();
    up.Data.Keyboard.Vk = (UInt16)keyCode;
    // Scan Code here, was 0
    up.Data.Keyboard.Scan = (ushort)MapVirtualKey((UInt16)keyCode, 0);
    up.Data.Keyboard.Flags = (UInt32)KeyboardFlag.KEYUP;
    up.Data.Keyboard.Time = 0;
    up.Data.Keyboard.ExtraInfo = IntPtr.Zero;

    INPUT[] inputList = new INPUT[2];
    inputList[0] = down;
    inputList[1] = up;

    var numberOfSuccessfulSimulatedInputs = SendInput(2, 
         inputList, Marshal.SizeOf(typeof(INPUT)));
    if (numberOfSuccessfulSimulatedInputs == 0) 
       throw new Exception(
       string.Format("The key press simulation for {0} was not successful.", 
       keyCode));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X