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



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

代码在这里:

    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作为输出。

帮助我,请非常感谢:)

i‌解决了问题:‌

问题是我的字符串指针,I‌使用s = create_string_buffer(b'00' * 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'00' * 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 = []

最新更新