使用PlaySound()时没有声音

时间:2018-05-25 18:38:11

标签: python windows ctypes playsound

基本上我想在ctypes中使用PlaySound()函数。

  

是的我知道winsound模块是建立在它上面的,我可以使用它,但我有理由不这样做:)

在C中我会调用这样的函数:

PlaySound("sound.wav", NULL, SND_FILENAME);

我的Python脚本等价:

import ctypes

winmm = ctypes.WinDLL('winmm.dll')

winmm.PlaySound("sound.wav", None, 0x20000)

我运行它,没有返回错误,但声音也没有播放。

我怀疑问题在于十六进制值(0x20000),因为其他一切看起来都很好。我得到了这样的价值:

import winsound
print(hex(winsound.SND_FILENAME))

或以不同的方式:

import ctypes, winsound

winmm = ctypes.WinDLL('winmm.dll')

winmm.PlaySound("sound.wav", None, winsound.SND_FILENAME)

那么我怎样才能使这个工作,以便我的文件播放?

2 个答案:

答案 0 :(得分:1)

在Windows中,有Unicode和ANSI版本的函数。 documentation表示文件名为LPCTSTR。对于定义为LPCSTR的ANSI版本,对于Unicode,它是LPCWSTR

这是调用Windows功能的正确方法。通常,您需要该函数的W版本。定义.argtypes.restype也有助于进行错误检查。如您所见,您可以传递错误的类型,但它不起作用。定义.argtypes后,将捕获不兼容的类型。

from ctypes import *
from ctypes import wintypes as w

dll = WinDLL('winmm')

dll.PlaySoundW.argtypes = w.LPCWSTR,w.HMODULE,w.DWORD
dll.PlaySoundW.restype = w.BOOL

SND_FILENAME = 0x20000

# Call it with a Unicode string and it works.
dll.PlaySoundW('sound.wav',None,SND_FILENAME)

# Call it with a byte string and get an error since `.argtypes` is defined.
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)

输出(声音播放后):

Traceback (most recent call last):
  File "C:\test.py", line 15, in <module>
    dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

或者跳过所有工作,只需使用winsound模块:

import winsound
winsound.PlaySound('sound.wav',winsound.SND_FILENAME)

答案 1 :(得分:0)

尽管documentation将其指定为字符串。

  

指定要播放的声音的字符串

在Python中,你实际上必须使它成为字节值。简单地说:

 count: function() {
    this.counter++;
 }