Search code examples
c#.netwindowspostmessage

User32 API custom PostMessage for automatisation


I want to automate a program called Spotify from C#, the best way (I think) to do this is by triggering fake keypresses. I want to program to pause playback, and I don't know enough about this stuff to find another way than keypresses. So I use Visual Studio's Spy++ to see what message Spotify gets when pressing the play button on my keyboard, I copy the data from that message into my Console Application and run it, when I run I can see the PostMessage in Spy++'s Message Logging, so this is working but it doesn't pause/play my music. I guess this is because I also have to send another PostMessage with another destination, but how do I know what else to send?

Post Message call:

MessageHelper.PostMessage((int)hwndSpotify, 0x100, 0x000000B3, 0x01000001);

I hope someone is familiar with this and can help me out.


Solution

  • To automate Spotify, first you have to get the handle of the window with the following class name: SpotifyMainWindow (using FindWindow()).

    Then, you can use the SendMessage() method to send a WM_APPCOMMAND message to the Spotify's window.

    Following a simple code to do that:

    internal class Win32
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
        internal class Constants
        {
            internal const uint WM_APPCOMMAND = 0x0319;
        }
    }
    
    public enum SpotifyAction : long
    { 
        PlayPause = 917504,
        Mute = 524288,
        VolumeDown = 589824,
        VolumeUp = 655360,
        Stop = 851968,
        PreviousTrack = 786432,
        NextTrack = 720896
    }
    

    For instance, to play or pause the current track:

    Win32.SendMessage(hwndSpotify, Win32.Constants.WM_APPCOMMAND, IntPtr.Zero, new IntPtr((long)SpotifyAction.PlayPause));