Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 220
user1091566 Avatar asked Sep 03 '25 08:09

user1091566


1 Answers

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));
like image 197
Jerome Thievent Avatar answered Sep 04 '25 22:09

Jerome Thievent