VB+API初級(jí)入門_第1頁
VB+API初級(jí)入門_第2頁
VB+API初級(jí)入門_第3頁
VB+API初級(jí)入門_第4頁
VB+API初級(jí)入門_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、vb api 初級(jí)入門 (來源: csdn)經(jīng)過 yydfz 整理,作者不詳,但看到寫得不錯(cuò)很有參考價(jià)值,就整理發(fā)上來了,如果作者認(rèn)為侵權(quán),請(qǐng)通知我,我馬上刪除。接受網(wǎng)友的意見,寫了一篇關(guān)于vb api 的文章,希望大家能從中學(xué)到一些知識(shí)。一、 api 是什么?這個(gè)我本來不想說的,不過也許你知道其它人不知道,這里為了照顧一下新手,不得不說些廢話,請(qǐng)大家諒解。win32 api 即為 microsoft 32 位平臺(tái)的 應(yīng)用程序編程接口(applicationprogramming interface) 。所有在 in32 平臺(tái)上運(yùn)行的應(yīng)用程序都可以調(diào)用這些函數(shù)。使用 win32 api ,應(yīng)用

2、程序可以充分挖掘windows 的 32 位操作系統(tǒng)的潛力。mircrosoft的所有 32 位平臺(tái)都支持統(tǒng)一的api,包括函數(shù)、結(jié)構(gòu)、消息、宏及接口。使用win32 api不但可以開發(fā)出在各種平臺(tái)上都能成功運(yùn)行的應(yīng)用程序,而且也可以充分利用每個(gè)平臺(tái)特有的功能和屬性。以上為 api 的相關(guān)介紹,不過有些新手看了以后可能還是不怎么明白api 到底有什么用?這里請(qǐng)不要著急,如果你有足夠耐心的話,請(qǐng)慢慢往下看。二、如何使用api ?估計(jì)這才是大家真正關(guān)心的,那么如何使用api 呢?在了解api 之前, 先打開你的vb書,翻到過程函數(shù)這章來,在搞清楚api 之前應(yīng)該先搞懂過程函數(shù)是怎么一回事!如果你還

3、不知道過程的工作方式,那么請(qǐng)先不要急著往下看,那樣容易走很多彎路。好了,當(dāng)你理解了過程函數(shù)時(shí),也就是你可以使用api 的時(shí)候了,別把a(bǔ)pi 看得太難,你就像使用過程函數(shù)一樣使用api 就可以了。首先,讓我們看看一個(gè)簡單的api,以下:private declare sub sleep lib kernel32 alias sleep (byval dwmilliseconds as long) 以上這個(gè) api 的呢是起一個(gè)延時(shí)作用。你如果是剛接觸api 的話可能會(huì)感到api 的書寫及其復(fù)雜,而且會(huì)感到很不適應(yīng)。其實(shí)這沒什么的,慢慢習(xí)慣就好了。至于api 這些復(fù)雜的書寫你就不用操心了,在你安裝

4、vb 的時(shí)候微軟已經(jīng)幫我們帶上了api 瀏覽器, 這些全部都可以利用api 瀏覽器幫我們自動(dòng)生成。api 瀏覽器的位置位于開始菜單程序microsoft visual basic 6.0 中文版 microsoft visual basic 6.0 中文版工具 api 文本瀏覽器。打開 api 瀏覽器, 在最上面的一個(gè)文本框中輸入sleep,這時(shí)下面列表框中就會(huì)自動(dòng)顯示相應(yīng)的api 函數(shù), 然后點(diǎn)右邊添加按鈕即可,接著點(diǎn)擊復(fù)制按鈕,這時(shí)你就可以用ctrl+v把聲明的api 添加到 vb 代碼窗口中了。這里我要說一下,有些新手可能還弄不明白。api 的聲明范圍一般有兩種模式,一種是private

5、(私有的 ),一種是 public(公用的 )。一般 private 是聲明在類模塊或窗體類中,public 聲明在模塊中。你在添加api 的時(shí)候,添加按鈕下面就有api 的聲明范圍,可以根據(jù)自己的需要進(jìn)行添加。這里我們一般選擇私有的(private)就可以了。經(jīng)過上面,我們知道如何添加api,接著我們分析一下api 聲明,這是你了解api 必備的。首先看第一個(gè)單詞private,很顯然,我上面剛剛講過,這是申明一個(gè)私有的api 變量。再看第二個(gè)declare,這個(gè)單詞幫我們告訴vb 是在申明api 函數(shù),一般申明外在的api函數(shù)時(shí)都必須帶上這個(gè)單詞。第三個(gè) sub,別告訴我你不知道什么意思?

6、這就是我叫你先學(xué)習(xí) vb 中過程函數(shù)的意思,這個(gè)說白了就是沒有反回值,一般如果不是sub 而是 function都帶有反回值的。第四個(gè)lib,這個(gè)是告訴vb 我們要聲明哪一個(gè)dll 中的 api 函數(shù),也就是告訴 vb 我們要申明第五個(gè)單詞kernel32.dll 中的 api ,一般寫dll 名稱時(shí)都要用雙引號(hào)括起來, 如user32、shell32.dll 等,至于后面的 .dll 這個(gè)可以帶可不帶。再來看第六個(gè)alias ,這個(gè)也是需要同后面一個(gè)一起用的,我們應(yīng)該把第六個(gè)和第七個(gè)連起來一起看alias sleep,這個(gè)意思表示將被調(diào)用的過程在dll 中還有另外的名稱,這個(gè)是可選的。最后括

7、號(hào)里面的,也就是和過程函數(shù)一樣,你傳入相應(yīng)的值就可以了。上面我們分析完api 函數(shù)聲明以后,接著我們就要自己動(dòng)手寫代碼了。先把這個(gè)api復(fù)制到 form1 代碼窗口中,然后寫如下代碼:private declare sub sleep lib kernel32 (byval dwmilliseconds as long) private sub form_load() sleep 2000 end sub 解釋一下,也就是在窗體啟動(dòng)時(shí)使用sleep api 進(jìn)行延時(shí) 2秒, 后面的參數(shù)dwmilliseconds是表示你要延時(shí)的秒數(shù),基本上和設(shè)置timer 中的秒數(shù)一樣。你再看一下sleep2

8、000 的使用方式,是不是和使用vb 過程函數(shù)一樣呢?好了,我們的第一個(gè)vb api 程序?qū)懲炅耍梢钥吹绞褂胊pi 并不是一件很難的事。三、如何才能提升你對(duì)api 的學(xué)習(xí)興趣?api,我常把它看做成過程函數(shù),不過每人都有每人的見解和理解方式,自己的理解方式只要可以幫助自己更好的學(xué)習(xí)和掌握api ,也沒必要一定要學(xué)習(xí)他人的。1、自己做msgbox 了解 api 參數(shù)的使用方法是很重要的,這里我們不用vb 的 msgbox ,直接使用api 彈出 msgbox 消息框。首先,打開api 瀏覽器,選擇messagebox,大家可以用這個(gè)api 和vb 內(nèi)置的 msgbox 比較一下,其實(shí) msgb

9、ox 也就是 messagebox 的縮寫,只不過一個(gè)是api ,一個(gè)是 vb 內(nèi)置的,但兩者都是通過api 進(jìn)行工作的。好了,選擇私有聲明方式,粘貼到vb 代碼編輯窗口中,然后新建一個(gè)commandbutton,寫入以下代碼:private declare function messagebox lib user32 alias messageboxa (byval hwnd as long, byval lptext as string, byval lpcaption as string, byval wtype as long) as long private sub command1

10、_click() messagebox me.hwnd, 這里是內(nèi)容 , 標(biāo)題 , 0 end sub 先讓我們來分析一下,首先看第一個(gè)參數(shù)byval hwnd as long ,很顯然這是一個(gè)長整形變量,所以我們這里需要傳遞的是數(shù)字,你可能會(huì)發(fā)現(xiàn)我們傳遞的并不是數(shù)字啊,而是me.hwnd ?很奇怪是嗎?如果你真的有此疑問說明你是真心想要學(xué)習(xí)好api 的,現(xiàn)在就讓我們來看看me.hwnd 到底是什么東西?以下摘自vb 幫助文檔:hwnd 屬性:返回窗體或控件的句柄。句 柄:是由操作環(huán)境定義的一個(gè)唯一的整數(shù)值,它被程序用來標(biāo)識(shí)或者切換到對(duì)象,如窗體或控件等?,F(xiàn)在估計(jì)你差不多就已經(jīng)明白了,我們調(diào)用

11、的hwnd 其實(shí)是一個(gè)句柄整數(shù)值,你可以用msgbox me.hwnd看一下就知道了。至于me 這是一個(gè)關(guān)鍵字,代表當(dāng)前form 窗體對(duì)象。如: me.caption= 標(biāo)題 、me.backcolor=vbred 等。接上面的,首先我們傳入了me.hwnd ,表示是當(dāng)前窗口調(diào)用messagebox,這里告訴大家一個(gè)技巧,也就是以后凡是看到byval hwnd as long ,一般都是需要傳入句柄的,至于傳入哪個(gè)對(duì)象句柄,那就要看你是怎么實(shí)現(xiàn)的了。byval lptext as string ,這個(gè)是字符串變量,標(biāo)識(shí)著叫我們需要傳入字符串進(jìn)去,可以看里面的變量字符lptext,屬于文本的意思

12、,也就是說是用來顯示msgbox 中的消息文本的。byval lpcaption as string ,也是字符串變量,還是傳入字符串進(jìn)去。在看里面的變量字符 lpcaption,其實(shí)就是顯示msgbox 標(biāo)題的。byval wtype as long ,這是一個(gè)整形變量,需要傳遞整形數(shù)字,還是看里面的變量字符 wtype,標(biāo)識(shí)著顯示msgbox 類型,這里可以像vb 的 msgbox 一樣使用,如這里可以傳入: vbyesno,vbokcancel 等,如果忽略那就傳入0 即可。好了,按 f5 啟動(dòng)程序,點(diǎn)擊command1,接著就會(huì)彈出一個(gè)消息框,這里我們制作以及分析 msgbox 已經(jīng)完

13、成了。希望你能在這段學(xué)習(xí)到一些知識(shí)。2、來點(diǎn)實(shí)用的吧就拿隱藏 windows 任務(wù)管理器來說吧,這里只能隱藏任務(wù)管理器中的窗口,不能隱藏進(jìn)程。 (問:有沒有隱藏進(jìn)程的?答:你想干什么?),當(dāng)程序運(yùn)行后你無法從任務(wù)管理器的窗口中關(guān)閉程序,只能從進(jìn)程中進(jìn)行終止。好了,還是老規(guī)矩,打開api 瀏覽器,輸入getwindow 和 showwindow 兩個(gè) api, 聲明范圍還是私有的,復(fù)制粘貼到form 代碼窗口中,嗯,好了?別急, 還是 api 瀏覽器,選擇 combox 中的常數(shù), 輸入 gw_owner 和 sw_hide這兩個(gè) api 常數(shù),然后粘貼到代碼窗口中,問我這兩個(gè)是干什么的?那就接

14、著往下看吧。寫入以下代碼:private declare function getwindow lib user32 (byval hwnd as long, byval wcmd as long) as long private declare function showwindow lib user32 (byval hwnd as long, byval ncmdshow as long) as long private const gw_owner = 4 private const sw_hide = 0 private sub form_load() dim lphwnd as l

15、ong lphwnd = getwindow(me.hwnd, gw_owner) showwindow lphwnd, sw_hide end sub 又到了分析的時(shí)候了,這對(duì)剛?cè)腴T的新手可謂是最激動(dòng)的時(shí)候了。好了,還是老子,看看兩個(gè) api 的表面意思和傳遞值變量。先看 getwindow, 表面意思:獲取窗口。傳遞值變量:hwnd 整形句柄, wcmd 整形命令值。再看 showwindow ,表面意思:顯示窗口。傳遞值變量:hwnd 整形句柄, ncmdshow整形命令值。然后是使用代碼,先看lphwnd = getwindow(me.hwnd, gw_owner)這句,這句意思是獲取

16、當(dāng)前窗口的所有者窗口句柄,可以看到getwindow 是 function 過程函數(shù),執(zhí)行以后會(huì)返回相應(yīng)的窗口句柄值,這個(gè)值為long 整形 (同句柄 )。接著調(diào)用showwindow lphwnd, sw_hide ,這句意思是顯示lphwnd 這個(gè)句柄的窗口,關(guān)鍵一句是最后的sw_hide, 這是api 函數(shù)的常量。 通過設(shè)置常量能讓系統(tǒng)知道api 到底應(yīng)該怎么執(zhí)行顯示窗口,是顯示?還是隱藏? hide 當(dāng)然是隱藏的意思。好了,編譯成exe,運(yùn)行后打開任務(wù)管理器,查看程序窗口,還有嗎?我又要說一下了,有些人可能不懂為什么要用gw_owner 這些常量,這些到底有什么用?還有就是我怎么知道哪

17、些api 對(duì)應(yīng)哪些的常量?其實(shí)這些常量你只要稍微注意一下就知道它們是怎么回事了,如在getwindow 中我使用gw_owner ,在 showwindow 中我使用 sw_hide 這些常量都有一個(gè)共同的特點(diǎn),就是他們都是以api 的單詞第一個(gè)字母為標(biāo)準(zhǔn)。如 getwindow 相對(duì)應(yīng)的常量就是get(g)window(w)=gw,showwindow 相對(duì)應(yīng)的常就是 show(s)window(w)=sw ,這些常量可以自己在vb 的 api 瀏覽器中找找看。3、繼續(xù)往下學(xué)吧上面兩個(gè)我們講到了一般api 的使用方法,和一些api 常量的使用方法,接著我們來看看 api 類型的使用方法,在了

18、解這一小節(jié)前請(qǐng)先搞懂vb 中的自定義類型(type)這章,否則你可能會(huì)稀里糊涂的,到時(shí)別怪我沒提醒你哦!這次讓我們來獲取一下鼠標(biāo)指針的位置。這里教大家一個(gè)技巧,當(dāng)你想用api 去實(shí)現(xiàn)某一特定的功能時(shí), 卻又不知道該用哪個(gè)api, 這時(shí)你可以就表面的意思到api 瀏覽器找找,有 70%以上的機(jī)率可以找到哦!現(xiàn)在就拿這個(gè)api 開刀,那我們應(yīng)該如何找?別著急,往下看:如我們現(xiàn)在要獲取鼠標(biāo)指針位置,可以這樣翻譯一下:get(獲?。?cursor(指針) pos(位置),組合起來: getcursorpos,呵呵,一條api 就這樣出來了,到api 瀏覽器輸入這個(gè)組合單詞,呵,有吧?見以下:priva

19、te declare function getcursorpos lib user32 alias getcursorpos (lppoint as pointapi) as long 好了好了,高興一下就算了,現(xiàn)在讓我們分析一下這個(gè)api,看其它的沒啥不同的,其中只有一個(gè)參數(shù),就是最后一個(gè)變量有些不懂?在vb 中好像沒有見過這個(gè)變量?不明白么?那就再繼續(xù)往下看。lppoint as pointapi ,pointapi ?很顯然,在vb 中并沒有此類型,一般都是string、integer、long、byte 等變量類型,那么這個(gè)也就理所當(dāng)然的是自定義類型(問:什么是自定義類型?答:不知道,

20、自已不會(huì)看書啊)。既然是自定義類型,那么我們?nèi)绾尾拍苤浪侨绾味x的呢?這里也就不用你操心啦,還是api 瀏覽器,在最上面的combox 中選擇類型,這時(shí)下面list 中也就自然的把a(bǔ)pi 的相關(guān)類型顯示出來了,現(xiàn)在我們開始在text 文本框中輸入我們需要的自定義類型,pointapi ,點(diǎn)擊添加,出來了吧?如下:private type pointapi x as long y as long end type 好了,現(xiàn)在開始寫代碼,添加一個(gè)timer 控件,設(shè)置屬性見以下:interval = 100 enabled = true 雙擊 timer 控件,轉(zhuǎn)到代碼環(huán)境中寫入以下代碼:pr

21、ivate declare function getcursorpos lib user32 (lppoint as pointapi) as long private type pointapi x as long y as long end type private sub timer1_timer() dim lppoint as pointapi getcursorpos lppoint me.caption = x = & lppoint.x & y = & lppoint.y end sub 好了,分析開始,緊張不?別緊張,沒啥值得緊張的!見以下:dim l

22、ppoint as pointapi ,申明一個(gè)pointapi 類型變量, 我們學(xué)過自定義類型的朋友都知道,一般使用自定義類型時(shí)都需要先申明一個(gè)相關(guān)的類型變量方可使用。getcursorpos lppoint,這一步我不說你都知道,調(diào)用 api 唄。通過這個(gè) api 獲取鼠標(biāo)指針的相關(guān)信息。這里我們使用了自己聲明的lppoint 變量,那為啥要使用這個(gè)變量呢?這里我們回過頭來就前兩節(jié)我們所分析的那樣進(jìn)行分析,可以看到getcursorpos所需要傳遞的值, 如果是 long, 我們就傳入整形數(shù)字, 如果是 string, 我們就傳入字符串, 這里是 pointapi ,所以理所當(dāng)然是要傳入p

23、ointapi 類型,但是! vb 中的自定義類型不可以直接使用,所以我們需要先聲明一個(gè)相同類型的變量。不知道說了這么多你懂了沒?me.caption = x = & lppoint.x & y = & lppoint.y,最后一句,也就是用來顯示當(dāng)前鼠標(biāo)的坐標(biāo)值的,我們通過聲明的lppoint 變量來獲取相應(yīng)的鼠標(biāo)坐標(biāo)值,如果你不懂,那就請(qǐng)你先把vb 自定義類型這章學(xué)完再說。這里關(guān)于 api 的一些使用方法及范例就先介紹到這里,如果你還有耐心往下看下去的話,那我們就接著往下聊!四、如何慢慢提升自己的api 功力?何為 api 功力?其實(shí)沒必要搞那么清楚,首先需要搞明白

24、的就是,你應(yīng)該知道在什么環(huán)境下使用什么api,實(shí)現(xiàn)哪些功能應(yīng)該使用哪些api!這才是我們需要的。1、試著自己從小程序開始寫起。寫小程序?對(duì)! 在你寫小程序時(shí)應(yīng)該揀你最感興趣的程序?qū)?,否則有可能你寫到一半以后會(huì)覺得自己這個(gè)程序?qū)懙煤翢o價(jià)值,簡直是在浪費(fèi)時(shí)間,最后到頭來還是功虧一簣。這里我拿什么當(dāng)題材呢?我在這里也想了很久,最后還是決定選擇一個(gè)注銷windows 程序來做題材 (其實(shí)這是我當(dāng)初學(xué)api 最想實(shí)現(xiàn)的功能)。注銷 windows 也就是退出windows( 重啟, 關(guān)機(jī)等都一樣, 不都是退出的意思嗎?),根據(jù)表面意思在api 瀏覽器中輸入exit( 退出 )windows , 看看有沒

25、有這個(gè)api?這里提醒一下,你在查找這個(gè)api 的時(shí)候還會(huì)看到exitwindowsex這個(gè) api,其實(shí)這兩個(gè)api 實(shí)現(xiàn)的功能一樣,前者是用在16 位操作系統(tǒng)上,只不過在win32 位操作系統(tǒng)上一般都使用exitwindowsex 。所以這里就使用后者。api 見以下:private declare function exitwindowsex lib user32 alias exitwindowsex (byval uflags as long, byval dwreserved as long) as long 看看里面的兩個(gè)參數(shù),byval uflags as long ?這里我們

26、需要傳入一個(gè)整形數(shù)字,可是應(yīng)該傳入什么數(shù)字呢?這里說下,api 中的參數(shù)可以傳入不同的值,不同的值從而導(dǎo)致產(chǎn)生不同的結(jié)果。分析api 中參數(shù)應(yīng)該傳遞哪些值其實(shí)是有技巧的,以后大家只要是看到參數(shù)字符中包函flags 字符的話那就說明該參數(shù)可以被傳入一個(gè)或多個(gè)標(biāo)志,并且大部分都是傳入 api 常數(shù) (什么是 api 常數(shù)就不用我說了吧)。 說白話點(diǎn),就是我們可以傳入多個(gè)api 常量,并且可以在api 瀏覽器中找到, 當(dāng)然, 不一定所有的api 常數(shù)都可以在api 瀏覽器中找到,不過大部分都可以。在 api 瀏覽器查api 常量時(shí)我前面就教過大家技巧,現(xiàn)在該是我們實(shí)踐的時(shí)候了,分析如下:exit :

27、頭一個(gè)大寫字符e windows :頭一個(gè)大寫字符w ex :頭一個(gè)大寫字符e 組合:ewe_ 好了,現(xiàn)在在 api 瀏覽器的中常數(shù)中找找,咦?發(fā)現(xiàn)好像沒有以ewe 開頭的常數(shù)?只發(fā)現(xiàn)以 ewx 開頭的?現(xiàn)在先別著急,咱們回過頭來再分析下,咱們是失敗在最后一步ex 上,這里我不得不否決我前面教過大家的技巧,但是又不能完全否決,出現(xiàn)這種情況時(shí)就需要大家靈活運(yùn)用api 常數(shù)的分析法, 可以看到 ewx 最后一個(gè)x 是以 ex 的 x 作結(jié)尾的,以這種方法做api 常數(shù)開頭的不止這一個(gè),所以這里我特意留了一個(gè)陷阱,希望給大家?guī)硪恍┙?jīng)驗(yàn)將來能夠靈活運(yùn)用。現(xiàn)在我把關(guān)機(jī)uflags 所能用到的相關(guān)常數(shù)發(fā)

28、上來,如下:private const ewx_force = 4 private const ewx_logoff = 0 private const ewx_reboot = 2 private const ewx_shutdown = 1 怎么樣?看得懂吧?英語稍微好一點(diǎn)基本上沒問題。不過這里我還是要解釋一番,照顧新手嘛!ewx_force 前面的ewx_ 我就不說了,關(guān)鍵是看_ 符號(hào)后面的 ,force 單詞翻譯:強(qiáng)制,強(qiáng)迫。人工在翻譯一下(我英文不好,翻譯錯(cuò)了請(qǐng)別見怪,呵呵_ ) ,意思是說:強(qiáng)制執(zhí)行 exitwindowsex api關(guān)機(jī)函數(shù)。 不知道這樣解釋你能不能明白。那到底這

29、個(gè)常數(shù)有什么用呢?這里我們先回憶一下以前關(guān)機(jī)的時(shí)候,當(dāng)windows 無法關(guān)閉某些窗口的時(shí)候就停止繼續(xù)關(guān)機(jī)了,最后還得把無法關(guān)閉的窗口手動(dòng)關(guān)閉方可,現(xiàn)在, 如果我們使用這個(gè)常數(shù)進(jìn)行關(guān)機(jī),那windows 不管你窗口能不能關(guān)閉,直接強(qiáng)制關(guān)閉。希望你懂了。ewx_logoff 這個(gè)嘛,貌似組合單詞, 不可直接翻譯, 那樣就不是那個(gè)意思了。logout off,是這樣寫嗎?注銷的意思。ewx_reboot 不浪費(fèi)時(shí)間了,直接說明意思:重新啟動(dòng)。ewx_shutdown 關(guān)機(jī)。至于第二個(gè) byval dwreserved as long ,為保留整形,一般為0 即可。至于為什么為0,大家可以到網(wǎng)上下載

30、一些專門講解api函數(shù)的電子書看看,里面有大部分api函數(shù)的詳細(xì)講解?;蛘呦螺d vs.msdn 看看,在 msdn 中說 windows 2000/95/98/me 中此參數(shù)忽略,xp中是指定關(guān)機(jī)消息說明。最后看看這個(gè)api為function 聲明,說明該函數(shù)有返回值,返回值為long,msdn 中說:如果執(zhí)行成功,則返回非零,否則為零?,F(xiàn)在上面已經(jīng)把這個(gè)關(guān)機(jī)api 和相關(guān)參數(shù)常量都給你分析透了,你可別告訴我你還不知道怎么寫?好了,這里我們做一個(gè)定時(shí)注銷程序,呵呵, 雖然很簡單, 不過很多時(shí)候用得上哦!在 form窗口上添加 timer控件, interval 設(shè)置為 1000,enabled

31、 設(shè)置為true。好了,代碼如下:private declare function exitwindowsex lib user32 (byval uflags as long, byval dwreserved as long) as long private const ewx_logoff = 0 private sub timer1_timer() static i as integer i = i + 1 me.caption = i 這一步純粹是想看看當(dāng)前已經(jīng)執(zhí)行到幾秒了?可不要if i = 10 then 秒數(shù)判斷,可以根據(jù)自己的需要進(jìn)行運(yùn)算exitwindowsex ewx_l

32、ogoff, 0 end if end sub 其實(shí)我都有點(diǎn)不想分析了,不過為了照顧大眾,不得不說下,static i as integer 靜態(tài)變量(問:啥叫靜態(tài)變量?答:我暈!),i = i + 1 是每執(zhí)行 timer一次 i就加 1,timer的 interval設(shè)置為 1000,1000 為一秒, 2000 為二秒。 。 。后面一個(gè) if i = 10 then 是判斷當(dāng) i=10 以后,也就是 10 秒,就執(zhí)行注銷,這個(gè)時(shí)候你可別忘了保存好你的其它沒有保存的文件哦,如果沒保存資料丟失的話偶不承擔(dān)任何法律責(zé)任的。其實(shí)這里我們可以自己做一個(gè),如可以寫成這樣:exitwindowsex

33、ewx_logoff or ewx_force, 0,其中用了 or運(yùn)算,整體的意思是強(qiáng)制windows 注銷。這樣理解就夠了,只要能讓你明白?,F(xiàn)在我又要說一下了,不說不行的!就是在api 中使用or 運(yùn)算,關(guān)于 or運(yùn)算符 vb 書中都有詳細(xì)解釋的, 別告訴我你沒看?沒看馬上去看!上面 ewx_logoff or ewx_force 的使用是把注銷和 強(qiáng)制進(jìn)行 or位運(yùn)算,對(duì)兩個(gè)數(shù)值執(zhí)行按位析取,這里涉及到二進(jìn)制運(yùn)算,說多了你可能不明白(如果你還是想追根到底的想知道到底是怎么一回事的話,我也沒辦法,給個(gè)網(wǎng)址你慢慢看http:/ ),我就說簡單點(diǎn)的吧,以后如果你想組合兩個(gè)api常數(shù)的功能, 一

34、般都是用or 進(jìn)行運(yùn)行的。 如上面寫的。好了,保存其它文件,然后f5 運(yùn)行之,看著 form標(biāo)題的數(shù)字慢慢添加,當(dāng)為10 時(shí),windows 開始注銷。 。小提示: 在使 用ewx_shutdown的時(shí)候你可能會(huì)感覺沒有作用,主要是 nt 系統(tǒng)的安全性提高,需要用其它api進(jìn)行提升自己的權(quán)限才可以。關(guān)于如何提升應(yīng)用程序權(quán)限請(qǐng)百度一下。2、先從一些最簡單的api 開始無疑自己試著寫程序是最好的提升方法,學(xué)完一些知識(shí)以后自己試著寫寫,這樣能讓你理解的更快更好,好了不說廢話了,接著往下看。最簡單的 api,呵呵,哪些最簡單呢?這個(gè)我也說不好,這樣吧,咱們就從get(獲取 )開始,那 get 什么呢?

35、 window( 窗口 ),還是從窗口下手吧,這樣更接近我們?nèi)粘5木幊?,誰叫這是一個(gè)windows 操作系統(tǒng)呢?先列幾個(gè)常用的api :getwindow 、getwindowdc 、getwindowlong 、getwindowrect 、getwindowrgn 、getwindowsdirectory 、getwindowtext 、 getwindowthreadprocessid 還有很多,我就先列舉幾個(gè)簡單點(diǎn)的,咱們就從這幾個(gè)中間隨便抽幾個(gè)來講講吧。先從 getwindowtext 下手,大家就表面的意思進(jìn)行理解下,get(獲取 )window( 窗口)text(文本 ),ver

36、y good! 這個(gè) api 以前不錯(cuò)的,可以獲取密碼框中的密碼,呵呵,說到這里,我估計(jì)有些人開始興奮起來了!那好,follow me! 新建一個(gè) form 窗口,然后添加一個(gè)commandbutton ,caption 設(shè)置為 :顯示密碼。接著添加兩個(gè)textbox,text1 屬性設(shè)置: passwordchar=*;text=123456789 ,text2 的屬性基本上沒有什么需要設(shè)置的,只需要把text 屬性為空就可以了,它主要是用來幫助咱們顯示出密碼的。好了,在form1 代碼框中填入以下代碼:private declare function getwindowtext lib u

37、ser32 alias getwindowtexta (byval hwnd as long, byval lpstring as string, byval cch as long) as long private sub command1_click() dim sbuffer as string sbuffer = space(255) getwindowtext text1.hwnd, sbuffer, 255 text2.text = sbuffer end sub ok ,f5 運(yùn)行,點(diǎn)擊command1,怎么樣? text1 中的密碼字符顯示在text2 中了吧?你可以再更改下t

38、ext1 中的密碼, 然后再點(diǎn)擊command1 試試。 也許你覺得會(huì)多此一舉,為何不 text2.text=text1.text 這樣?如果真的這樣的話看似簡單,那你就學(xué)不到api 了。又到了開始分析的時(shí)候了,打起精神來,先看第一句:dim sbuffer as string ,不用說,聲明一個(gè)字符串變量唄!接著看第二句:sbuffer = space(255) 那這一句呢?有些人可能不知道了,沒事,我會(huì)仔細(xì)講的。space是 vb 內(nèi)置的字符串處理函數(shù),vb 中的幫助文件中有說明:開始 本示例使用space 函數(shù)來生成一個(gè)字符串,字符串的內(nèi)容為空格,長度為指定的長度。 dim mystri

39、ng 返回10 個(gè)空格的字符串。 mystring = space(10) 將 10 個(gè)空格插入兩個(gè)字符串中間。 mystring = hello & space(10) & world 結(jié)束很顯然, 我這一句是要分配255 個(gè)空格字符串內(nèi)存,為啥要用分配?這都是為后面所要用到打定的基礎(chǔ)。接著往下:getwindowtext text1.hwnd, sbuffer, 255 這一步是關(guān)鍵,通過它來獲取咱們想要的窗口文本,看第一個(gè)參數(shù),我前面講過hwnd 一般都是需要傳入句柄的,這時(shí)咱們傳入了text1.hwnd(text1 控件的句柄 ), 第二個(gè)參數(shù), lpsting 為字符

40、串變量, 所以這里咱們傳入sbuffer字符串變量。最后一個(gè)cch 為 long 整形,所以理應(yīng)傳入數(shù)字,這里我們傳入了255?,F(xiàn)在又有人想問了, 為什么需要這么傳入值?貌似和以前的傳入不一樣?確實(shí)!一剛開始你可能搞不懂,這時(shí)候我先講講大概的意思,我們用getwindowtext 來獲取窗口中的文本,當(dāng)獲取成功以后,理所當(dāng)然會(huì)返回窗口中的字符串,但是當(dāng)我們用這個(gè)api 進(jìn)行獲取時(shí),必須需要一個(gè)緩沖來保存我們所獲取的字符串,你如果不信去試試把sbuffer = space(255)去掉,后面的 255 其實(shí)就是告訴這個(gè)api 我們緩沖字符串的大小,這里再告訴大家一個(gè)技巧,以后只要是看見包函有cc

41、h 字符時(shí),大部分都是輸入相關(guān)類型的大小。再附加一點(diǎn),就里我說過,hwnd 是用來傳句柄的,你也可以傳入其它窗口句柄,只要其它窗口有文本,都是可以通過這個(gè)api 獲取的。 還有 text2.text = sbuffer 其實(shí)是可以先把sbuffer 處理一下再傳給text2.text 的,關(guān)于字符串處理這里不講。好了,分析結(jié)束,來個(gè)小提示:在windows 操作系統(tǒng)中,任何有句柄的東東都可被看作為一個(gè)窗口。另外你可能會(huì)去試試qq 的密碼框, _ 這里我要告訴你一下,無法成功,為什么無法成功呢?這是一個(gè)技術(shù)問題目前不提!接著再來試試getwindowsdirectory ,大家看表面意思吧!ge

42、t(獲取 )windows( 就是windows 目錄 )directory( 目錄 ),也就是獲取咱們那個(gè)系統(tǒng)目錄,如:c:windows ??赡芪业膚indows 目錄中在c 盤,而其它人的可能在d 盤、 e 盤也說不定,所以有的時(shí)候軟件需要這個(gè) api 進(jìn)行獲取操作系統(tǒng)具體的windows 目錄。好了,還是新建一個(gè)標(biāo)準(zhǔn)exe, 添加一個(gè)commandbutton , 屬性 caption=顯示 windows目錄, ok,寫入以下代碼:private declare function getwindowsdirectory lib kernel32 alias getwindowsdir

43、ectorya (byval lpbuffer as string, byval nsize as long) as long private sub command1_click() dim sbuffer as string sbuffer = space(255) getwindowsdirectory sbuffer, 255 msgbox windows目錄在: & sbuffer end sub 分析!第一個(gè)dim sbuffer as string字符串變量,sbuffer = space(255)緩沖字符串,getwindowsdirectory sbuffer, 25

44、5這個(gè)和上面所講的一樣,最后一個(gè)參數(shù)nsize 為 long 整形,所以傳入數(shù)值,那傳入什么數(shù)值呢?size?當(dāng)然是緩沖字符串大小了,以后遇到這個(gè)nsize 一般也是傳入相關(guān)類型的大小的。msgbox windows目錄在: & sbuffer ,是用msgbox 消息框顯示出windows 目錄的位置。ok,恭喜你,你又會(huì)使用了一個(gè)api,還要繼續(xù)嗎?(問:當(dāng)然還要啦!答:最后一次哦! ) getwindowthreadprocessid ,這次玩玩窗口進(jìn)程,我估計(jì)有些人只要看見與進(jìn)程有關(guān)的東東也會(huì)變得興奮,呵呵!好了,先看看這個(gè)api 是什么樣的?如下:private declar

45、e function getwindowthreadprocessid lib user32 alias getwindowthreadprocessid (byval hwnd as long, lpdwprocessid as long) as long 看表面意思: get(獲取 )window( 窗口 )thread(線程 )process(程序 )id(id) ,組合: 獲取當(dāng)前線程的窗口進(jìn)程id。至于進(jìn)程id 要著有什么用,自己以后深入32 編程就知道了??纯磪?shù), byval hwnd as long , 哈哈,熟悉吧,一個(gè) hwnd 句柄。lpdwprocessid as lo

46、ng這個(gè)就是咱們需要的進(jìn)程id, 老規(guī)矩,新建標(biāo)準(zhǔn)exe,添加一個(gè)commandbutton, 屬性:caption=獲取窗口進(jìn)程id。代碼如下:private declare function getwindowthreadprocessid lib user32 (byval hwnd as long, lpdwprocessid as long) as long private sub command1_click() dim pid as long getwindowthreadprocessid me.hwnd, pid msgbox 窗口進(jìn)程的id 是: & pid end

47、 sub 我已經(jīng)習(xí)慣了給大家分析了。首先看看第一個(gè)參數(shù),byval hwnd as long ,又是句柄來的(問:廢話!答:教會(huì)了你也別這樣啊),lpdwprocessid as long ,這個(gè)就要注意了,看看這個(gè)參數(shù)的傳遞方式,是以byref 進(jìn)行傳遞的 (問:呵呵,不懂什么意思?答:不懂?轉(zhuǎn)回去看過程函數(shù)這章),也就是說 byref 是以地址進(jìn)行傳遞的,過程中可以改變傳遞的參數(shù)值。明白了嗎?還不明白的話回去乖乖看書吧!現(xiàn)在明白了傳遞方式,也就是說我們聲明的pid是用來獲取窗口進(jìn)程id 的,厲害啊。f5,運(yùn)行之,點(diǎn)擊command1,pid 出來了吧?沒出來我馬上從十樓跳下去。溫馨小提示

48、_:hwnd 可以傳入其它窗口句柄,同樣可以獲取其它窗口進(jìn)程id 。接下來我們?cè)賮砜纯磗et(設(shè)置 ),set什么呢?當(dāng)然還是window( 窗口 )容易些, 先列出幾個(gè)常用的 api :setwindowlong 、 setwindowpos、setwindowrgn 、setwindowtext 接上面的。首先咱們先看setwindowtext,咱們?cè)谏厦嬷v過getwindowtext 這個(gè) api,getwindowtext 是用來獲取窗口文本的,而這個(gè)正好相反?,F(xiàn)在可以看看表面意思set(設(shè)置)window( 窗口 )text(文本 ),好了這樣理解就夠了,我們已經(jīng)知道這個(gè)api 是設(shè)

49、置窗口文本的,接著咱們就到api 瀏覽器中找找這個(gè)api,如下:private declare function setwindowtext lib user32 alias setwindowtexta (byval hwnd as long, byval lpstring as string) as long 接著咱們看里面所需要傳遞的參數(shù),一共有兩,第一個(gè)byval hwnd as long我就不用說了,傳入句柄唄,第二個(gè)byval lpstring as string ,其中聲明的lpstring 是字符串變量,可想而知, 這里需要傳入字符串,好了,開始實(shí)踐。 新建一個(gè)標(biāo)準(zhǔn)exe ,

50、然后添加一個(gè)textbox控件,然后再添加一個(gè)commandbutton, 寫入以下代碼:private declare function setwindowtext lib user32 alias setwindowtexta (byval hwnd as long, byval lpstring as string) as long private sub command1_click() setwindowtext text1.hwnd, 這是咱們?cè)O(shè)置的文本 end sub 呵呵,這個(gè)看似比前面的更簡單,不過我還是要羅嗦一下,首先把text1 的句柄傳入第一個(gè)參數(shù),這樣api 知道咱們

51、需要操作哪個(gè)窗口,第二個(gè)是一個(gè)字符串變量,所以這里就是我們需要傳入的文本。好了,f5 運(yùn)行,點(diǎn)擊command1,ok。再看 setwindowpos,可以說這個(gè)api 可以看成設(shè)置窗口位置,但是最終的實(shí)現(xiàn)效果取決于咱們傳遞的參數(shù),好了,在api 瀏覽器中找到這個(gè)api ,如下:private declare function setwindowpos lib user32 alias setwindowpos (byval hwnd as long, byval hwndinsertafter as long, byval x as long, byval y as long, byval

52、cx as long, byval cy as long, byval wflags as long) as long 呵!好家伙,這個(gè)api 看起來有些復(fù)雜???不過別擔(dān)心,有我在嘛,我會(huì)幫你好好分析的,這里還請(qǐng)大家別光我一個(gè)人分析,必須把自己融入進(jìn)來,咱們一起分析這樣不更有趣?好了,廢話少說,先看第一個(gè)參數(shù): byval hwnd as long 這里我就不講了,傳入窗口句柄byval hwndinsertafter as long 好了, 看看這個(gè)! hwndinstrafter ,可以看到里面包函有hwnd 字符,這時(shí)你可能會(huì)說我前面不是已經(jīng)說過嘛,只要看見包函有hwnd 字符的都應(yīng)該傳

53、入句柄嘛?呵呵,沒錯(cuò),你很聰明,記得我說的話呢!在這里夸一下你,別驕傲??!現(xiàn)在咱們好好分析一下這個(gè)地方應(yīng)該傳入哪些參數(shù)!打開msdn ,不好意思是英文,這里我就把翻譯過來的說明放上來,如下: hwndinsertafter - long,窗口句柄。在窗口列表中,窗口hwnd 會(huì)置于這個(gè)窗口句柄的后面。也可能選用下述值之一: hwnd_bottom 將窗口置于窗口列表底部 hwnd_top 將窗口置于z 序列的頂部; z 序列代表在分級(jí)結(jié)構(gòu)中,窗口針對(duì)一個(gè)給定級(jí)別的窗口顯示的順序hwnd_topmost 將窗口置于列表頂部,并位于任何最頂部窗口的前面hwnd_notopmost 將窗口置于列表頂

54、部,并位于任何最頂部窗口的后面可以看到這個(gè)地方有四個(gè)參數(shù)供我們選擇,一般我們會(huì)使用第三個(gè)api 常數(shù)和第四個(gè)api 常數(shù),這幾個(gè)api 常數(shù)都可以在api 瀏覽器中找到,至于具體實(shí)現(xiàn)什么功能我相信大家都知道吧,后面有寫呢!再看看后面的幾個(gè)x,y,cx,cy 分別為 long 變量,我上面講過,setwindowpos 可以看成設(shè)置窗口位置嘛, 所以這里理所當(dāng)然是傳入相關(guān)的坐標(biāo)值,如果忽略則為0,自己可以試下。byval wflags as long, 這個(gè)參數(shù),我又說過,看看字符flags,呵呵,熟悉吧,所以這里咱們需要傳入相關(guān)的標(biāo)識(shí)常數(shù),利用咱們以前學(xué)過的常數(shù)分析法進(jìn)行分析,set(s)wi

55、ndow(w)pos(p)=swp_ ,可以看到相關(guān)的常數(shù)了吧?這里我把相關(guān)常數(shù)的說明發(fā)上來大家看下,如下:swp_drawframe 圍繞窗口畫一個(gè)框swp_hidewindow 隱藏窗口swp_noactiv ate 不激活窗口swp_nomove 保持當(dāng)前位置(x 和 y 設(shè)定將被忽略)swp_noredraw 窗口不自動(dòng)重畫swp_nosize 保持當(dāng)前大小(cx 和 cy 會(huì)被忽略)swp_nozorder 保持窗口在列表的當(dāng)前位置(hwndinsertafter 將被忽略)swp_showwindow 顯示窗口 swp_framechanged 強(qiáng)迫一條 wm_nccalcsize

56、消息進(jìn)入窗口,即使窗口的大小沒有改變所以我說過,一個(gè)這樣的api 他具體實(shí)現(xiàn)的功能取決于你所傳遞的參數(shù)。假設(shè)這里咱們需要實(shí)現(xiàn)一個(gè)窗口永遠(yuǎn)置前的功能,首先新建一個(gè)標(biāo)準(zhǔn)exe,輸入以下代碼:private declare function setwindowpos lib user32 (byval hwnd as long, byval hwndinsertafter as long, byval x as long, byval y as long, byval cx as long, byval cy as long, byval wflags as long) as long privat

57、e const hwnd_topmost = -1 private const swp_nomove = &h2 private const swp_nosize = &h1 private sub form_load() setwindowpos me.hwnd, hwnd_topmost, 0, 0, 0, 0, swp_nomove or swp_nosize end sub 現(xiàn)在咱們開始分析,第一個(gè)參數(shù)傳入句柄,第二個(gè)我上面講過,實(shí)現(xiàn)什么功能傳入什么參數(shù),這里咱們是實(shí)現(xiàn)的窗口永久置前的功能,所以傳入hwnd_topmost常數(shù),現(xiàn)在看看其實(shí)坐標(biāo), 如果你不想改變窗口的具

58、體位置的話,這里可不設(shè)為0,再看看后面的wflags,我傳入了兩個(gè)常數(shù),這兩個(gè)常數(shù)的相關(guān)說明請(qǐng)大家看看上面就知道,主要是不改變窗口位置和不改變窗口大小的前提下把窗口置前,其它常數(shù)如果大家有興趣可以自己試試。最后一個(gè),看看setwindowrgn ,這里我要解釋一番,這個(gè)api 所實(shí)現(xiàn)的功能呢就是改變窗口外觀,也就是咱們所說的異形窗口等,通過這個(gè)api 咱們可以把窗口改變成任何形狀,在 api 瀏覽器找到這個(gè)api ,如下:private declare function setwindowrgn lib user32 alias setwindowrgn (byval hwnd as long

59、, byval hrgn as long, byval bredraw as boolean) as long 好了,第一個(gè)參數(shù),句柄。第二個(gè)參數(shù),long 變量,這里需要傳入什么咱們下面會(huì)講到。第三個(gè), boolean 變量,可以說明這里需要傳入布爾值,redraw 為重畫的意思,所以如果我們用這個(gè)api 改變窗口形狀,這里需要為true,表示重畫窗口。現(xiàn)在新建一個(gè)標(biāo)準(zhǔn)exe,然后 把 form 的 scalemode 設(shè)置成 3-pixel , 我們知道windows是以像素為單位的,所以使用這個(gè)api 進(jìn)行設(shè)置的時(shí)候是以像素為單位進(jìn)行處理窗口外觀。然后把 borderstyle 設(shè)置為

60、0-none,這樣看得更明顯。好了,寫入以下代碼:private declare function setwindowrgn lib user32 (byval hwnd as long, byval hrgn as long, byval bredraw as boolean) as long private declare function createroundrectrgn lib gdi32 (byval x1 as long, byval y1 as long, byval x2 as long, byval y2 as long, byval x3 as long, byval y3 as long) as long private sub form_load() dim

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論