Управление топором C# WPF RDP от MSTSCLib для проблем Hyper-V

В настоящее время занят созданием небольшого RDP-клиента в WPF C# для виртуальных машин, размещенных в Hyper-V. У этого клиента не должно быть никакого управления, поэтому он может подключаться только к нему и иметь возможность использовать компьютер. Так что нет вариантов остановки / запуска / и т.д. ВМ.

Управление с использованием: AxMSTSCLib.AxMsRdpClient7NotSafeForScripting инициализируется во время выполнения и помещается в WindowsFormsHost

Проблемы:

1) Я солгал, есть одна особенность, которая должна быть возможной: отправка Ctrl + Alt + Del. Я сделал кнопку для этого на клиенте, конечно. Я испробовал несколько возможностей, но у меня не получилось в каждом из них, я даже не могу отправить одну букву "А" на ВМ.

Возможности, которые я попробовал:

а) Симуляция клавиатуры через собственный вызов SendInput из user32.dll

  • Когда я сделал SendKeystroke 'control, alt и что-то еще', а затем пошел к виртуальной машине и, например, нажал F, была запущена команда control + F. Или я мог бы начать выбирать несколько файлов (например, Shift).
  • кроме этого, я попытался установить и отключить некоторые свойства в расширенных настройках /securedsettings элемента управления

Так что, если я не делаю что-то неправильно, что ключи не срабатывают, этот метод не работает для меня


б) Использование InputManager

PresentationSource source = PresentationSource.FromVisual(this);
KeyEventArgs insertStuff = new KeyEventArgs(Keyboard.PrimaryDevice, source, 0, Key.D0);
insertStuff.RoutedEvent = UIElement.KeyDownEvent;
InputManager.Current.ProcessInput(insertStuff);

это пользовательский контроль, где расположен windowsformhost, я попытался заменить это this.winformshost, но там тоже не повезло


в) попробовал другой путь, но потерпел неудачу и забыл, все равно не очень красиво.


2) Вторая проблема - это фокус, если быть более точным: фокус при запуске приложения в виртуальной машине.

Поясню подробно: у разработчика машины все в порядке. Но когда я запускаю приложение из RDP на виртуальную машину (A) для подключения к другой виртуальной машине (B) с помощью моего инструмента, возникает серьезная проблема. Когда вы щелкаете один раз внутри элемента управления RDP, где машина B отображается впервые, все приложение застревает. Единственный способ открепить его - просто нажать кнопку запуска Windows, например, на компьютере B, затем вернуться к клиентскому инструменту, и все в порядке, но это довольно неприемлемо.

Я обнаружил, что есть проблемы с фокусом элемента управления, но следующее не удалось решить (создал новый класс, который имеет элемент управления топором в качестве базового класса):

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    //Fix for the missing focus issue on the rdp client component
    if (m.Msg == 0x0021)
    {
        this.Focus();
    }
    base.WndProc(ref m);
}

Если кто-нибудь сможет помочь с этим, я определенно буду благодарен!

С уважением!

1 ответ

Решение
 protected override void WndProc(ref Message m)
         {
             switch (m.Msg)
             {
                 case 0x021:
                     {
                         Message mm = new Message();
                         mm.Msg = 0x007;
                         base.WndProc(ref mm);
                     }
                     break;
             }
             base.WndProc(ref m);
         }
Другие вопросы по тегам