ctypes中的结构体内联合语法

10 投票
1 回答
4594 浏览
提问于 2025-04-16 02:46

我有个关于ctypes语法的小问题,因为关于联合体的文档对我这种初学者来说不太清楚。

假设我想实现一个INPUT结构(可以在这里查看):

typedef struct tagINPUT {
  DWORD type;
  union {
    MOUSEINPUT    mi;
    KEYBDINPUT    ki;
    HARDWAREINPUT hi;
  } ;
} INPUT, *PINPUT;

我需要修改下面的代码吗?

class INPUTTYPE(Union):
    _fields_ = [("mi", MOUSEINPUT),
                ("ki", KEYBDINPUT),
                ("hi", HARDWAREINPUT)]

class INPUT(Structure):
    _fields_ = [("type", DWORD),
                (INPUTTYPE)]

我不太确定联合体是否可以有没有名字的字段,但加一个在Win32API中没有定义的名字似乎有点危险。

谢谢,

Mike

1 个回答

11

你的结构语法不太对:

AttributeError: '_fields_' must be a sequence of pairs

我觉得你想在你的ctypes.Structure中使用匿名属性。看起来ctypes的文档中创建了一个TYPEDESC结构,这个结构的构造方式和tagINPUT非常相似。

另外,你还需要为你的平台定义DWORD作为基本类型。

撰写回答