有些窗体在设计时会定义一些特殊的功能消息,而当我们传递这些消息给这类窗体时,这类窗口就会执行某段程序,并返回执行的结果。为了让程序可以送出消息,Windows提供了SendMessage API函数。
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:接收消息的窗口;
wMsg:消息的编号;
wParam:消息的第一个参数;
lParam:消息的第二个参数。
wParam及lParam参数的意义会随着wMsg参数而变,因此我们要传递消息给某一个窗体时,除了了解该消息的意义外,还要了解wParam及lparam的意义。
lParam参数在SendMessage定义句中为"lParam As Any",因此它有以下几中写法:
当数值为 0 时,写成:ByVal 0&
当为字符串常数 时,写成:ByVal "字符串的内容"
当为字符串变量时,写成:ByVal S
第一个实例:对窗体进行操作
下面我们对窗体的几个消息进行解释和应用:WM_GETTEXT:读取窗体的Caption属性;WMSETTEXT:设置窗体的Caption属性;WM_SYSCOMMAND(wParam=SC_MAXIMIZE):将窗体的属性设置为2;WM_SYSCOMMAND(wParam=SC_MINIMIZE):将窗体的属性设置为1;WM_SYSCOMMAND(wParam=SC_RESTORE):将窗体的属性设置为0;WM_SYSCOMMAND(wParam=SC_CLOSE):Unload窗体.
下面我们在窗体上放置几个Command控件和一个Text控件:
我们先把所需要的参数和API函数定义到模块里面:
Public Const WM_SYSCOMMAND = &H112
Public Const SC_CLOSE = &HF060& '关闭窗体
Public Const SC_MINIMIZE = &HF020& '最小化窗体
Public Const SC_MAXIMIZE = &HF030& '最大化窗体
Public Const SC_RESTORE = &HF120& '恢复窗体大小
Public Const WM_SETTEXT = &HC '设置窗体的Caption
Public Const WM_GETTEXT = &HD '取得窗体的caption
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
双击Command中放入:
Private Sub Command_Click(Index As Integer)
Dim S As String
S = String(80, Chr(0))
Select Case Index
Case 0
SendMessage Me.hwnd, WM_GETTEXT, Len(S), ByVal S '读出窗体的Caption
Text1.Text = Left(S, InStr(S, Chr(0)) - 1)
Case 1
'因为Text1.text属于Variant类型,所以一定先要用CStr把它转换成字符串
SendMessage Me.hwnd, WM_SETTEXT, 0, ByVal CStr(Text1.Text)'设置窗体的Caption
Case 2
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, ByVal 0&'使窗体最大化
Case 3
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&'使窗体最小化
Case 4
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, ByVal 0&'使窗体恢复原来的大小
Case 5
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&'关闭窗体
End Select
End Sub