2017-09-26 104 views
0

我想在我的窗口中列出我的输入设备(如麦克风等)。在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作为输出。

请帮我谢谢你了:)

回答

0

我解决了这个问题:

问题是我的字符串的指针,我在结构上采用s = create_string_buffer(b'\000' * 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'\000' * 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 = []