private void VideoSender() { // Console.WriteLine("video sender online"); //while (videoSendingThreadStatus) while (stream != null) { //todo //Thread.Sleep(100); Bitmap bitmap; if (isWindowSelected) { bitmap = WindowCaptureUtility.CaptureSelectedWindow(selectedWindowHwnd); } else { var rect = new WindowCaptureUtility.RECT { Left = Screen.PrimaryScreen.Bounds.Left, Right = Screen.PrimaryScreen.Bounds.Right, Top = Screen.PrimaryScreen.Bounds.Top, Bottom = Screen.PrimaryScreen.Bounds.Bottom }; bitmap = WindowCaptureUtility.Capture(rect); } if (bitmap == null) continue; if (stream != null) { try { //todo changed //bitmap.SetResolution(bitmap.Width*scaleRate, bitmap.Height*scaleRate); //send the bitmap SendBitmap(new Bitmap(bitmap, (int)(bitmap.Width * scaleRate), (int)(bitmap.Height * scaleRate))); } catch (Exception e) { Console.WriteLine("Before Exception : {0}, {1} {2}", bitmap.Width, bitmap.Height, scaleRate); Console.WriteLine("Client VideoReceiver Run Into An Exception : \n" + e); ConnectionFailedHandler(); } } } }
/// <summary> /// 处理收到的Command包 /// </summary> /// <param name="command"></param> private void CommandProcessor(Command command) { int hwnd; int x, y; switch (command.CommandType) { case Command.Types.CommandType.LeftClick: if (!isWindowSelected) { if ((DateTime.Now - lastLeftClickTime).TotalMilliseconds > MinTimeGapBetweenClicks) MouseUtility.SetCursorPos((int)command.X, (int)command.Y); MouseUtility.mouse_event( MouseUtility.MOUSEEVENTF_LEFTDOWN | MouseUtility.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); lastLeftClickTime = DateTime.Now; x = (int)command.X; y = (int)command.Y; // MouseUtility.mouse_event(MouseUtility.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } else { var rect = new WindowCaptureUtility.RECT(); WindowsUtility.GetWindowRect(selectedWindowHwnd, ref rect); if ((DateTime.Now - lastLeftClickTime).TotalMilliseconds > MinTimeGapBetweenClicks) MouseUtility.SetCursorPos((int)command.X + rect.Left, (int)command.Y + rect.Top); MouseUtility.mouse_event( MouseUtility.MOUSEEVENTF_LEFTDOWN | MouseUtility.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); lastLeftClickTime = DateTime.Now; x = (int)command.X + rect.Left; y = (int)command.Y + rect.Top; // MouseUtility.mouse_event(MouseUtility.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); } Console.WriteLine("mouse left clicked : {0},{1}", x, y); break; case Command.Types.CommandType.RightClick: if (!isWindowSelected) { if ((DateTime.Now - lastRightClickTime).TotalMilliseconds > MinTimeGapBetweenClicks) MouseUtility.SetCursorPos((int)command.X, (int)command.Y); MouseUtility.mouse_event (MouseUtility.MOUSEEVENTF_RIGHTDOWN | MouseUtility.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); lastRightClickTime = DateTime.Now; x = (int)command.X; y = (int)command.Y; //MouseUtility.mouse_event(MouseUtility.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); } else { var rect = new WindowCaptureUtility.RECT(); WindowsUtility.GetWindowRect(selectedWindowHwnd, ref rect); if ((DateTime.Now - lastRightClickTime).TotalMilliseconds > MinTimeGapBetweenClicks) MouseUtility.SetCursorPos((int)command.X + rect.Left, (int)command.Y + rect.Top) ; MouseUtility.mouse_event( MouseUtility.MOUSEEVENTF_RIGHTDOWN | MouseUtility.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); lastRightClickTime = DateTime.Now; x = (int)command.X + rect.Left; y = (int)command.Y + rect.Top; // MouseUtility.mouse_event(MouseUtility.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); } Console.WriteLine("mouse right clicked : {0},{1}", x, y); break; case Command.Types.CommandType.Scroll: MouseUtility.mouse_event(MouseUtility.MOUSEEVENTF_WHEEL, 0, 0, (int)command.Y, 0); Console.WriteLine("scroll : " + command.Y); break; case Command.Types.CommandType.Minimize: hwnd = isWindowSelected ? selectedWindowHwnd : WindowsUtility.WindowFromPoint((int)command.X, (int)command.Y); //找到主窗口 while (WindowsUtility.GetParent(hwnd) != 0) hwnd = WindowsUtility.GetParent(hwnd); WindowsUtility.ShowWindow(hwnd, 2); Console.WriteLine("Minimize"); break; case Command.Types.CommandType.SelectWindow: if (command.X > 0 && command.Y > 0) { selectedWindowHwnd = WindowsUtility.WindowFromPoint((int)command.X, (int)command.Y); if (selectedWindowHwnd != 0) { var rect = new WindowCaptureUtility.RECT(); WindowsUtility.GetWindowRect(selectedWindowHwnd, ref rect); scaleRate = Math.Min(ClientScreenWidth / (float)(rect.Right - rect.Left), ClientScreenHeight / (float)(rect.Bottom - rect.Top) ); //todo uncertain if (scaleRate > 1) scaleRate = 1; isWindowSelected = true; } Console.WriteLine("window selected"); } else { isWindowSelected = false; selectedWindowHwnd = 0; scaleRate = Math.Min(ClientScreenWidth / (float)Screen.PrimaryScreen.Bounds.Width, ClientScreenHeight / (float)Screen.PrimaryScreen.Bounds.Height ); //todo uncertain if (scaleRate > 1) scaleRate = 1; Console.WriteLine("canceled the selected window"); } break; case Command.Types.CommandType.ShutDownApp: hwnd = isWindowSelected ? selectedWindowHwnd : WindowsUtility.WindowFromPoint((int)command.X, (int)command.Y); WindowsUtility.ShutDownSpecifiedProgram(hwnd); Console.WriteLine("Shut down selected app"); break; case Command.Types.CommandType.ShowDesktop: WindowsUtility.ShowDesktop(); break; ////todo mute audio and etc case Command.Types.CommandType.StartAudioAndVideoTransmission: // audioSendingThreadStatus = true; //videoSendingThreadStatus = true; videoSendingThread.Start(); break; //case Command.Types.CommandType.StartAudioTransmission: // audioSendingThreadStatus = true; // break; //case Command.Types.CommandType.StartVideoTransmission: // videoSendingThreadStatus = true; // break; //case Command.Types.CommandType.StopAudioAndVideoTransmission: // audioSendingThreadStatus = false; // videoSendingThreadStatus = false; // break; //case Command.Types.CommandType.StopAudioTransmission: // audioSendingThreadStatus = false; // break; //case Command.Types.CommandType.StopVideoTransmission: // videoSendingThreadStatus = false; // break; default: break; } Console.WriteLine("CommandType " + command.CommandType); //UpdateVideoAndAudioThreadStatus(); }