資源描述:
《sendmessage函數(shù)的常用消息及其應(yīng)用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、SendMessage函數(shù)的常用消息及其應(yīng)用SendMessage函數(shù)的常用消息及其應(yīng)用(剽竊)--轉(zhuǎn)文本框控件通常用于輸入和編輯文字。它屬于標(biāo)準(zhǔn)Windows編輯控件的一個(gè)子類,所以它支持所有編輯控件消息?這兒講述的技術(shù)也適用于由其他廠商設(shè)計(jì)的,以Windows編輯控件類為基礎(chǔ)的其他控件?函數(shù)原型:DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,_ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong其中四個(gè)參數(shù)的含義和說(shuō)明如下:1.hWn
2、d: 對(duì)象的句柄。希望將消息傳送給哪個(gè)對(duì)象,就把該對(duì)象的句柄作為實(shí)參傳送,在VB中可以簡(jiǎn)單地用“對(duì)象.hWnd”獲得某個(gè)對(duì)象的句柄,如Text1.hWnd和Form1.hWnd分別可以得到Text1和Form1的句柄。它是一個(gè)長(zhǎng)整型數(shù)。Windows給每個(gè)控件一個(gè)編號(hào),這個(gè)編號(hào)就稱為窗口句柄。有了這個(gè)句柄,我們就可告訴Windows我們要控制哪個(gè)控件,所以這個(gè)句柄在API調(diào)用中至關(guān)重要。VB的大多數(shù)控件都包括hwnd屬性,如下拉框、TreeView等,窗體也有這個(gè)屬性。但也有一些控件沒(méi)有這個(gè)屬性,如標(biāo)簽控件。沒(méi)有這個(gè)屬性就無(wú)法利用WindowsAPI函數(shù),但可以節(jié)省系統(tǒng)資源。2.wMs
3、g: 被發(fā)送的消息。根據(jù)具體需求和不同的對(duì)象,將不同的消息作為實(shí)參傳送,以產(chǎn)生預(yù)期的動(dòng)作。使SendMessage傳遞消息,大多是為了完成以下幾個(gè)工作: ?、僭O(shè)置控件的一些選項(xiàng),象我們要使用的CB_SETDROPPEDWIDTH的就屬于這種情況。盡管VB的每個(gè)控件都提供了許多屬性,但仍然有許多控件的選項(xiàng)沒(méi)有包括在其中。而這些選項(xiàng)中的大多數(shù)都可以利用該函數(shù)進(jìn)行設(shè)置? ②獲得控件的一些設(shè)置。同上一種情況相反,有時(shí)我們需要獲得控件的一些設(shè)置,相當(dāng)于讀取屬性。例如,如果想知道一個(gè)下拉框的下拉部分的寬度是多少,就可以向控件發(fā)送CB_GETDROPPEDWIDTH消息。對(duì)于這種情況,SendMe
4、ssage函數(shù)的返回值就是結(jié)果?! 、蹐?zhí)行一定的操作。例如,我們要在下拉框中尋找是否有“ABC”這個(gè)字符串,當(dāng)然,我們可以編寫(xiě)一個(gè)循環(huán),逐條比較看是否存在這樣的字符串。如果使用API,我們只需要向下拉框發(fā)送CB_FINDSTRING消息,這條消息就會(huì)自動(dòng)進(jìn)行查找工作并返回結(jié)果?! 、苣M用戶操作。我們有時(shí)希望模擬用戶的操作,比如關(guān)閉其他應(yīng)用程序的窗口。其實(shí)只要我們能知道那個(gè)窗口的句柄,我們就可以發(fā)送WM_CLOSE消息給那個(gè)窗口,窗口接受到這條消息就會(huì)關(guān)閉,如同用戶關(guān)閉窗口一樣?3.wParam、4.lParam: 附加的消息信息。這兩個(gè)是可選的參數(shù),用來(lái)提供關(guān)于wMsg消息更多的信息
5、,不同的wMsg可能使用這兩個(gè)參數(shù)中的0、1或2個(gè),如果不需要哪個(gè)附加參數(shù),則將實(shí)參賦為NULL(在VB中賦為0)?! Param定義為Any類型。指定Any類型可禁止VB進(jìn)行類型檢查,從而允許將任意數(shù)據(jù)類型傳遞給該過(guò)程。由于每條消息對(duì)參數(shù)的類型和傳遞方式的要求都不同:有的可能要求為L(zhǎng)ong型,有的可能要求為自定義類型;大多數(shù)要求按傳值方式傳遞,但也有一些要求按傳地址方式。為了滿足各種要求,我們將這個(gè)參數(shù)定義為Any類型。比如,我們要傳遞一個(gè)Long型變量lData。如果消息要求傳地址方式傳遞,可以使用:SendMessage……,lData 而如果要求傳值方式傳遞,則使用SendM
6、essage……,ByVallData 如果傳遞常數(shù),我們則需要使用類型后綴來(lái)指定常數(shù)的類型,比如"0&",表示Long型的常數(shù)0,如SendMessage……,ByVal0& 我們也可以使用類型轉(zhuǎn)換函數(shù)CLng將常數(shù)指定為L(zhǎng)ong型,如CLng(0)。 程序中,有時(shí)定義lParamAsAny,有時(shí)定義ByVallParamAsString。這是為什么呢?對(duì)于SendMessage函數(shù),lParam的使用是很靈活的,在一般情況下,lParam是一個(gè)指針,它指向的數(shù)據(jù)類型有三種:長(zhǎng)整形、自定義數(shù)據(jù)結(jié)構(gòu)類型、字符串類型。對(duì)于前兩種類型,需要將lParam定義為lParamAsAny,從
7、而將lParam數(shù)據(jù)的指針傳遞到SendMessage函數(shù)。對(duì)于字符串類型,則需要定義ByvallParamAsString,因?yàn)樽址愋蛿?shù)據(jù)不同,只有定義ByVal,得到的才是字符串的指針,如果沒(méi)有ByVal,得到的將是指向字符串指針的指針。另外對(duì)于少數(shù)的消息來(lái)說(shuō),SendMessage函數(shù)需要的只是lParam本身的值,這時(shí)就需要將lParam定義為ByvallParamAsLong,或者在程序調(diào)用時(shí)在lParam之前加ByV