在Windows下編程,常發現有不少功能Windows系統已經做了,如果能夠直接調用,就可省去不少程式的編寫,並能提高程式的運作效率。在許多情況下,我們都可以用「Ctrl+X」、「Ctrl+C」、「Ctrl+V」和「Ctrl+Z」分別進行「剪下」、「複製」、「貼上」和「撤銷」操作,由此想到,如果我們能夠在程式中呼叫系統的這些功能,就無需為如何實現這些操作而操心了。經過不斷的探索,終於發現SendMessage和PostMessage能夠擔此重任,真是如獲至寶,於是迫不及待地把它們介紹給各位朋友。
用VB5的「API瀏覽器」可以很容易找到這兩個API函數:
DeclareFunctionSendMessageLib“user32”Alias“SendMessageA”_(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,_lParamAsAny)AsLong
DeclareFunctionPostMessageLib“user32”Alias“PostMessageA”_(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,_ByVallParamAsLong)AsLong
這兩個函數的功能幾乎是一樣的,只是SendMessage是直接調用Windows函數來發送訊息,只有這個訊息完全被處理後此函數才返回,而PostMessage則給窗體的訊息隊列增加一個訊息,這個訊息將在未來某個時間進行正常事件處理時得到處理。以下僅以SendMessage為例。
函數中雖然有四個參數,但關鍵的是前兩個:hwnd和wMsg。 Hwnd是句柄,MicrosoftWindows應用程式中的每個窗體和控制項都擁有一個句柄,透過句柄可以指明函數的操作物件;wMsg是一個十六進位數,代表了函數要傳送的具體訊息。
以下以具體範例說明如何用SendMessage實現「剪下」、「複製」、「貼上」、「撤銷」和「刪除」功能:
在窗體中放置一個文字框Text1和五個按鈕,分別執行以上五種功能,並編寫以下程式。
OptionExplicit
PRivateDeclareFunctionSendMessageLib“user32”Alias“SendMessageA”_(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
ConstWM_CUT=&H300
ConstWM_COPY=&H301
ConstWM_PAST=&H302
ConstWM_CLEAR=&H303
ConstWM_UNDO=&H304
DimfbAsLong
PrivateSubcmdClear_Click()
fb=PostMessage(Text1.hwnd,WM_CLEAR,0,0)
EndSub
PrivateSubcmdCopy_Click()
fb=SendMessage(Text1.hwnd,WM_COPY,0,0)
EndSub
PrivateSubcmdCut_Click()
fb=SendMessage(Text1.hwnd,WM_CUT,0,0)
EndSub
PrivateSubcmdPast_Click()
fb=SendMessage(Text1.hwnd,WM_PAST,0,0)
EndSub
PrivateSubcmdUndo_Click()
fb=SendMessage(Text1.hwnd,WM_UNDO,0,0)
EndSub
除了TextBox外SendMessage還可以對RitchTextBox和ComboBox等進行操作,只要相應改變hwnd參數即可。 ->