public override void Execute(Server server, Client client, string args) { string[] parts = args.Split('/'); if (2 != parts.Length) { client.Send("Error: invalid mouse position"); return; } double xPercent, yPercent; try { xPercent = double.Parse(parts[0]); yPercent = double.Parse(parts[1]); if (!(0d <= xPercent && xPercent < 1d)) { throw new ArgumentOutOfRangeException("xPercent"); } if (!(0d <= yPercent && yPercent < 1d)) { throw new ArgumentOutOfRangeException("yPercent"); } } catch { client.Send("Error: invalid mouse position"); return; } IntPtr hWnd = WindowHandle; if (IntPtr.Zero == hWnd) { client.Send("Error: couldn't get window handle"); return; } RECT clientSize = new RECT(); if (!Win32Window.GetClientRect(hWnd, out clientSize)) { client.Send("Error: GetClientRect failed"); return; } Point clientPos = new Point(); if (!Win32Window.ClientToScreen(hWnd, ref clientPos)) { client.Send("Error: ClientToScreen failed"); return; } int x = clientPos.X + (int)(xPercent * clientSize.Width); int y = clientPos.Y + (int)(yPercent * clientSize.Height); if (!Win32Input.Move(x, y)) { client.Send("Error: Move() returned false"); return; } client.Send("Set mouse position: {0},{1}", x, y); }
public Client(Server server, TcpClient client) { this.server = server; this.client = client; this.stream = client.GetStream(); this.reader = new StreamReader(client.GetStream(), encoder); InitCommands(); logHandler = new ClientLogHandler(this); thread = new Thread(Run); thread.IsBackground = true; Number = server.ClientCount + 1; thread.Name = "GRC ClientHandler-" + Number; Debug("New connection from {0}", client.Client.RemoteEndPoint); running = true; thread.Start(); }
public void RefreshSettings() { if (!initialized) return; lock (this) { if (null != server) { server.Dispose(); server = null; } try { server = new Server(this); } catch (SocketException e) { Logging.Write(Color.Red, "Error starting GliderRemoteCompat server"); Logging.WriteException(Color.Red, e); MessageBox.Show( "The port is already in use. You must change it in the settings.", "GliderRemoteCompat", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception e) { Logging.Write(Color.Red, "Error starting GliderRemoteCompat server"); Logging.WriteException(Color.Red, e); MessageBox.Show( "Error starting server:\n\n" + e, "GliderRemoteCompat", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
public override void Dispose() { lock (this) { if (!initialized) return; if (null != server) { server.Dispose(); server = null; } if (null != settingsForm) { settingsForm.Dispose(); settingsForm = null; } base.Dispose(); initialized = false; Logging.Write("{0} unloaded", Name); } }
public abstract void Execute(Server server, Client client, string args);
public override void Execute(Server server, Client client, string args) { if (IntPtr.Zero == WindowHandle) { client.Send("Error: couldn't get window handle"); return; } RECT size = new RECT(); if (!Win32Window.GetWindowRect(new HandleRef(this, WindowHandle), out size)) { client.Send("Error: GetWindowRect failed"); return; } if (null == bitmap || bitmap.Width != size.Width || bitmap.Height != size.Height) { if (null != bitmap) { bitmap.Dispose(); } bitmap = new Bitmap(size.Width, size.Height); } using (Graphics g = Graphics.FromImage(bitmap)) { Win32Window.PrintWindow(WindowHandle, g.GetHdc(), 0); g.ReleaseHdc(); } // crop to just the client area RECT clientSize = new RECT(); if (!Win32Window.GetClientRect(WindowHandle, out clientSize)) { client.Send("Error: GetClientRect failed"); return; } Point clientPos = new Point(); if (!Win32Window.ClientToScreen(WindowHandle, ref clientPos)) { client.Send("Error: ClientToScreen failed"); return; } // ok for a one time thing but wasteful for continual use //Bitmap srcBitmap = bitmap.Clone(new Rectangle( // clientPos.X - size._Left, // clientPos.Y - size._Top, // clientSize.Width, // clientSize.Height), // PixelFormat.Format32bppArgb); if (null == clientArea || clientArea.Width != clientSize.Width || clientArea.Height != clientArea.Height) { if (null != clientArea) { clientArea.Dispose(); } clientArea = new Bitmap(clientSize.Width, clientSize.Height); clientSrcRect = new Rectangle( clientPos.X - size._Left, clientPos.Y - size._Top, clientSize.Width, clientSize.Height); clientDestRect = new Rectangle(Point.Empty, clientArea.Size); } using (Graphics g = Graphics.FromImage(clientArea)) { g.DrawImage(bitmap, clientDestRect, clientSrcRect, GraphicsUnit.Pixel); } Bitmap srcBitmap = clientArea; if (client.settings.CaptureScale < 1f) { int nWidth = (int)(srcBitmap.Width * client.settings.CaptureScale); int nHeight = (int)(srcBitmap.Height * client.settings.CaptureScale); if (null == bitmapSmall || bitmapSmall.Width != nWidth || bitmapSmall.Height != nHeight) { if (null != bitmapSmall) { bitmapSmall.Dispose(); } bitmapSmall = new Bitmap(nWidth, nHeight); } using (Graphics g = Graphics.FromImage(bitmapSmall)) { g.DrawImage(srcBitmap, 0, 0, nWidth, nHeight); } srcBitmap = bitmapSmall; } using (MemoryStream s = new MemoryStream()) { if (null == encoderParams) { encoderParams = new EncoderParameters(1); } if (null == qualityParam || lastQuality != client.settings.CaptureQuality) { lastQuality = client.settings.CaptureQuality; qualityParam = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, (long)Math.Round(lastQuality * 100)); // must be long encoderParams.Param[0] = qualityParam; } srcBitmap.Save(s, JpegCodec, encoderParams); //using (FileStream f = new FileStream("test.jpg", FileMode.Create)) { // s.WriteTo(f); //} //client.Send(string.Format("DBG: Length is {0} (0x{0:X})", s.Length)); client.Send(false, "Success! 4-byte length and JPEG stream follow (length={0})", s.Length); client.Send(BitConverter.GetBytes((int)s.Length), false); s.WriteTo(client.Stream); client.Send(); } }