According to the windows documentation about CreateTimerQueueTimer its how its done.
Indeed, and I believe MS puts APC to even more uses than documented, c.f. http://bugs.winehq.org/show_bug.cgi?id=3930#c37 Maybe there are other places where Wine ought to use APC.
One issue with APC for WINMM is that one needs further tests to investigate which call causes memoization of the GetCurrentThread() field to which the callback will be delivered? - Is is the thread that called midiOpen? - The thread that called midiWrite?
BTW, would it be ok for Wine to a) include a patch that introduces version-specific behaviour (as mentioned in the above bug)? b) Or should Wine's WINMM generally behave like Win9X because it's old and many newer apps use another API? c) Like W2k/xp/7 because that's what's current now.
Regards, Jörg Höhle