I've used the PlaySound function inside the Win32 API before to do something similar.
Although this isn't in the same language that you're using, below is an example of a program that will play 'mahnamahna.wav' on every 100th keystroke.(Yes, it was quite funny)
 format PE GUI 4.0
entry start
;Mahna Mahna.
include 'win32a.inc'
include 'helper.asm'
section '.idata' import data readable writeable
    library kernel32,'KERNEL32.DLL',\
            user32,'USER32.DLL',\
            hook,'HOOK.DLL',\
            winmm,'WINMM.DLL'
    import  hook,\
            SetKeyPressedHandler,'SetKeyPressedHandler'
    import winmm,\
            PlaySound,'PlaySound'
    include 'api\kernel32.inc'
    include 'api\user32.inc'
section '.data' data readable writeable
    szWavFile db "mahnamahna.wav",0
    ;String saying what the dll is called.
    szDllName db "HOOK.DLL",0
    ;Name of the function in the dll for the keyboard procedure
    szf_KeyboardProc db "KeyboardProc",0
    ;handle to the dll
    hDll dd ?
    ;handle to the keyboard procedure
    hKeyboardProc dd ?
    ;handle to the hook
    hHook dd ?
    kInput KBINPUT
    keyCount dd 0x0 ;
    ;msg for the message pump
    msg MSG
section '.text' code readable executable
    start:
        ;Load the DLL into memory.
        invoke LoadLibraryA,szDllName
        cmp eax,0x0
        je exit
        mov [hDll],eax
        invoke GetProcAddress,[hDll],szf_KeyboardProc
        cmp eax,0x0
        je freeLibrary
        mov [hKeyboardProc],eax
        invoke SetKeyPressedHandler,KeyPressedHandler
    hook:
        invoke SetWindowsHookEx,WH_KEYBOARD_LL,[hKeyboardProc],[hDll],0x0
        cmp eax,0x0
        je freeLibrary
        mov [hHook],eax
    msg_loop:
        invoke  GetMessage,msg,NULL,0,0
        cmp eax,1
        jb  unhook
        jne msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
    jmp msg_loop
    proc KeyPressedHandler code,wparam,lparam
        ;Move the VK Code of the key they pressed into al.
        xor eax,eax
        mov eax,[lparam]
        mov cx,word [eax]
        cmp [wparam],WM_KEYDOWN
        je .ProcessKeyDown
        cmp [wparam],WM_KEYUP
        je .ProcessKeyUp
        .ProcessKeyDown:
            ret ;No need to go any further - we only process characters on key up
        .ProcessKeyUp:
            mov edx,[keyCount]
            inc edx
            cmp cx,VK_F12
            je unhook
            ;Hotkeys.
            ;F12 - Quit.
            cmp edx,0x64
            jne .done
            call MahnaMahna
            xor edx,edx
            .done:
            mov [keyCount],edx
        ret
    endp
    proc MahnaMahna
        invoke PlaySound,szWavFile,0x0,0x20000
        ret
    endp
    unhook:
        invoke UnhookWindowsHookEx,[hHook]
    freeLibrary:
        invoke FreeLibrary,[hDll]
    exit: 
        invoke ExitProcess,0
The above will not work without the following dll(hook.dll)
 format PE GUI 4.0 DLL
entry _DllMain
include 'win32a.inc'
section '.data' data readable writeable
    hKeyPressedHandler dd 0x0
section '.text' code readable executable
proc _DllMain hinstDLL,fdwReason,lpvReserved
    mov eax,TRUE
    ret
endp
    proc SetKeyPressedHandler hProc
        mov eax,[hProc]
        mov [hKeyPressedHandler],eax
        ret
    endp
    proc KeyboardProc code,wparam,lparam
        cmp [code],0x0
        jl CallNextHook
        cmp [hKeyPressedHandler],0x0;Make sure our event handler is set.
        je CallNextHook
        ;Call our handler.
        invoke hKeyPressedHandler,[code],[wparam],[lparam]
        CallNextHook:
            invoke CallNextHookEx,0x0,[code],[wparam],[lparam]
            ret
    endp
section '.idata' import data readable writeable
    library kernel32,'KERNEL32.DLL',\
            user32,'USER32.DLL'
    include 'api\kernel32.inc'
    include 'api\user32.inc'
section '.edata' export data readable
    export 'hook.DLL',\
        KeyboardProc,'KeyboardProc',\
        SetKeyPressedHandler,'SetKeyPressedHandler'
section '.reloc' fixups data discardable