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

时间:2011-02-25 20:45:11

标签: c# .net winapi

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

5 个答案:

答案 0 :(得分:12)

我发现PInvoke Interop助手非常有帮助: http://blogs.microsoft.co.il/blogs/sasha/archive/2008/01/12/p-invoke-signature-generator.aspx

它几乎包含所有内容,可以将C ++转换为C#/ VB。我很少,如果有的话,再去搜索google / pinvoke.net了。 Screenshot

以下是MSDN杂志文章:http://msdn.microsoft.com/en-us/magazine/cc164193.aspx

原始的2008年1月MSDN杂志文章现在仅作为.CHM help file download提供,从https://msdn.microsoft.com/magazine/msdn-magazine-issues的最底部链接。 (“CLR Inside Out:托管和非托管代码之间的密钥”。)

这是下载:http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2008_01.exe。源代码可以在http://clrinterop.codeplex.com/找到。

答案 1 :(得分:6)

您可以下载Microsoft Platform SDK并查看标题文件(*.h)。例如。 BN_CLICKEDwinuser.h文件中定义。

通常情况下,如果你只需要一个或两个常数,Google search并查看前几个结果也就足够了,因为那里会打印出值。

答案 2 :(得分:4)

http://pinvoke.net/ 许多常见P / Invoke定义的绝佳资源。

答案 3 :(得分:1)

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

http://www.magnumdb.com/search?q=BN_CLICKED

enter image description here

答案 4 :(得分:0)

这是一种概念验证,但我将a script放在一起,可以查找任何Windows API常量。用法示例:

PS > .\Get-WindowsSDKConstant.ps1 BN_CLICKED
0
PS > .\Get-WindowsSDKConstant.ps1 BN_DBLCLK
5
PS > .\Get-WindowsSDKConstant.ps1 WM_COMMAND
273

它要求您下载Visual StudioWindows 10 SDK,因为在幕后它会编译一个查找常量的程序。

最后,这里是对提问者问题的一些答案:

  

某些库中是否定义了[常量]?

权威来源是Windows Platform SDK

  

我必须自己定义吗?

它们不是内置于Windows或.NET,这意味着您可能自己定义它们(或从某处复制它们)。

  

Windows版本之间的版本特定值是什么?

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

但是,我已经看到至少有一个地方常量不同,具体取决于你正在编译的平台/架构。我不认为仅仅因为你的代码在x86 64位Windows上工作,它就可以在ARM 32位Windows RT上工作。