Управление топором 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);
}