我正在StackOverflow上搜索,找到了Mute Volume in C#的答案。我不明白答案是怎么回事。我从来没有深入到Marshaling或P / Invoke。我之前使用过它们,但从未理解我在做什么。
所以,我对此感到困惑:
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
在声明这些内容时,它们的名称是否重要,或者它们只是被视为任何整数,无论它们被称为什么?
值0x80000
和0x319
来自何处?
答案 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);
答案 3 :(得分:0)
这些名称并不重要,正如您所期望的那样 - 这些是整数的价值,而且来自MSDN。
请记住,那里的值是LPARAM,这意味着它们是高阶位。 WPARAM将是低位。两者都是32位(4字节),在这种情况下它们是零 - 这就是为什么" 0x8"成为" 0x80000"。