我已设置Raw Input以在我的消息窗口中触发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不支持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 }
]);
有人看错了什么吗?
答案 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
成员,即usButtonFlags
和usButtonData
具有对齐2.因此,它们被放置在偏移处填充物在翻译中丢失了。
这种事情很常见,是翻译结构时首先要检查的事情之一。挖出一个C ++编译器,让它发出结构的大小,以及所有成员的偏移量。将其与翻译中的相同信息进行比较。如果他们不匹配,请找出原因。
您有几种方法可以解决它:
usButtonFlags
和usButtonData
替换为ULONG
,并使用按位操作挑选出两个USHORT
值。USHORT
之前添加虚拟填充usButtonFlags
。