10-鼠标操作的处理
左键右键双击移动
同样在ServerSocket.h
中需要一个函数捕捉鼠标事件
这里在ServerSocket.h
就需要一个结构体来接收鼠标事件,之前文件只用接收打开的文件路径,这里client需要传多个参数到sever端
bool GetMouseEvent(MOUSEEV& mouse) {if (m_packet.sCmd == 5) {memcpy(&mouse, m_packet.strData.c_str(), sizeof(MOUSEEV));return true;}return false;}
typedef struct MouseEvent{MouseEvent() {nAction = 0;nButton = -1;ptXY.x = 0;ptXY.y = 0;}WORD nAction;// 点击、移动、双击WORD nButton;// 左键、右键、中键POINT ptXY;// 坐标
}MOUSEEV,*PMOUSEEV;
然后就是server端响应这个事件
int MouseEvent() {MOUSEEV mouse;if (CServerSocket::getInstance()->GetMouseEvent(mouse)) {DWORD nFlags = 0;switch (mouse.nButton) {case 0: //左键nFlags = 1;break; case 1: //右键nFlags = 2;break;case 2: //中键nFlags = 4;break; case 4: //无按键按下,单纯的鼠标移动nFlags = 8;break;}if (nFlags != 8) SetCursorPos(mouse.ptXY.x, mouse.ptXY.y);switch (mouse.nAction){case 0: //单击nFlags |= 0x10;break;case 1: //双击nFlags |= 0x20;break;case 2: //按下,可能要拖动一些东西nFlags |= 0x40;break;case 3: //放开nFlags |= 0x80;break;default:break;}switch (nFlags) {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(4, NULL, 0); //表明收到这个消息了,并且执行完成了CServerSocket::getInstance()->Send(pack);}else {OutputDebugString(_T("获取鼠标操作参数失败"));return -1;}return 0;
}
这里的处理方式是定义一个8位flag,将flag前4位区分哪个键按下,后四位当单双击行为`
GetMessageExtraInfo()
当鼠标事件发生时候,可能出现其他事件,比如按下了ctrl按键