Как разместить терминальную сессию (mstsc) в приложении WPF? - PullRequest
2 голосов
/ 03 сентября 2010

Существуют некоторые инструменты для управления несколькими терминалами (mstsc).

Как мне добиться чего-то подобного в WPF?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010

Вы должны использовать элемент WindowsFormsHost для размещения элемента управления ActiveX RDP.

Краткий пример , как интегрировать Windows Media Player в приложение WPF. Хостинг управления RDP аналогичен.

1 голос
/ 08 сентября 2010

Скорее всего, эти инструменты используют элемент управления ActiveX для удаленного рабочего стола, предназначенный для размещения на веб-страницах, но, поскольку он является элементом управления ActiveX, вы также можете размещать его самостоятельно.

Если ничего другого, вы можете встроить элемент управления веб-браузера в свое приложение WPF, а затем встроить в него элемент управления ActiveX.

Смотрите следующие ссылки:

0 голосов
/ 08 ноября 2018
  1. Вы должны добавить в проект две библиотеки: AxInterop.MSTSCLib.dll, Interop.MSTSCLib.dll

Вы можете получить его из MS RDCMan с официального сайта MS. Как добавить его из вкладки COM в «Рекомендации» - это большой вопрос ... 2. Добавьте в XAML WindowsFormsHost:

<UserControl x:Class="VMViewer"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="231" d:DesignWidth="274" Loaded="UserControl_Loaded">
<Border BorderThickness="1" BorderBrush="CornflowerBlue">
    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="22"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Grid.Row="0" x:Name="connectBtn" Content="Connect" Click="Button_Click" DockPanel.Dock="Top" HorizontalAlignment="Stretch" />
        <WindowsFormsHost Grid.Row="1" Margin="0,0,0,0" x:Name="wfHost" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Border>

  1. Создание нового класса клиента rdp:

    открытый класс RdpControl: AxMSTSCLib.AxMsRdpClient9NotSafeForScripting { public RdpControl () : база() { }

    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) // WM_MOUSEACTIVATE
        {
            if (!this.ContainsFocus)
            {
                this.Focus();
            }
        }
    
        base.WndProc(ref m);
    }}
    
  2. Код за вашим UserControl:

    private void InitData () { _rdp = новый RdpControl (); . ((System.ComponentModel.ISupportInitialize) (_ RDP)) BeginInit (); _rdp.Name = "rdp"; _rdp.Enabled = true; wfHost.Child = _rdp; ((System.ComponentModel.ISupportInitialize) (_ RDP)) EndInit (). }

    private void Connect()
    {
        _rdp.Server = CurrentVM.Name;
        _rdp.UserName = CurrentVM.Login;
        _rdp.AdvancedSettings9.ClearTextPassword = CurrentVM.Password;
        _rdp.ColorDepth = 24;
        _rdp.AdvancedSettings9.SmartSizing = true;
        _rdp.AdvancedSettings9.AuthenticationLevel = 2;
        _rdp.AdvancedSettings9.EnableCredSspSupport = true;
        _rdp.Width = Convert.ToInt32(this.ActualWidth);
        _rdp.Height = Convert.ToInt32(this.ActualHeight);
        _rdp.DesktopWidth = Convert.ToInt32(this.ActualWidth);
        _rdp.DesktopHeight = Convert.ToInt32(this.ActualHeight);
        try
        {
            _rdp.Connect();
        }
        catch
        {
        }
    }
    
  3. Добавить в UserControl кнопку с этим обработчиком:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        InitData();
        Connect();
    }
    

Надеюсь, это поможет.

...