Что такое переменные "APPCOMMAND", используемые с P/Invoke?

Я искал здесь, на StackOverflow и нашел ответ на отключить громкость в C#. Я не понимаю, что происходит с ответом. Я никогда не углублялся в маршалинг или P / Invoke. Я использовал их раньше, но никогда не понимал, что делаю.

вот что меня смущает:

private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
  • при объявлении их, имеет ли значение, как они называются, или они просто рассматриваются как любое целое число независимо от того, что они называются?

  • где значения 0x80000 и 0x319 откуда?

4 ответов


эти значения определены в Winuser.h, который включен в более общий Windows.h.

константы Winuser для WM_APPCOMMAND задокументированы на эта страница MSDN.

Как вы называете эти переменные в своем коде, как и с любой переменной, технически зависит от вас. Тем не менее, это обычная практика, чтобы держать именование в соответствии с тем, что используется библиотекой вы вызываете (в этом случае Winuser.ч.) Не вижу причин называть их иначе.


имена для удобства, но взяты из документации WinAPI / заголовочных файлов. Многие из этих констант имеют мнемонический префикс как намек на то, где они используются, например WM_ => Windows Message, SPI_ => SystemParametersInfo и т. д.

Это, вероятно, хорошая идея не менять их, хотя бы для того, чтобы вы могли посмотреть их в документации, если это необходимо.

в дополнение к документации Microsoft,pinvoke.net поддерживается сообществом wiki, который документирует WinAPI. Вы можете посмотреть постоянные значения там, если это необходимо. В конечном счете, они такие, какие они есть, потому что именно так они определены в WinAPI.


соглашение об именах не имеет значения, и оно просто содержит значение int. Он обычно используется для использования этих имен, но вы можете использовать любое имя.

значения используются SendMessage e.q.

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

SendMessage(this.Handle, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_VOLUME_MUTE);

SendMessage(this.Handle, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_VOLUME_UP);

http://www.blackwasp.co.uk/BasicVolumeControl.aspx


имена не имеют значения, это как вы ожидаете - это значения, которые являются ints, и они взяты из MSDN.

имейте в виду, что значения там LPARAM, что означает, что они являются битами высокого порядка. Wparam будет битами низкого порядка. Оба являются 32 битами (4 байта), и в этом случае они равны нулю - вот почему "0x8" становится "0x80000".