Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 访问P/Invoke的Windows API常量和结构_C#_.net_Winapi - Fatal编程技术网

C# 访问P/Invoke的Windows API常量和结构

C# 访问P/Invoke的Windows API常量和结构,c#,.net,winapi,C#,.net,Winapi,快速问题:如何从.NET访问BN_CLICKED常量和为Win32 API定义的其他常量?它们是在某个库中定义的吗?我必须自己定义它们吗?如果是,我在哪里可以找到这些值?Windows版本之间的值是否特定于版本?您可以下载并查看头文件(*.h)。例如,在winuser.h文件中定义了 通常,如果您只需要一个或两个常量,a和前几个结果也就足够了,因为值打印在那里。对于许多常见的p/Invoke定义来说是一个很好的资源。我发现PInvoke Interop Assistant非常有用: 它几乎拥有

快速问题:如何从.NET访问BN_CLICKED常量和为Win32 API定义的其他常量?它们是在某个库中定义的吗?我必须自己定义它们吗?如果是,我在哪里可以找到这些值?Windows版本之间的值是否特定于版本?

您可以下载并查看头文件(
*.h
)。例如,在
winuser.h
文件中定义了


通常,如果您只需要一个或两个常量,a和前几个结果也就足够了,因为值打印在那里。

对于许多常见的p/Invoke定义来说是一个很好的资源。

我发现PInvoke Interop Assistant非常有用:

它几乎拥有一切,可以为你转换C++到C/VB。我很少再求助于搜索google/pinvoke.net了。

以下是MSDN杂志的文章:

2008年1月MSDN杂志的原始文章现在只能作为一个链接提供,从最底层链接。(列“CLR Inside Out:托管代码和非托管代码之间的封送处理”。)


以下是下载:。源代码可以在中找到。

这是一种概念证明,但我把它放在一起,可以查找大多数Windows API常量。用法示例:

PS > .\Get-WindowsSDKConstant.ps1 BN_CLICKED
0
PS > .\Get-WindowsSDKConstant.ps1 BN_DBLCLK
5
PS > .\Get-WindowsSDKConstant.ps1 WM_COMMAND
273
它需要您下载和下载,因为在幕后它编译了一个查找常量的程序

最后,以下是对提问者问题的一些回答:

是否在某个库中定义了[常数]

权威来源是

我必须自己定义它们吗

它们不是Windows或.NET内置的,这意味着您可能会自己定义它们(或从其他地方复制它们)

Windows版本之间的值是否特定于版本

它们非常稳定,因为否则,当用户升级到较新版本的Windows时,为某个版本的Windows编译的程序可能会停止工作。微软竭尽全力防止这种情况发生

但是,我至少看到过一个地方,根据编译所使用的平台/体系结构,常量有所不同。我不认为仅仅因为您的代码在x86 64位Windows上工作,它就可以在ARM 32位Windows RT上工作。

MagNumDB网站(由SO用户提供)是一种查找常量的简单方法:


对于WM_命令,这是非常有用和标准的。但我发现用谷歌点击的BN_有两个不同的值。@Legatou无规则无例外;-)在我看来,平台SDK头绝对是最好的选择。真的吗?我发现PInvoke.net对方法签名很有用。我试图找到
BN_CLICKED
,但没有成功。@Uwe-Keim-你说得对-我认为这是
BM_CLICK
的打字错误,但看起来
BN_CLICKED
确实存在。我在pinvoke.net上也找不到它。这看起来是一个很好的工具,可以将
.h
文件(使用Uwe Keim的答案获得)转换为C#P/Invoke签名。您通常不需要它们。大多数常量和方法签名都包含在它的数据库中。没有一个源是完美的。web被错误的VB6声明所感染,pinvoke.net经常模棱两可和误导,pinvoke助手只是丑陋的机器生成的,SDK需要掌握C技能。只有一个近乎完美:stackoverflow.com