Nachdem ich nun die mittlere Maustaste abfangen kann, muss ich jetzt nur noch Winamp steuern können.
Relativ schnell fand ich heraus, dass man mit WM_COMMAND Befehle an Winamp senden kann. Leider kein kombiniertes Play/Pause. Also muss ich zuerst den Status abfangen und je nach dem Play oder Pause/Unpause senden.
Das ganze funktioniert natürlich über Win32, also erst mal ein par Konstanten definieren:
// Winamp Window Class Name const string m_windowName = "Winamp v1.x"; // For Sending normal Commands const int WM_COMMAND = 0x111; const int WA_NOTHING = 0; // Plays selected Track const int WA_PLAY = 40045; // Pauses/Unpauses currently playing Track const int WA_PAUSE = 40046; // For sending IPC Commands const int WM_WA_IPC = 0x0400; // Returns Playback Status. 1=playing, 3=paused, 0=not playing) const int IPC_ISPLAYING = 104; // FindWindow [System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // SendMessageA [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] public static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
Nun muss ich nur noch Winamp abfragen, ob es gerade spielt oder im Pause Modus ist und dann ein Pause Command schicken und sonst ein Play Command. Das sieht dann so aus:
private void Play_Pause_Winamp() { IntPtr hwnd = FindWindow(m_windowName, null); if (hwnd == IntPtr.Zero) { Console.WriteLine("Winamp is not running."); } else { // GetPlaybackStatus int status = SendMessageA(hwnd, WM_WA_IPC, WA_NOTHING, IPC_ISPLAYING); if (status == 1 || status == 3) { // Pause/Unpause SendMessageA(hwnd, WM_COMMAND, WA_PAUSE, WA_NOTHING); } else { // Start playing SendMessageA(hwnd, WM_COMMAND, WA_PLAY, WA_NOTHING); } } }
#
Wirklich ein super Beitrag. Ich werde dev.flauschig.ch mal haufiger besuchen 😉