tagRAWMOUSE结构问题

时间:2015-09-30 18:17:45

标签: winapi firefox-addon jsctypes

我已设置Raw Input以在我的消息窗口中触发WM_INPUT。我已经为鼠标设置了输入。我成功收到消息并致电GetRawInputData()

我按照文件写了这封信,但这有点傻。

文档说这是我收到的结构:

RAWMOUSE structure

所以我是从ctypes这样做的,所以这就是为什么我要进入这个。

当我做一个鼠标滚轮时,我得到了这个:

tagRAWMOUSE(0, 0, 1024, 0, 0, 0, 0)

当我做鼠标滚轮时,我得到完全相同的东西:

tagRAWMOUSE(0, 0, 1024, 0, 0, 0, 0)

作为指导,当我只是用鼠标移动鼠标时,它会得到:

tagRAWMOUSE(0, 0, 0, 0, 0, 1, 0)

我将我的结构设置为2 USHORT,因为我的ctypes不支持union:

this.RAWMOUSE = ctypes.StructType('tagRAWMOUSE', [
    { usFlags: this.USHORT },
    { usButtonFlags: this.USHORT },
    { usButtonData: this.USHORT },
    { ulRawButtons: this.ULONG },
    { lLastX: this.LONG },
    { lLastY: this.LONG },
    { ulExtraInformation: this.ULONG }
]);

有人看错了什么吗?

1 个答案:

答案 0 :(得分:4)

让重新限制结构的C ++定义,因为它很重要:

typedef struct tagRAWMOUSE {
  USHORT usFlags;
  union {
    ULONG  ulButtons;
    struct {
      USHORT usButtonFlags;
      USHORT usButtonData;
    };
  };
  ULONG  ulRawButtons;
  LONG   lLastX;
  LONG   lLastY;
  ULONG  ulExtraInformation;
} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;

工会正在弄乱你的路线。联盟需要协调一致,以使其所有成员保持一致。因为联合具有ULONG成员,即ulButtons,所以联合的对齐是4个字节。因此,联合必须放在一个4的倍数的偏移处。在这种情况下,它将它放在偏移量4.因此在usFlags之后有两个字节的填充。

在你的ctypes结构中,覆盖USHORT的联盟的两个ULONG成员,即usButtonFlagsusButtonData具有对齐2.因此,它们被放置在偏移处填充物在翻译中丢失了。

这种事情很常见,是翻译结构时首先要检查的事情之一。挖出一个C ++编译器,让它发出结构的大小,以及所有成员的偏移量。将其与翻译中的相同信息进行比较。如果他们不匹配,请找出原因。

您有几种方法可以解决它:

  • usButtonFlagsusButtonData替换为ULONG,并使用按位操作挑选出两个USHORT值。
  • USHORT之前添加虚拟填充usButtonFlags