📄 rcaclient.cpp
字号:
EndDialog( dlg, TRUE );
return TRUE;
}
}
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
if( g_ThreadState == WAIT_REQUEST )
{
EndDialog( dlg, TRUE );
}
}
return TRUE;
break;
case IDCANCEL:
EndDialog( dlg, FALSE );
return TRUE;
default:
break;
}
default:
return FALSE;
}
return FALSE;
}
VOID WINAPI OnCommand( HWND hwnd, WPARAM w, LPARAM l )
{
// 筛选命令 ID
switch( w )
{
case ID_EXIT:
if ( g_ThreadState == CONNECTING)
{
if( IDOK == MessageBox( hwnd, "正在获取远程计算机屏幕信息, 是否要中断连接 ?"
, "RCA Client", MB_ICONQUESTION | MB_OKCANCEL ) )
DestroyWindow( hwnd );
}
else
{
g_bMustExit = TRUE;
DestroyWindow( hwnd );
}
break;
case ID_CONNECT:
//if( false )
if( FALSE == DialogBox( g_hInstance, MAKEINTRESOURCE(IDD_CONNECTDIALOG),
g_hWnd, ConnectDialogProc ) )
{
return;
} else {
// 设置 UI
EnableMenuItem( GetMenu(hwnd), ID_DISCONNECT, MF_ENABLED);
EnableMenuItem( GetMenu(hwnd), ID_CONNECT, MF_GRAYED | MF_DISABLED);
EnableMenuItem( GetMenu(hwnd), ID_REFRUSH, MF_ENABLED );
}
break;
case ID_IMAGE_FORMAT_BMP:
CheckMenuItem( GetMenu(hwnd), ID_IMAGE_FORMAT_BMP , MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_IMAGE_FORMAT_JPEG, MF_UNCHECKED );
g_gm.dwImageFormat = IMAGE_FORMAT_BMP;
return;
case ID_IMAGE_FORMAT_JPEG:
CheckMenuItem( GetMenu(hwnd), ID_IMAGE_FORMAT_JPEG , MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_IMAGE_FORMAT_BMP, MF_UNCHECKED );
g_gm.dwImageFormat = IMAGE_FORMAT_JPEG;
return;
case ID_BIT_8:
CheckMenuItem( GetMenu(hwnd), ID_BIT_8, MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_BIT_16, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_BIT_24, MF_UNCHECKED );
g_gm.iBitCount = 8;
return;
case ID_BIT_16:
CheckMenuItem( GetMenu(hwnd), ID_BIT_8, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_BIT_16, MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_BIT_24, MF_UNCHECKED );
g_gm.iBitCount = 16;
return;
case ID_BIT_24:
CheckMenuItem( GetMenu(hwnd), ID_BIT_8, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_BIT_16, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_BIT_24, MF_CHECKED );
g_gm.iBitCount = 24;
return;
case ID_JPEG_QUALITY_10:
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_10, MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_30, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_50, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_70, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_90, MF_UNCHECKED );
g_gm.dwFlagEx1 = 10;
return;
case ID_JPEG_QUALITY_30:
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_10, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_30, MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_50, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_70, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_90, MF_UNCHECKED );
g_gm.dwFlagEx1 = 30;
return;
case ID_JPEG_QUALITY_50:
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_10, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_30, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_50, MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_70, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_90, MF_UNCHECKED );
g_gm.dwFlagEx1 = 50;
return;
case ID_JPEG_QUALITY_70:
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_10, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_30, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_50, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_70, MF_CHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_90, MF_UNCHECKED );
g_gm.dwFlagEx1 = 70;
return;
case ID_JPEG_QUALITY_90:
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_10, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_30, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_50, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_70, MF_UNCHECKED );
CheckMenuItem( GetMenu(hwnd), ID_JPEG_QUALITY_90, MF_CHECKED );
g_gm.dwFlagEx1 = 90;
return;
case ID_REFRUSH:
if( g_ThreadState == WAIT_REQUEST )
SetEvent( g_tc.hBeginRequest );
break;
case ID_DISCONNECT:
EnableMenuItem( GetMenu(hwnd), ID_CONNECT, MF_ENABLED );
EnableMenuItem( GetMenu(hwnd), ID_DISCONNECT, MF_DISABLED | MF_GRAYED );
EnableMenuItem( GetMenu(hwnd), ID_REFRUSH, MF_DISABLED | MF_GRAYED );
if( g_ThreadState == WAIT_REQUEST )
{
SetEvent( g_tc.hBeginConnectEvent );
}
if( g_ThreadState == REQUESTING )
{
SetEvent( g_tc.hExitEvent );
}
closesocket( g_hSocket2 );
g_hSocket2 = NULL;
break;
default:
break;
}
return;
}
RCAMOUSEINPUT mi;
RCAKEYBDINPUT ki;
RCAREQUESTHEADER rreqh;
LRESULT CALLBACK MainWindowProc( HWND hwnd, UINT msg, WPARAM w, LPARAM l )
{
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
INT ret;
GetClientRect( hwnd, &rect );
static UINT_PTR timer;
switch( msg )
{
case WM_RBUTTONDOWN:
if( g_hSocket2 )
{
mi.dwExtraInfo =0;
mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
//mi.dx = (lParam&0x0000ffff) * (65535 / 1024);
//mi.dy = (lParam>>16) * (65535 / 768);
mi.mouseData = 0;
mi.time = 0;
rreqh.dwRequestID = 0x40;
rreqh.requestBytes = sizeof(RCAREQUESTHEADER) + sizeof(RCAMOUSEINPUT);
ret = send(g_hSocket2, (char*)&rreqh, sizeof(rreqh), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
ret = send(g_hSocket2, (char*)&mi, sizeof(mi), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
}
return TRUE;
case WM_RBUTTONUP:
if( g_hSocket2 )
{
mi.dwExtraInfo =0;
mi.dwFlags = MOUSEEVENTF_RIGHTUP;
//mi.dx = (lParam&0x0000ffff) * (65535 / 1024);
//mi.dy = (lParam>>16) * (65535 / 768);
mi.mouseData = 0;
mi.time = 0;
rreqh.dwRequestID = 0x40;
rreqh.requestBytes = sizeof(RCAREQUESTHEADER) + sizeof(RCAMOUSEINPUT);
ret = send(g_hSocket2, (char*)&rreqh, sizeof(rreqh), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
ret = send(g_hSocket2, (char*)&mi, sizeof(mi), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
}
return TRUE;
case WM_LBUTTONUP:
if( g_hSocket2 )
{
mi.dwExtraInfo =0;
mi.dwFlags = MOUSEEVENTF_LEFTUP;
// mi.dx = (lParam&0x0000ffff) * (65535 / 1024);
// mi.dy = (lParam>>16) * (65535 / 768);
mi.mouseData = 0;
mi.time = 0;
rreqh.dwRequestID = 0x40;
rreqh.requestBytes = sizeof(RCAREQUESTHEADER) + sizeof(RCAMOUSEINPUT);
ret = send(g_hSocket2, (char*)&rreqh, sizeof(rreqh), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
ret = send(g_hSocket2, (char*)&mi, sizeof(mi), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
}
return TRUE;
case WM_LBUTTONDOWN:
if( g_hSocket2 )
{
mi.dwExtraInfo =0;
mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
// mi.dx = (lParam&0x0000ffff) * (65535 / 1024);
// mi.dy = (lParam>>16) * (65535 / 768);
mi.mouseData = 0;
mi.time = 0;
rreqh.dwRequestID = 0x40;
rreqh.requestBytes = sizeof(RCAREQUESTHEADER) + sizeof(RCAMOUSEINPUT);
ret = send(g_hSocket2, (char*)&rreqh, sizeof(rreqh), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
ret = send(g_hSocket2, (char*)&mi, sizeof(mi), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
}
return TRUE;
case WM_MOUSEMOVE:
if( g_hSocket2 )
{
mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
mi.dx = (LONG)(l & 0x0000ffff) * 65535 / rect.right;
mi.dy = (LONG)(l >> 16) * 65535 / rect.bottom;
rreqh.dwRequestID = 0x40;
rreqh.requestBytes = 64;
ret = send(g_hSocket2, (char*)&rreqh, sizeof(rreqh), 0 );
if( ret == SOCKET_ERROR )
{
MessageBox( hwnd, "网络连接出现问题或 RCA 服务器已经被关闭", "RCA Client Information", MB_ICONINFORMATION );
PostMessage( hwnd, WM_COMMAND, ID_DISCONNECT, 0 );
return FALSE;
}
ret = send(g_hSocket2, (char*)&mi, sizeof(mi), 0 );
if( ret == SOCKET_ERROR )
return FALSE;
}
break;
case WM_KEYDOWN:
if( (w==VK_F5) && (g_ThreadState==WAIT_REQUEST) )
SetEvent( g_tc.hBeginRequest );
if( (w==VK_RWIN) || (w==VK_LWIN) )
break;
break;
case WM_THREADWORKSTATE:
OnThreadWorkState( hwnd, w, l );
return 0;
case WM_COMMAND:
OnCommand( hwnd, w, l );
return 0;
case WM_TIMER:
if( g_ThreadState != WAIT_CONNECT )
PostMessage(hwnd, WM_COMMAND, ID_DISCONNECT , NULL );
DestroyWindow( hwnd );
KillTimer( hwnd, timer );
return TRUE;
case WM_CREATE:
mi.dwExtraInfo =0;
mi.mouseData = 0;
mi.time = 0;
lstrcpy(rreqh.rcaID, "RCA" );
rreqh.wMajorVersion =1;
rreqh.wMinorVersion =0;
timer = SetTimer(hwnd, 1, 10 * 60 * 1000, NULL );
return OnCreate( hwnd, (PAINTSTRUCT*)l );
g_gm.dwImageFormat = IMAGE_FORMAT_JPEG;
g_gm.iBitCount = 8;
g_gm.dwFlagEx1 = 50;
break;
case WM_SIZE:
SendMessage( GetDlgItem( hwnd, ID_TOOLBAR ), TB_AUTOSIZE, 0, 0 );
break;
case WM_PAINT:
hdc = BeginPaint( hwnd, &ps );
OnPaint( hwnd, hdc );
EndPaint( hwnd, &ps );
break;
case WM_DESTROY:
g_bMustExit = TRUE;
OnDestroy();
PostQuitMessage(0);
break;
default:
break;
}
return DefWindowProc( hwnd, msg, w, l );
}
INT WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, INT )
//int main(int argc, char* argv[])
{
g_hInstance = GetModuleHandle( NULL );
WNDCLASSEX wcex;
wcex.cbClsExtra = 0;
wcex.cbSize = sizeof(wcex);
wcex.cbWndExtra = 0;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hIcon = LoadIcon( g_hInstance, MAKEINTRESOURCE(IDI_CLIENTICON) );
wcex.hIconSm = LoadIcon( g_hInstance, MAKEINTRESOURCE(IDI_CLIENTICON) );
wcex.hInstance = g_hInstance;
wcex.lpfnWndProc = MainWindowProc;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "RCAClient_Window";
wcex.style = CS_VREDRAW | CS_HREDRAW;
if( !RegisterClassEx( &wcex ) )
return FALSE;
g_hWnd = CreateWindowEx( 0, "RCAClient_Window", "RCA Client", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, LoadMenu( g_hInstance, MAKEINTRESOURCE(IDR_MENU1) ),
g_hInstance, NULL );
if( !g_hWnd )
return 0;
ShowWindow( g_hWnd, SW_SHOWNORMAL );
UpdateWindow( g_hWnd );
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -