C#我想使用MSTSCLib在后台保存RDP屏幕的快照

问题描述

我正在一个项目中在后台运行多个MSTSCLib RDP连接。建立连接后,我需要保存每个RDP连接的屏幕截图。我想将这些图像收集到一个文件夹中而不向用户显示我有下面的代码,但是我只能得到一张黑色的图片。我该如何解决这个问题?

public class RemoteDesktopApi
{
    private Thread _thread;

    public void connect(string _Ip,Int32 _Port,Int32 _witdh,Int32 _height,Int32 _timeout,string _User,string _Pass)
    {
        try
        {
            var rdpForm = new System.Windows.Forms.Form();
            var rdp = new AxmsTSCLib.AxmsRdpClient6NotSafeForScripting();
            var tcs = new taskcompletionsource<TaskScheduler>();
            
            rdp.Height = _height;
            rdp.Height = _height;
            rdp.Width = _witdh;
            rdpForm.Width = _witdh;
            rdpForm.Height = _height;
            rdpForm.Controls.Add(rdp);
            rdpForm.ShowInTaskbar = false;
            
            rdpForm.Show();
            
            rdpForm.Text = Convert.ToString(rdpForm.Handle);

            rdp.AdvancedSettings7.EnableWindowsKey = 1;
            rdp.AdvancedSettings7.disableCtrlAltDel = 1;
            rdp.AdvancedSettings7.allowBackgroundInput = 1;
            rdp.AdvancedSettings7.AcceleratorPassthrough = 1;
            rdp.AdvancedSettings7.BitmapPeristence = 1;
            rdp.AdvancedSettings7.Compress = 1;
            rdp.AdvancedSettings7.DoubleClickDetect = 1;
            rdp.AdvancedSettings7.PerformanceFlags = 0x10;
            // rdpForm.ControlBox = false;
            //rdpForm.WindowState = FormWindowState.Minimized;

             rdpForm.Left = -2000;
            //rdpForm.MinimizeBox
            MessageBox.Show(Convert.ToString(rdpForm.Handle));

            rdp.Server = _Ip;
            rdp.UserName =_User;
            rdp.AdvancedSettings7.ClearTextPassword = _Pass;

            rdp.Connect();

            _thread = new Thread(startArg =>
            {
                while (rdp.Connected.ToString() == "2")
                {
                    Thread.Sleep(1000);
                }

                Thread.Sleep(5000);
              
                Control ctl = rdp;
                Control originalParent = ctl.Parent;
                int oldLeft = ctl.Left;
                ctl.Left = 22222;  // way outside
                ctl.Parent = rdpForm;
                System.Drawing.Imaging.ImageFormat fmt = System.Drawing.Imaging.ImageFormat.Jpeg;

                if ("test.png".ToLower().EndsWith(".png"))  
                    fmt = System.Drawing.Imaging.ImageFormat.Png;

                using (Bitmap bmp = new Bitmap(ctl.ClientSize.Width,ctl.ClientSize.Height))
                {
                    ctl.DrawToBitmap(bmp,ctl.ClientRectangle);
                    bmp.Save("test.png",fmt);
                }

                ctl.Parent = originalParent;
                ctl.Left = oldLeft;
            
                rdpForm.Parent = originalParent;
                rdpForm.Left = oldLeft;

                rdp.disconnect();

                rdpForm.Close();
            });

            _thread.SetApartmentState(ApartmentState.STA);
            _thread.IsBackground = true;
            _thread.Start();
        }
        catch
        {
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)