Альтернатива SendKeys, работающая на Citrix

Недавно я разработал приложение для виртуальной клавиатуры для клиента. Программа отлично работает почти со всеми программами, но некоторые команды, такие как {ENTER} или {DEL} , не работают с Citrix. Есть ли обходной путь или альтернатива SendKeys ?

Редактировать 1: Я попробовал метод SendInput (имитатор ввода Windows использует SendInput), и клавиша DEL, а также клавиши со стрелками все еще не работают. Однако клавиша ENTER работает.

Редактировать 2: Решено. Протестировано с двумя разными версиями Citrix. Этот вопрос мне очень помог. :

Тонкие клиенты Citrix используют скан-код параметр keybd_event, даже когда MS говорит он не используется и должен быть 0. Вам нужно также предоставить физический сканкод чтобы клиент Citrix мог его получить. Клиент Citrix также имеет серьезную проблему с вводом с клавиатуры, созданным с помощью SendInput API.

Я исправил код в имитаторе ввода Windows :

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


/// 
/// Calls the Win32 SendInput method ...
/// 
/// The VirtualKeyCode to press
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));
}

13
задан Community 23 May 2017 в 12:15
поделиться