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的大小