2011-02-25 25 views
3

快速問題:如何訪問.NET中爲Win32 API定義的BN_CLICKED常量和其他常量?它們是否在某個庫中定義?我必須自己定義它們嗎?如果是這樣,我在哪裏可以找到這些值? Windows版本之間的版本特定值是什麼?訪問用於P/Invoke的Windows API常量和結構

+2

沒有源是完美的。網絡感染了不良的VB6聲明,pinvoke.net通常是含糊不清和誤導性的,pinvoke助手只是生成難看的機器,SDK需要掌握C語言技能。只有一個近乎完美的一個:stackoverflow.com – 2011-02-25 21:28:30

回答

12

我發現PInvoke Interop Assistant確實有幫助: 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

這看起來像是一個很好的工具,可以將'.h'文件(使用Uwe Keim的答案獲得)轉換爲C#P/Invoke簽名。 – Justin 2011-02-25 21:00:58

+1

你通常不需要它們。大多數常量和方法簽名都包含在其數據庫中。 – 2011-02-25 21:01:57

+0

不錯,我得試試這個。 – Justin 2011-02-25 21:05:02

6

您可以下載Microsoft Platform SDK並查看頭文件(*.h)。例如。 BN_CLICKEDwinuser.h文件中定義。

通常,如果您只需要一個或兩個常量,則可以使用Google search並查看前幾個結果,因爲該值會打印在那裏。

+0

對於WM_COMMAND,這是有用的和標準的。但是我發現了兩個與谷歌BN_CLICKED不同的值。 – Squirrelsama 2011-02-25 20:51:02

+0

@Legatou沒有規則沒有例外;-)在我看來,平臺SDK頭部絕對是最好的選擇。 – 2011-02-25 20:53:19

4

http://pinvoke.net/ 一個很好的資源此 許多常見的P/Invoke定義

+1

真的嗎?我發現PInvoke.net非常適合方法簽名。我試圖找到'BN_CLICKED',但沒有成功。 – 2011-02-25 20:52:38

+1

@Uwe Keim - 你說得對 - 我認爲這是'BM_CLICK'的錯字,但看起來像'BN_CLICKED'確實存在。我也無法在pinvoke.net上找到它。 – Justin 2011-02-25 20:54:55

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編譯的程序可能會停止工作。 Microsoft竭盡全力防止這種情況發生。

但是,我已經看到至少有一個地方的常量是不同的,取決於你編譯的平臺/架構。例如,我不會認爲僅僅因爲你的代碼在x86 64位Windows上工作,它就可以在ARM 32位Windows RT上工作。