在MASM中使用PlaySound(),需要一个方法来帮助在后台运行,而无需等待整个.wav声音文件完成



使用此代码(主要是将irvine32.inc添加到github代码中(:https://gist.github.com/michaellindahl/7782978

TITLE MASM PlaySound                        (PlaySoundExample.asm)
includelib winmm.lib
INCLUDE Irvine32.inc
INCLUDE macros.inc
PlaySound PROTO,
pszSound:PTR BYTE, 
hmod:DWORD, 
fdwSound:DWORD
.data
deviceConnect BYTE "DeviceConnect",0
SND_ALIAS    DWORD 00010000h
SND_RESOURCE DWORD 00040005h
SND_FILENAME DWORD 00020000h
file BYTE "t.wav",0
.code
main PROC
INVOKE PlaySound, OFFSET deviceConnect, NULL, SND_ALIAS
INVOKE PlaySound, OFFSET file, NULL, SND_FILENAME
exit
main ENDP
END main

您需要另外添加SND_ASYNC标志。

声音异步播放,PlaySound立即返回在开始声音之后。终止异步播放波形声音,在pszSound设置为NULL的情况下调用PlaySound。

在MASM32中,您需要OR它们的二进制位,因此您的函数arg的两个位都设置为类似于C.中的SND_ASYNC | SND_FILENAME

#define SND_ASYNC           0x0001 
#define SND_FILENAME    0x00020000L

代码示例:

.model flat, stdcall
option casemap: none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
includelib Winmm.lib
PlaySoundA PROTO,
pszSound:PTR BYTE, 
hmod:DWORD, 
fdwSound:DWORD
.data
file BYTE "t.wav",0
szCaption   db  "Hello", 0
szText      db  "Hello World!", 0
.code
main PROC
INVOKE PlaySoundA, OFFSET file, NULL, 20001H      ; SND_ASYNC | SND_FILENAME
INVOKE MessageBox, NULL, addr szText, addr szCaption, MB_OK
INVOKE ExitProcess, 0
main ENDP
END main

最新更新