使用APPCOMMAND_MEDIA_NEXT_TRACK发送消息

时间:2015-03-27 12:11:27

标签: c# winapi interop

我试图编写一个简单的应用程序,跳过当前播放的音轨,类似于键盘上的媒体按钮的工作方式。

我找到了静音(0x80000)的LParam值,但我不知道如何找到命令的值,例如下一首/上一首曲目或8如何(从下面的文章)映射到0x80000所以我可以解决地图11(下面的文章中的下一首曲目)如何工作?

静音通过使用0x80000工作,但使用8时不工作。

很抱歉,如果这是一个愚蠢的问题,我以前从未做过任何互操作。

由于

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646275%28v=vs.85%29.aspx

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private const int WM_APPCOMMAND = 0x319;

    private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
    private const int APPCOMMAND_VOLUME_MUTE_INT = 8;

    //private const int APPCOMMAND_MEDIA_NEXT_TRACK = ?;
    private const int APPCOMMAND_MEDIA_NEXT_TRACK = 11;

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, int lParam);

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // doesn't work
        //SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
        //    APPCOMMAND_VOLUME_MUTE_INT);

        SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
            APPCOMMAND_VOLUME_MUTE);
    }
}

1 个答案:

答案 0 :(得分:1)

SendMessage()的参数通常以不寻常的方式打包。一个必要的邪恶,因为它只有简单的参数类型,需要支持许多不同类型的消息。还设计用于C语言,这种语言不支持方法重载等任何方法。 WM_APPCOMMAND在黑桃中有这个,lparam被打包以携带3个值(命令,设备号,keystate)。

正确的代码是:

  SendMessage(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)((int)cmd << 16));

cmd 是您要发送的命令。与示例代码中的APPCOMMAND_VOLUME_MUTE_INT或APPCOMMAND_MEDIA_NEXT_TRACK类似。还解释了0x8000的来源,它是8&lt;&lt; 16。

请注意,您的SendMessage()声明是错误的,最后一个参数是IntPtr,而不是 int 。您将找到一个C#包装类,可以在this post中的任何类型的项目中使用。