自己寫遠端控制軟體之鍵鼠響應
上一篇說影象壓縮和顯示的時候,大家已經看到了在客戶端的捕捉鍵鼠訊息的程式碼,這裡就直接說在伺服器的實現了。
程式碼其實很簡單,但是需要注意的是,在網路接收訊息後,不要在網路回撥裡,直接 mouse_event或者keybd_event 做其它事情也不行,除了從緩衝區取一個緩衝區,然後 Post 到 IOCP 以外,否則,輕則影響效率,重則死鎖。當然接收的資料還是要處理的,用的是執行緒池函式 QueueUserWorkItem,你懂的。不過,QueueUserWorkItem 有時,有點問題(有時有 .Net 程式執行的時候,CPU 很高,原因不明,可能是要和 .Net 強執行緒吧),不過,我有仿 QueueUserWorkItem 的函式,可以避免這個問題,這裡就不說了。
程式碼其實很簡單,但是需要注意的是,在網路接收訊息後,不要在網路回撥裡,直接 mouse_event或者keybd_event 做其它事情也不行,除了從緩衝區取一個緩衝區,然後 Post 到 IOCP 以外,否則,輕則影響效率,重則死鎖。當然接收的資料還是要處理的,用的是執行緒池函式 QueueUserWorkItem,你懂的。不過,QueueUserWorkItem 有時,有點問題(有時有 .Net 程式執行的時候,CPU 很高,原因不明,可能是要和 .Net 強執行緒吧),不過,我有仿 QueueUserWorkItem 的函式,可以避免這個問題,這裡就不說了。
DWORD WINAPI RunCommand(LPVOID lpParam)
{
SOCKET_POST_CTRL *pRecv = (SOCKET_POST_CTRL *) lpParam;
switch (pRecv->remoteCtrl.dwCtrl) {
case CTRL_MOUSE:
SetCursorPos(pRecv->remoteCtrl.x * GetSystemMetrics(SM_CXSCREEN) / pRecv->remoteCtrl.dwWidth,
pRecv->remoteCtrl.y * GetSystemMetrics(SM_CYSCREEN) / pRecv->remoteCtrl.dwHeight);
mouse_event(pRecv->remoteCtrl.dwFlags, 0, 0, 0, 0);
break;
case CTRL_KEYBOARD:
::keybd_event((BYTE) pRecv->remoteCtrl.nChar, (BYTE) pRecv->remoteCtrl.nChar, pRecv->remoteCtrl.nFlags, 0);
break;
default:
break;
}
SQ_PushBack(pRecv->hQueue, ForceCast<DWORD>(pRecv));
return 0;
}
VOID OnRecv(SOCKET_POST *pPost)
{
SOCKET_POST_CTRL *pRecv = (SOCKET_POST_CTRL *) pPost;
if (pRecv->dwBytesTrans == 0) {
IOCP_Close(pRecv->pInfo);
SQ_PushBack(pRecv->hQueue, ForceCast<DWORD>(pRecv));
}
else {
pRecv->dwLeftSize -= pRecv->dwBytesTrans;
if (pRecv->dwLeftSize > 0) {
pRecv->pWSABuf = &(pRecv->wsaBuf[0]);
pRecv->dwBufCount = ItemCount(pRecv->wsaBuf);
pRecv->wsaBuf[0].len= pRecv->dwLeftSize;
pRecv->wsaBuf[0].buf= (PCHAR) &(pRecv->pktHead);
pRecv->wsaBuf[0].buf+= (sizeof(pRecv->pktHead) + sizeof(pRecv->remoteCtrl) - pRecv->dwLeftSize);
IOCP_PostRecv(m_hIOCP, pRecv->pInfo, pRecv);
}
else {
switch (pRecv->pktHead.dwStamp) {
case STAMP_PACKET:
QueueUserWorkItem(RunCommand, pRecv, 0);
SQ_PopFront(m_hQueueRecv, ForceCast<LPDWORD>(&pRecv));
PostRecv(m_pInfo, pRecv);
break;
default:
IOCP_Close(pRecv->pInfo);
SQ_PushBack(pRecv->hQueue, ForceCast<DWORD>(pRecv));
break;
}
}
}
}
相關文章
- 自己寫遠端控制軟體之捕捉螢幕
- 自己寫遠端控制軟體之隱藏介面
- 自己寫遠端控制軟體之網路傳輸
- 自己寫遠端控制軟體之偵測伺服器伺服器
- 自己寫遠端控制軟體之影象壓縮
- 遠端桌面控制軟體,遠端桌面控制軟體推薦,及其連線方法
- vnc遠端控制軟體,vnc遠端控制軟體有什麼用,操作教程VNC
- VNC遠端控制軟體XP版,VNC遠端控制軟體XP版下載VNC
- 遠端控制軟體 LogMeIn
- vnc遠端控制軟體怎麼用,vnc遠端控制軟體怎麼用,使用教程VNC
- vnc遠端控制軟體,vnc遠端控制軟體怎麼使用,vnc server如何安裝?VNCServer
- 供應遠端教育軟體
- VNC遠端控制軟體:VNC Server for MacVNCServerMac
- VNC Server for Mac(VNC遠端控制軟體)VNCServerMac
- 遠端控制軟體哪個好用?精選安全遠控軟體ToDesk
- vnc遠端控制軟體x64,vnc遠端控制軟體x64安裝方法,及使用教程VNC
- vnc遠端控制軟體中文版,細數五款好用的vnc遠端控制軟體中文版VNC
- 2024遠端控制軟體排名1
- 國外遠端控制軟體排行榜
- TeamViewer遠端控制軟體,讓你享受遠端辦公的便利View
- vnc遠端控制軟體綠色,vnc遠端控制軟體綠色版下載,使用者登入使用教程VNC
- 最佳RDP/VPN替代方案:Splashtop遠端控制軟體
- 高流暢的遠端控制軟體推薦
- 八大遠端控制軟體,完美替代TeamviewerView
- 開源一款遠端控制軟體 —— pcshare
- 遠端控制篇:模擬按鍵 (轉)
- VNC遠端協助軟體,VNC遠端協助軟體下載!VNC
- 最快的遠端控制軟體radmin的配置和使用
- 遠端控制軟體 TeamViewer 的侷限性和替代方案View
- VNC Connect Enterprise Mac(遠端桌面控制軟體)VNCMac
- 專業商用遠端控制軟體,低至10元每月
- 遠端桌面軟體概述
- 批次遠端桌面管理軟體 批次遠端桌面
- 免費的遠端控制軟體推薦:vnc viewer mac版VNCViewMac
- Mac軟體推薦:NoMachine輕鬆帶你遠端控制桌面Mac
- 一臺電腦遠端控制多臺電腦的軟體有哪些
- 穿過任意防火牆NAT的遠端控制軟體TeamViewer防火牆View
- 如何遠端連線 遠端桌面軟體連線