📄 050206.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="#">代码</a></td>
</tr>
<tr>
<td width="100%">
<p align="center">代码</td>
</tr>
<tr>
<td width="100%"><br>
Windows API函数通常有以下诸类:底层服务--提供对Windows底层和核心服务的访问。用户接口服务--为应用程序创建和管理用户界面。系统服务--提供访问内存,文件系统,运行处理以及动态链接库等的途径。构建对象模型和ActiveX对象服务--帮助开发面向对象的应用程序和构件。图形和多媒体服务--生成图形输出,音频,视频设备访问。……等等。<br>
一点知识:调用API时,如普通VB内函数一样,用函数名(实参)来得到1个返回值,而API的返回值常常只是1个Long长整数,在很大程度上不能满足需要,应通过另一种重要的途径:传递字符串参数指针或结构类型参数指针,让API去改变传入的字符串参数或结构类型数据,也就达到了"返回值"的目的。<br>
重大注意:在向API函数传递字符串参数时,API函数不会为我们建立任何字符串空间,在把字符串传递给函数之前,必须建立1个足够长的空字符串(缓冲区),以处理可能返回的最长的字符串。通常是指定1个足够长的空格字符串,如"参数名=string(255," ")"或"参数名=space(255)"等等。在API调用中就从其左部开始写入返回值,返回后可能会有多余空格,去除多余空格可用:<br>
返回参数=left(含空格返回参数,instr(含空格返回参数,chr(0))-1)<br>
这里有一点知识说明一下:chr(0)不是空格(空格是chr(32)),而是API写返回值时的一种格式:在每写完1个字符串值的未尾都自动加上一个"\0",表示字符串结束(这是C语言的习惯)。通过查找这个"\0"(ASCII为0)的位置,就能知道返回值有多长,上面公式中的位置值再减1是将这个"\0"去掉。得到"纯"字符串。<br>
VB内部函数space函数:指定空格,返回空字符串或空变体类数据。格式:space(空格个数),如x=space(10),x就等于" (10个空格) "。<br>
怎样使1个窗口总在屏幕最顶层,即始终占据有效性?如果是在1个MDI程序内,被别的子窗体遮住,则可用1个定时器,在其timer事件中用该窗口的zorder方法就可以了,如:<br>
Private Sub Form_Load()<br>
Timer1.Interval = 500<br>
Timer1.Enabled = True<br>
End Sub<br>
Private Sub Timer1_Timer()<br>
Form1.ZOrder 0<br>
End Sub<br>
在运行中,如果form1被别的窗口遮住,它立即返回屏幕表面。 <br>
也可用API函数来实现1个窗口始终停留在屏幕表面(不限于1个MDI窗体)。用SetWindowPos函数,声明及调用如下:<br>
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long,<br>
ByVal hWndinsertAfter As Long, ByVal x As Long, ByVal y As Long, _<br>
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long<br>
Private Sub Form_Load()<br>
SetWindowPos hwnd, -1, 0, 0, 0, 0, &H2 + &H1<br>
End Sub form窗体就将停留在屏幕表面。<br>
将鼠标指针定位于自定义的屏幕坐标处:SetCursorPos函数。<br>
声明:<br>
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long<br>
调用如:Private Sub Command1_Click()<br>
Call SetCursorPos(600, 100) 将鼠标定位到屏幕(600,100)处。<br>
End Sub<br>
很简单,注:屏幕是以象素为单位的(与屏幕分辨率设定有关)。不是缇。<br>
重点笔记:消息<br>
消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两 <br>
个32位长度(Long)的参数.hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置) 但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你. 小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event). 这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip). 现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB"好意地"进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是 <br>
肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好 <br>
不要使用,因为这与VB的安全程序设计有一点点的违背.(注:子类处理确实有很大 <br>
的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用 <br>
VB的断点调试功能,这可能会导致VB崩溃!) <br>
需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用Send <br>
Message或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而Pos <br>
tMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消 <br>
息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息 <br>
的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个 <br>
32位的参数. <br>
--------------- <br>
API中的回调函数:回调函数是指将VB标准模块中的某个函数过程作为参数传递到API函数中,需要接收回调函数的API常是"枚举"功能的函数(如EnumWindows),用 "AddressOf 过程名"的格式进行传递。如:<br>
lxn& = EnumWindows(AddressOf AddToList, 0&)<br>
EnumWindows第1个参数就是1个自定义回调函数AddToList。它存在于标准模块中。<br>
AddressOf操作符用于回调函数,来实现典型的"枚举",即连续调用回调函数遍历此API提供的一系列条目。举个例子吧:有个API叫EnumWindows,此函数枚举系统中当前加载的所有窗口句柄hwnd(形成一系列条目),每枚举出一个新窗口时就调用1次从其参数传入的回调函数。也就要用AddressOf来"连续调用"了。<br>
AddressOf传递的是过程的地址,而非通常的情况--传递过程返回值的地址。<br>
使用回调函数需要注意以下几点:1,AddressOf后跟1个function函数指针,不能是Sub过程指针;2,使用AddressOf的函数必须放在标准模块中,不能在窗体模块,类模块中;3,必须了解回调函数需要哪些参数。这些参数应由这个API提供。<br>
举1例如下:<br>
标准模块中:<br>
Public Declare Function EnumWindows Lib "user32" (ByVal _<br>
lpEnumFunc As Long, ByVal lparam As Long) As Long<br>
Public Declare Function GetWindowTextA Lib "user32" (ByVal _<br>
hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long<br>
Public Declare Function GetWindowTextLengthA Lib "user32" _<br>
(ByVal hwnd As Long) As Long<br>
Public Function AddToList(ByVal hwnd As Long, ByVal lparam As Long) As Long<br>
Dim sTitle As String '这是个回调函数,参数hwnd将由EnumWindows提供<br>
Dim lLen As Long<br>
Dim lReturn As Long<br>
lLen = GetWindowTextLengthA(hwnd) + 1<br>
sTitle = String$(lLen + 1, 0)<br>
lReturn = GetWindowTextA(hwnd, sTitle, lLen)<br>
If lReturn > 0 Then<br>
Form1.List1.AddItem Left(sTitle, lReturn)<br>
End If<br>
AddToList = 1 这句不能丢,否则视为0就是调用失败。调用了也实为没调用。<br>
End Function<br>
窗体模块中:<br>
Private Sub Command1_Click()<br>
List1.Clear<br>
lxn& = EnumWindows(AddressOf AddToList, 0&)<br>
End Sub <br>
EnumWindows函数:枚举窗口列表中的所有父窗口(不包括按纽,菜单等等子窗口)。返回每1个窗口句柄hwnd传递到参数lpEnumFunc--用AddressOf指定的一个标准模块中的函数,使得每枚举1个窗口时都调用1次此函数。来操作每个窗口,参数lparam就不管它吧。 <br>
GetWindowText函数:返回指定句柄窗口的标题文字。第2个参数是预定义的一个缓冲区,以存放返回值(常为1大串空格如string(255," ")),第3个参数是缓冲区长度(即空格的个数)。而"函数"返回值就是标题字符串的长度。 <br>
GetWindowTextLength函数:返回指定句柄窗口的标题文字的长度。<br>
什么是进程?线程?<br>
在Windows的32位操作系统中实现了多任务与多线程。要了解单线程 <br>
与多线程的区别就要先了解文件、进程、线程的区别。 <br>
文件:一个应用程序在没有调用时(没有加载到内存中时---包括虚拟内存) <br>
叫文件或程序。 <br>
进程:应用程序被加载到内存中后叫进程。 <br>
线程:进程被CPU处理时叫线程。 <br>
Windows 32位操作系统可让cpu在不同的时间段内处理不同的线程,这些线程 <br>
可以来自于一个进程(多线程进程),也可以来自不同的进程。由于这个时间 <br>
段很短,所以人们认为在一个较长的时间段内cpu在执行多个任务,所以说 <br>
Windows 32位操作系统具有多线程多任务的功能。 <br>
在做一个程序时可以调用多个线程,这叫多线程进程,也可以不调用多个线程 <br>
这叫单线程进程。 <br>
===================<br>
SendKeys语句<br>
此语句可代替手在键盘上敲击按键,很有意思。也就是说,可以让程序自动"击键"。如果用shell函数打开另1软件,那么可用此语句来实现对别的软件的自动控制。妙!<br>
SendKeys语句将1个或多个按键消息发送到屏幕上当前具有焦点的窗口(即活动窗口),就如同在键盘上进行输入一样。<br>
语法:SendKeys 按键字串,True或False<br>
SendKeys "abc",true<br>
其中,按键字串是指在键盘上接连按下了哪些键,多次按下构成的1个"按键字串",如连续按下A,B,C键为"ABC",要用引号。按键字串还可用变量,如:m="abc":<br>
sendkeys m,true.此时不要引号。第2个参数是表示当按键消息发送出去后是否等待。等待消息处理完毕才返回到过程中,而false则在按键发送出去后立即返回过程,去执行本程序的其他部分。<br>
关于按键字串的规则:1,普通字符键直接用字符表示即可,如"H5A2SD".<br>
2,非字符键用大括号括住键名表示,如按下ESC键为{ESC},按下NUMLOCK键为{NUMLOCK},按下PAGEDOWN为{PGDN},按下F2为{F2}等等。见下面的表。<br>
3,与Shift,Ctrl,Alt按键的组合键。与Shift键组合键,前面加"+"号,并将要与之同时按下的键用大括号括住,如表示"按下E键与C键的同时按下Shift键",表示为"+{EC}",而表示"按下E键的同时按下Shift键,但马上松开Shift键按C键",则表示为"+EC".要注意。同时按下Ctrl键是前加"^"号,同时按下Alt键是前加 "%"号。<br>
4,已赋予了其他功能的符号:加号(+);插入符(^);百分号(%);上划线(~);大括号({);中括号([);圆括号(( ).要表示"按下"这些键,则要用大括号括住,如表示加号为{+},表示右大括号为{}}。等等。<br>
5,重复多次按下某个键,可用简捷方法{键 次数}方式来表示,如重复按下10次H键,为{H 10},在键与次数间要用个空格隔开。并用大括号括住。再如重复按12次ESC键,则为{ESC 12}(不会有歧义,故不要用嵌套的大括号)。<br>
举个例子如下(自动让计算器算数):<br>
Private Sub Command1_Click()<br>
Dim ReturnValue, I<br>
ReturnValue = Shell("CALC.EXE", 1) '运行计算器。<br>
AppActivate ReturnValue '激活计算器。<br>
For I = 1 To 100 '设置计数循环。<br>
SendKeys I & "{+}", True '按下按键给计算器<br>
Next I '将所有I值相加。<br>
'SendKeys "=", True '取得总合。<br>
'SendKeys "%{F4}", True '用Alt+F4关闭窗口<br>
End Sub<br>
功能键如下: <br>
BACKSPACE:{BACKSPACE},{BS}或{BKSP} BREAK:{BREAK}<br>
CAPSLOCK:{CAPSLOCK} DELorDELETE:{DELETE}或{DEL} DOWNARROW:{DOWN} END:{END}<br>
ENTERRETURN:{ENTER}或~ ESC:{ESC} <br>
HELP:{HELP} HOME:{HOME} <br>
INSorINSERT:{INSERT}或{INS} LEFTARROW:{LEFT}<br>
NUMLOCK:{NUMLOCK} PAGEDOWN:{PGDN}<br>
PAGEUP:{PGUP} PRINTSCREEN:{PRTSC}<br>
RIGHTARROW:{RIGHT} SCROLLLOCK:{SCROLLLOCK}<br>
TAB:{TAB} UP:{UP} <br>
F1-F16:{F1}-{F16} <br>
是否可用此语句来枚举软件密码,让电脑自动输入每1个可能的值,以达到破解的目的,我想如果可能的话,会是1种纯天然的破解法。主要的ASCII值在32-126之间,包括了大小写字母.数字和标点符号。在计时器事件中不断累加ASCII值("%"符号不能进行枚举,它好象会暂停计时器事件)。对位数少的密码还是能起到一些作用吧。NO。
<p align="center">
<br>
< <a href="050205.htm">上一页</a>--<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="050207.htm">下一页</a>
><br>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -