C# 什么是「;APPCOMMAND";与P/Invoke一起使用的变量?
我在StackOverflow上搜索,找到了答案。我不明白答案是怎么回事。我从未深入研究过封送或P/Invoke。我以前用过,但从来都不明白我在做什么 这就是我困惑的地方:C# 什么是「;APPCOMMAND";与P/Invoke一起使用的变量?,c#,pinvoke,sendmessage,C#,Pinvoke,Sendmessage,我在StackOverflow上搜索,找到了答案。我不明白答案是怎么回事。我从未深入研究过封送或P/Invoke。我以前用过,但从来都不明白我在做什么 这就是我困惑的地方: private const int APPCOMMAND_VOLUME_MUTE = 0x80000; private const int WM_APPCOMMAND = 0x319; 当声明这些时,它们的名称是否重要,或者它们是否被视为任何整数,而不管它们被称为什么 值0x80000和0x319来自哪里 这些值在Win
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
- 当声明这些时,它们的名称是否重要,或者它们是否被视为任何整数,而不管它们被称为什么
- 值
和0x80000
来自哪里0x319
Winuser.h
中定义,它包含在更常见的Windows.h
中
WM_APPCOMMAND的Winuser常量记录在上
在代码中如何命名这些变量,就像命名任何变量一样,在技术上取决于您。但是,通常的做法是使命名与您正在调用的库(在本例中为Winuser.h)使用的命名保持一致。我看不出还有什么理由给它们命名。命名约定并不重要,它只包含一个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);
这些名称是为了方便起见,但取自WinAPI文档/头文件。这些常量中的许多都有助记符前缀作为使用位置的提示,例如WM_=>Windows Message、SPI_=>systemparameters sinfo等 如果只是为了在必要时可以在文档中查找它们,那么最好不要更改它们
除了Microsoft文档之外,还有一个社区维护的wiki,用于记录WinAPI。如果需要,您可以在那里查找常量值。归根结底,它们是什么,因为这就是它们在WinAPI中的定义方式。名称并不重要,正如您所期望的那样-这些值是整数,它们是从中获取的
请记住,其中的值是LPARAM,这意味着它们是高阶位。WPARAM将是低阶位。两者都是32位(4字节),在本例中它们是零-这就是为什么“0x8”变为“0x80000”。常量名称并不重要,但最好保持名称为标准名称。使用其他名称可能会使熟悉API的任何人感到困惑。这些值基本上是由使用PInvoke调用的API定义的幻数。WinAPI充满了幻数,您可以从MSDN获得这些数字。为什么是神奇的数字?因为微软的员工都是魔术师。谢谢你的文档,举个例子,如果我想粘贴一些东西,命令代码是38。我会这样做:
private const int APPCOMMAND\u PASTE=0x38000代码>SendMessage(this.Handle,WM_APPCOMMAND,IntPtr.Zero,(IntPtr)APPCOMMAND_PASTE)代码>假设您已经导入了user32.dll并声明了SendMessage当然。@Frank Close。正如kobigurk所指出的,这些值是LPARAM,需要放在高位,因此您应该将其定义为APPCOMMAND\u PASTE=0x380000代码>(用四个零填充右侧)。完整的8位值实际上是0x00380000
(静音是0x00080000
),我们只需按照写入int a=1的相同方式去掉前导零代码>而不是inta=00000001代码>。