ctypes中的结构内联合语法


问题内容

关于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中定义的名称似乎很危险。

谢谢,

麦克风


问题答案:

您的Structure语法无效:

AttributeError: '_fields_' must be a sequence of pairs

我相信您想在ctypes.Structure中使用匿名属性。看起来ctypes文档创建了TYPEDESC结构(其结构与tagINPUT非常相似)。

还要注意,您必须将DWORD定义为平台的基本类型。