【问题标题】:How would you recreate this Windows API Structure with ctypes? [duplicate]您将如何使用 ctypes 重新创建此 Windows API 结构? [复制]
【发布时间】:2013-09-02 05:37:46
【问题描述】:

我不完全确定如何在 Python 中使用 ctypes 创建这个特定结构,因为它有一个嵌套的 Union 块。

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

您将如何处理嵌套的Union 块?

【问题讨论】:

    标签: python winapi ctypes


    【解决方案1】:

    由于该联合从未在INPUT 之外正确使用,因此您可以将其创建为嵌套类:

    class INPUT(Structure):
        class _I(Union):
            _fields_ = [
                ('mi', MOUSEINPUT),
                ('ki', KEYBDINPUT),
                ('hi', HARDWAREINPUT),
            ]
    
        _anonymous_ = ('i', )
        _fields_ = [
            ('type', DWORD),
            ('i', _I),
        ]
    

    即使您没有使用匿名,也可以使用 input.i.hi.uMsg 来完成。

    from ctypes import *
    from ctypes.wintypes import *
    
    class MOUSEINPUT(Structure):
        _fields_ = [
            ('dx', LONG),
            ('dy', LONG),
            ('mouseData', DWORD),
            ('dwFlags', DWORD),
            ('time', DWORD),
            ('dwExtraInfo', POINTER(ULONG)),
        ]
    
    class KEYBDINPUT(Structure):
        _fields_ = [
            ('wVk', WORD),
            ('wScan', WORD),
            ('dwFlags', DWORD),
            ('time', DWORD),
            ('dwExtraInfo', POINTER(ULONG)),
        ]
    
    class HARDWAREINPUT(Structure):
        _fields_ = [
            ('uMsg', DWORD),
            ('wParamL', WORD),
            ('wParamH', DWORD)
        ]
    
    class INPUT(Structure):
        class _I(Union):
            _fields_ = [
                ('mi', MOUSEINPUT),
                ('ki', KEYBDINPUT),
                ('hi', HARDWAREINPUT),
            ]
    
        _anonymous_ = ('i', )
        _fields_ = [
            ('type', DWORD),
            ('i', _I),
        ]
    

    【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多