tagRAWMOUSE 结构问题
tagRAWMOUSE Structure Issues
我已将原始输入设置为在我的消息 window 上触发 WM_INPUT
。我已经为鼠标设置了输入。我已成功收到消息并致电 GetRawInputData()
.
我严格按照文档进行操作,但它有点傻。
文档说这是我收到的结构:
所以我是从 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
成员,即 usButtonFlags
和 usButtonData
具有对齐 2。因此它们被放置在偏移量 2 和 4 处。填充在转换中丢失了。
这种事情很常见,并且是翻译结构时首先要检查的事情之一。挖出一个 C++ 编译器并让它发出结构的大小和所有成员的偏移量。将其与您翻译中的相同信息进行比较。如果不匹配,找出原因。
您有两种修复方法:
- 将
usButtonFlags
和usButtonData
替换为ULONG
,并使用位运算找出两个USHORT
值。
- 在
usButtonFlags
之前添加一个虚拟填充 USHORT
。
我已将原始输入设置为在我的消息 window 上触发 WM_INPUT
。我已经为鼠标设置了输入。我已成功收到消息并致电 GetRawInputData()
.
我严格按照文档进行操作,但它有点傻。
文档说这是我收到的结构:
所以我是从 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
成员,即 usButtonFlags
和 usButtonData
具有对齐 2。因此它们被放置在偏移量 2 和 4 处。填充在转换中丢失了。
这种事情很常见,并且是翻译结构时首先要检查的事情之一。挖出一个 C++ 编译器并让它发出结构的大小和所有成员的偏移量。将其与您翻译中的相同信息进行比较。如果不匹配,找出原因。
您有两种修复方法:
- 将
usButtonFlags
和usButtonData
替换为ULONG
,并使用位运算找出两个USHORT
值。 - 在
usButtonFlags
之前添加一个虚拟填充USHORT
。