User32 API自定义PostMessage用于自动化

时间:2011-12-10 19:18:59

标签: c# .net windows postmessage

我想从C#自动化一个名为Spotify的程序,最好的方法(我认为)这样做是通过触发假按键。我想编程暂停播放,我不太了解这些东西,找到另一种方式而不是按键。因此我使用Visual Studio的Spy ++来查看Spotify在按下键盘上的播放按钮时获得的消息,我将该消息中的数据复制到我的控制台应用程序中并运行它,当我运行时我可以在Spy ++的消息记录中看到PostMessage,所以这是有效的,但它不会暂停/播放我的音乐。我想这是因为我还必须向另一个目的地发送另一个PostMessage,但我怎么知道还有什么要发送?

发布消息电话:

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

我希望有人熟悉这个并且可以帮助我。

2 个答案:

答案 0 :(得分:3)

要自动化Spotify,首先必须使用以下类名获取窗口句柄:SpotifyMainWindow(使用FindWindow())。

然后,您可以使用SendMessage()方法将WM_APPCOMMAND消息发送到Spotify的窗口。

遵循一个简单的代码:

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
}

例如,播放或暂停当前曲目:

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

答案 1 :(得分:0)

按“播放按钮”会生成虚拟键码 - 对于正式列表,请参阅http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx

您可以找到例如VK_VOLUME_UP VK_MEDIA_PLAY_PAUSE VK_ZOOM

即使是一些遥控器也会将这些代码转换为与现有软件尽可能兼容。

这些是在Windows ME(!)出现并且仍在使用的那天推出的 - 至少当我检查了我的Windows 2008 R2的注册表时!

Windows基本上将某些VK *转换为WM_APPCOMMAND消息,其中包含应用程序监听的某些代码...
如果密钥与启动应用程序(即邮件,浏览器等)有关,则魔术通过Windows资源管理器进行,该资源管理器从Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ AppKey的注册表中读取映射(通过关联或直接执行) - HKLM或HKCU。

有些旧链接,但似乎仍然有效的信息: