007 鼠标操作

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;
}
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值