【问题标题】:Send message with APPCOMMAND_MEDIA_NEXT_TRACK使用 APPCOMMAND_MEDIA_NEXT_TRACK 发送消息
【发布时间】:2015-03-27 12:11:27
【问题描述】:

我正在尝试编写一个简单的应用程序,它可以跳过当前播放的曲目,类似于键盘上媒体按钮的工作方式。

我找到了静音 (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);
    }
}

【问题讨论】:

    标签: c# winapi interop


    【解决方案1】:

    SendMessage() 的参数通常以不同寻常的方式打包。一个必要的邪恶,因为它只有简单的参数类型并且需要支持许多不同类型的消息。也设计用于 C 语言,一种不支持方法重载之类的语言。 WM_APPCOMMAND 有这个,lparam 被打包为携带 3 个值(命令、设备号、键状态)。

    正确的代码是:

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

    cmd 是您要发送的命令。就像示例代码中的 APPCOMMAND_VOLUME_MUTE_INT 或 APPCOMMAND_MEDIA_NEXT_TRACK 一样。也说明了0x8000是从哪里来的,是8

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

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 2015-09-02
      • 2020-08-04
      • 2018-05-25
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多