什么是“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;
在声明这些变量时,它们的名称是否重要,或者它们只是像任何整数一样被对待,而不管它们的名称是什么?
值
0x80000
和0x319
从何而来?
这些值是在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" .