static void Capture(Process proc) { var rect = new User.RECT(); User.GetWindowRect(proc.MainWindowHandle, ref rect); if (rect.top >= 0 && rect.bottom >= 0 && rect.left >= 0 && rect.right >= 0) { using (var bmp = new Bitmap(rect.right - rect.left - 20, rect.bottom - rect.top - 50, System.Drawing.Imaging.PixelFormat.Format16bppRgb555)) { Graphics.FromImage(bmp).CopyFromScreen(rect.left + 10, rect.top + 40, 0, 0, new System.Drawing.Size(rect.right - rect.left - 20, rect.bottom - rect.top - 50), CopyPixelOperation.SourceCopy); ScreenS = ConvertTo(bmp); } } /* * DateTime fps_lock = DateTime.Now; * while (true) * { * if ((DateTime.Now - fps_lock).Milliseconds >= 16) * { * User.GetWindowRect(proc.MainWindowHandle, ref rect); * using (var bmp = new Bitmap(rect.right - rect.left, rect.bottom - rect.top, System.Drawing.Imaging.PixelFormat.Format32bppRgb)) * { * Graphics.FromImage(bmp).CopyFromScreen(rect.left, rect.top, 0, 0, new System.Drawing.Size(rect.right - rect.left, rect.bottom - rect.top), CopyPixelOperation.SourceCopy); * fps_lock = DateTime.Now; * Send(bmp); * } * } * }*/ }
static void Main(string[] args) { myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 30L); myEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, 1L); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.MulticastLoopback = true; socket.Bind(local); socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(m.Address, local.Address)); string procid = Console.ReadLine(); //WaveFormat format = new WaveFormat(4000, 6, 1); //cptr = new WasapiLoopbackCapture(10, format, ThreadPriority.AboveNormal, true); //WaveWriter wrt = new WaveWriter(soundarr, cptr.WaveFormat); //cptr.Initialize(); //cptr.DataAvailable += (s, e) => //{ // wrt.Write(e.Data, e.Offset, e.ByteCount); //}; //cptr.Start(); var procs = Process.GetProcessesByName(procid); Process proc = null; var rect = new User.RECT(); foreach (var prc in procs) { User.GetWindowRect(prc.MainWindowHandle, ref rect); if ((rect.left != 0 || rect.right != 0) || (rect.bottom != 0 || rect.top != 0)) { proc = prc; break; } } if (proc == null) { return; } Capture(proc); Task.Factory.StartNew(new Action <object>((object r_obj) => { var r = (User.RECT)r_obj; TcpListener lstnr = new TcpListener(new IPEndPoint(IPAddress.Loopback, 8989)); lstnr.Start(); var clnt = lstnr.AcceptTcpClient(); Task.Run(() => { using (StreamReader rdr = new StreamReader(clnt.GetStream(), Encoding.UTF8, false, 4096, true)) { //username string msg = ""; msg = rdr.ReadLine(); users.Add(msg); string bkmsg = ""; foreach (var u in users) { bkmsg += u + ";"; } using (StreamWriter wrt = new StreamWriter(clnt.GetStream(), Encoding.UTF8, 4096, true)) { wrt.WriteLine(bkmsg + (users.Count == 1)); wrt.Flush(); } if (users.Count == 1) { //W;H msg = rdr.ReadLine(); int width = int.Parse(msg.Split(';')[0]); int height = int.Parse(msg.Split(';')[1]); double own_width = System.Windows.SystemParameters.PrimaryScreenWidth; double own_height = System.Windows.SystemParameters.PrimaryScreenHeight; while (msg != "clnt_chg") { msg = rdr.ReadLine(); double X = ConvertFuckThisToDoubleFuckMeAIDSFUCK(msg.Split(';')[0].Replace(',', '.')); double Y = ConvertFuckThisToDoubleFuckMeAIDSFUCK(msg.Split(';')[1].Replace(',', '.')); double X_Off = ((X + 10) / width) * (r.right - r.left); double Y_Off = ((Y + 10) / height) * (r.bottom - r.top); //X;Y LeftMouseClick((int)X_Off + r.left, (int)Y_Off + r.top); } } } }); }), rect); CaptureLoop = new System.Timers.Timer(); CaptureLoop.Interval = 32; CaptureLoop.Elapsed += (sender, e) => { if (ScreenS != null) { Send(ScreenS); } }; CaptureLoop.Start(); while (true) { Capture(proc); } }
private void button1_Click(object sender, EventArgs e) { //ищем хэндл процесса Process[] p = Process.GetProcessesByName("freecell"); if (p.Length == 0) { MessageBox.Show("Процесс не найден"); return; } WindowHandle = p[0].MainWindowHandle; PrHandle = p[0].Handle; ((Form1)((Button)sender).Parent).WindowState = FormWindowState.Minimized; //ицем хэндл окна IntPtr hwnd = User.FindWindow(null, "Солитер"); System.Threading.Thread.Sleep(10); //фигачим окно в одну и ту же позицию var placement = User.GetPlacement(WindowHandle); User.ShowWindow(hwnd, 1); User.SetWindowPos(hwnd, 0, 0, 0, 640, 480, SWP_SHOWWINDOW); placement2 = User.GetPlacement(WindowHandle); //User.SetWindowLong32(hwnd, ) //Определяем рамки var SM_CYCAPTION = User.GetSystemMetrics(4); var SM_CXBORDER = User.GetSystemMetrics(5); var SM_CYBORDER = User.GetSystemMetrics(6); var SM_CXEDGE = User.GetSystemMetrics(45); var SM_CYEDGE = User.GetSystemMetrics(46); var SM_CXFRAME = User.GetSystemMetrics(32); var SM_CYFRAME = User.GetSystemMetrics(33); var SM_CYMENU = User.GetSystemMetrics(15); //Определяем размеры рабочей области User.RECT t = User.GetClientRect(hwnd); //тут надо вычислить нормальные размеры рамок при любых условия, не ебясь со стилями, или с getsystemmetrix int bottom_x = (placement2.rcNormalPosition.Width - t.right) / 2; int bottom_y = (placement2.rcNormalPosition.Height - SM_CYCAPTION - SM_CYMENU - t.bottom) / 2; int x = placement2.rcNormalPosition.X + bottom_x; int y = placement2.rcNormalPosition.Y + SM_CYCAPTION + SM_CYMENU + bottom_y; int width = t.right; int height = t.bottom - 20; //Делаем скриншот Bitmap BMP = new Bitmap(width, height); System.Drawing.Graphics GFX = System.Drawing.Graphics.FromImage(BMP); GFX.CopyFromScreen(x, y, 0, 0, new Size(width, height)); //если было свернуто или скрыто, то возвращаем в исходное состояние if (placement.showCmd == User.ShowWindowCommands.Hide) { User.ShowWindow(hwnd, 0); } else if (placement.showCmd == User.ShowWindowCommands.Minimized) { User.ShowWindow(hwnd, 2); } //анализ пикселей //тупо подсчитать рамки пикселей на 640х480 Bitmap[] BMP_Free = new Bitmap[4]; Bitmap[] BMP_House = new Bitmap[4]; Bitmap[,] BMP_Field = new Bitmap[8, 7]; Bitmap s = GrayScale(BMP); Bitmap f = AllocationBorders(s); //for (int i = 0; i < 4; i++) //{ //BMP_Free[i] = //} pictureBox1.Image = f; //BMP.GetPixel(50, 20); ((Form1)((Button)sender).Parent).WindowState = FormWindowState.Normal; }