api函式是構築windows應用程式的基石,是windows程式設計的必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式的方法,或者是呼叫windows api函式的介面,也就是說具備呼叫動態連線庫的能力。visual c#和其它開發工具一樣也能夠呼叫動態鏈結庫的api函式。本文中筆者就結合例項向大家介紹在visual c#中如何呼叫各種返回值的api,該例項就是乙個通過api函式呼叫獲取系統資訊的程式。
在visual c#中呼叫api的基本過程:
首先,在呼叫api之前,你必須先導入system.runtime.interopservices這個命名空間。該命名空間包含了在visual c#中呼叫api的一些必要集合,具體的方法如下:
using system.runtime.interopservices;
在匯入了命名空間後,我們要宣告在程式中所要用到的api函式。我們的程式主要是獲取系統的相關資訊,所以用到的api函式都是返回系統資訊的。先給出在visual c#中宣告api的方法:
[dllimport("kernel32")]
public static extern void getwindowsdirectory(stringbuilder windir,int count);
其中,"dllimport"屬性用來從不可控**中呼叫乙個方法,它指定了dll的位置,該dll中包含呼叫的外部方法;"kernel32"設定了類庫名;"public"指明函式的訪問型別為公有的;"static"修飾符宣告乙個靜態元素,而該元素屬於型別本身而不是指定的物件;"extern"表示該方法將在工程外部執行,同時使用dllimport匯入的方法必須使用"extern"修飾符;最後getwindowsdirectory函式包含了兩個引數,乙個為stringbuilder型別的,另乙個為int型別的,該方法返回的內容存在於stringbuilder型別的引數中。同時,因為我們在這裡使用到了stringbuilder類,所以在程式的開始處,我們還得新增system.text這個命名空間,方法同上。
其他幾個api函式的宣告如下:
[dllimport("kernel32")]
public static extern void getsystemdirectory(stringbuilder sysdir,int count);
[dllimport("kernel32")]
public static extern void getsysteminfo(ref cpu_info cpuinfo);
[dllimport("kernel32")]
public static extern void globalmemorystatus(ref memory_info meminfo);
[dllimport("kernel32")]
public static extern void getsystemtime(ref systemtime_info stinfo);
以上幾個api的作用分別是獲取系統路徑,獲得cpu相關資訊,獲得記憶體的相關資訊,獲得系統時間等。
在宣告完所有的api函式後,我們發現後三個函式分別用到了cpu_info、memory_info、systemtime_info等結構,這些結構並非是.net內部的,它們從何而來?其實,我們在用到以上api呼叫時均需用到以上結構,我們將函式呼叫獲得的資訊存放在以上的結構體中,最後返回給程式輸出。這些結構體比較複雜,但是如果開發者能夠熟練運用,那麼整個api世界將盡在開發者的掌握之中。以下就是上述結構體的宣告:
//定義以下各結構
//定義cpu的資訊結構
[structlayout(layoutkind.sequential)]
public struct cpu_info
//定義記憶體的資訊結構
[structlayout(layoutkind.sequential)]
public struct memory_info
//定義系統時間的資訊結構
[structlayout(layoutkind.sequential)]
public struct systemtime_info
結構體定義的主體部分和c++中的沒多大差別,具體每個結構體內部成員的定義可參考聯機幫助中的sdk文件。同時,我們還發現在每個結構體定義的上面都有一句用中括號括起來的說明性文字。這些說明都是有關結構體成員的布局的,共有三種選項,分別說明如下:
layoutkind.automatic:為了提高效率允許執行態對型別成員重新排序。
注意:永遠不要使用這個選項來呼叫不受管轄的動態鏈結庫函式。
layoutkind.explicit:對每個域按照fieldoffset屬性對型別成員排序
layoutkind.sequential:對出現在受管轄型別定義地方的不受管轄記憶體中的型別成員進行排序。
在上面的程式中,為了方便起見我們都用到了第三種方式。
所有的api函式以及相關的結構體宣告完畢後,我們就運用這些api來實現我們的程式功能――獲取系統的相關資訊。
介面可按如下方式布置,不過有興趣的讀者自然可以發揮自己的想象,將介面布局做得更好。
簡單的介面布置好後,我們新增乙個按鈕("獲取資訊"按鈕)的訊息處理函式如下:
private void getinfo_click(o b j e c t sender, system.eventargs e)
在上面的訊息處理函式中,我們運用了在程式開始處宣告的各個api函式獲取了系統的相關資訊,並最終在介面上以文字標籤的方式顯示結果。
結束語:
通過本文的學習,我相信稍有api使用基礎的開發者可以馬上觸類旁通,很快掌握visual c#中對api的操作。上面給出的例項僅僅是乙個非常簡單的示例程式,不過有興趣的讀者可以進一步完善其功能,做出更完美的系統資訊檢測程式。
winform利用API函式獲取系統的資訊
api函式是構築windows應用程式的基石,是windows程式設計的必備利器。每一種windows應用程式開發工具都提供了間接或直接呼叫了windows api函式的方法,或者是呼叫windows api函式的介面,也就是說具備呼叫動態連線庫的能力。visual c 和其它開發工具一樣也能夠呼叫...
利用API函式獲取系統資訊
我們所編寫的每乙個程式,都會有乙個執行環境的最低需求。如何獲取使用者機器的配置資訊呢?其實,我們可以利用api函式輕鬆實現。我們利用visual c 嚮導生成乙個單文件介面的視窗程式框架。生成乙個新的對話方塊,這個對話方塊用於顯示我們所取得的機器的配置資訊。為這個對話方塊生成乙個新類,命名為csys...
利用API函式向TreeView控制項傳送訊息
出處 http blog.csdn.net slowgrace archive 2009 04 15 4076404.aspx 1 sendmessage 向treeview控制項傳送訊息通常要用api的sendmessge函式,這需要在標準模組裡新增宣告如下 api宣告 public declar...