2015-03-27 2 views
0

Я пытаюсь написать простое приложение, которое пропускает текущий трек, аналогично тому, как будут работать кнопки мультимедиа на клавиатуре.Отправить сообщение с APPCOMMAND_MEDIA_NEXT_TRACK

Я нашел значения LParam для отключения звука (0x80000), но я не знаю, как найти значения для таких команд, как следующий/предыдущий трек или как 8 (из приведенной ниже статьи) сопоставляется с 0x80000, поэтому я могу решить, как карта 11 (следующий трек из статьи ниже) в код, который работает ?.

мьютинг работает с помощью 0x80000, но не при использовании 8.

Извините, если это глупый вопрос, я никогда не делал каких-либо Interop вещи раньше.

Благодаря

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

Аргументы в 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 < < 16.

Обратите внимание, что ваш SendMessage() заявление неверно, последний аргумент IntPtr, не INT. Вы найдете класс оболочки C#, который можно использовать в любом виде проекта в this post.

Смежные вопросы