tagRAWMOUSE 结构问题

tagRAWMOUSE Structure Issues

我已将原始输入设置为在我的消息 window 上触发 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 不支持联合:

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 }
]);

有没有人看错了?

让我们重述结构的 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;

工会打乱了你的阵营。工会需要对齐,以便其所有成员对齐。因为union有一个ULONG成员,即ulButtons,所以union的对齐是4字节。因此,联合必须放置在一个偏移量是 4 的倍数的位置。在这种情况下,它将它放置在偏移量 4 处。因此在 usFlags.

之后有两个字节的填充

在您的 ctypes 结构中,覆盖 ULONG 的联合的两个 USHORT 成员,即 usButtonFlagsusButtonData 具有对齐 2。因此它们被放置在偏移量 2 和 4 处。填充在转换中丢失了。

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

您有两种修复方法:

  • usButtonFlagsusButtonData替换为ULONG,并使用位运算找出两个USHORT值。
  • usButtonFlags 之前添加一个虚拟填充 USHORT