C# 访问P/Invoke的Windows API常量和结构
快速问题:如何从.NET访问BN_CLICKED常量和为Win32 API定义的其他常量?它们是在某个库中定义的吗?我必须自己定义它们吗?如果是,我在哪里可以找到这些值?Windows版本之间的值是否特定于版本?您可以下载并查看头文件(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非常有用: 它几乎拥有
*.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