资源描述
vb控件的使用
使用ADO Data控件
ADO Data控件使用MicrosoftActiveX数据对象(ADO)来快速建立数据绑定的控件和数据提供者之间的连接。数据绑定控件是任何具有“数据源”属性的控件。数据提供者可以是任何符合OLE DB规范的数据源。使用Visual Basic的类模块也可以很方便地创建子集的数据提供者。
尽管可以在应用程序中直接使用ActiveX数据对象,但ADO Data控件有作为一个图形控件的优势(具有“向前”和“向后”按钮),以及一个易于使用的界面,使您可以用最少的代码创建数据库应用程序。
在Visual Basic的“工具箱”中,不少控件都可以作为数据绑定的控件,包括复选框、组合框、图像、标签、列表框、图片框以及文本框控件等。此外,Visual Basic还包括了若干种数据绑定的ActiveX控件,诸如DataGrid、DataCombo、Chart以及 DataList控件等。用户也可以创建自己的数据绑定的ActiveX控件,或从其他开发商购买控件。
Visual Basic以前的版本提供了内在的 Data 控件和 Remote Data 控件(RDC) 来进行数据访问。这两种控件仍包括在 Visual Basic中,以提供向后兼容。不过,因为 ADO 的适应性更广,因此建议用户使用ADO Data控件来创建新的数据库应用程序。
详细信息 关于数据绑定的控件的完整列表位于“绑定到ADO Data控件的控件”中。要了解如何使用这些内在的Data 控件或 Remote Data 控件,请参阅“使用 Data 控件”或“使用 Remote Data 控件”。关于创建数据提供者的详细信息,请参阅“创建数据识别类”。
可能的用法
连接一个本地数据库或远程数据库。
打开一个指定的数据库表,或定义一个基于结构化查询语言 (SQL) 的查询、或存储过程、或该数据库中的表的视图的记录集合。
将数据字段的数值传递给数据绑定的控件,可以在这些控件中显示或更改这些数值。
添加新的记录,或根据对显示在绑定的控件中的数据的任何更改来更新一个数据库。
要创建一个客户或前端数据库应用程序,应在窗体中添加ADO Data控件,以及其它所需要的任何 Visual Basic控件。可以根据您的需要在窗体中放置多个ADO Data控件。不过,请注意,这种控件是一种相当“昂贵”的创建连接的方法,应在第一个控件至少有两个连接,且以后的每个控件至少多一个连接时使用。
用最少的代码创建一个前端数据库应用程序
通过在设计时设置一些属性,可以用最少的代码来创建一个数据库应用程序。如果正在使用OLE DB 数据源,则相应的Microsoft 数据链接名称(DataLink Name)(.MDL) 必须是在您的机器上创建的。请参阅“创建 Northwind的OLE DB Data Link”,以获得一个循序渐进的示例。
要创建一个简单的前端数据库应用程序:
1. 在窗体上放置一个ADO Data控件(该图标的工具提示为 "ADODC")如果该控件不在“工具箱”中,请按 CTRL+T 键,显示“部件”对话框。在这个“部件”对话框中,单击“MicrosoftADO DataControl”。
2. 在“工具箱”中,单击选定“ADO Data控件”。然后按 F4 键显示“属性”窗口。
3. 在“属性”窗口中,单击“ConnectionString”显示“ConnectionString”对话框。
4. 如果您已经创建了一个 Microsoft 数据链接文件(Data Link file)(.MDL),请选择“使用 OLE DB 文件”并单击“浏览”,以找到计算机上的文件。如果使用 DSN,则单击“使用 ODBC 数据源名”,并从框中选择一个 DSN,或单击“新建”创建一个。如果想创建一个连接字符串,请选择“使用 ConnectionString”,单击“生成”,然后使用“数据链接属性”对话框创建一个连接字符串。在创建连接字符串后,单击“确定”。ConnectionString 属性将使用一个类似于下面这一行的字符串来填充:
driver={SQL Server};server=bigsmile;uid=sa;pwd=pwd;database=pubs
5. 在“属性”窗口中,将“记录源”属性设置为一个 SQL 语句。例如:SELECT * FROM Titles WHERE AuthorID = 72在访问一个表时,应始终包括一个 WHERE 子句。如果这样做失败,则会锁定整个表,这样对其他用户将是一个严重的障碍。
6. 在窗体上再放置一个“文本框”控件,用来显示数据库信息。
7. 在其“属性”窗口中,将 Text1 的“数据源”属性设为ADO Data控件的名称 (ADODC1)。这样就将这个文本框和ADO Data控件绑定在一起。
8. 在其“属性”窗口中,单击“数据字段”将下拉得到一个可用的字段列表。单击所要显示的字段的名称。
9. 对希望访问的其它每个字段重复第 6、7、8 步。
10. 按 F5 键运行该应用程序。用户可以在ADO Data控件中使用四个箭头按钮,从而允许用户到达数据的开始、记录的末尾或在数据内从一个记录移动到另一个记录。
在程序中设置 ConnectionString、Source、DataSource以及 DataField下面的代码演示了如何在程序中设置这四个属性。注意设置 DataSource 属性要使用 Set 语句。
Private Sub Form_Load()
With ADODC1
.ConnectionString = "driver={SQL Server};" & _
"server=bigsmile;uid=sa;pwd=pwd;database=pubs"
. RecordSource = "Select * From Titles Where AuthorID = 7"
End With
Set Text1.DataSource = ADODC1
Text1.DataField = "Title"
End Sub
ADO Data 控件的事件
ADO Data控件提供了若干个可以编程的事件。下表说明了这些事件及其何时产生,不过这个表不是一个关于这些事件何时发生的所有条件的完整列表。更完整的信息,请参阅各个事件的参考主题。
详细信息 如果试图循序渐进地使用ADO Data控件,请参阅“使用DataGrid 和ADO数据控件创建一个简单的数据库应用程序”,“ 创建一个简单的DataCombo应用程序”以及“创建一个连接 DataList控件的DataGrid”。
设置ADO Data控件的与数据库相关的属性
当创建连接时,您可以使用下列三种源之一:一个连接字符串,一个 OLE DB文件(.MDL),或一个 ODBC 数据源名称(DSN)。当您使用 DSN 时,则无须更改控件的任何其它属性。
不过,如果对数据库技术比较了解,可以更改在ADO Data控件中出现的其它的一些属性。下面的列表说明了该控件的与数据库相关的一些属性。这个列表同时也建议了设置这些属性的逻辑顺序。
注意 数据库技术是比较复杂的,下列的建议并不意味着一定要视为规则。
1. ConnectionString—ConnectionString 属性是一个字符串,可以包含进行一个连接所需的所有设置值。在该字符串中所传递的参数是与驱动程序相关的。例如,ODBC 驱动程序允许该字符串包含驱动程序、提供者、缺省的数据库、服务器、用户名称以及密码等。
2. UserName—用户的名称,当数据库受密码保护时,需要指定该属性。和Provider 属性类似,这个属性可以在 ConnectionString 中指定。如果同时提供了一个 ConnectionString 属性以及一个 UserName 属性,则ConnnectionString 中的值将覆盖 UserName 属性的值。
3. Password—在访问一个受保护的数据库时也是必需的。和 Provider 属性、 UserName 属性类似,如果在ConnectionString 属性中指定了密码,则将覆盖在这个属性中指定的值。
4. RecordSource—这个属性通常包含一条语句,用于决定从数据库检索什么信息。
5. CommandType—CommandType 属性告诉数据提供者 Source 属性是一条 SQL 语句、一个表的名称、一个存储过程还是一个未知的类型。
6. CursorLocation—这个属性指定光标的位置,是位于客户还是位于服务器
上。这一决策将影响您对下面几个属性的设置。
7. CursorType—CursorType 属性决定记录集是静态类型、动态类型、还是键集光标类型。
8. LockType—LockType 属性决定当其他人试图更改您正在编辑的数据时,如何锁定该数据。如何设置这个 LockType 属性是一个复杂的决策,取决于多个因素。
9. Mode—Mode 属性决定想用记录集进行什么操作。例如,如果只是想要创建一个报告,可以将该属性设为只读来获得性能的改善。
10. MaxRecords—这个属性决定光标的大小。如何决定这个属性的值取决于所检索的记录的大小,以及计算机的可用资源(内存)的多少。一个大的记录(包括很多列以及长字符串)比小记录要花费更多的资源。因此,MaxRecords 属性就不能太大。
11. ConnectionTimeout—设置等待建立一个连接的时间,以秒为单位。如果连接超时,则返回一个错误。
12. CacheSize—CacheSize 属性指定从光标中可以检索多少条记录。如果将CursorLocation 设为客户端,则这个属性只能设为一个较小的数目(可能为1),不会有任何不利的影响。如果光标的位置位于服务器端,则可以对这个数进行调整,将其设为你希望一次可以查看的行数。例如,如果使用 DataGrid 控件来查看 30 行,则可以将 CacheSize 设为 60,这样不必检索更多的数据就可以进行滚动。
13. BOFAction、EOFAction—这两个属性决定当该控件位于光标的开始和末尾时的行为。提供的选择包括停留在开始或末尾、移动到第一个或最后一个记录、或添加一个新记录(只能在末尾)。
绑定到ADO Data控件的控件
任何具有 DataSource 属性的控件都可以绑定到一个ADO Data控件。下面的内在控件都可以绑定到ADO Data控件:
复选框(CheckBox)
组合框(ComboBox)
图像(Image)
标签(Label)
列表框(ListBox)
图片框(PictureBox)
文本框(TextBox)
Visual Basic的所有版本中也提供下述数据绑定的ActiveX控件:
DataList
DataCombo
DataGrid
Microsoft Hierarchical FlexGrid
RichTextBox
Microsoft Chart
DateTimePicker
ImageCombo
MonthView
最后,用户可以使用DataBinding对象创建自己的数据绑定的ActiveX控件。
详细信息 关于自己创建数据绑定控件的详细内容,请参阅“创建数据绑定用户控件”。
使用CheckBox控件
选定CheckBox控件时,这个控件将显示选定标记。通常用此控件提供Yes/No或True/False选项。可用分组的CheckBox控件显示多个选项,用户可从中选择一个或多个选项。
CheckBox控件与OptionButton控件的相同之处在于,每个都是用来指示用户所作的选择。不同之处在于,对于一组OptionButton ,一次只能选定其中的一个,而对CheckBox控件,则可选定任意数目的复选框。
详细信息 关于CheckBox控件的简单示例,请参阅第三章“窗体,控件和菜单”中的“用复选框选择单个选项”。
Value 属性
CheckBox控件的Value属性指示复选框处于选定、未选定或禁止状态(暗淡的)中的哪一种。选定时,value设置值为 1。例如:
用户单击CheckBox控件指定选定或未选定状态,然后可检测控件状态并根据此信息编写应用程序以执行某些操作。
缺省时,CheckBox控件设置为vbUnchecked。若要预先在一列复选框中选定若干复选框,则应在Form_Load或 Form_Initialize过程中将Value属性设置为vbChecked。
可将Value属性设置为vbGrayed以禁用复选框。例如,有时可能希望在满足某条件之前禁用复选框。
Click事件
无论何时单击CheckBox控件都将触发Click事件,然后编写应用程序,根据复选框的状态执行某些操作。在下例中,每次单击CheckBox控件时都将改变其Caption属性以指示选定或未选定状态。
Private Sub Check1_Click()
If Check1.Value = vbChecked Then
Check1.Caption = "Checked"
ElseIf Check1.Value = vbUnchecked Then
Check1.Caption = "Unchecked"
End If
End Sub
注意 如果试图双击CheckBox控件,则将双击当作两次单击,而且分别处理每次单击;这就是说,CheckBox控件不支持双击事件。
响应鼠标和键盘
在键盘上使用 TAB 键并按 SPACEBAR 键,由此将焦点转移到 CheckBox控件上,这时也会触发CheckBox控件的Click事件。
可以在Caption属性的一个字母之前添加连字符,创建一个键盘快捷方式来切换CheckBox控件的选择。例如:
本例中,按 ALT+C 组合键将使控件的状态在选定和未选定之间切换。
增强CheckBox控件的视觉效果
CheckBox控件象CommandButton和OptionButton控件一样,可通过更改Style属性的设置值后使用Picture、DownPicture和DisabledPicture属性增强其视觉效果。例如,有时可能希望在复选框中添加图标或位图,或者在单击或禁止控件时显示不同的图像。
使用ComboBox控件
组合框控件将文本框和列表框的功能结合在一起。有了这个控件,用户可通过在组合框中输入文本来选定项目,也可从列表中选定项目。
组合框向用户提供了供选择的列表。如果项目数超过了组合框能够显示的项目数,控件上将自动出现滚动条。用户即可上下或左右滚动列表。
何时用组合框代替列表框
通常,组合框适用于建议性的选项列表,而当希望将输入限制在列表之内时,应使用列表框。组合框包含编辑区域,因此可将不在列表中的选项输入列区域中。
此外,组合框节省了窗体的空间。只有单击组合框的向下箭头时(样式 1 的组合框除外,它总是处于下拉状态)才显示全部列表,所以无法容纳列表框的地方可以很容易地容纳组合框。
详细信息 关于这些控件的简单示例,请参阅第三章“窗体、控件和菜单”中的“使用 ListBox和ComboBox”。有关列表框控件的详细信息,还请参阅本章后面的“使用ListBox控件”。
数据绑定特性
Visual Basic中的标准版和数据绑定版的ComboBox控件。虽然通过这两个版本都可以显示、编辑和更新大多数标准类型数据库中的信息,但是DBCombo提供了更高级的数据访问特性。DBCombo控件还支持一组与标准组合框控件不同的属性和方法。
详细信息 关于详细信息,请参阅第七章“使用Visual Basic标准控件”中“使用DataList和DataCombo”控件。
组合框的样式
此处有三种组合框样式。每种样式都可在设计时或运行时来设置,而且每种样式都使用数值或相应的Visual Basic常数来设置组合框的样式。
下拉式组合框
在缺省设置 (Style = 0)下,组合框为下拉式。用户可(象在文本框中一样)直接输入文本,也可单击组合框右侧的附带箭头打开选项列表。选定某个选项后,将此选项插入到组合框顶端的文本部分中。当控件获得焦点时,也可按ALT+ DOWN ARROW键打开列表。
简单组合框
将组合框Style属性设置为 1 将指定一个简单的组合框,任何时候都在其内显示列表。为显示列表中所有项,必须将列表框绘制得足够大。当选项数超过可显示的限度时将自动插入一个垂直滚动条。用户可直接输入文本,也可从列表中选择。 象下拉式组合框一样,简单组合框也允许用户输入那些不在列表中的选项。
下拉式列表框
下拉式列表框 (Style = 2 ) 与正规列表框相似─ 它显示项目的列表,用户必须从中选择。但下拉式列表框与列表框的不同之处在于,除非单击框右侧的箭头,否则不显示列表。这种列表框与下拉式组合框的主要差别在于,用户不能在列表框中输入选项,而只能在列表中选择。当窗体上的空间较少时,可使用这种类型的列表框。
添加项目
为在组合框中添加项目,应使用AddItem方法,其语法如下:
通常在Form_Load事件过程中添加列表项目,但也可在任何时候使用AddItem方法。这样一来就能够动态地(响应用户的操作)在列表中添加项目。
以下代码将 "Chardonnay," "Fum抏 Blanc," "Gew黵ztraminer," 和 "Zinfandel"放置到名为Combo1,Style属性为 0 (vbComboDropDown) 的组合框中:
Private Sub Form_Load ()
Combo1.AddItem "Chardonnay"
Combo1.AddItem “Fum'e Blanc”
Combo1.AddItem "Gewürztraminer"
Combo1.AddItem "Zinfandel"
End Sub
运行时,只要加载窗体,而且用户单击向下箭头,则将显示如图所示的列表。
设计时添加项目
在设计时,也可设置组合框控件“属性”窗口的List属性,从而在列表中添加项目。选定List属性选项并单击向下箭头后就可输入列表项目,然后按CTRL+ENTER组合键换到新的一行。
只能将项目添加到列表的末尾。所以,如果要将列表按字母顺序排序,则应将Sorted属性设置为True。关于详细的信息,请参阅后面“排序列表”。
在指定位置添加项目
为了在列表指定位置添加项目,应在新项目后指定索引值。例如,下行代码将 "Pinot Noir" 插入到第一个位置并把其它项目的位置向下调整:
Combo1.AddItem "Pinot Noir", 0
注意,指定列表中的第一个位置的是 0 而不是 1(见图)。
排序列表
将Sorted属性设置为True并省略索引,则可在列表中指定按字母顺序添加的项目。排序时不区分大小写;所以 "chardonnay" 和 "Chardonnay" 被看作一个词。
将Sorted属性设置为True之后,使用带有index参数的AddItem方法将导致不可预料的非排序结果。
删除项目
可在组合框中用RemoveItem方法删除项目。RemoveItem有一个参数index,它指定要删除的项目:
box.RemoveItem index
box及index参数和AddItem中的参数相同。
例如,为了删除列表中的第一个项目,应添加下面一行代码:
Combo1.RemoveItem 0
为了在组合框中删除所有列表项目,应使用 Clear 方法:
Combo1.Clear
用Text属性获取列表内容
获取当前选定项目值的最简单的常用方法就是使用Text属性。在运行时无论向控件的文本框部分输入了什么文本,Text属性都与这个文本相对应。它可以是选定的列表选项,或者是用户在文本框中输入的字符串。
例如,如果用户选定列表框中的 "Chardonnay",则通过下列代码显示有关Chardonnay的信息:
Private Sub Combo1_Click ()
If Combo1.Text = "Chardonnay" Then
Text1.Text = "Chardonnay is a medium-bodied _
white wine."
End If
End Sub
Text属性包含Combo1列表框中当前选定的项目。代码查看是否选择了"Chardonnay",若是如此,则在文本框中显示信息。
用List属性访问列表选项
有了List属性就可访问列表中所有项目。该属性包含一个数组,而且列表中的每个项目都是数组的元素。每一项都表示为字符串的形式。为了引用列表中的项目,应使用如下语法:
box.List(index)
box参数引用组合框,而index是项目的位置。顶端项目的索引为0,下一个项目的索引为1,依次类推。例如,在文本框中,以下语句显示列表中的第三个项目(index = 2):
Text1.Text = Combo1.List(2)
用ListIndex属性判断位置
欲知组合框列表中选定项目位置,请使用ListIndex属性。该属性设置或返回控件中当前选定项目的索引值,而且只在运行时有效。对组合框的ListIndex属性进行设置也会触发控件的Click事件。
若选定第一个(顶端)项目,则属性值为0,选定的下一个项目属性值为1,依次类推。如果未选定项目,或者用户在组合框中输入选项(样式0 或1)而不在列表中选择现有项目,则ListIndex 为 -1。
注意NewIndex属性可用来跟踪列表中最后添加的项目的索引。向排序列表插入项目时,这一点很有用。
用ListCount属性返回项目数
为了返回组合框中的项目数,应使用ListCount属性。例如,下列语句用ListCount属性判断组合框中的项目数:
Text1.Text = "You have " & Combo1.ListCount & " _
entries listed"
附录资料:不需要的可以自行删除
VB HOOK(钩子)超级无敌详细用法(介绍)
hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。
关于HOOKS
使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
HOOK链
WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)
HOOK过程
为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的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函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。
全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。
[注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。
HOOK类型
WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK
WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。
WH_CBT Hook
系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。
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_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。
WH_JOURNALPLAYBACK Hook
` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。
WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此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_SYSMSGFILTER 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过程
监视系统事件
安装、销毁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 Long
idHook代表是何种Hook,有以下几种
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_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_MSGFILTER = (-1)
Public Const WH_SHELL = 10
Public Const WH_SYSMSGFILTER = 6
lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式
Private Function HookFunc(ByVal nCode As 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的名称我们可以任意给定,不一定叫 HookFunc
hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是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程式也来设一个Remote的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 hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。
最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()
Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" _
(ByVal hHook As Long) As Long
hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。
KeyBoard Hook的范例
Hook Function的三个叁数
nCode wParam lParam 传回值
HC_ACTION 表按键Virtual Key 与WM_KEYDOWN同若讯息要被处理传0
或
展开阅读全文