⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 能够远程监视局域网内的桌面
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <jpeg.hpp>
#pragma hdrstop
#include <stdio.h>

#include "Main.h"
#include "Config.h"
#include "About.h"
#include "Socket.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"

#define CM_ENTIRESCREEN 201   //捕获全屏
#define CM_ACTIVEWINDOW 202   //捕获当前窗口

TMainForm *MainForm;
//---------------------------------------------------------------------------

__fastcall TMainForm::TMainForm(TComponent *Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

// 捕获当前屏幕并保存到imagestream中
void CaptureImage(int options, int level, int cq, TMemoryStream* imgstream)
{
	LONG width,height;
	RECT capRect;
	HDC DesktopDC;
	switch (options) {
		case CM_ENTIRESCREEN:  // 捕获整个屏幕
			// 取得桌面的矩形区域范围
			GetWindowRect(GetDesktopWindow(),&capRect);  
		break;
		case CM_ACTIVEWINDOW:  // 捕获当前窗口
			HWND ForegWin;
			ForegWin = GetForegroundWindow();  // 取得当前窗口句柄
			if (!ForegWin)
				ForegWin = GetDesktopWindow();
			GetWindowRect(ForegWin,&capRect);  // 取得当前窗口的矩形区域范围
		break;
	}

	DesktopDC = GetDC(GetDesktopWindow());  // 创建内存设备描述表
	width = capRect.right - capRect.left;
	height = capRect.bottom - capRect.top;
	Graphics::TBitmap *bBitmap;  // 定义位图变量
	try {
		bBitmap = new Graphics::TBitmap(); // 创建位图
		bBitmap->Width=width;
		bBitmap->Height=height;
		if ((level>0)&&(level<8))
			bBitmap->PixelFormat = TPixelFormat(level);  // 设定色深
		// 拷贝屏幕的指定区域到位图
		BitBlt(bBitmap->Canvas->Handle,0,0,width,height,DesktopDC,
			capRect.left,capRect.top,SRCCOPY);

		if (cq>=0) {
			TJPEGImage *jpeg;
			try {
				jpeg = new TJPEGImage;  // 创建JPEG图象
				jpeg->CompressionQuality = cq;  // 设定图象品质
				jpeg->Assign(bBitmap);  // 将位图转化为JPEG格式
				jpeg->SaveToStream(imgstream);  // 保存JPEG图象信息
			}
			 __finally {
				delete jpeg;  // 释放资源
			}
		}
		else {
			bBitmap->SaveToStream(imgstream);  // 保存位图信息
		}
	}
	__finally {
		delete bBitmap;  // 释放资源
	}
}

// 新建观察窗口
void __fastcall TMainForm::CreateMDIChild(AnsiString sAddress, int CL, int CQ)
{
	TMDIChild *Child;

	//--- create a new MDI child window ----
	Child = new TMDIChild(Application);
	Child->RemoteAddress = sAddress;  // 主机IP
	Child->CL = CL;  // 色深
	Child->CQ = CQ;  // 品质
//  int sock=Connect_Server(RemoteAddress, LISTENPORT);
//  Write_Socket(sock, "2\n");
//  AnsiString read=Socket_Readln(sock);
//  ShowMessage(read);

	Child->Caption = "来自'" + sAddress+"'";
	Child->Capture();  // 捕获第一屏
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FileNew1Execute(TObject *Sender)
{
	ConfigForm->ShowModal();
	if (ConfigForm->Execute) {
		// 新建观察窗口
		CreateMDIChild(ConfigForm->ComboBox1->Text,  // 主机IP
		ConfigForm->TrackBar1->Position,  // 色深
		ConfigForm->TrackBar2->Position*10);  // 品质
	}
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::HelpAbout1Execute(TObject *Sender)
{
	AboutBox->ShowModal();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FileExit1Execute(TObject *Sender)
{
	//Close();
  Application->Terminate ();
  
}
//---------------------------------------------------------------------------

// 捕获并发送自己的屏幕图象
void __fastcall TMainForm::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
	AnsiString sRecvString = Socket->ReceiveText();  // 保存接收到的字符串
	AnsiString sRemoteAddress = Socket->RemoteAddress;  // 保存对方IP
	int CL,CQ;
	u_short port;
  int CmdType;

	// 将接收到的字符串分解为命令类别、接收端口、色深、品质4个参数
  int pos = sRecvString.Pos("\n");
  // 命令类别
  // 1:请求图象发送(附加参数:接收端口、色深、品质)
  // 2:请求目标机屏幕分辨率(附加参数:无)
  // 3:接收鼠标信息(附加参数:鼠标命令、X坐标、Y坐标)
  // 4:
  CmdType=StrToIntDef(sRecvString.SubString(1,pos-1),0);
  sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);
  pos = sRecvString.Pos("\n");
  
  switch(CmdType)
    {
    case 1://请求图象发送

    	// 接收端口
    	port = u_short(StrToIntDef(sRecvString.SubString(1,pos-1),0));
    	sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);

    	pos = sRecvString.Pos("\n");
    	// 色深
    	CL = StrToIntDef(sRecvString.SubString(1,pos-1),0);
    	sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);
    
    	pos = sRecvString.Pos("\n");
    	// 品质
    	CQ = StrToIntDef(sRecvString.SubString(1,pos-1),0);
    
    	if (port) {
    		TMemoryStream *ImageStream;  // 定义数据流
    		try {
    			ImageStream = new TMemoryStream;  // 分配内存
    			// 捕获当前屏幕并保存到ImageStream中
    			CaptureImage(CM_ENTIRESCREEN, CL, CQ, ImageStream);
    			// 发送ImageStream到接收端口
    			if (!SendStream(sRemoteAddress, port, ImageStream))
    				MessageBox(0,"发送数据流失败","冰河",MB_ICONERROR);
    		}
    		__finally {
    			delete ImageStream;  // 释放资源
    		}
    	}
      break;
    case 2://请求目标机屏幕分辨率
      {
      char str[24];
      int Width=GetSystemMetrics(SM_CXSCREEN);
      int Height=GetSystemMetrics(SM_CYSCREEN);
      sprintf(str,"%d*%d\n",Width,Height);
      Socket->SendText(str);
      }
      break;
    case 3://
      {
      int MouseCmd=StrToIntDef(sRecvString.SubString(1,pos-1),0);
      sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);
      pos = sRecvString.Pos("\n");
      int px=StrToIntDef(sRecvString.SubString(1,pos-1),0);
      sRecvString = sRecvString.SubString(pos+1,sRecvString.Length()-pos);
      pos = sRecvString.Pos("\n");
      int py=StrToIntDef(sRecvString.SubString(1,pos-1),0);
      switch(MouseCmd)
        {
        case 1://WM_MOUSEMOVE
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,px,py,0,0);
          break;
        case 2://WM_LBUTTONDOWN
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,px,py,0,0);
          break;
        case 3://WM_LBUTTONUP
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,px,py,0,0);
          break;
        case 4://WM_RBUTTONDOWN
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,px,py,0,0);
          break;
        case 5://WM_RBUTTONUP
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,px,py,0,0);
          break;
        case 6://WM_MIDBUTTONDOWN
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,px,py,0,0);
          break;
        case 7://WM_MIDBUTTONUP
          mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,px,py,0,0);
          break;

        default:
          break;
        }
      }
      break;
    default://
      break;
    }
    
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::ServerSocket1ClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
	ErrorCode = 0;
	MessageBox(0,"远程连接出错","冰河",MB_ICONERROR);  // 显示出错信息
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormCreate(TObject *Sender)
{
	ServerSocket1->Port = LISTENPORT;  // 指定监听端口
	ServerSocket1->Open();  // 开始监听
}
//---------------------------------------------------------------------------






void __fastcall TMainForm::N2Click(TObject *Sender)
{
	// 是否打开端口允许别人抓屏
	N2->Checked = !N2->Checked;
	ServerSocket1->Active = N2->Checked;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -