在做这个功能的时候我们线对其进行设计,如果我们要显示出鼠标的操作,则必须在你监视的页面上进行显示。在显示之后由于屏幕大小和分辨率的不同,则需要对获取的鼠标坐标信息进行处理,同时其中鼠标的操作需要进行获取转换为数据进行封装,然后将获得的操作数据发送给服务端使得服务端接受到消息以此来完成操作指令。
第一步则是要拦截本地的鼠标信息获取其操作
采取按比例放缩的思想实现了这个操作,同时通过这个函数实现了数据的封装,代码如下:
CPoint CWatchDialog::UserPoint2RemoteScreenPoint(CPoint& point)
{//800 450
CRect clientRect;
ScreenToClient(&point);//全局坐标到客户坐标
//本地坐标到远程坐标
m_picture.GetWindowRect(clientRect);
return CPoint(point.x * 2560 / clientRect.Width(), point.y * 1600 / clientRect.Height());
}
第二步时坐标信息的转换
左键右键单击双击等操作的赋予其标签,为后续的数据传输打下基础
void CWatchDialog::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint remote = UserPoint2RemoteScreenPoint(point);
//封装
MOUSEEV event;
event.ptXY = remote;
event.nButton = 0;//左键
event.nAction = 2;//双击
CClientSocket* pClient = CClientSocket::getInstance();
CPacket pack(5,(BYTE*) & event, sizeof(event));
pClient->Send(pack);
CDialog::OnLButtonDblClk(nFlags, point);
}
void CWatchDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
}
void CWatchDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
TODO: 在此添加消息处理程序代码和/或调用默认值
//CPoint remote = UserPoint2RemoteScreenPoint(point);
封装
//MOUSEEV event;
//event.ptXY = remote;
//event.nButton = 0;//左键
//event.nAction = 4;//放开
//CClientSocket* pClient = CClientSocket::getInstance();
//CPacket pack(5, (BYTE*)&event, sizeof(event));
//pClient->Send(pack);
CDialog::OnLButtonUp(nFlags, point);
}
void CWatchDialog::OnRButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint remote = UserPoint2RemoteScreenPoint(point);
//封装
MOUSEEV event;
event.ptXY = remote;
event.nButton = 2;//右键
event.nAction = 2;//双击
CClientSocket* pClient = CClientSocket::getInstance();
CPacket pack(5, (BYTE*)&event, sizeof(event));
pClient->Send(pack);
CDialog::OnRButtonDblClk(nFlags, point);
}
void CWatchDialog::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint remote = UserPoint2RemoteScreenPoint(point);
//封装
MOUSEEV event;
event.ptXY = remote;
event.nButton = 2;//右键
event.nAction = 3;//按下//TODO 服务端对应的修改
CClientSocket* pClient = CClientSocket::getInstance();
CPacket pack(5, (BYTE*)&event, sizeof(event));
pClient->Send(pack);
CDialog::OnRButtonDown(nFlags, point);
}
void CWatchDialog::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint remote = UserPoint2RemoteScreenPoint(point);
//封装
MOUSEEV event;
event.ptXY = remote;
event.nButton = 2;//右键
event.nAction = 4;//放开
CClientSocket* pClient = CClientSocket::getInstance();
CPacket pack(5, (BYTE*)&event, sizeof(event));
pClient->Send(pack);
CDialog::OnRButtonUp(nFlags, point);
}
void CWatchDialog::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint remote = UserPoint2RemoteScreenPoint(point);
//封装
MOUSEEV event;
event.ptXY = remote;
event.nButton = 0;//左键
event.nAction = 1;//移动
CClientSocket* pClient = CClientSocket::getInstance();
CPacket pack(5, (BYTE*)&event, sizeof(event));
pClient->Send(pack);
CDialog::OnMouseMove(nFlags, point);
}
void CWatchDialog::OnStnClickedWatch()
{
CPoint point;
GetCursorPos(&point);
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint remote = UserPoint2RemoteScreenPoint(point);
//封装
MOUSEEV event;
event.ptXY = remote;
event.nButton = 0;//左键
event.nAction = 3;//按下
CClientSocket* pClient = CClientSocket::getInstance();
CPacket pack(5, (BYTE*)&event, sizeof(event));
pClient->Send(pack);
}