使用 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 = []
我想在 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 = []