0 注意:
怎么接收到命令,以及如何将结果返回给客户端在2、3、4节以及介绍清楚来,本节只讨论功能实现
鼠标操作就很简单了,根据控制端发送过来的鼠标信息,服务端做出相应的鼠标反应就行了,这里有个问题,鼠标是一个复合的信息,有按键有坐标有动作,这里我们需要定义一个鼠标结构体,控制端用这个结构体来封装数据,被控端用这个结构体来解析数据
1鼠标结构体
鼠标结构体包含以下部分:
-
行为:单击、双击、移动
-
按键:左键、右键、中键
-
坐标
// 鼠标结构 typedef struct MouseEvent { MouseEvent() { nAction = 0; nButton = -1; ptXY.x = 0; ptXY.y = 0; } // 行为:单击、双击、移动 WORD nAction; // 按键:左键、右键、中键 WORD nButton; // 坐标 POINT ptXY; }MOUSEEVENT, *PMOUSEEVENT;
2 鼠标操作参考代码
// 获取鼠标结构信息 bool GetMoueEvent(MOUSEEVENT& mouse) { if (m_packet.sCmd == 11) { memcpy(&mouse, m_packet.strData.c_str(), sizeof(MOUSEEVENT)); return true; } return false; }
int MouseEvent() { // 获取鼠标操作信息,把缓冲区数据转换为MOUSEVENT结构 MOUSEEVENT mouse; if(CServerSocket::getInstance()->GetMoueEvent(mouse)) { OutputDebugString(_T("获取鼠标操作失败!!")); return -1; } // 为了避免switch和if嵌套,使用置标志的方法来组合 按键与操作 DWORD flags = 0; // 让flags低八位的低三个比特代表什么按键 switch (mouse.nButton) { case 0: // 左键 flags = 0x01; break; case 1:// 右键 flags = 0x02; break; case 2:// 中键 flags = 0x04; break; case 3:// 没有按键,鼠标移动 flags = 0x08; break; } // 如果有按键的话,先设置鼠标位置 等于8就是没有按键,不等于8就是有按键 if (flags != 8) { SetCursorPos(mouse.ptXY.x, mouse.ptXY.y); } // 让高四个比特代表具体操作 switch (mouse.nAction) { case 0:// 单击 flags |= 0x10; break; case 1:// 双击 flags |= 0x20; break; case 2:// 按下 flags |= 0x40; break; case 3:// 放开 flags |= 0x80; break; } /* 低位代表按键, 0x01 左键、0x01 右键、0x01 中键 高位代表动作 0x10:单击、0x20:双击、0x40:按下、0x80:放开 */ // mouse_event 函数合成鼠标运动和按钮单击。 // 鼠标事件,距离上一次鼠标事件的偏移量,上面通过SetCursorPos发生一次鼠标事件,这里为0就就代表在当前位置 switch (flags) { // ----左键------ case 0x21: // 鼠标左键双击 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo()); case 0x11: // 鼠标左键单击 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo()); break; case 0x41: // 鼠标左键按下 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo()); break; case 0x81: // 鼠标左键放开 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo()); break; // ----右键------ case 0x22: // 鼠标右键双击 mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, GetMessageExtraInfo()); case 0x12: // 鼠标右键单击 mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, GetMessageExtraInfo()); break; case 0x42: // 鼠标右键按下 mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, GetMessageExtraInfo()); break; case 0x82: // 鼠标右键放开 mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, GetMessageExtraInfo()); break; // ----中键------ case 0x24: // 鼠标中键双击 mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, GetMessageExtraInfo()); case 0x14: // 鼠标中键单击 mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, GetMessageExtraInfo()); mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, GetMessageExtraInfo()); break; case 0x44: // 鼠标中键按下 mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, GetMessageExtraInfo()); break; case 0x84: // 鼠标中键放开 mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, GetMessageExtraInfo()); break; // ----移动------ case 0x08: // 鼠标移动 mouse_event(MOUSEEVENTF_MOVE, mouse.ptXY.x, mouse.ptXY.y, 0, GetMessageExtraInfo()); break; } // 鼠标操作完成,回应客户端 CPacket pack(11, NULL, 0); CServerSocket::getInstance()->Send(pack); return 0; }