个鼠标按钮的状态一起以三字节移动数据包的形 式发送给 i8042.位移计数器表示从最后一次位移数据包被送往 i8042 后有位移量发生.标准的 PS/2 鼠标 发送位移和按键信息给 i8042 采用如下的 3 字节数据包格式: Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
┌————┬————┬————┬————┬——┬———┬———┬———┐ Byte 1 │Y 溢出位│X 溢出位│Y 符号位│X 符号位│置 1│中键位│右键位│左键位│ ├————┴————┴————┴————┴——┴———┴———┴———┤ Byte 2 │ Byte 3 │ X 左右移位值,补码 Y 上下移位值,补码 │
│ ├——————————————————————————————————┤ └——————————————————————————————————┘ 位移计数器是一个 9 位二进制补码整数.它的最高位作为符号位出现在位移数据包的第一个字节里, 这些计数器在鼠标读取输入发现有位移时被更新,这些值是自从最后一次发送位移数据包给 i8042 后位移 的累计量(即最后一次包发给 i8042 后位移计数器被复位), 位移计数器可表示的值的范围是-255 到+255. 如果超过了范围,相应的溢出位就被设置,并且在复位前计数器不会增减. 对标准的 PS/2 鼠标的一个流行的扩展是微软的 Intellimouse.它包括支持五个鼠标按键和三个位移 轴(左右,上下和滚轮).这些附加特征要求使用 4 字节的位移数据包而不是标准 3 字节数据包.微软的 Intellimouse 使用 4 字节的位移数据包格式有两种情况分别如下: 1,三键带滚轮鼠标: Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
┌————┬————┬————┬————┬——┬———┬———┬———┐ Byte 1 │Y 溢出位│X 溢出位│Y 符号位│X 符号位│置 1│中键位│右键位│左键位│ ├————┴————┴————┴————┴——┴———┴———┴———┤ Byte 2 │ Byte 3 │ Byte 4 │ X 左右移位值,补码 Y 上下移位值,补码 Z 滚动移位值,补码 │ │ │ ├——————————————————————————————————┤ ├——————————————————————————————————┤ └——————————————————————————————————┘ Z 位移是二进制补码表示滚轮的自上次数据报告以来的位移.有效值的范围在-8 到+7,这意味着数值 实际只有低四位有用,高四位仅用作符号扩展位.当 Z 小于 0 时表示向上滚动,当 Z 大于 0 时表示向下滚 动. 2,五键带滚轮鼠标: Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
┌————┬————┬————┬————┬——┬———┬———┬———┐ Byte 1 │Y 溢出位│X 溢出位│Y 符号位│X 符号位│置 1│中键位│右键位│左键位│
├————┴————┴————┴————┴——┴———┴———┴———┤ Byte 2 │ Byte 3 │ Byte 4 │ 置 0 │ X 左右移位值,补码 Y 上下移位值,补码 置 0 │第 5 键位 │第 4 键位 │ Z3 │ Z2 │ Z1 │ │ │ Z0 │ ├——————————————————————————————————┤ ├————┬————┬————┬————┬——┬———┬———┬———┤ └————┴————┴————┴————┴
——┴———┴———┴———┘ Z0~Z3 是二进制补码用于表示从上次数据
报告以来滚轮的位移量,有效范围从-8 到+7;第 4 键位:置 1 表示第 4 键按下了,置 0 表示第 4 键没有按下;第 5 键位:置 1 表示第 5 键按下了,置 0 表示第 5 键没 有按下.可以看出三键带滚轮鼠标和五键带滚轮鼠标这两种数据包格式是相互兼容的.一般现在使用的鼠 标都是带滚轮的,所以使用的都是 4 字节的数据包格式.调用 API 函数 GetSystemMetrics(SM_CMOUSEBUTT ONS)可以返回当前鼠标的按键数,调用 GetSystemMetrics(SM_MOUSEWH