使用 winmm.dll in python 获取输入设备

using winmm.dll in python to get input devices

我想在 windows 上列出我的输入设备(如麦克风等)。

代码在这里:

    from ctypes import * 
    import sys
    #printf = libc.printf
    winmm =  windll.LoadLibrary("winmm.dll")
    widn = winmm.waveInGetDevCapsA #wave in device num
    widn.restype = c_uint

    waveNum = winmm.waveInGetNumDevs 

    class LPWAVEINCAPS(Structure):
        _fields_ = [
            ("wMid",c_ushort),
            ("wPid",c_ushort),
            ("vDriverVersion",c_uint),
            ("szPname",c_wchar_p),
            ("dwFormats",c_uint),
            ("wChannels",c_ushort), 
            ("wReserved1",c_ushort),
            ]

    widn.argtypes = [
        c_uint,
        POINTER(LPWAVEINCAPS),
        c_uint
        ]

    count_devs = waveNum()

    print(count_devs)

    structLP = LPWAVEINCAPS()

    for i in range(count_devs):
        str = widn(c_uint(i),byref(structLP),c_uint(sys.getsizeof(structLP)))
        print(structLP.szPname)

输出是段错误,当我删除 byref 它给了我 None 作为输出。

请帮助我,非常感谢:)

我解决了这个问题:‌

问题是我的字符串指针,我在结构

中使用了 s = create_string_buffer(b'[=11=]0' * 32) 然后 ("szPname", type(s))
from ctypes import * 
import sys
#printf = libc.printf
winmm =  windll.LoadLibrary("winmm.dll")
widn = winmm.waveInGetDevCapsA #wave in device num
widn.restype = c_uint

waveNum = winmm.waveInGetNumDevs

s = create_string_buffer(b'[=10=]0' * 32)

class LPWAVEINCAPS(Structure):
    _fields_ = [
        ("wMid",c_ushort),
        ("wPid",c_ushort),
        ("vDriverVersion",c_uint),
        ("szPname", type(s)),
        ("dwFormats",c_uint),
        ("wChannels",c_ushort), 
        ("wReserved1",c_ushort),
        ]

widn.argtypes = [
    c_uint,
    POINTER(LPWAVEINCAPS),
    c_uint
    ]

count_devs = waveNum()

print(count_devs)

structLP = LPWAVEINCAPS()

for i in range(count_devs):
    print(sizeof(type(structLP)))
    str = widn(c_uint(i),byref(structLP),sizeof(structLP))
    print(structLP.szPname)
#waveCaps = winmm.waveOutGetDevCaps
waveNum.restype = c_uint
#waveCaps.argtypes = []