Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是「;APPCOMMAND";与P/Invoke一起使用的变量?_C#_Pinvoke_Sendmessage - Fatal编程技术网

C# 什么是「;APPCOMMAND";与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

我在StackOverflow上搜索,找到了答案。我不明白答案是怎么回事。我从未深入研究过封送或P/Invoke。我以前用过,但从来都不明白我在做什么

这就是我困惑的地方:

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