Recientemente desarrollé una aplicación de teclado virtual para un cliente. El programa funciona bien con casi todos los programas, pero ciertos comandos como {ENTER}
o {DEL}
no funcionan con Citrix. ¿Hay una solución alternativa o una alternativa al SendKeys
?SendKeys alternativa que funciona en Citrix
Edición 1: Probé el método SendInput (Windows Input Simulator usa SendInput) y la tecla DEL así como las teclas de flecha todavía no están funcionando. La tecla ENTER funciona sin embargo.
Editar 2: Resuelto. Probado con dos versiones diferentes de Citrix. This question helped me a lot.:
clientes ligeros Citrix utiliza el código de rastreo parámetro de keybd_event aun cuando MS dice que no se utiliza y debe ser 0. Es necesario para suministrar el código de rastreo física aswell para el cliente Citrix para conseguirlo. El cliente Citrix también tiene el problema principal con la entrada del teclado generada con la API SendInput .
remendé el código en Windows Input 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));
}
Gracias !!! XSL. ¡Gran hallazgo! Yo también estaba usando InputSimulator (herramienta fab por cierto), pero necesitaba este truco que me proporcionó (ushort) MapVirtualKey ((UInt16) keyCode, 0); Excelente trabajo: muchas gracias –
¿Tiene un método para enviar una cadena completa en lugar de presionar una tecla? – Mathias