This is an article about how you can control Winamp 3.x with the help of a dummy window. It covers how you can make an MFC DLL and integrate it with the Wasabi SDK.
Messagemod a Winamp 3.x plugin
Environment: VC6 SP5, WinXP Pro
Short description: Adds the windowsmessage support to Winamp 3.x with a
Many people use Winamp as their main mp3 player, and some have switched from
Winamp 2.xx to Winamp 3.xx. Since Winamp 2.xx used the simple WM_COMMAND,
WM_USER and WM_COPYDATA to control play, pause, stop etc, many other programs
could control Winamp too.
In the 3.xx versjon of Winamp, the windows-messages was removed from the player,
as we know it. Messagemod is a plugin (WAC) that add the old functionality. I
usally program in MFC, so this library is primary made with MFC.
Messagemod is not complete with ALL the functions, but it has the basics. If you
don’t want to learn how to code it yourself, just download the “Winamp 2x
Plugin Manager” from Winamps homepage, that will give you all the
functionality that the old 2.xx has.
What is needed
Download the Wasabi SDK from http://www.winamp.com/nsdn/
When you have installed (unpacked) it to somewhere (Default: C:Wasabi SDK)
please read the few textfiles under the docs directory to get some info about
the SDK before starting. (I’ll guess that you won’t find it useful now, but
Now compile the projects:
Studio – This is the BFC project (project file is not in the bfc directory).
Studiowaclient – Output: waclient.lib
Unpack the sourcecode in the directory:
Add waclient.lib and bfc.lib to the project.
Before you try to compile the, please check the paths in settings for debug and
working folder. Also check the “Post-build step” and change it to your
We use Winamp 3.x (studio.exe) as the debug component. (So we can get all the
What is a WAC?
A WAC is just a renamed DLL file. I guess Nullsoft guys wanted to see the
difference between a component and system dll’s. 🙂
Using the code
MessageMod.cpp and MessageMod.h:
In these files we have 2 classes;
I have let the
WACNAME remain unchanged as they are in the
examples. Just because it would be easy to compare with other examples. Thanks
for the easy template Nullsoft.
CMessageModApp class takes care of the MFC bit of the
project. The output is a shared DLL MFC dll compilation.Ã?Â
WACNAME takes care of the Winamp 3.xx bit of the project.
I’ve added some useful overrides like “runlevelcb_onShutdown”, but it
is kept as simple as possible.
Winamp 3.xx makes a window called “STUDIO”. The old Winamp 2.xx made a
window called “Winamp 1.x”. To handle that I’ve made a dummy window
that is named the same. The window created is global, and the handling of the
WM-commands are also global.
It is the dummy window that does all the magic, look at the easy windowproc:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_PAINT: //The window will show transparent, to avoid it: A simple paint routine.
FillRect(GetDC(hwnd), &r, (HBRUSH) GetStockObject(GRAY_BRUSH));
case WM_COMMAND: //This calls the HandleWMCommand routine to handle Winamp stuff
int res=HandleWMCommand(hwnd, wParam,lParam);
case WM_USER: //This calls the HandleWMUser routine to handle Winamp stuff
int res=HandleWMUser(hwnd, wParam,lParam);
return DefWindowProc(hwnd, uMsg, wParam, lParam); //Default window message...
The functions HandleWMCommand and HandleWMUser handles the different
messages. This article will not explain how to use the the Wasabi SDK. It will
just show you how it is done. It takes some time to be able to handle the Wasabi.
To learn it you’ll have to work some hours. It is clever to use Winamps forums
When you have compiled the code and Winamp3 is started you must make a simple
program to send WM_COMMAND and WM_USER messages to the dummy window.
HWND Winamp=::FindWindow("Winamp 1.x",NULL);
::SendMessage(Winamp, WM_COMMAND, WINAMP_PLAY, NULL);
Now with this code above you should be able to press play from an other
program. The WinampDefs.h is a complete list over commands. The comments here
gives an overview of what is added or not.
Many of the functions that is depending to be in the same process as Winamp.
All of these functions has been removed, since pointers are not available
If messages are sent before the STUDIO window is created it will crash. Winamp
3.x loads the plug-ins before the main window.
Due lack of time many of the features are not implemented, but can easily
been done. So if someone feels for making it finished, please do so. Mail me if
you want to publish it here as updated code, with your credits of cause! 🙂