




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VB复习一:基础知识 对象的有关概念l 1.对象Object:VB中常用的对象有:窗体、控件等。 2.对象的三要素 (1)属性Property:用来描述和反映对象外部特征的参数。 (2)方法Method:允许其他对象与之交互的方式,表明一个对象所具有的能力。 (3)事件Event:响应对象的动作称为事件,它发生在用户与应用程序交互时。如单击控件、鼠标移动、键盘按下等。 事件驱动EventDriven:VB为窗体和大多数控件都规定了一组事件,当应用程序被启动后,VB随时准备捕获各种事件。一旦发生了某个事件,VB就会执行与该事件相联系的事件过程;执行完后,VB等待下一个事件的发生。 VB程序的执行
2、步骤如下:l (1)启动应用程序,装载和显示窗体; (2)窗体(或窗体上的控件)等待事件的发生; (3)事件发生时,执行对应的事件过程; (4)重复执行步骤(2)和(3); (5)直到遇到END结束语句结束程序的运行;或按“结束”强行停止程序的运行。 VB集成开发环境l 1.主窗口 应用程序窗口,由标题栏、菜单栏和工具栏组成。 2.窗体(form)窗口 设计VB程序的界面。 3.代码(code)窗口 编辑窗体、标准模块中的代码。 4.属性(properties)窗口 所有窗体或控件的属性设置。 5.工程资源管理器(projectexpror)窗口 保存一个应用程序所有的文件。 6.工具箱(to
3、olbox)窗口 显示各种控件的制作工具,供用户在窗体上设计 建立VB程序的步骤l 1.建立用户界面的对象,并设置对象属性; 2.对象事件过程及编程; 3.程序运行和调试; 4.保存文件: 窗体frm格式和vb工程vbp格式 VB编码基础l 1.VB代码不区分字母的大小写 系统保留字自动转换每个单词的首字母大写; 用户自定义行以第一次为准。 2.语句书写自由 一行可书写几句语句,之间用冒号分隔; 一句语句可分若干行书写,用续行符_(空格+下画线)连接一行字符运算符关系运算符逻辑运算 说明: 1当一个表达式中出现多种运算符时,首先进行算术运算符,接着处理字符串连接运算符,然后处理比较运算符,最后
4、处理逻辑运算符,在各类运算中再按照相应的优先次序进行。 2可以用括号改变优先顺序,强令表达式的某些部分优先运行。括号内的运算总是优先于括号外的运算。对于多重括号,总是由内到外。 .表达式的书写中需注意的问题 (1)运算符不能相邻。例a+-b是错误的。 (2)乘号不能省略。例x乘以y应写成:x*y (3)括号必须成对出现,均使用圆括号。 (4)表达式从左到右在同一基准并排书写,不能出现上下标 (5)要注意各种运算符的优先级别,为保持运算顺序,在写表达式时需要适当添加括号(),若用到库函数必须按库函要求书写。 4.不同数据类型的转换 运算结果的数据类型向精度高的数据类型靠。 IntegerLong
5、SingleDouble0与int(N)相同,当N0时,int(N)与fix(N)-1相等。 例如:Fix(9.59)=9,Int(9.59)=9 Fix(-9.59)=-9,Int(-9.59)=-10 思考:如何实现四舍五入取整? (2)Asc(Abcd)值为:65(只取首字母的Ascii值) (3)Val(abc123)值为:0,Val(1.2sa10)值为1.2 注意:Val()函数只将最前面的数字字符转换为数值 常用方法 方法是面向对象的,故使用的形式为:对象.方法 Print方法 形式:对象.PrintSpc(n)|Tab(n)表达式列表;|, 作用:在对象上输出信息 对象:窗体、
6、图形框或打印机(Printer),省略对象在窗体上输出。 Spc(n)函数:插入n个空格,允许重复使用。 Tab(n)函数:左端开始右移动n列,允许重复使用。 ;(分号):光标定位上一个显示的字符后。 ,(逗号):光标定位在下一个打印区的开始位置处。 无;,时换行。 开始打印的位置缺省为打印对象的左上角0,0。 注意:Print方法在Form_Load事件过程中起作用,必须设置窗体的 AutoRedraw为True。 二:程序结构 顺序结构 VB程序设计采用结构化程序设计的思想。在VB中有3种基本的程序流程结构:顺序结构、选择结构和循环结构。所有的程序都可以看成是这三种结构或三种结构的组合。
7、顺序结构 所谓顺序结构,就是在程序运行过程中,按照语句的顺序逐条执行。顺序结构中主要的语句是赋值语句、输入输出语句及End语句等。赋值语句 赋值语句是最基本的语句之一,通过赋值语句,可以在程序中改变变量的值,或改变对象属性值。其语法格式为: 变量名=表达式 对象.属性=表达式 例如:A=Text1.Text B=0 Text1.Text=Text1.Text+Command1.Caption A=2=3结果为false(表达式2=3的值) sb=Round(Sqr(delt)/(2*a),7) 选择结构 1.IfThen语句(单分支结构) IfThen 语句块 EndIf 或IfThen 例:
8、已知两个数x和y,比较它们的大小,将大的数存在x中 IfxyThen t=x x=y y=t EndIf 或Ifx0Then x1=(-b+Sqr(b*b-4*a*c)/(2*a) x2=(-b-Sqr(b*b-4*a*c)/(2*a) Label4.Caption=方程有两实根,分别为:+Str(x1)+Str(x2) ElseIfb*b-4*a*c=0Then x2=(-b)/(2*a) Label4.Caption=方程有一根,为:+Str(x2) Else Label4.Caption=方程没有实根 EndIf EndSub 循环结构 循环结构语句 1For循环 FOR循环一般格式:
9、For循环变量初值to终值step步长 语句组(也被叫做循环体) next循环变量 例题:累加器s=1+3+5+7+9+19s=0 fori=1to20step2 s=s+i nexti prints 答案:100 注意1:初值和终值即可是整数,也可是小数 s=0 fori=1.2to4.9step0.2 s=s+1 nexti prints 答案:19 注意2:步长1时,可省略不写;步长值不能为0 例题:累乘器: s=1 fori=1to5 s=s*i nexti prints 答案:120 注意3:初值和终值大小 s=1 fori=5to1step2 s=s*i nexti prints
10、答案:1(因为循环条件不满足,循环语句没执行) 将步长改为2,答案为_ 练习:求1到100的和。 PrivateSubCommand1_Click() DimiAsInteger,sumAsInteger sum=0 Fori=1To100 sum=sum+i Nexti Printsum EndSub 累乘器:乘=1*2*3*100 PrivateSubCommand2_Click() DimiAsInteger,chengAsSingle cheng=1 Fori=1To10 cheng=cheng*i Nexti Printcheng EndSub 累加、累乘 累加、累乘是较常见的数值问
11、题。累加(累乘)是将多个数 相加(乘),所以一般采用循环结构来实现。在循环体中应有表 示累加(如sum=sum+x)或累乘(如t=t*i)的赋值语句。需要注 意的是,累加中用于存放和的变量一般赋初值为0,而累乘中用于 存放积的变量赋初值为1。 例题:阶乘求1!+2!+n!,n由键盘输入。 【分析】该题先求阶乘,再将阶乘值累加。循环次数由用户输入确定(即n的值)。 PrivateSubForm_Click() Dimsasdouble,tasdouble,nasinteger s=0 t=1 n=val(InputBox(“请输入n的值”) Fori=1ton t=t*i求i! s=s+t Ne
12、xti Print“1!+2!+”;n;”!=”;s EndSub 4037913 三:静态数组及声明 数组不是一种数据类型,而是一组相同类型的变量的集合,数组必须先声明后使用。 两类数组:静态(定长)数组、动态(可变长)数组 1.静态数组及声明 形式:Dim数组名(下标1,下标2)As类型 声明了数组的名、维数、大小、类型 维数:几个下标为几维数组,最多60维。 下标:下界To上界省略下界为0,必须为常数。 每一维大小:上界下界+1 数组大小:每一维大小的乘积 例:Dimmark(1to100)AsInteger 数组的基本操作 1.用循环数组元素进行赋值 Fori=1To10 iA(i)=
13、0 Nexti 2.用循环输出数组元素 Fori=1To10 printiA(i) NextI 四:穷举法 穷举法的基本思想是:对要解决的问题的所有可能情况一一检查,从中找到符合要求的答案。 例题: 百元买百鸡问题。假定公鸡每只5元,母鸡每只3元,小鸡1元钱3只。现在有100元钱要求买100只鸡,而且每一种鸡都要有,请编程列出所有可能的购鸡方案。 设公鸡、母鸡、小鸡各为x、y、z只,根据题目要求,列出方程为: x+y+y=100 3x+5y+z/3=100 三个未知数,两个方程,此题有若干个解,采用“穷举法”,把每一种情况都考虑到。 最简单三个未知数利用三重循环来实现。 PrivateSubC
14、ommand1_Click() Dimx,y,zAsInteger DimaAsInteger Forx=1To20 Fory=1To33 Forz=1To100 If5*x+3*y+z/3=100Andx+y+z=100Then Printx=;x; Printy=;y; Printz=;z EndIf Nextz Nexty Nextx Print EndSub 运行结果如下: 例题:求100-999之间的所有“水仙花数”。“水仙花数”是一个三位数,其各位数字的立方和等于该数本身。例如:153=13+53+33,153是一个水仙花数。 【分析】采用穷举法对指定范围内的每一个数进行判断它是否
15、为水仙花数。判断一个数是否为水仙花数的关键是如何将此数的各位数字分离出来。如对于数据153,可采用下面的方法分离其各位数字 (1)int(153/100),得到百位数字1。 (2)int(153-1*100)/10),得到十位数字5。 (3)153-1*100-5*10,得到个位数字3。 程序代码如下: PrivateSubForm_Click() Dimi%,a%,b%,c% Fori=100to999 a=i100 b=(i-a*100)10 c=i-a*100-b*10 Ifi=a*a*a+b*b*b+c*c*cThenPrinti; Nexti EndSub 运行结果如下: 15337
16、0371407选择结构 1ifThen语句 语句格式: (1)IfThen (2)IfThen EndIf 语句功能:当的值为True或非零时,执行Then 后面的语句(或语句块),否则不做任何操作,实现单分支 选择结构。 2IfThenElse语句 语句格式: (1)IfThenElse (2)IfThen Else EndIf 语句功能:当的值为True或非零时,执行Then后面的语句(语 句块),否则执行Else后面的语句(或语句块),实现双分支选择结构 例如:输入一个整数,判断其奇偶性。 程序代码如下: PrivateSubForm_Click() Dimxasinteger x=In
17、putBox(“请输入一个整数”) Ifxmod2=0Then Printx;”是偶数” Else Printx;”是奇数” Endif EndSub 3IfThenElseIf语句 语句格式: IfThen ElseIfThen Else EndIf 语句功能:根据不同的表达式值确定执行哪个语句块,实现多分支选择结构。 使用说明:先计算的值,若为真,则执行,并跳过其他 分支语句执行If语句的后续语句(即EndIf后面的语句);若为假,则计算的值,依此类推,直到找到一个为真的条件时,才执行相应的语句块,然 后执行EndIf后面的语句。格式中的Else是可选项,表示若无任何表达式值为真 时,则执
18、行; 若无Else选项,且所有条件表达式值都不为真,则不执 行If语句中的任何语句块。 【注意】 当If语句内有多个表达式的值为真时,只执行第一个为 真的表达式后的语句块。 例题:求一元二次方程的根。 y=ax2+bx+c的形式的一元二次方程,输入a,b,c的值,的到方程的根 DimaAsSingle DimbAsSingle DimcAsSingle Dimx1AsSingle Dimx2AsSingle PrivateSubCommand1_Click() a=Val(Text1.Text) b=Val(Text2.Text) c=Val(Text3.Text) Ifb*b-4*a*c0T
19、hen x1=(-b+Sqr(b*b-4*a*c)/(2*a) x2=(-b-Sqr(b*b-4*a*c)/(2*a) Label4.Caption=方程有两实根,分别为:+Str(x1)+Str(x2) ElseIfb*b-4*a*c=0Then x2=(-b)/(2*a) Label4.Caption=方程有一根,为:+Str(x2) Else Label4.Caption=方程没有实根 EndIf EndSub 三:算法及程序 穷举法的基本思想是:对要解决的问题的所有可能情况一一检查,从中找到符合要求的答案。 例题:百钱买百鸡问题:我国古代数学家张丘建在算经中提出了“百鸡问题”:“鸡翁一
20、,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”每种鸡至少有一只分析】设母鸡、公鸡、小鸡各为x,y,z只, 程序代码如下: PrivateSubCommand1_Click() Dimx,y,zAsInteger DimaAsInteger Forx=1To20 Fory=1To33 Forz=1To100 If5*x+3*y+z/3=100Andx+y+z=100Then Printx=;x; Printy=;y; Printz=;z EndIf Nextz Nexty Nextx Print EndSub HYPERLINK /share/330214077/
21、10725496918 l nogo#nogo vb期末20道编程题 姐姐我吐血整理的1:求随机10个整数的最大值、最小值、平均值以及和Option Base 1Dim a(10) As Integer, i As IntegerPrivate Sub Command1_Click() Randomize For i = 1 To 10 a(i) = Int(Rnd * 90) + 10 Text1 = Text1 & a(i) & Next iEnd SubPrivate Sub Command2_Click() Dim max As Integer max = a(1) For i = 2
22、 To 10 If a(i) max Then max = a(i) End If Next i Text2 = maxEnd SubPrivate Sub Command3_Click() Dim min As Integer min = a(1) For i = 1 To 10 If a(i) min Then min = a(i) End If Next i Text3 = minEnd SubPrivate Sub Command4_Click() Dim s As Integer For i = 1 To 10 s = s + a(i) Next i Text4 = sEnd Sub
23、Private Sub Command5_Click() Dim s As Integer, ave As Integer For i = 1 To 10 s = s + a(i) ave = s / 10 Next i Text5 = aveEnd Sub2:水仙花数Private Sub Command1_Click() Dim x As String, y As Integer x = Val(Text1.Text) a = x 100 b = (x - a * 100) 10 c = x Mod 10 y = a 3 + b 3 + c 3 Text2.Text = CStr(a) T
24、ext3.Text = CStr(b) Text4.Text = CStr(c) Text5.Text = CStr(y) If y = x Then MsgBox & x & 是水仙花数 Else MsgBox & x & 不是水仙花数 End IfEnd Sub3:百元买鸡问题Option ExplicitDim x As Integer, y As Integer, z As IntegerPrivate Sub Command1_Click() List1.AddItem 公鸡 母鸡 小鸡 For x = 1 To 20 For y = 1 To 33 z = 100 - x - y
25、If 5 * x + 3 * y + z / 3 = 100 Then List1.AddItem CStr(x) & Space(6) & CStr(y) & Space(6) & CStr(z) End If Next y Next xEnd Sub4:1000以内完数Private Sub Form_Click() Dim i, j As Integer For i = 4 To 1000 temp = 1 For j = 2 To i / 2 If i Mod j = 0 Then temp = temp + j End If Next j If temp = i Then Print
26、 i End If Next iEnd Sub5: 三位数之和Private Sub Command1_Click() Dim x As String, y As Integer x = Val(Text1.Text) a = x 100 b = (x - a * 100) 10 c = x Mod 10 y = a + b + c Text2 = CStr(y)End Sub6: 最小公倍数Private Sub Command2_Click() Dim m As Integer, n As Integer m = Text1 n = Text2 Text4 = m * n / gcd(m,
27、 n)End SubPrivate Function gcd(m As Integer, n As Integer) Dim k As Integer Do k = m Mod n m = n n = k Loop Until k = 0 gcd = mEnd Function7:求逆序数Private Sub Command1_Click() Dim a As Long, b As Long a = Val(Text1.Text) Call con(a, b) Text2 = bEnd SubPrivate Sub con(n As Long, m As Long) If n 0 Then
28、m = m & n Mod 10 n = n 10 Call con(n, m) End IfEnd Sub8级数有限项求和(1)计算下列通项的和,当通项小于0.000001 时,停止计算S=1/2+1/(2*4)+1/(2*4*6)+1/(2*4*6*2n)+Private Sub Form_Click() Dim sum!, term!, i% sum = 0 i = 0 term = 1 Do i = i + 1 term = term * (2 * i) sum = sum + 1 / term Loop Until (1 / term N 成立Private Sub Form_Cli
29、ck() Dim n%, sum%, k% n = InputBox(请输入整数) sum = 0 k = 0 Do While sum n k = k + 1 sum = sum + k * k Loop Print n=; n, k=; k, sum=; sumEnd Sub9: 求质因子问题Private Sub Command1_Click() Dim i As Integer Randomize For i = 1 To 10 a(i) = Int(100 * Rnd + 1) List1.AddItem a(i) Next iEnd SubPrivate Sub Command2_
30、Click() Dim i As Integer, j As Integer, b(10, 10) As Integer For i = 1 To 10 Text1 = Text1 + CStr(a(i) + = Call factor(a(i), i, b() j = 1 Do While b(i, j) 0 If b(i, j + 1) 0 Then Text1 = Text1 & b(i, j) & * & Else Text1 = Text1 & b(i, j) End If j = j + 1 Loop Text1 = Text1 + vbCrLf Next iEnd SubPriv
31、ate Sub factor(ByVal n As Integer, m As Integer, fac() As Integer) Dim i As Integer, j As Integer j = 1 For i = 2 To n Do While n Mod i = 0 fac(m, j) = i n = n / i j = j + 1 Loop Next iEnd Sub10:字符统计Private Sub Command1_Click() Dim i As Integer Randomize For i = 1 To 20 a(i) = Int(90 * Rnd + 10) Tex
32、t1 = Text1 & a(i) & If i Mod 10 = 0 Then Text1 = Text1 & vbCrLf Next iEnd Sub“统计”按钮Private Sub Command2_Click() Dim b(10 To 99) As Integer Dim i As Integer, j As Integer Dim sum As Integer For i = 1 To 20 b(a(i) = 1 Next i For i = 10 To 99 sum = sum + b(i) Next i Text2 = CStr(sum)End Sub“清除”按钮Privat
33、e Sub Command3_Click() Text1.Text = Text2.Text = Command1.SetFocusEnd Sub“结束”按钮Private Sub Command4_Click() EndEnd Sub1:判定素数过程Dim a(20) As IntegerPrivate Sub Command1_Click() Dim n As Integer, i As Integer Randomize For i = 1 To 20 n = Int(Rnd * 100 + 1) a(i) = n List1.AddItem a(i) Next iEnd SubPriv
34、ate Sub Command2_Click() Dim i As Integer For i = 1 To 20 If prime(a(i) = True Then List2.AddItem a(i) Next iEnd SubPrivate Function prime(n As Integer) As Boolean Dim i As Integer If n = 1 Then prime = True Else For i = 2 To Sqr(n) If n Mod i = 0 Then Exit For Next i If i Sqr(n) Then prime = True E
35、nd IfEnd Function2:求最大公约数Private Sub Command1_Click() Dim m As Integer, n As Integer m = Text1 n = Text2 Text3 = gcd(m, n)End SubPrivate Function gcd(m As Integer, n As Integer) Dim k As Integer Do k = m Mod n m = n n = k Loop Until k = 0 gcd = mEnd Function3:冒泡排序过程Dim a(10) As IntegerPrivate Sub Co
36、mmand1_Click() Dim i As Integer Randomize For i = 1 To 10 a(i) = Int(Rnd * 90 + 10) Text1 = Text1 & a(i) & Next iEnd SubPrivate Sub Command2_Click() Dim i As Integer, j As Integer Call sort(a(), 10) For i = 1 To 10 Text2 = Text2 & a(i) & Next iEnd SubPrivate Sub sort(a() As Integer, n As Integer) Di
37、m i As Integer, j As Integer, t As Integer For i = 1 To n - 1 For j = i To n If a(j) a(i) Then t = a(j) a(j) = a(i) a(i) = t End If Next j Next iEnd Sub4: 顺序查找过程Option Base 1Option ExplicitDim a(10) As IntegerPrivate Sub Command1_Click() Dim i As Integer, n As Integer, k As Integer n = Text2 For i =
38、 1 To 10 If a(i) = n Then MsgBox 要查找的数 & CStr(i) & 个元素, vbOKOnly, 顺序查找 Exit Sub End If Next i MsgBox 要查找的数不存在!, vbOKOnly, 顺序查找End SubPrivate Sub Form_activate() Dim i As Integer Randomize For i = 1 To 10 a(i) = Int(Rnd * 100) Text1 = Text1 & a(i) & Next iEnd Sub5:判断回文数过程Private Sub Command1_Click()
39、Dim x As String, y As String, c As String Dim i As Integer x = Text1.Text For i = 1 To Len(x) c = Mid(x, i, 1) y = c & y Next i If x = y Then Label1.Caption = x & 是回文数 Else Label1.Caption = x & 不是回文数 End IfEnd Sub6:递归函数求阶乘Private Sub Command1_Click() EndEnd SubPrivate Sub List1_DblClick() Dim m As I
40、nteger Call fact(Val(List1.List(List1.ListIndex), m) Text1 = mEnd SubPrivate Sub fact(n As Integer, m As Integer) Dim i As Integer m = 1 For i = 2 To n m = m * i Next iEnd Sub7:递归函数求Fibonacci数列Private Sub Command1_Click() Text2 = fab(Val(Text1.Text)End SubPrivate Function fab(n As Integer) As Intege
41、r If n = 1 Or n = 2 Then fab = 1 Else fab = fab(n - 2) + fab(n - 1) End IfEnd Function8,9: 对角线之和Option ExplicitOption Base 1Dim a(5, 5) As IntegerPrivate Sub Command1_Click() Dim i As Integer, j As Integer For i = 1 To 5 For j = 1 To 5 a(i, j) = Int(9 * Rnd + 1) Text1 = Text1 & a(i, j) & Next j Text
42、1 = Text1 & vbCrLf Next iEnd SubPrivate Sub Command2_Click() Dim b(5) As Integer, i As Integer, j As Integer For i = 1 To 5 For j = 1 To 5 b(i) = b(i) + a(i, j) Next j Text2 = Text2 & b(i) & vbCrLf Next iEnd SubPrivate Sub Command3_Click() Dim b(5) As Integer, i As Integer, j As Integer For i = 1 To
43、 5 For j = 1 To 5 b(i) = b(i) + a(j, i) Next j Text6 = Text6 & b(i) & Next iEnd SubPrivate Sub Command4_Click() Dim i As Integer, s1 As Integer, s2 As Integer For i = 1 To 5 s1 = s1 + a(i, i) Next i Text3.Text = s1 For i = 1 To 5 s2 = s2 + a(i, 6 - i) Next i Text4.Text = s2End SubPrivate Sub Command
44、5_Click() Dim i As Integer, j As Integer, s As Integer For i = 1 To 5 For j = 1 To 5 s = s + a(i, j) Next j Next i Text5.Text = sEnd Sub10矩阵转置Private Sub Cmd生成_Click() n = InputBox(请输入方阵的阶数:) ReDim A(n, n) As Integer Randomize For I = 1 To n For J = 1 To n A(I, J) = Int(90 * Rnd) + 10 Text1.Text = T
45、ext1.Text & A(I, J) & Next J Text1.Text = Text1.Text & vbCrLf Next IEnd SubPrivate Sub Cmd转置1_Click() For I = 1 To n For J = 1 To n Text2.Text = Text2.Text & A(J, I) & Next J Text2.Text = Text2.Text & vbCrLf Next IEnd SubPrivate Sub Cmd清除_Click() Text1.Text = Text2.Text = Cmd生成.SetFocusEnd SubPrivat
46、e Sub Cmd结束_Click() EndEnd Sub附录资料:不需要的可以自行删除VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。关于HOOKS 使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOU
47、SE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你
48、自己的HOOK函数。该函数语法如下: public function MyHook(nCode,wParam,iParam) as long 加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 注释对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消
49、息,这时,HOOK函数中的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 注释 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。HOOK类型 WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMes
50、sage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。 WH_CBT Hook 系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执
51、行上面的操作。 WH_DEBUG HOOK 系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。 WH_FOREGROUNDIDLE Hook 系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。 WH_GETMESSAGE Hook WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。 WH_JOURNALRECORD Hook WH_JOURNAL
52、RECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook返回一个时
53、间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。 WH_KEYBOARD Hook WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。 WH_MOUSE Hook WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。 WH_MSGFILTER and WH_SYSMSGFILTE
54、R Hooks WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。 WH_SHELL Hook 一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。 使用HOOK 安装、销毁HOOK过程
55、监视系统事件安装、销毁HOOK过程 使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As LongidHook代表是何种Hook,有以下几种
56、Public Const WH_CALLWNDPROC = 4 Public Const WH_CALLWNDPROCRET = 12 Public Const WH_CBT = 5 Public Const WH_DEBUG = 9 Public Const WH_FOREGROUNDIDLE = 11 Public Const WH_GETMESSAGE = 3 Public Const WH_HARDWARE = 8 Public Const WH_JOURNALPLAYBACK = 1 Public Const WH_JOURNALRECORD = 0 Public Const WH_
57、KEYBOARD = 2 Public Const WH_MOUSE = 7 Public Const WH_MSGFILTER = (-1) Public Const WH_SHELL = 10 Public Const WH_SYSMSGFILTER = 6lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式 Private Function HookFunc(ByVal nCode As
58、 Long, _ ByVal wParam As Long, _ ByVal lParam As Long ) As Long nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。 wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。 因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunchmod 代表.DLL的hInstance,如果是Local Hook
59、,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(.dll名称)来传入。dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设一个Re
60、mote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最後的那一个所拦截,也就是说A先做keyboard Hook,而後B才做,那讯息被B拦截,那A呢?就看B的Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。Declare Function CallNextHookEx Lib user32 Alias CallNextHookEx _ (ByVal h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2.1 口算除法(1)(教案)-2024-2025学年三年级下册数学人教版
- 第三单元 第1课时 数数、数的组成(一)(教学设计)一年级数学下册同步高效课堂系列(人教版2024)
- 2025年中考数学试题分类汇编:概率(6大考点55题) (第1期)原卷版
- 单元4 日常生活中常见的材料教学设计-2025-2026学年初中化学仁爱科普版九年级下册-仁爱科普版2012
- 2025年中考化学试题分类汇编:科学探究题(第1期)原卷版
- 第8课 初识Python教学设计-2025-2026学年小学信息技术(信息科技)六年级上册青岛版(六三制)
- 2025年高考全国一卷数学试题(解析卷)
- 2025常规商品进口合同
- 向日葵趣味题目及答案
- 2025年江西省中考生物试题(含答案)
- 注册安全工程师考试建筑施工(初级)安全生产实务试题及解答
- 2025年城镇燃气条例竞赛题库
- GB/T 22030-2025车用乙醇汽油调合组分油
- 展厅预算装修方案(3篇)
- 肺癌的护理新进展
- 2025年煤炭矿山职业技能鉴定考试-综采考试历年参考题库含答案解析(5套100道单选题合辑)
- 供电公司保密培训课件
- 车务段安全培训课件
- 供电外协人员管理办法
- DBJT 13-318-2025建筑施工盘扣式钢管脚手架安全技术标准
- 2025武汉辅警考试真题
评论
0/150
提交评论