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

📄 rcaclientlibrary.cpp

📁 远程控制软件源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
///////////////////////////////////////////
//
//	获得整个屏幕的象素信息
//	
//	参数: 
//
//	pbmi[in,out] -- BITMAPINFO 结构指针, 函数成功调用后会填充这个结构,这个结构反映了象素信息
//
//	x, y, w, h;  矩形的左上角座标, 以及宽高. 如果这些参数不合法,将被修整为合法参数
//
//	pBits[in,out]	-- void 指针, 函数调用成功后,pBits 将被象素值填充. 如果 pBits 为NULL,
//					函数将修改 dwBufferSize 参数, 指明需要多少缓冲存放象素值
//
//  dwBufferSize -- [in, out] 指明 pBits 的大小. 如果函数成功调用后, dwBufferSize 将会被修改, 
//					指明实际拷贝的象素字节数
// 返回值:
//		 BOOL 类型, 函数调用成功后, 将返回 TRUE; 失败,将返回 FALSE;
// 
HBITMAP 
WINAPI GetDCPixel_BMP (
	HDC			hdc,
	int 		x,
	int 		y,
	int 		w,
	int 		h,
	int			zw,
	int			zh,
	WORD		wBitCount,
	VOID **		pBits,
	BITMAPINFOHEADER	* pbmih,		// 当色深为 8 时, 包含颜色表
	DWORD *		pdwBitmapInfoSize
)
{
	int width = 0;
	int height;

	// 确定 DC 是而效的, 并获得 DC 的宽高(以像素为单位)
	width = GetDeviceCaps( hdc, HORZRES);
	if( width == 0 )
		return NULL;
	height = GetDeviceCaps( hdc, VERTRES);
	
	// 修整请求的矩形
	x = (x<0)||(x>(width-1)) ? 0 : x;
	x = (y<0)||(y>(height-1)) ? 0 : y;

	w = (w>(width-x)) || (w<1) ?  width - x : w;
	h = (h>(height-y)) || (h<1) ?  height - y : h;

	zw = zw <= 0 ? w : zw;
	zh = zh <= 0 ? h : zh;

	// 修整请求的色深
	if( wBitCount <= 8 )
		wBitCount = 8;
	else if( wBitCount <=16 )
		wBitCount = 16;
	else if( wBitCount <= 24 )
		wBitCount = 24;
	else if( wBitCount >=32 )
		wBitCount = 32;


	// 计算存储图象所需空间的大小
	//DWORD tmp = (((w * wBitCount) +31) & ~31) / 8 * h;

	
	if( pbmih != NULL )
	{
		if( wBitCount == 8 )
		{
			if( *pdwBitmapInfoSize < (sizeof(RGBQUAD)*256 + sizeof(BITMAPINFOHEADER) ))
				return NULL;
		} 
		else 
		{
			if( *pdwBitmapInfoSize < sizeof( BITMAPINFOHEADER) )
				return NULL;
		}

	} 
	else
	{
		*pdwBitmapInfoSize = (sizeof(RGBQUAD)*256 + sizeof(BITMAPINFOHEADER) );
		return NULL;
	}


	HBITMAP		bmp;
	PVOID		pTmp = NULL;
	BITMAPINFO	bmi;
	bmi.bmiHeader.biSize			= sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth			= zw;
	bmi.bmiHeader.biHeight			= zh;
	bmi.bmiHeader.biPlanes			= 1;
	bmi.bmiHeader.biBitCount		= wBitCount;
	bmi.bmiHeader.biCompression		= BI_RGB;
	bmi.bmiHeader.biSizeImage		= 0;
	bmi.bmiHeader.biXPelsPerMeter	= 0;
	bmi.bmiHeader.biYPelsPerMeter	= 0;
	bmi.bmiHeader.biClrUsed			= 0;
	bmi.bmiHeader.biClrImportant	= 0;


	// create a DIB section bitmap;
    bmp = CreateDIBSection( hdc, &bmi, DIB_RGB_COLORS, &pTmp, NULL, 0 );
	if( bmp == NULL )
		return NULL;

	// set the out param pBits to image buffer pTmp;
	*pBits = pTmp;

	HDC hdcMem = CreateCompatibleDC( hdc );
	if( hdcMem == NULL)
	{
		DeleteObject(bmp);
		return NULL;
	}
	
	SelectObject( hdcMem, bmp );
	StretchBlt( hdcMem, 0, 0, zw, zh, hdc, x, y, w, h, SRCCOPY );
	//BitBlt( hdc, 0, 0,w, h, hdcMem, 0, 0, SRCCOPY );	

	DIBSECTION ds;
	GetObject( bmp, sizeof(ds), (PVOID)&ds );

	//cout << ds.dsBmih.biClrUsed << endl;
	if( ds.dsBm.bmBitsPixel == 8 )
	{
		
		int clrGetNum;
		SelectObject( hdcMem, bmp );
		clrGetNum = GetDIBColorTable( hdcMem, 0, ds.dsBmih.biClrUsed, 
			(RGBQUAD*)(sizeof(BITMAPINFOHEADER) +(char*)pbmih ) ); 
		if(  0 == clrGetNum )
		{
			DeleteDC( hdcMem );
			DeleteObject( bmp );
			return NULL;
		}

	}

	CopyMemory( (void*)pbmih, &(ds.dsBmih), sizeof(BITMAPINFOHEADER) );	
	// 计算并输出图像所需存储空间的大小
	//cout << (((w * wBitCount) +31) & ~31) / 8 * h << endl;

	DeleteDC( hdcMem );
	return bmp;
}


VOID
WINAPI InitResponseHead(
	PRCARESPONSEHEADER prresh,
	DWORD dwStatusCode,
	DWORD dwSize
)
{
	lstrcpy( prresh->rcaID, "RCA" );
	prresh->dwStatusCode = dwStatusCode;
	prresh->dwTotalBytes = dwSize;

}


char ___s[256];

char * WINAPI WSAErrorString( int WSAError )
{
	switch( WSAError )
	{

	case WSAEACCES:		// 10013
		lstrcpy( ___s, "拒绝访问 10013" ); 
		break;

	case WSAEADDRINUSE:	// 10048 
		lstrcpy( ___s, "地址已经使用 10048" );
		break;

	case WSAEADDRNOTAVAIL: // 10049
		lstrcpy( ___s, "请求的地址无效 10049" );
		break;

	case WSAEAFNOSUPPORT: // 10047
		lstrcpy( ___s, "地址家族不支持 10047" );
		break;

	case WSAEALREADY:	// 10037
		lstrcpy( ___s, "操作已经在进行中 10037" );
		break;

	case WSAECONNABORTED:	// 10053
		lstrcpy( ___s, "软件原因连接被中断 10053" );
		break;

	case WSAECONNREFUSED:	// 10061
		lstrcpy( ___s, "连接被拒绝 10061" );
		break;

	case WSAECONNRESET: // 10054
		lstrcpy( ___s, "连接被重置 10054" );
		break;

	case WSAEDESTADDRREQ: // 10039
		lstrcpy( ___s, "必须指定目的地址 10039" );
		break;

	case WSAEFAULT:
		lstrcpy( ___s, "地址错误 10014" );
		break;

	case WSAEHOSTDOWN:
		lstrcpy( ___s, "远程主机死机了( 蓝屏?) 10064" );
		break;


	case WSAEHOSTUNREACH:
		lstrcpy( ___s, "无法找到主机 10065" );
		break;

	case WSAEINPROGRESS:
		lstrcpy( ___s, "阻塞操作正在进行 10036" );
		break;

	case WSAEINTR:
		lstrcpy( ___s, "阻塞操作被打断 10004" );
		break;

	case WSAEINVAL:
		lstrcpy( ___s, "参数无效 10022" );
		break;

	case WSAEISCONN:
		lstrcpy( ___s, "套接字已经连接 10056" );
		break;

	case WSAEMFILE:
		lstrcpy( ___s, "打开的套接字太多 10024" );
		break;

	case WSAEMSGSIZE:
		lstrcpy( ___s, "消息太长 10040" );
		break;

	case WSAENETDOWN:
		lstrcpy( ___s, "网络系统, 网络接口, 本地网络有错误 10050" );
		break;

	case WSAENETRESET:
		lstrcpy( ___s, "保持活动的连接在操作中出现错误 10052" );
		break;

	case WSAENETUNREACH:
		lstrcpy( ___s, "网络无法到达 10051" );
		break;

	case WSAENOBUFS:
		lstrcpy( ___s, "没有可用的缓冲区 10055" );
		break;

	case WSAENOPROTOOPT:
		lstrcpy( ___s, "错误的协议选项 10042" );
		break;

	case WSAENOTCONN:
		lstrcpy( ___s, "套接字没有连接 10057" );
		break;

	case WSAENOTSOCK:
		lstrcpy( ___s, "套接字句柄无效 10038" );
		break;

	case WSAEOPNOTSUPP:
		lstrcpy( ___s, "操作不支持 10045" );
		break;

	case WSAEPFNOSUPPORT:
		lstrcpy( ___s, "协议族不支持 10046" );
		break;

	case WSAEPROCLIM:
		lstrcpy( ___s, "使用 WinSock 的进程太多 10067" );
		break;

	case WSAEPROTONOSUPPORT:
		lstrcpy( ___s, "协议不支持 10043" );
		break;

	case WSAEPROTOTYPE:
		lstrcpy( ___s, "协议类型错误 10041" );
		break;

	case WSAESHUTDOWN:
		lstrcpy( ___s, "套接字关闭后无法进行发送操作 10058" );
		break;

	case WSAESOCKTNOSUPPORT:
		lstrcpy( ___s, "套接字类型不支持 10044" );
		break;

	case WSAETIMEDOUT:
		lstrcpy( ___s, "连接超时 10060" );
		break;

	case WSATYPE_NOT_FOUND:
		lstrcpy( ___s, "指定的类没有发现 10109" );
		break;

	case WSAEWOULDBLOCK:
		lstrcpy( ___s, "资源暂时无法获得 10035" );
		break;

	case WSAHOST_NOT_FOUND:
		lstrcpy( ___s, "主机没有发现 11001" );
		break;

	case WSA_INVALID_HANDLE:
		lstrcpy( ___s, "无效句柄 (OS dependent)" );
		break;

	case WSA_INVALID_PARAMETER:
		lstrcpy( ___s, "无效参数 (OS dependent)" );
		break;

//	case WSAINVALIDPROCTABLE:
//		lstrcpy( ___s, "无效的过程表 (OS dependent)" );
//		break;

//	case WSAINVALIDPROVIDER:
//		lstrcpy( ___s, "无效的提供者版本 (OS dependent)" );
//		break;

	case WSA_IO_INCOMPLETE:
		lstrcpy( ___s, "重叠 I/O 事件对象不在通知状态 (OS dependent)" );
		break;

	case WSA_IO_PENDING:
		lstrcpy( ___s, "重叠操作将在过后完成 (OS dependent)" );
		break;

	case WSA_NOT_ENOUGH_MEMORY:
		lstrcpy( ___s, "内存不足 (OS dependent) " );
		break;

	case WSANOTINITIALISED:
		lstrcpy( ___s, "WSAStartup 函数没有成功的调用 10093" );
		break;

	case WSANO_DATA:
		lstrcpy( ___s, "请求的名字有效, 但没有请求的数据记录 11004" );
		break;

	case WSANO_RECOVERY:
		lstrcpy( ___s, "无法回复错误, 可能服务器数据库文件没有发现,也可能是服务器返回了错误 11003" );
		break;

//	case WSAPROVIDERFAILEDINIT:
//		lstrcpy( ___s, "无法初始化服务提供者 (OS dependent)" );
//		break;

	case WSASYSCALLFAILURE:
		lstrcpy( ___s, "系统调用失败 (OS dependent)" );
		break;

	case WSASYSNOTREADY:
		lstrcpy( ___s, "网络子系统错误 10091" );
		break;

	case WSATRY_AGAIN:
		lstrcpy( ___s, "Nonauthoritative host not found. please try again later 11002" );
		break;

	case WSAVERNOTSUPPORTED:
		lstrcpy( ___s, "请求的版本不支持 10092" );
		break;

	case WSAEDISCON:
		lstrcpy( ___s, "从容关闭正在进行中 10101" );
		break;

	case WSA_OPERATION_ABORTED:
		lstrcpy( ___s, "重叠操作被中断 (OS dependent)" );
		break;

	default:
		lstrcpy( ___s, "未知错误" );

	}
	return ___s;
}

BOOL WINAPI CreateEventSelectSocket( 
	SOCKET * s,
	HANDLE * hEvent,
	LONG     lEventFlags
)
{
	
	int		ret;
	*s = socket( AF_INET, SOCK_STREAM, 0 );
	if( *s == INVALID_SOCKET )
		return FALSE;
	
	*hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
	if( *hEvent == NULL )
	{
		closesocket( *s );
		return FALSE;
	}

	ret = WSAEventSelect( *s, *hEvent, lEventFlags );
	if( ret == SOCKET_ERROR )
	{
		closesocket( *s );
		CloseHandle( hEvent );
		return FALSE;
	}

	return TRUE;
}

BOOL
WINAPI
RCAConnect_EventSelectIO(
	SOCKET		s,
	HANDLE		hEventArray[2],
	sockaddr*	addr,
	UINT		uExitMsg
)
{
	int		ret;
	BOOL	bSunc = FALSE;
	DWORD	dwRet;
	WSANETWORKEVENTS ns;

	while(1)
	{
		ret = connect( s, addr, sizeof(sockaddr) );
		if( ret == SOCKET_ERROR )
		{
			if( WSAGetLastError() != WSAEWOULDBLOCK )
				return FALSE;
		}
		else
		{
			return TRUE;
		}
		
		while(1)
		{
			dwRet = WaitForMultipleObjects( 2,  hEventArray, FALSE, INFINITE );
			

⌨️ 快捷键说明

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