Click here to Skip to main content
16,017,238 members
Articles / Programming Languages / C++
Article

Winamp Control Utility via hotkeys

Rate me:
Please Sign up or sign in to vote.
2.41/5 (5 votes)
16 Jan 2007 27K   11   1
A small snippet which allows you to control your winamp via predefined hotkeys
This small snippet will enable you to control Winamp.

Hotkeys

Predefined hotkeys. Usage:
CTRL + ALT + F12 - Play or pause current song.
CTRL + ALT + F11 - Stop playing current song.
CTRL + ALT + F10 - Resume playing curret song.
CTRL + ALT + F9  - Close Winamp player.
CTRL + ALT + F8  - Skip to next item in playlist.
CTRL + ALT + F7  - Toggle repeat in Winamp.
CTRL + ALT + F6  - Toggle shuffle in Winamp.
CTRL + ALT + ARROW UP - Increase volume in Winamp.
CTRL + ALT + ARROW DOWN - Decrease volume in Winamp.
CTRL + ALT + ARROW RIGHT - Fast forward 5 seconds.
CTRL + ALT + ARROW DOWN - Fast rewind 5 seconds.

Source

Below you fill everything you need to build the controller. I used Dev-C++ 4.9.9.2 to compile this source.
/**************************************************************/
/* A small snippet which allows you to control winamp 
/* via hotkeys on your keyboard.
/* 
/* If you wish to add more features you can go here:
/* http://forums.winamp.com/showthread.php?s=&threadid=180297
/**************************************************************/

#include <iostream>
#include <windows.h>

using namespace std;

// WM_COMMAND - Commands to send to Winamp Client.
#define WINAMP_START 40045
#define WINAMP_PLAY_OR_PAUSE 40046
#define WINAMP_NEXT_TRACK 40048
#define WINAMP_PREVIOUS_TRACK  40044
#define WINAMP_CLOSE 40001
#define WINAMP_STOP 40047
#define WINAMP_RAISE_VOLUME 40058
#define WINAMP_LOWER_VOLUME 40059
#define WINAMP_TOGGLE_REPEAT 40022
#define WINAMP_TOGGLE_SHUFFLE 40023
#define WINAMP_WINDOW_HANDLE "Winamp v1.x"
#define WINAMP_FAST_FORWARD 40148 
#define WINAMP_FAST_REWIND 40144 

// WM_USER 
#define WINAMP_CUSTOM_VOLUME 122

// HOTKEYS
#define CALL_CMD_PLAY_OR_PAUSE 101 // CTRL + ALT + F12 
#define CALL_CMD_STOP 102 // CTRL + ALT + F11
#define CALL_CMD_START 105 // CTRL + ALT + F10
#define CALL_CMD_CLOSE 106 // CTRL + ALT + F9
#define CALL_CMD_NEXT_TRACK 107 // CTRL + ALT + F8
#define CALL_CMD_REPEAT 108 // CTRL + ALT + F7
#define CALL_CMD_SHUFFLE 109 // CTRL + ALT + F6
#define CALL_CMD_RAISE_VOLUME 103 // CTRL + ALT + ARROW UP
#define CALL_CMD_LOWER_VOLUME 104 // CTRL + ALT + ARROW DOWN
#define CALL_CMD_FAST_FORWARD 110 // CTRL + ALT + ARROW RIGHT
#define CALL_CMD_FAST_REWIND  111 // CTRL + ALT + ARROW LEFT

class Controller
{
      public:
             void PlayOrPause();
             void Next();
             void Previous();
             void Start();
             void Stop();
             void Close();
             void RaiseVolume();
             void LowerVolume();
             void ToggleRepeat();
             void ToggleShuffle();
             void CustomVolume(int Volume);
             void FastForward();
             void FastRewind();
             char * CurrentTrack();
             //
             void WCommand(int command);
             void UCommand(int input, int command);
             HWND WinampHandle();
      private:
              char itsCurrentTrack[2048],*p;
};

HWND Controller::WinampHandle()
{
     return FindWindow(WINAMP_WINDOW_HANDLE,NULL);
}

void Controller::WCommand(int command)
{
 SendMessage(Controller::WinampHandle(),WM_COMMAND, command, 1);
}

void Controller::UCommand(int input, int command)
{
 SendMessage(Controller::WinampHandle(),WM_USER, input, command);     
}

void Controller::PlayOrPause()           { Controller::WCommand(WINAMP_PLAY_OR_PAUSE);        }
void Controller::Next()                  { Controller::WCommand(WINAMP_NEXT_TRACK);           }
void Controller::Previous()              { Controller::WCommand(WINAMP_PREVIOUS_TRACK);       }
void Controller::Close()                 { Controller::WCommand(WINAMP_CLOSE);                }
void Controller::Stop()                  { Controller::WCommand(WINAMP_STOP);                 }
void Controller::ToggleRepeat()          { Controller::WCommand(WINAMP_TOGGLE_REPEAT);        }
void Controller::ToggleShuffle()         { Controller::WCommand(WINAMP_TOGGLE_SHUFFLE);       }
void Controller::RaiseVolume()           { Controller::WCommand(WINAMP_RAISE_VOLUME);         }
void Controller::LowerVolume()           { Controller::WCommand(WINAMP_LOWER_VOLUME);         }
void Controller::Start()                 { Controller::WCommand(WINAMP_START);                }
void Controller::CustomVolume(int Volume){ Controller::UCommand(Volume,WINAMP_CUSTOM_VOLUME); }
void Controller::FastForward()           { Controller::WCommand(WINAMP_FAST_FORWARD);         }
void Controller::FastRewind()            { Controller::WCommand(WINAMP_FAST_REWIND);          }

char * Controller::CurrentTrack()
{
 GetWindowText(Controller::WinampHandle(),itsCurrentTrack,sizeof(itsCurrentTrack));
 p = itsCurrentTrack+strlen(itsCurrentTrack)-8;
 while (p >= itsCurrentTrack)
 {
       if (!strnicmp(p,"- Winamp",8)) 
       {
          break;
          p--;
       }
 }
 if (p >= itsCurrentTrack) 
 {
       p--;
 }
 while (p >= itsCurrentTrack && *p == ' ')
 { 
       p--;
       *++p = 0;
 }
 return itsCurrentTrack;
}

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "Winamp Controller";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               
    MSG messages;            
    WNDCLASSEX wincl;        
    
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;    
    wincl.style = CS_DBLCLKS;     
    wincl.cbSize = sizeof (WNDCLASSEX);

    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                
    wincl.cbClsExtra = 0;                      
    wincl.cbWndExtra = 0;                      

    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (
           0,                   
           szClassName,         
           "Winamp Controller Utility",       
           WS_OVERLAPPEDWINDOW, 
           CW_USEDEFAULT,       
           CW_USEDEFAULT,       
           544,                 
           375,                 
           HWND_DESKTOP,        
           NULL,                
           hThisInstance,       
           NULL                 
           );
    
    RegisterHotKey(hwnd, CALL_CMD_PLAY_OR_PAUSE, MOD_CONTROL|MOD_ALT, VK_F12);
    RegisterHotKey(hwnd, CALL_CMD_STOP,  MOD_CONTROL|MOD_ALT, VK_F11);
    RegisterHotKey(hwnd, CALL_CMD_START, MOD_CONTROL|MOD_ALT, VK_F10);
    RegisterHotKey(hwnd, CALL_CMD_CLOSE, MOD_CONTROL|MOD_ALT, VK_F9);
    RegisterHotKey(hwnd, CALL_CMD_NEXT_TRACK, MOD_CONTROL|MOD_ALT, VK_F8);
    RegisterHotKey(hwnd, CALL_CMD_REPEAT, MOD_CONTROL|MOD_ALT, VK_F7);
    RegisterHotKey(hwnd, CALL_CMD_SHUFFLE, MOD_CONTROL|MOD_ALT, VK_F6);
    RegisterHotKey(hwnd, CALL_CMD_RAISE_VOLUME, MOD_CONTROL|MOD_ALT, VK_UP);
    RegisterHotKey(hwnd, CALL_CMD_LOWER_VOLUME, MOD_CONTROL|MOD_ALT, VK_DOWN);
    RegisterHotKey(hwnd, CALL_CMD_FAST_FORWARD, MOD_CONTROL|MOD_ALT, VK_RIGHT);
    RegisterHotKey(hwnd, CALL_CMD_FAST_REWIND, MOD_CONTROL|MOD_ALT, VK_LEFT);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    Controller Winamp;
    switch (message)                 
    {
        case WM_HOTKEY:
        switch(wParam)
        {
              case CALL_CMD_PLAY_OR_PAUSE: 
                   Winamp.PlayOrPause();
              break;
              case CALL_CMD_STOP: 
                   Winamp.Stop();
              break;
              case CALL_CMD_START: 
                   Winamp.Start();
              break;
              case CALL_CMD_CLOSE: 
                   Winamp.Close();
              break;
              case CALL_CMD_NEXT_TRACK: 
                   Winamp.Next();
              break;
              case CALL_CMD_REPEAT: 
                   Winamp.ToggleRepeat();
              break;
              case CALL_CMD_SHUFFLE: 
                   Winamp.ToggleShuffle();
              break;
              case CALL_CMD_RAISE_VOLUME:
                   Winamp.RaiseVolume();
              break;
              case CALL_CMD_LOWER_VOLUME:
                   Winamp.LowerVolume();
              break;
              case CALL_CMD_FAST_FORWARD:
                   Winamp.FastForward();
              break;
              case CALL_CMD_FAST_REWIND:
                   Winamp.FastRewind();
              break;
        }
        break;
        case WM_DESTROY:
            PostQuitMessage (0);       
            break;
        default:                      
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Norway Norway
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Generalget winamp song duration Pin
chris pang29-Sep-08 13:21
chris pang29-Sep-08 13:21 
how to retrieve all playlist duration ?

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.