快速提问:如何从.NET访问为Win32 API定义的BN_CLICKED常量和其他常量?它们是否在某些图书馆中定义?我必须自己定义吗?如果是这样,我在哪里可以找到这些值? Windows版本之间的值是否为特定版本的值?
答案 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了。
以下是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_CLICKED
在winuser.h
文件中定义。
通常情况下,如果你只需要一个或两个常数,Google search并查看前几个结果也就足够了,因为那里会打印出值。
答案 2 :(得分:4)
http://pinvoke.net/是此 许多常见P / Invoke定义的绝佳资源。
答案 3 :(得分:1)
答案 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 Studio和Windows 10 SDK,因为在幕后它会编译一个查找常量的程序。
最后,这里是对提问者问题的一些答案:
某些库中是否定义了[常量]?
权威来源是Windows Platform SDK
我必须自己定义吗?
它们不是内置于Windows或.NET,这意味着您可能自己定义它们(或从某处复制它们)。
Windows版本之间的版本特定值是什么?
它们非常稳定,因为当用户升级到更新版本的Windows时,为一个版本的Windows编译的程序可能会停止工作。微软竭尽全力防止这种情况发生。
但是,我已经看到至少有一个地方常量不同,具体取决于你正在编译的平台/架构。我不认为仅仅因为你的代码在x86 64位Windows上工作,它就可以在ARM 32位Windows RT上工作。