什么是#AP; APPCOMMAND"与P / Invoke一起使用的变量?

时间:2014-06-04 20:39:39

标签: c# pinvoke sendmessage

我正在StackOverflow上搜索,找到了Mute Volume in C#的答案。我不明白答案是怎么回事。我从来没有深入到Marshaling或P / Invoke。我之前使用过它们,但从未理解我在做什么。

所以,我对此感到困惑:

private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
  • 在声明这些内容时,它们的名称是否重要,或者它们只是被视为任何整数,无论​​它们被称为什么?

  • 0x800000x319来自何处?

4 个答案:

答案 0 :(得分:4)

这些值在Winuser.h中定义,它包含在更常见的Windows.h中。

WM_APPCOMMAND的Winuser常量记录在this MSDN page

如何在代码中命名这些变量,就像任何变量一样,在技术上取决于您。但是,通常的做法是使命名与您正在调用的库(在本例中为Winuser.h)使用的命名一致。我认为没有理由将它们命名为其他任何东西。

答案 1 :(得分:2)

名称是为了方便起见,但是取自WinAPI文档/头文件。许多这些常量都有一个助记符前缀作为它们使用位置的提示,例如: WM_ => Windows消息,SPI_ => SystemParametersInfo等

最好不要更改它们,如果只是为了在必要时可以在文档中查找它们。

除了Microsoft文档之外,pinvoke.net是一个社区维护的Wiki,用于记录WinAPI。如果需要,您可以在那里查找常量值。最终,它们就是它们,因为它们是在WinAPI中定义的。

答案 2 :(得分:1)

命名约定并不重要,它只包含一个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

答案 3 :(得分:0)

这些名称并不重要,正如您所期望的那样 - 这些是整数的价值,而且来自MSDN

请记住,那里的值是LPARAM,这意味着它们是高阶位。 WPARAM将是低位。两者都是32位(4字节),在这种情况下它们是零 - 这就是为什么" 0x8"成为" 0x80000"。