什么是“appcommand”?P/Invoke使用的变量

本文关键字:Invoke 变量 appcommand 什么 | 更新日期: 2023-09-27 18:06:39

我在StackOverflow上搜索,找到了c#静音音量的答案。我不明白答案是怎么回事。我从来没有深入研究过编组或P/Invoke。我以前用过它们,但从来不明白我在做什么。

这就是我困惑的地方:

private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
  • 在声明这些变量时,它们的名称是否重要,或者它们只是像任何整数一样被对待,而不管它们的名称是什么?

  • 0x800000x319从何而来?

什么是“appcommand”?P/Invoke使用的变量

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

WM_APPCOMMAND的Winuser常量记录在此MSDN页面。

如何在代码中命名这些变量,就像对任何变量一样,在技术上取决于您。但是,通常的做法是保持与您调用的库(在本例中为Winuser.h)使用的命名一致。

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

如果只是为了在必要时可以在文档中查找它们,那么不更改它们可能是一个好主意。

除了微软文档,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

名称无关紧要,正如您所期望的那样-这些值是整型值,它们取自MSDN。

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