📄 040104.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>vb study</title>
<style>
<!--
td {font-size: 9pt}
A:link {text-decoration: none; color: #0033cc;font-size: 9pt}
A:visited {text-decoration: none; color: #0066CC;font-size: 9pt}
A:active {text-decoration: none; color: #ff0000; font-size: 9pt}
A:hover {text-decoration: underline; color: #000000;font-size: 9pt}
-->
</style>
</head>
<body>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0" width="98%">
<tr>
<td width="100%"><a href="#">你的位置</a>:<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="#">VB学习</a>--<a href="#">API函数</a></td>
</tr>
<tr>
<td width="100%">
<p align="center">消息类函数</td>
</tr>
<tr>
<td width="100%"><br>
SendMessageA:发送消息,调用一个窗口的窗口函数,将一条消息发给那个窗口,除非消息处理完毕,否则该函数不会返回。其返回值为long型值(由具体消息决定),声明:<br>
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) as long<br>
这是API中一个最重要的函数,通过这个函数,我们可让VB程序向外发送所有窗口消息,如关闭(WM_CLOSE)消息等等,查阅资料,对消息的常数值请参看API浏览器。<br>
参数 类型及说明 <br>
hwnd Long,要接收消息的那个窗口的句柄 <br>
wMsg Long,消息的标识符 <br>
wParam Long,具体取决于消息 <br>
lParam Any,具体取决于消息 <br>
例如在窗体上有一文本框text1,要获得其中文字的行数:<br>
Const EM_GETLINECOUNT = &HBA 这是消息标识号<br>
Private Declare Function SendMessageA Lib "user32" _<br>
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _<br>
ByVal lParam As Long) As Long<br>
调用:<br>
lastline = SendMessageA(Text1.hWnd, EM_GETLINECOUNT, 0, 0&)<br>
这里的lastline就等于text1中的文本行数。如=9,表示有9行。<br>
PwdChangePasswordA:更改windows屏幕保护程序的密码<br>
声明:Private Declare Function PwdChangePasswordA Lib "mpr" (ByVal _<br>
lpcRegkeyname As String, ByVal hWnd As Long, ByVal uiReserved1 _<br>
As Long, ByVal uiReserved2 As Long) As Long<br>
调用:<br>
Private Sub Command1_Click()<br>
Call PwdChangePasswordA("SCRSAVE", Me.hWnd, 0, 0)<br>
End Sub<br>
=============================================<br>
得到指定文本类窗口内的文本:WM_GETTEXT消息<br>
这个消息获得1个指定文本类窗口内的文本,可以获得用**号掩盖了密码的文本窗口内的文本。消息的值为&HD。消息本身的参数说明:wParam--字符串缓冲区长度;一般用WM_GETTEXTLENGTH消息获取值然后加1(结束符\0);lParam--字符串缓冲区,要用Space或String函数先打通足够长的空格,并用Byval指明传递字符串缓冲区地址,若不指明byval,因这个参数在SendMessage中是声明为Any的,并缺省为byref,不指明byval会传递首字符指针的指针,将出错!<br>
在使用它之前一般要先用WM_GETTEXTLENGTH消息获取指定文本窗口内文本的长度(值为&HE),以决定安排1个多长的字符串缓冲区存放获取的文本。<br>
下面是个例子的一部分:<br>
Dim ahwnd As Long<br>
Private Sub Command1_Click()<br>
ahwnd = CLng(Text3.Text) 输入1个文本类窗口句柄值<br>
Dim abc As String 定义1个字符串缓冲区<br>
x = SendMessage(ahwnd, WM_GETTEXTLENGTH, 0&, 0&) 获得窗口内字符数<br>
x = x + 1 .设置缓冲区长度<br>
abc = Space(x) <br>
SendMessage ahwnd, WM_GETTEXT, x, ByVal abc 注意:要用"byval 缓冲区"。<br>
Label2.Caption = "字数:" & x<br>
Text2.Text = abc 在程序中显示出获取的文本。<br>
End Sub <br>
===============================================<br>
调用当前屏幕保护程序:sendmessage函数的WM_SYSCOMMAND=&H112&消息和它的SC_SCREENSAVE=&HF140&参数。例下:<br>
声明:<br>
Public Const WM_SYSCOMMAND = &H112&<br>
Public Const SC_SCREENSAVE = &HF140&<br>
Declare Function SendMessage Lib "user32" Alias _<br>
"SendMessageA" (ByVal hWnd As Long, _<br>
ByVal wMsg As Long, ByVal wParam As Long, ByVal _<br>
lParam As Long) As Long<br>
调用:<br>
Private Sub Command2_Click()<br>
Call SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0&)<br>
End Sub<br>
---------------------------------------------<br>
设置/取消文本框只读:EM_SETREADONLY消息(值为&HCF)<br>
声明:见SendMessageA函数。消息的固有参数wParam可为True(只读)或False(非只读),参数lParam为0&.调用如:<br>
lxn=SendMessageA(Text1.hWnd,EM_SETREADONLY , True,0&)<br>
----------------------------------------------<br>
文本框的自动滚动:WM_HSCROLL消息或WM_VSCROLL消息<br>
WM_HSCROLL水平滚动消息的值是&H114;WM_VSCROLL垂直滚动消息的值是&H115.<br>
声明见SendMessageA函数。<br>
参数wParam的可能值有:<br>
WM_HSCROLL消息:SB_LEFT=6,往左移。 SB_RIGHT=7,往右移。<br>
SB_LINELEFT=0,往左移动1个单元格<br>
SB_LINERIGHT=1,往右移动1个单元格<br>
SB_PAGELEFT=2,往左移动较多部分。<br>
SB_PAGERIGHT=3,往右移动较多部分。<br>
WM_VSCROLL消息:SB_TOP=6;往上移。 SB_BOTTOM=7;往下移<br>
SB_LINEUP=0;往上移动1个单元格<br>
SB_LINEDOWN=1;往下移动1个单元格。<br>
SB_PAGEUP=2,往上移动较多部分。<br>
SB_PAGEDOWN=3,往下移动较多部分。<br>
水平滚动与垂直滚动消息的wparam参数值实际是相同的。只不过一个是左右滚动,一个是上下滚动而已。<br>
调用如:<br>
Private Const WM_VSCROLL = &H115<br>
Private Const SB_LINEDOWN = 1<br>
Private Sub Timer1_Timer()<br>
x = SendMessageA(Text1.hwnd, WM_VSCROLL, SB_LINEDOWN, 0&)<br>
End Sub<br>
----------------------------------------------<br>
禁止部分滚动:EM_SETRECTNP消息(值为&HB4)<br>
该消息指定控件内允许滚动的区域,反之,剩下的区域就不能滚动了。区域的坐标以控件的窗口坐标为准(单位:象素)。<br>
消息参数:wParam:0;<br>
lParam:为1个RECT型数,指定允许滚动的窗口内矩形区域。<br>
例下:禁止文本框下半部分滚动 <br>
Private Const EM_SETRECTNP = &HB4<br>
Private Type RECT RECT型数的声明<br>
Left As Long<br>
Top As Long<br>
Right As Long<br>
Bottom As Long<br>
End Type<br>
Dim lxn As RECT<br>
Private Sub Form_Click()<br>
Dim a As Long <br>
ScaleMode = 3<br>
lxn.Left = 0 <br>
lxn.Top = 0<br>
lxn.Right = Text1.Width<br>
lxn.Bottom = Text1.Height / 2 控件上半部分区域允许滚动<br>
a = SendMessageA(Text1.hwnd, EM_SETRECTNP, 0, lxn)<br>
End Sub <br>
----------------------------------------------<br>
撒消最近1次的编辑操作:EM_UNDO消息 <br>
在许多编辑软件中可看到"编辑"菜单中有"撒消"命令,用的就是此消息。<br>
此消息无参数(wParam,lParam视为0)。<br>
在此消息之前,可先用EM_CANUNDO消息判断是否允许进行当前的"撒消"操作。<br>
EM_CANUNDO消息也无参数。若返回True,则可"撒消",若返回False,则不能撒消。<br>
EM_UNDO的值为&HC7.消息EM_CANUNDO的值为&HC6.<br>
调用如:<br>
Private Sub Command3_Click()<br>
Dim lxn As Long<br>
lxn = SendMessageA(Text1.hwnd, EM_UNDO, 0&, 0&)<br>
End Sub<br>
====================================================<br>
截获指定窗口的Windows消息:GetMessageA函数<br>
该函数用来获得当前系统向某个窗口发送的消息。声明:<br>
Public Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long<br>
参数有lpMsg:返回截获的消息,hwnd:指定要截获哪个窗口的消息。wMsgFilterMin和wMsgfIlterMax参数大约是过滤消息范围吧(?),反正写0和1000就是。<br>
结构类型MSG声明如下:<br>
Private Type MSG<br>
hwnd As Long 消息要发送的窗口句柄<br>
message As Long 消息标识符(名称)<br>
wParam As Long 消息自身参数1<br>
lParam As Long 消息自身参数2<br>
time As Long 消息经历的时间(?)<br>
pt As POINTAPI 屏幕坐标 (?)<br>
End Type<br>
其中包含有个POINTAPI的声明如下:<br>
Private Type POINTAPI<br>
x As Long<br>
y As Long<br>
End Type<br>
调用如:<br>
Dim MYMSG As MSG<br>
Dim returnCode As Boolean<br>
Private Const WM_LBUTTONDOWN = &H201<br>
Private Sub Timer1_Timer()<br>
DoEvents 使本程序中断,将控制权交给系统。(我没看懂)<br>
returnCode = GetMessage(MYMSG, Me.hwnd, 0, 1000) <br>
if MYMSG.message=WM_LBUTTONDOWN then MsgBox "你按下了鼠标左键"<br>
End Sub
<p align="center">
<br>
< <a href="040103.htm">上一页</a>--<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="040105.htm">下一页</a>
><br>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -