1. 程式人生 > >VB中功能強大的SendMessage函式

VB中功能強大的SendMessage函式

Windows API(應用程式介面)是Windows系列軟體為程式開發人員提供的火力強大的“武器庫”,在這個武器庫中,有很多極具威力的武器,SendMessage就是其中之一,它的功能非常豐富,靈活使用這個函式,會給程式設計工作帶來很多便利。本文以Visual Basic為例,結合幾個具體的例子介紹該函式的功能。
逆@風@者
一、SendMeaasge函式簡介
顧名思義,SendMessage函式的功能是“傳送訊息”,即將一條訊息傳送到指定物件(作業系統、視窗或控制元件等)上,以產生特定的動作(如滾屏、修改物件外觀等)。
SendMessage函式VB中的函式說明如下:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (Byval hwnd As Long, Byval wMsg As Long,Byval wParam As Long,lParam As Any) As Long
其中四個自變數的含義和說明如下:
hWnd:物件的控制代碼。希望將訊息傳送給哪個物件,就把該物件的控制代碼作為實參傳送,在
VB
中可以簡單地用“物件.hWnd”獲得某個物件的控制代碼,如Text1.hWnd和Form1.hWnd分別可以得到Text1和Form1的控制代碼。
wMsg:被髮送的訊息。根據具體需求和不同的物件,將不同的訊息作為實參傳送,以產生預期的動作。
wParam、lParam:附加的訊息資訊。這兩個是可選的引數,用來提供關於wMsg訊息更多的資訊,不同的wMsg可能使用這兩個引數中的0、1或2個,如果不需要哪個附加引數,則將實參賦為NULL(在VB中賦為0)。
在簡單瞭解了SendMessage函式的格式和功能後,讓我們以幾個例子來看看它的威力。
二、SendMessage函式使用例項
例1 多行TextBox中的快速處理功能在處理多行TextBox時我們經常會碰到以下幾種情況:
希望瞭解多行TextBox中目前共有多少行文字。
想快速返回第N行的文字。
對於上面的情況,如果用
VB
自身的語句或函式來實現的話,要寫不短的程式碼,而且由於要採用順序查詢的辦法來完成,因此程式碼的執行效率也很低。如果使用SendMessage函式則可以大大減少程式碼量,並大幅度的提高執行效率。
用SendMessage函式完成上面兩個任務的方法非常簡單,每個任務只需簡單地傳送一條訊息給多行TextBox即可,兩個訊息分別為:EM_GETLINECOUNT、EM_GETLINE,其它引數和返回值見附表。
下面用一個簡單的例項演示這兩個功能:
新建工程,在Form1上新增三個TextBox(名稱分別為Text1、txtLineCount、TxtString,將Text1的Multi
Line
屬性
置為True)、三個標籤和一個命令按鈕。為工程新增一個模組Moudle1,在其中寫如下宣告(其中
SendMessage函式的宣告可以從VB的“API瀏覽器”中複製): 訊息常量名 訊息值 wParam lParam 返回值 EM_GETLINECOUNT &HBA 未用 未用 行數 EM_GETLINE &HC4 要找的行號 存結果的位元組串 結果位元組串的位元組數

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long,lParam As Any) As Long
Public Const EM_GETLINECOUNT=&HBA
Public Const EM_GETLINE=&HC4
在Form1的程式碼模組中寫如下程式碼:
Private Sub Command1_Click()
Dim str(256) As Byte
str(1)=1 '最大允許存放256個字元
'獲取總行數,結果顯示在文字框txtLineCount中
txtlineCount=SendMessage(Text1.hwnd,EM_GETLINECOUNT,0,0)
'獲取第3行的資料放在str中,轉換為字串後顯示在文字框txtString中
SendMessage Text1.hwnd,EM_GETLINE,2,str(0)
txtString= StrConv(str,VBUnicode)
End Sub
之後,按F5執行程式,在多行文字框中隨便鍵入幾行文字,然後按下[確定]按鈕,出現如圖畫面,說明程式正確統計出了總行數和第3行的文字。
兩點補充說明:在呼叫SendMessage獲取第N行字串時,lParam需要說明為位元組陣列,在呼叫完成後,再將位元組陣列轉換為字串;另外,呼叫前必須在lParam的前兩個位元組指明允許存放的最大長度,其中第一個位元組為低位,第二個位元組為高位,本例將高位(即str(1))置1.說明最大允許存放256個字元。

例2 程式控制拉下或收起組合框的下拉列來
一般情況下,為了拉下或收起組合框的下拉列表,需要用鍵盤或滑鼠進行操作,而有時我們希望程式執行的某個時刻自動拉出下拉列表(比如在一些演示程式中),為了實現這個目的,我們也只有藉助於SendMessage函式,方法是發一個CB_SHOWDROPDOWN(&H14F)訊息給組合框。
逆@風@者
在發CB_SHOWDROPDOWN訊息時,wParam引數決定了是拉下列表(=True時)還是收起列表(=False時),lParam無用(設為0)。
為說明具體的使用方法,下面提供簡單的程式片段。首先在程式碼模組中做如下宣告:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Const CB_SHOWDROPDOWN=&H14F
當程式中某處需要拉下組合框Combol的列表時,寫如下呼叫語句:
SendMessage Combol.hwnd,CB_SHOWDROPDOWN,True,0
當需要收起組合框Combol的列表時,寫如下語句:
SendMessage Combol.hwnd,CB_SHOWDROPDOWNN,False,0
例3 在列表框中查詢匹配的專案
在Win95風格的幫助系統中一般都有一個“索引”頁,索引頁含有一個文字框和一個列表框,當用戶在文字框中輸入文字時,下拉列表會動態地顯示與文字框中文字最匹配的專案,為使用者提供了最大的方便。這種效果在應用程式的幫助系統中很容易實現(只要按照Win95幫助系統的正常製作過程製作就可以實現),如果想在應用程式的其它地方實現這種特性就需費一番心思了。
而使用SendMessage函式實現上述特性則非常簡單,甚至只需一條語句就足夠了,那就是在文字框的Change事件中給列表框發一條LB_FINDSTRING(&H18F)訊息,該訊息告訴列表框在列表中查詢匹配的專案。
在發LB_FINDSTRING訊息時,wParam引數代表從列表框的哪一個專案後面開始查詢,一般情況下該引數可定為-1,表示從List1(0)即第一項開始向後迴圈查詢,lParam則傳進欲搜尋的字串(必須採用值傳遞)。
具體的程式碼和執行畫面與後面的例4合併在一起演示。
例4 為ListBox新增水平滾動條
VB中,列表框控制元件僅提供垂直滾動條,沒有設定水平滾動條的能力,當某些專案的文字寬度較長時,超出列表框寬度部分的文字就無法顯示出來,因此,很有必要為ListBox新增一個水平滾動條來方便操作。
為新增水平滾動條,只需發一條LB_SETHORIZONTALEXTENT(&H194)訊息給列表框即可。傳送訊息時,wParam為滾動條的長度(以畫素為單位,可通過計算得出準確的長度,也可隨便給一個大於最大文字寬度的數字,如本例的250),lParam無用。下面是例3和例4合併在一起的程式碼和執行畫面
Declare Function SendMessage Lib "user32" Alias "SendMessageA"(ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
Public Const LB_FINDSTRING=&H18F
Public Const LB_SETHORIZONTALEXTENT=&H194
Private Sub Form_Load()
List1.AddItem "軟體"
List1.AddItem "電腦遊戲"
List1.AddItem "電視機"
List1.AddItem "電視臺"
List1.AddItem "電腦"
List1.AddItem "電腦遊戲軟體"
'下一句為列表框新增水平滾動條
SendMessage List1.hwnd,LB_SETHORIZONTALEXTENT,250,0
End Sub
Private Sub Text1_Change()
'注意!當lParam傳入的是字串時,必須用ByVal傳遞
List1.ListIndex = SendMessage(List1.hwnd,LB_FINDSTRING,-1,ByVal Text1.Text)
End Sub
通過上面幾個例子,想必您已經對SendMessage函式的強大功能有了初步的瞭解。事實上利用該函式我們還可以完成更多更好的任務,如控制文字框的自動滾屏、實現文字編輯過程中的Undo功能、操縱應用程式的窗體控制選單等等,感興趣的讀者請參閱有關Windows API的資料。
本文程式均用Visual Basic 5.0企業版編寫,在Pwin95環境下執行正常。