如何理解PlaySound函数API文档并在MASM中实现?

How to understand PlaySound function API document and implement it in MASM?

我知道在PlaySound函数中把20001h作为最后一个参数可以让音乐同步播放。但是为什么是20001h呢?我还希望“重复”在后台播放音乐,但我无法理解 API 文档,因为它没有提到 20001h 代表 SND_SYNC,也没有显示代表 SND_LOOP 的内容。 求指教,万分感谢!

这是我的代码:

includelib Winmm.lib
PlaySound PROTO,
        pszSound:PTR BYTE, 
        hmod:DWORD, 
        fdwSound:DWORD

file BYTE "test.wav",0
SND_SYNC DWORD 0

main proc
    mov SND_SYNC, 20001H 
    INVOKE PlaySound, OFFSET file, NULL, SND_SYNC

.......

I know that putting 20001h in PlaySound function as the last parameter can make the music play synchronously.

这是不正确的。它 异步播放文件 .

最后一个参数是一个位掩码,它可以将多个标志“或”在一起。 SND_SYNC 定义为 00000h(没有任何其他标志),而 20001hSND_ASYNC (00001h) 与 [= 或运算的组合15=] (20000h).

SND_LOOP (00008h) 只能与 SND_ASYNC.

结合使用

所以,为了完成你想要的:

I also wanted the music played in the background "repeatedly"

您需要组合 SND_FILENAMESND_ASYNCSND_LOOP 标志。该数值为 20009h.

以下是您可以与 PlaySound() 一起使用的所有标志。它们的含义在 PlaySound's documentation 1:

中解释
Name Value
SND_SYNC 0x00000000
SND_ASYNC 0x00000001
SND_NODEFAULT 0x00000002
SND_MEMORY 0x00000004
SND_LOOP 0x00000008
SND_NOSTOP 0x00000010
SND_PURGE 0x00000040
SND_APPLICATION 0x00000080
SND_NOWAIT 0x00002000
SND_ALIAS 0x00010000
SND_ALIAS_ID 0x00110000
SND_FILENAME 0x00020000
SND_RESOURCE 0x00040000
SND_SENTRY 0x00080000
SND_RING 0x00100000
SND_SYSTEM 0x00200000

1 注意:SND_RING 没有记录,但您可以看到 SND_ALIAS_IDSND_RINGSND_ALIAS.