📄 rcaclientlibrary.cpp
字号:
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 + -