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

📄 rcaclientlibrary.cpp

📁 远程控制软件源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			if( dwRet == (WAIT_OBJECT_0 + 1 ) )
			{
				return FALSE;
			}			
			
			ret = WSAEnumNetworkEvents( s, hEventArray[0],  &ns );
			if( ret == SOCKET_ERROR )
				break;

			if( ns.lNetworkEvents & FD_CONNECT )
			{
				if( ns.iErrorCode[ FD_CONNECT_BIT ] != 0 )
				{
					return FALSE;
				}
				else
					return TRUE;
			}
		}
	}

	// never run to here;
	return TRUE;
}


VOID
WINAPI
InitRCARequestHead (
	RCAREQUESTHEADER *	rreqh,
	WORD				wMajorVersion,	// 主版本号
	WORD				wMinorVersion,	// 次版本号
	DWORD				dwRequestID,
	DWORD				dwRequestBytes
)
{
	rreqh->dwRequestID = dwRequestID;
	rreqh->requestBytes = dwRequestBytes;
	rreqh->wMajorVersion = wMajorVersion;
	rreqh->wMinorVersion = wMinorVersion;

	lstrcpy( rreqh->rcaID, "RCA" );
}



BOOL 
WINAPI
RCASendRequest_0X10_EventSelectIO(
	SOCKET		s,
	HANDLE		hEventArray[2],
	HWND		hwnd,
	PSTR		pOperation,
	PSTR		pFile,
	PSTR		pParameters,
	PSTR		pDirectory,
	INT			nShowCmd
)
{
	DWORD	dwCountSize;
	INT		ret;
	DWORD nOperation	= lstrlen( pOperation ) +1;
	DWORD nFile			= lstrlen( pFile ) +1;
	DWORD nParameters	= lstrlen( pParameters ) +1;
	DWORD nDirectory	= lstrlen( pDirectory ) +1;
	dwCountSize = 
		4 +					// hwnd
		4 + nOperation +	// pOperation
		4 + nFile +			// pFile
		4 + nParameters +	// pParameters
		4 + nDirectory +	// pDirectory
		4;					// nShowCmd
	
	RCAREQUESTHEADER rreqh;
	InitRCARequestHead( &rreqh, 1, 0, 0x10, dwCountSize + sizeof(RCAREQUESTHEADER) );

	// 发送请求头
	ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(RCAREQUESTHEADER));
	if( ret != sizeof(RCAREQUESTHEADER) )
		return FALSE;

	ret = RCASend_EventSelectIO( s, hEventArray, (char*)&hwnd, sizeof(HWND));
	if( ret != sizeof(HWND) )
		return FALSE;

	
	if( nOperation == 0 )
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nOperation, sizeof(int));
	else {
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nOperation, sizeof(int));
		if( ret != sizeof(int) )
			return FALSE;
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)pOperation, nOperation);
		if( ret != nOperation )
			return FALSE;
	}

	if( nFile == 0 )
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nFile, sizeof(int));
	else {
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nFile, sizeof(int));
		if( ret != sizeof(int) )
			return FALSE;
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)pFile, nFile);
		if( ret != nFile )
			return FALSE;
	}

	if( nParameters == 0 )
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nParameters, sizeof(int));
	else {
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nParameters, sizeof(int));
		if( ret != sizeof(int) )
			return FALSE;
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)pParameters, nParameters);
		if( ret != nParameters )
			return FALSE;
	}

	if( nDirectory == 0 )
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nDirectory, sizeof(int));
	else {
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)&nDirectory, sizeof(int));
		if( ret != sizeof(int) )
			return FALSE;
		ret = RCASend_EventSelectIO( s, hEventArray, (char*)pDirectory, nDirectory);
		if( ret != nDirectory )
			return FALSE;
	}

	return TRUE;
}


BOOL
WINAPI
RCASendRequest_0X20_EventSelectIO(
	SOCKET		s,
	HANDLE		hEventArray[2],
	RCAGETIMAGEDATA * pgm
)
{
	if( pgm->dwImageFormat != IMAGE_FORMAT_BMP )
		if( pgm->dwImageFormat != IMAGE_FORMAT_JPEG )
			return FALSE;


//	DWORD	dwRet;
	int		ret;

	RCAREQUESTHEADER rreqh;
	rreqh.dwRequestID = 0x20;
	rreqh.requestBytes = sizeof(rreqh) + sizeof(RCAGETIMAGEDATA);
	rreqh.wMajorVersion	= 1;
	rreqh.wMinorVersion	= 0;

	lstrcpy( rreqh.rcaID, "RCA" );
	
	ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(RCAREQUESTHEADER));
	if( ret != sizeof( RCAREQUESTHEADER ) )
		return FALSE;
	
	ret = RCASend_EventSelectIO( s, hEventArray, (char*)pgm, sizeof(RCAGETIMAGEDATA));
	if( ret != sizeof( RCAGETIMAGEDATA ) )
		return FALSE;

	return TRUE;
}



HBITMAP
WINAPI
RCARecvImageData(
	SOCKET	s,
	HANDLE	hEventArray[2],
	DWORD	dwImageFormat 
	)
{

	int				ret;
//	DWORD			dwRet;
	RCARESPONSEHEADER rresh;


	// 接收响应头
	ret = RCARecv_EventSelectIO( s, hEventArray, (char*)&rresh, 
		sizeof(RCARESPONSEHEADER));
	if ( ret != sizeof(RCARESPONSEHEADER) )
		return FALSE;

	DWORD dwRecvCount = rresh.dwTotalBytes - sizeof(rresh);
	if ( dwRecvCount <= 0 )
		return FALSE;

	// 分配内存, 接收剩余的像素数据
	char * buf = (char*)new BYTE[dwRecvCount];
	if ( buf == NULL )
		return FALSE;

	// 接收图象数据
	ret = RCARecv_EventSelectIO( s, hEventArray, buf, dwRecvCount);
	if ( ret != dwRecvCount )
		return FALSE;

	if ( dwImageFormat == IMAGE_FORMAT_BMP )
	{
		// 通过 BMP 格式的数据创建 HBITMAP
		
		PBITMAPFILEHEADER pbmfh = (PBITMAPFILEHEADER)buf;

		HDC hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );
		if( hdc == NULL )
		{
			delete[] buf;
			return FALSE;
		}

		
		PBYTE pBits = (PBYTE)buf;
		pBits += pbmfh->bfOffBits;
		PBITMAPINFO pbmih = (PBITMAPINFO) ( pbmfh+1 );
		PVOID p;
		HBITMAP hbm = CreateDIBSection( hdc, pbmih, DIB_RGB_COLORS, &p, NULL, NULL );
		if ( hbm == NULL )
		{
			DeleteDC( hdc );
			delete[] buf;
			return FALSE;
		}
		
		CopyMemory( p, pBits, pbmih->bmiHeader.biSizeImage );


		DeleteDC( hdc );
		delete[] buf;

		return hbm;

	} else if ( dwImageFormat == IMAGE_FORMAT_JPEG )
	{

		// 创建 DC 以备在上面绘制 JPEG 像素
		HDC hdc = CreateDC( "DISPLAY" , NULL, NULL, NULL);
		if ( hdc == NULL )
		{
			delete[] buf;
			return FALSE;
		}

		PBYTE	pJPEGBuffer			= (PBYTE)buf;					// JPEG 缓冲区
		DWORD	dwJPEGBufferSize	= rresh.dwTotalBytes - 40;	// JPEG 缓冲区大小
		BYTE*	pRGBBuffer = NULL;
		DWORD	width;		// 图象宽
		DWORD   height;		// 图象高
		DWORD	channels;	// 图象颜色通道数目
		
		if ( FALSE == DecodeFromJPEGBuffer( pJPEGBuffer, dwJPEGBufferSize,
									&pRGBBuffer, &width, &height, &channels ) )
		{
			delete[] buf;
			DeleteDC( hdc );

			return FALSE;
		}
		
		BITMAPINFO	bmi;
		bmi.bmiHeader.biSize			= sizeof(bmi);
		bmi.bmiHeader.biBitCount		= 24;
		bmi.bmiHeader.biClrImportant	= 0;
		bmi.bmiHeader.biClrUsed			= 0;
		bmi.bmiHeader.biCompression		= BI_RGB;
		bmi.bmiHeader.biWidth			= width;
		bmi.bmiHeader.biHeight			= height;
		bmi.bmiHeader.biPlanes			= 1;
		bmi.bmiHeader.biSizeImage		= width * height * 3;
		bmi.bmiHeader.biXPelsPerMeter	= 0;
		bmi.bmiHeader.biYPelsPerMeter	= 0;
		
		bmi.bmiColors[0].rgbRed			= (BYTE)0xff;
		bmi.bmiColors[0].rgbGreen		= (BYTE)0xff;
		bmi.bmiColors[0].rgbBlue		= (BYTE)0xff;
		bmi.bmiColors[0].rgbReserved	= (BYTE)0x0;
		
		PVOID p=NULL;
		HBITMAP hbm = CreateDIBSection( hdc, &bmi, DIB_RGB_COLORS, &p, NULL, NULL );
		if( hbm == NULL )
		{
			DeleteDC( hdc );
			delete[] buf;
			delete[] pRGBBuffer;

			return FALSE;
		}

		CopyMemory( p, pRGBBuffer, bmi.bmiHeader.biSizeImage );

		DeleteDC( hdc );
		delete[] buf;
		delete[] pRGBBuffer;

		return hbm;
	}
	// never run to here
	return NULL;
}



BOOL
WINAPI
RCASendMouseInput_EventSelectIO(
	SOCKET			s,
	HANDLE			hEventArray[2],
	RCAMOUSEINPUT * pMouseInput,
	DWORD			dwArraySize
)
{

	if ( dwArraySize > 20 )
		return FALSE;

	int ret;
	RCAREQUESTHEADER rreqh;
	InitRCARequestHead( &rreqh, 1, 0, 0x40, 
						sizeof(rreqh) + sizeof(RCAMOUSEINPUT) * dwArraySize );
	
	ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(rreqh));
	if( ret != sizeof(rreqh) )
		return FALSE;

	ret = RCASend_EventSelectIO( s, hEventArray, (char*)pMouseInput, 
								 sizeof(RCAMOUSEINPUT)*dwArraySize );
	if( ret != sizeof(RCAMOUSEINPUT) * dwArraySize )
		return FALSE;

	return TRUE;
}


BOOL
WINAPI
RCASendKeybdInput_EventSelectIO(
	SOCKET			s,
	HANDLE			hEventArray[2],
	RCAKEYBDINPUT * pKeybdInput,
	DWORD			dwArraySize
)
{
	if( dwArraySize > 20 )
		return FALSE;

	int ret;
	DWORD dwSize = sizeof(RCAKEYBDINPUT) * dwArraySize;

	RCAREQUESTHEADER rreqh;
	InitRCARequestHead( &rreqh, 1, 0, 0x41, dwSize + sizeof(rreqh) );

	ret = RCASend_EventSelectIO( s, hEventArray, (char*)&rreqh, sizeof(rreqh));
	if( ret != sizeof(rreqh ) )
		return FALSE;

	ret = RCASend_EventSelectIO( s, hEventArray, (char*)pKeybdInput, dwSize);
	if( ret != dwSize )
		return FALSE;

	return TRUE;
}



BOOL
WINAPI
CreateMouseInput(
	RCAMOUSEINPUT*	pmi,
	UINT			msg,
	WPARAM			w,
	LPARAM			l,
	float			fWidthScale,
	float			fHeightScale
)
{
	pmi->dwExtraInfo	= 0;
	pmi->mouseData		= 0;
	pmi->time			= 0;

	switch( msg )
	{
	case WM_MOUSEMOVE:
		pmi->dwFlags		= MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
		pmi->dx				= (LONG)(( w & 0x0000ffff ) * fWidthScale);
		pmi->dy				= (LONG)(( w >> 16 ) * fHeightScale );
		return TRUE;

	case WM_LBUTTONDOWN:
		pmi->dwFlags = MOUSEEVENTF_LEFTDOWN;
		return TRUE;

	case WM_RBUTTONDOWN:
		pmi->dwFlags = MOUSEEVENTF_RIGHTDOWN;
		return TRUE;

	case WM_LBUTTONUP:
		pmi->dwFlags = MOUSEEVENTF_LEFTUP;
		return TRUE;

	case WM_RBUTTONUP:
		pmi->dwFlags = MOUSEEVENTF_RIGHTUP;
		return TRUE;

	default:
		break;
	}

	return FALSE;
}


BOOL
WINAPI
CreateKeybdInput(
	RCAKEYBDINPUT*	pbi,
	UINT			msg,
	WPARAM			w,
	LPARAM			l
)
{
	pbi->dwExtraInfo = 0;
	pbi->time		 = 0;
	pbi->wScan		 = 0;

	switch( msg )
	{
	case WM_KEYDOWN:
		pbi->wVk = (WORD)w;
		pbi->dwFlags = 0;
		return TRUE;

	case WM_KEYUP:
		pbi->wVk = (WORD)w;
		pbi->dwFlags = KEYEVENTF_KEYUP;
		return TRUE;

	default:
		break;
	}

	return FALSE;

}

⌨️ 快捷键说明

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