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