public unsafe static void Send(Keys[] keyCodes, ServerBase serverBase) { Server serverNode = serverBase.ServerNode; RdpClient client = serverNode.Client; IMsRdpClientNonScriptable msRdpClientNonScriptable = (IMsRdpClientNonScriptable)client.GetOcx(); int num = keyCodes.Length; try { SendKeysData sendKeysData = default(SendKeysData); bool * ptr = (bool *)sendKeysData.keyUp; int * ptr2 = sendKeysData.keyData; int num2 = 0; for (int i = 0; i < num && i < 10; i++) { int num3 = (int)Util.MapVirtualKey((uint)keyCodes[i], 0u); sendKeysData.keyData[num2] = num3; sendKeysData.keyUp[num2++] = 0; if (!IsModifier(keyCodes[i])) { for (int num4 = num2 - 1; num4 >= 0; num4--) { sendKeysData.keyData[num2] = sendKeysData.keyData[num4]; sendKeysData.keyUp[num2++] = 1; } msRdpClientNonScriptable.SendKeys(num2, ref *ptr, ref *ptr2); num2 = 0; } } } catch { } }
private Server addRDPClient(String ip, int port, String username, String password, int timeout) { Server server = new Server(); RdpClient rdp = null; try { server.ip = ip; server.timeout = timeout; server.serverName = "RDP"; server.port = port; server.username = username; server.password = password; rdp = new RdpClient(server); server.client = rdp; this.rdp_panle.Controls.Add(rdp); rdp.OnResponse += rdpResult; rdp.Connect(ip, port, username, password); } catch (Exception e) { FileTool.log(ip + ":" + port + "-RDP操作异常-" + e.Message); LogWarning(ip + ":" + port + "-RDP操作异常-" + e.Message); server.isDisConnected = true; server.isEndMRE.Set(); } return(server); }
private void KeepAliveTimer_Tick(object sender, EventArgs e) { //string data = ((CustomDerivedTimer)sender).Data; Debug.WriteLine("{0}|{1:x}|KeepAliveTimer_Tick", DateTime.Now.ToString("o"), GetCurrentThreadId()); //https://stackoverflow.com/questions/59624421/rdp-activex-sendkeys-winl-to-lock-screen //https://stackoverflow.com/questions/1069990/keep-alive-code-fails-with-new-rdp-client var timer = (Timer)sender; var rdcServer = (Server)timer.Tag; //const uint WM_ACTIVATE = 0x006; //const uint WA_ACTIVE = 1; //SendMessage(rdcServer.Handle, WM_ACTIVATE, WA_ACTIVE, 0); try { RdpClient rdpClient = Util.GetRdpClient(rdcServer); IsActiveWindow(rdpClient.Control); rdpClient.Control.WindowTarget.GetType(); IntPtr hwnd = rdpClient.Control.Handle; Debug.WriteLine("{0}|KeepAliveTimer_Tick|rdpClient.Control.Handle={1:x}", DateTime.Now.ToString("o"), hwnd.ToInt64()); var keyCodes = new Keys[] { Keys.Scroll }; //Keys.ControlKey, Keys.ShiftKey, Keys.Escape Util.SendKeys(keyCodes, rdcServer); } catch (Exception ex) { timer.Stop(); Debug.WriteLine("{0}|{1:x}|KeepAliveTimer_Tick|{2}", DateTime.Now.ToString("o"), GetCurrentThreadId(), ex); } //https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.sendkeys.send?view=netcore-3.1 //SendKeys.Send("{HOME}"); //{SCROLLLOCK} }
public void rdpResult(ResponseType type, RdpClient rdp, ref Server server) { //接受事件通知,表示完成后,将当前阻塞线程放过继续执行。 if (ResponseType.Finished.Equals(type)) { server.isDisConnected = true; server.isEndMRE.Set(); } }
private void ClearRDP(RdpClient rdp) { try { rdp.Dispose(); this.rdp_panle.Controls.Remove(rdp); } catch (Exception e) { FileTool.log("RDP资源清理异常-" + e.Message); LogWarning("RDP资源清理异常-" + e.Message); } }
private void ClearRDP(RdpClient rdp) { try { this.rdp_panle.Controls.Remove(rdp); if (rdp.IsDisposed == false) { rdp.Dispose(); } } catch (Exception e) { FileTool.log("RDP资源清理异常-" + e.Message); } }
public static RdpClient GetRdpClient(Server server) { #if false //C# 4.0 (released alongside the .NET Framework 4.0 and Visual Studio 2010) dynamic rdcServer = obj.Server; // private RdpClient _client; //'RDCMan.exe' (CLR v4.0.30319: RDCMan.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. //'RDCMan.exe' (CLR v4.0.30319: RDCMan.exe): Loaded 'Anonymously Hosted DynamicMethods Assembly'. //Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in System.Core.dll //An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code //'RdcMan.Server._client' is inaccessible due to its protection level RdpClient rdpClient = rdcServer._client; // Resolved at runtime, not compile-time return(rdpClient); #else return(F_client.GetValue(server) as RdpClient); #endif }
private void ClearRDP(Server server) { try { RdpClient rdp = server.client; if (rdp.Connected != 0) { rdp.RequestClose(); rdp.Disconnect(); } rdp.Dispose(); this.rdp_panle.Controls.Remove(rdp); } catch (Exception e) { FileTool.log("RDP资源清理异常-" + e.Message); LogWarning("RDP资源清理异常-" + e.Message); } }
private Server addRDPClient(Server server) { try { RdpClient rdp = new RdpClient(); server.client = rdp; server.client.server = server; this.rdp_panle.Controls.Add(rdp); server.client.OnResponse += rdpResult; server.client.ConnectServer(server); } catch (Exception e) { FileTool.log(server.ip + ":" + server.port + "-RDP操作异常-" + e.Message); LogWarning(server.ip + ":" + server.port + "-RDP操作异常-" + e.Message); server.isDisConnected = true; server.isEndMRE.Set(); } return(server); }
private static void Main(string[] args) { SetupDebug(); if (args.Length != 3 && args.Length != 4) { Logit("usage: TestRDPClient hostname remotePort localPort <run-incoming-thread>"); Trace.Flush(); } remoteHostname = args[0]; remotePort = int.Parse(args[1]); localPort = int.Parse(args[2]); for (int i = 0; i < 1; i++) { rdpClient = new RdpClient(localPort + i, 100, 1000, true); IPHostEntry IPHost = Dns.GetHostEntry(remoteHostname); IPAddress[] addr = IPHost.AddressList; IPEndPoint sendpt = new IPEndPoint(addr[0], remotePort); Logit("Connecting to host " + remoteHostname + ", remotePort " + remotePort + ", localPort " + localPort); rdpConnection = rdpClient.Connect(sendpt); rdpConnection.WaitForState(ConnectionState.Open); Logit("Connection successful"); Thread outgoingThread = new Thread(RunOutgoing); outgoingThread.Start(); if (args.Length == 4) { Thread incomingThread = new Thread(RunIncoming); incomingThread.Start(); } while (outgoingThread.IsAlive) { Thread.Sleep(500); } } Trace.Flush(); }
public TestClass() { SetupDebug(); // const int ServerPort = 200; const int ServerPort = 5001; const int ClientPort = 6666; IPHostEntry IPHost = Dns.GetHostEntry("cedeno-dxp.corp.multiverse.net"); IPAddress[] addr = IPHost.AddressList; IPEndPoint sendpt = new IPEndPoint(addr[0], ServerPort); RdpClient rdpClient = new RdpClient(ClientPort, 100, 1000, true); RdpClient rdpClient2 = new RdpClient(ClientPort + 1, 100, 1000, false); //RdpServer rdpServer = new RdpServer(ServerPort, 100, 1000, true); RdpConnection rdpClientConn = rdpClient.Connect(sendpt); RdpConnection rdpClientConn2 = rdpClient2.Connect(sendpt); // RdpConnection rdpServerConn = rdpServer.Accept(); rdpClientConn.WaitForState(ConnectionState.Open); rdpClientConn2.WaitForState(ConnectionState.Open); // Console.WriteLine("Server State = " + rdpServerConn.ConnectionState); Console.WriteLine("Client State = " + rdpClientConn.ConnectionState); OutgoingMessage outMessage = new OutgoingMessage(); outMessage.Write("Good morning"); outMessage.Send(rdpClientConn); outMessage.Send(rdpClientConn2); // byte[] msg = Encoding.ASCII.GetBytes("Test"); // rdpClientConn.Send(msg); // rdpClientConn.Send(msg); // rdpClientConn.Send(msg); IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); IncomingMessage inMessage; inMessage = new IncomingMessage(rdpClientConn); Console.WriteLine("Got message: {0}", inMessage.ReadString()); inMessage = new IncomingMessage(rdpClientConn2); Console.WriteLine("Got message2: {0}", inMessage.ReadString()); // for (int i = 0; i < 3; ++i) { // byte[] rcvdMessage = rdpServerConn.Receive(ref remoteEP); // Console.WriteLine("Server got message from {1}: '{0}'", // Encoding.ASCII.GetString(rcvdMessage), remoteEP); // rdpServerConn.Send(msg); // } // // for (int i = 0; i < 3; ++i) { // byte[] rcvdMessage = rdpClientConn.Receive(ref remoteEP); // Console.WriteLine("Client got message from {1}: '{0}'", // Encoding.ASCII.GetString(rcvdMessage), remoteEP); // } // // rdpServerConn.Close(); Thread.Sleep(100); // Console.WriteLine("Server State = " + rdpServerConn.ConnectionState); Console.WriteLine("Client State = " + rdpClientConn.ConnectionState); Thread.Sleep(31000); // Console.WriteLine("Server State = " + rdpServerConn.ConnectionState); Console.WriteLine("Client State = " + rdpClientConn.ConnectionState); FinishDebug(); //rdpConn.Open(false, 1, 2, 3, 4, true); //rdpConn.Send(new Multiverse.Network.Rdp.RdpPacket(50)); //this.Hide(); //this.WindowState = FormWindowState.Minimized; }
public RdpHost() { Rdp = RdpClient.Create(); InitializeComponent(); }
private void Server_ConnectionStateChanged(ConnectionStateChangedEventArgs obj) { Debug.WriteLine("{0}|{1:x}|Server_ConnectionStateChanged|{2}:{3}", DateTime.Now.ToString("o"), GetCurrentThreadId(), obj.Server.Text, obj.State.ToString()); RdpClient rdpClient = Util.GetRdpClient(obj.Server); if (ConnectionState.Connected == obj.State) { if (rdpClient.Control.InvokeRequired) { Debug.WriteLine("in non-UI Thread"); rdpClient.Control.Invoke(new MethodInvoker(() => StartKeepTimer(obj.Server))); } else { StartKeepTimer(obj.Server); } if (Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread) { Debug.WriteLine("Do something on current dispatcher"); } Dispatcher dispatcher = Dispatcher.FromThread(Thread.CurrentThread); if (null != dispatcher) { Debug.WriteLine("We know the thread have a dispatcher that we can use"); } } else { if (serverTimers.TryGetValue(obj.Server, out Timer timer)) { timer.Stop(); serverTimers.Remove(obj.Server); } } //if Server#ConnectionStateChanged is Disconnected, rdpClient is null. if (null != rdpClient) { Debug.WriteLine(rdpClient.DesktopSize.ToFormattedString(), "Server_ConnectionStateChanged"); //IMsRdpClientNonScriptable ocx = (IMsRdpClientNonScriptable)rdpClient.MsRdpClient8.GetOcx(); ////https://docs.microsoft.com/zh-cn/windows/win32/termserv/imsrdpclientadvancedsettings-keepaliveinterval //rdpClient.MsRdpClient8.AdvancedSettings8.keepAliveInterval = 1; //rdpClient.MsRdpClient.AdvancedSettings.allowBackgroundInput = 1; ////https://docs.microsoft.com/zh-cn/windows/win32/termserv/imsrdpclientadvancedsettings-minutestoidletimeout //rdpClient.MsRdpClient8.AdvancedSettings2.MinutesToIdleTimeout = 1; //https://docs.microsoft.com/zh-cn/windows/win32/termserv/imsrdpclientnonscriptable-sendkeys //Now reference the dll and you can use it with bool[] and int[] parameters. For CTRL+ALT+DEL: //0x1d: CONTROL, 0x38: MENU/ALT, 0x53: DEL bool[] bools = { false, false, false, true, true, true, }; int[] ints = { 0x1d, 0x38, 0x53, 0x53, 0x38, 0x1d }; //Focus helps to avoid most E_FAIL exceptions //rdp.Focus(); //unsafe void SendKeys(int numKeys, int* pbArrayKeyUp, int* plKeyData); //fixed (bool* pKeyReleased = bools) //fixed (int* pScanCodes = ints) //{ // m_ComInterface.SendKeys(keyScanCodes.Length, pKeyReleased, pScanCodes); //} #if false bool bArrayKeyUp = true; //Key Released int lKeyData = 0x1d; //Scan Codes try { rdpClient.ClientNonScriptable3.SendKeys(1, ref bArrayKeyUp, ref lKeyData); } catch (Exception ex) { MessageBox.Show(ex.Message); } #endif } }