Winapi tagRAWMOUSE结构问题
我已经在我的消息窗口中设置了原始输入以触发Winapi tagRAWMOUSE结构问题,winapi,firefox-addon,jsctypes,Winapi,Firefox Addon,Jsctypes,我已经在我的消息窗口中设置了原始输入以触发WM_输入。我已经为鼠标设置了输入。我正在成功获取消息并调用GetRawInputData() 我严格遵守了文档,但这有点傻 文档说这是我收到的结构: 所以我是从ctypes做这件事的,这就是为什么我要进入这个领域 当我做鼠标滚轮时,我得到: tagRAWMOUSE(0, 0, 1024, 0, 0, 0, 0) 当我按下鼠标滚轮时,我得到了完全相同的结果: tagRAWMOUSE(0, 0, 1024, 0, 0, 0, 0) 作为指导,当我只移
WM_输入
。我已经为鼠标设置了输入。我正在成功获取消息并调用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)
由于我的ctypes不支持union,我将union设置为2 USHORT:
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 }
]);
有人看到什么不对吗?< /P> < P>让我们重新定义结构的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结构中,覆盖在ULONG
上的联合的两个USHORT
成员,即usButtonFlags
和usButtonData
具有对齐2。因此,它们被放置在偏移2和偏移4处。在翻译过程中,填充已经丢失
这类事情非常常见,并且是在翻译结构时首先检查的事情之一。挖掘出一个C++编译器,并得到它来释放结构的大小,以及所有成员的偏移量。将其与您翻译的相同信息进行比较。如果他们不匹配,找出原因
您有几种方法可以修复它:
- 将
和usButtonFlags
替换为usButtonData
,并使用按位操作来选择两个ULONG
值USHORT
- 在
之前添加一个虚拟填充usButtonFlags
USHORT
让我们重新定义结构的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结构中,覆盖在ULONG
上的联合的两个USHORT
成员,即usButtonFlags
和usButtonData
具有对齐2。因此,它们被放置在偏移2和偏移4处。在翻译过程中,填充已经丢失
这类事情非常常见,并且是在翻译结构时首先检查的事情之一。挖掘出一个C++编译器,并得到它来释放结构的大小,以及所有成员的偏移量。将其与您翻译的相同信息进行比较。如果他们不匹配,找出原因
您有几种方法可以修复它:
- 将
和usButtonFlags
替换为usButtonData
,并使用按位操作来选择两个ULONG
值USHORT
- 在
之前添加一个虚拟填充usButtonFlags
USHORT
tagRAWMOUSE(0,0,1024,0,0,0,0)
。第二个arg实际上是填充。因此1024是usButtonFlags
,而不是usButtonData
。十六进制的1024
是0x0400
,也就是说,等等,RI\u鼠标滚轮
。谢谢你的帮助,我还没试过,我正在试着弄清楚怎么会失去对齐。因为我认为联盟是一个或另一个。所以我想如果我做了两个USHORT
s,那就是两个大小为2的东西,这样就可以完美地匹配并重叠单个ULONG
。如果我们在这两个之间加上一个空格USHORT
,这会使整个结构的大小增加2个字节吗?该联合字段为4字节否?联合的大小为4,对齐方式为4。这意味着该并集的偏移量必须是4的倍数。我在回答中这样说。这意味着您的结构在ulRawButtons
之前有填充,但它必须在联合之前。当然是时候学习所有关于对齐的知识了。我不知道你改变了什么。天哪,谢谢大卫,我没有完整地阅读这篇文章,但我现在接受了,因为它是如此深入,我确信它是正确的。我马上就要测试它,并向您报告。非常感谢。这节对齐课将教会我很多东西,我将学习这一点,我可能会问一些更多的问题,请在这里。当然,这是解释。查看鼠标滚轮的tagRAWMOUSE(0,0,1024,0,0,0,0)
。第二个arg实际上是填充。因此1024是usButtonFlags
,而不是usButtonData
。十六进制的1024
是0x0400
,也就是说,等等,RI\u鼠标滚轮
。谢谢你的帮助,我还没试过,我正在试着弄清楚怎么会失去对齐。因为我认为联盟是一个或另一个。所以我想如果我做了两个USHORT
s,那就是两个大小为2的东西,这样就可以完美地匹配并重叠单个ULONG
。如果我们在这两者之间加上一个USHORT
,将使wh的大小