⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 050206.htm

📁 提供一个VB学习教程,入门级。来源于网上
💻 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去改变传入的字符串参数或结构类型数据,也就达到了&quot;返回值&quot;的目的。<br>
 重大注意:在向API函数传递字符串参数时,API函数不会为我们建立任何字符串空间,在把字符串传递给函数之前,必须建立1个足够长的空字符串(缓冲区),以处理可能返回的最长的字符串。通常是指定1个足够长的空格字符串,如&quot;参数名=string(255,&quot; &quot;)&quot;或&quot;参数名=space(255)&quot;等等。在API调用中就从其左部开始写入返回值,返回后可能会有多余空格,去除多余空格可用:<br>
 返回参数=left(含空格返回参数,instr(含空格返回参数,chr(0))-1)<br>
 这里有一点知识说明一下:chr(0)不是空格(空格是chr(32)),而是API写返回值时的一种格式:在每写完1个字符串值的未尾都自动加上一个&quot;\0&quot;,表示字符串结束(这是C语言的习惯)。通过查找这个&quot;\0&quot;(ASCII为0)的位置,就能知道返回值有多长,上面公式中的位置值再减1是将这个&quot;\0&quot;去掉。得到&quot;纯&quot;字符串。<br>
 VB内部函数space函数:指定空格,返回空字符串或空变体类数据。格式:space(空格个数),如x=space(10),x就等于&quot; (10个空格) &quot;。<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 &quot;user32&quot; (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, &amp;H2 + &amp;H1<br>
 End Sub form窗体就将停留在屏幕表面。<br>
 将鼠标指针定位于自定义的屏幕坐标处:SetCursorPos函数。<br>
 声明:<br>
 Private Declare Function SetCursorPos Lib &quot;user32&quot; (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&quot;好意地&quot;进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是 <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常是&quot;枚举&quot;功能的函数(如EnumWindows),用 &quot;AddressOf 过程名&quot;的格式进行传递。如:<br>
 lxn&amp; = EnumWindows(AddressOf AddToList, 0&amp;)<br>
 EnumWindows第1个参数就是1个自定义回调函数AddToList。它存在于标准模块中。<br>
 AddressOf操作符用于回调函数,来实现典型的&quot;枚举&quot;,即连续调用回调函数遍历此API提供的一系列条目。举个例子吧:有个API叫EnumWindows,此函数枚举系统中当前加载的所有窗口句柄hwnd(形成一系列条目),每枚举出一个新窗口时就调用1次从其参数传入的回调函数。也就要用AddressOf来&quot;连续调用&quot;了。<br>
 AddressOf传递的是过程的地址,而非通常的情况--传递过程返回值的地址。<br>
 使用回调函数需要注意以下几点:1,AddressOf后跟1个function函数指针,不能是Sub过程指针;2,使用AddressOf的函数必须放在标准模块中,不能在窗体模块,类模块中;3,必须了解回调函数需要哪些参数。这些参数应由这个API提供。<br>
 举1例如下:<br>
 标准模块中:<br>
 Public Declare Function EnumWindows Lib &quot;user32&quot; (ByVal _<br>
 lpEnumFunc As Long, ByVal lparam As Long) As Long<br>
 Public Declare Function GetWindowTextA Lib &quot;user32&quot; (ByVal _<br>
 hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long<br>
 Public Declare Function GetWindowTextLengthA Lib &quot;user32&quot; _<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 &gt; 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&amp; = EnumWindows(AddressOf AddToList, 0&amp;)<br>
 End Sub <br>
 EnumWindows函数:枚举窗口列表中的所有父窗口(不包括按纽,菜单等等子窗口)。返回每1个窗口句柄hwnd传递到参数lpEnumFunc--用AddressOf指定的一个标准模块中的函数,使得每枚举1个窗口时都调用1次此函数。来操作每个窗口,参数lparam就不管它吧。 <br>
 GetWindowText函数:返回指定句柄窗口的标题文字。第2个参数是预定义的一个缓冲区,以存放返回值(常为1大串空格如string(255,&quot; &quot;)),第3个参数是缓冲区长度(即空格的个数)。而&quot;函数&quot;返回值就是标题字符串的长度。 <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>
 此语句可代替手在键盘上敲击按键,很有意思。也就是说,可以让程序自动&quot;击键&quot;。如果用shell函数打开另1软件,那么可用此语句来实现对别的软件的自动控制。妙!<br>
 SendKeys语句将1个或多个按键消息发送到屏幕上当前具有焦点的窗口(即活动窗口),就如同在键盘上进行输入一样。<br>
 语法:SendKeys 按键字串,True或False<br>
 SendKeys &quot;abc&quot;,true<br>
 其中,按键字串是指在键盘上接连按下了哪些键,多次按下构成的1个&quot;按键字串&quot;,如连续按下A,B,C键为&quot;ABC&quot;,要用引号。按键字串还可用变量,如:m=&quot;abc&quot;:<br>
 sendkeys m,true.此时不要引号。第2个参数是表示当按键消息发送出去后是否等待。等待消息处理完毕才返回到过程中,而false则在按键发送出去后立即返回过程,去执行本程序的其他部分。<br>
 关于按键字串的规则:1,普通字符键直接用字符表示即可,如&quot;H5A2SD&quot;.<br>
 2,非字符键用大括号括住键名表示,如按下ESC键为{ESC},按下NUMLOCK键为{NUMLOCK},按下PAGEDOWN为{PGDN},按下F2为{F2}等等。见下面的表。<br>
 3,与Shift,Ctrl,Alt按键的组合键。与Shift键组合键,前面加&quot;+&quot;号,并将要与之同时按下的键用大括号括住,如表示&quot;按下E键与C键的同时按下Shift键&quot;,表示为&quot;+{EC}&quot;,而表示&quot;按下E键的同时按下Shift键,但马上松开Shift键按C键&quot;,则表示为&quot;+EC&quot;.要注意。同时按下Ctrl键是前加&quot;^&quot;号,同时按下Alt键是前加 &quot;%&quot;号。<br>
 4,已赋予了其他功能的符号:加号(+);插入符(^);百分号(%);上划线(~);大括号({);中括号([);圆括号(( ).要表示&quot;按下&quot;这些键,则要用大括号括住,如表示加号为{+},表示右大括号为{}}。等等。<br>
 5,重复多次按下某个键,可用简捷方法{键 次数}方式来表示,如重复按下10次H键,为{H 10},在键与次数间要用个空格隔开。并用大括号括住。再如重复按12次ESC键,则为{ESC 12}(不会有歧义,故不要用嵌套的大括号)。<br>
 举个例子如下(自动让计算器算数):<br>
 Private Sub Command1_Click()<br>
 Dim ReturnValue, I<br>
 ReturnValue = Shell(&quot;CALC.EXE&quot;, 1) '运行计算器。<br>
 AppActivate ReturnValue '激活计算器。<br>
 For I = 1 To 100 '设置计数循环。<br>
 SendKeys I &amp; &quot;{+}&quot;, True '按下按键给计算器<br>
 Next I '将所有I值相加。<br>
 'SendKeys &quot;=&quot;, True '取得总合。<br>
 'SendKeys &quot;%{F4}&quot;, 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值(&quot;%&quot;符号不能进行枚举,它好象会暂停计时器事件)。对位数少的密码还是能起到一些作用吧。NO。
 <p align="center">
        <br>
        &lt; <a href="050205.htm">上一页</a>--<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="050207.htm">下一页</a>     
        &gt;<br>
      </td>
    </tr>
  </table>
  </center>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -