VB编程中应用全局钩子实现应用程序的一键隐藏与显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011.02
电脑编程技巧与维护
1问题的引入
尝试着将全局钩子技术应用到了VB 编程中,用来实现内
存中带有句柄应用程序窗口的一键隐藏与显示,用VB 做如下的界面设计,如图1所示。
界面中的列表框中显示当前内存中运行的所有程序,在此可双击鼠标选择要隐藏的程序,在“隐藏键”后面的下拉式组合列表中选择隐藏程序时的按键,在“显示键”后的下拉式组合列表中选择要显示已被隐藏程序的按键,单击“设置”命令按钮完成设置,可以单击“隐藏到系统托盘”将Tools 窗口隐藏也可以最小化。
当需要隐藏或显示程序时,按设置好的键,即可。
下面将介绍在VB 编程中使用钩子技术实现应用程序的一键隐藏与显示的方法。
2钩子及相关API
2.1基本原理
钩子的本质是一段用以处理系统消息的程序,通过系统
调用,将其挂入到系统。
钩子机制允许应用程序截获并处理
发往指定窗口的消息或特定事件,其监视的窗口即可以是本进程内的,也可以是由其他进程所创建的。
在特定的消息发出,并在到达目的窗口之前,钩子程序先行截获此消息并得到对其的控制权。
此时在钩子函数中就可以对截获的消息进行各种修改处理,甚至强行终止该消息的继续传递。
任何一个钩子都有一个由系统来维护的指针列表(钩子链表),其指针指向钩子的各个处理函数。
最近安装的钩子放在链的开始,最早安装的钩子则放在最后。
当钩子监视的消息出现时,操作系统调用链表开始处的第一个钩子处理函数进行处理,也就是说最后加入的钩子优先获得控制权。
因此,为了设置钩子,只需将回调函数放置于链首即可,操作系统会使其首先被调用。
在这里提到的钩子处理函数必须是一个回调函数(callback function ),而且不能定义为类成员函数,必须定义为普通的C 函数。
在使用钩子时可以根据其监视范围的不同将其分为全局钩子和局部钩子两大类,其中局部钩子只能监视某个线程也叫线程钩子,而全局钩子则可对在当前系统下运行的所有线程进行监视。
显然,线程钩子可以看作是全局钩子的一个子集,全局钩子虽然功能强大但其钩子函数的实现必须封装在动态链接库中才可以使用。
在VB 编程中正是通过此种方式来应用全局钩子的。
2.2相关API 及函数2.2.1SetWindowsHookEx ()
SetWindowsHookEx ()负责将回调函数放置于钩子链表的开始位置。
SetWindowsHookEx ()函数原型声明如下:
VB 编程中应用全局钩子实现应用程序的一键隐藏与显示
张静
(河套大学机电与信息工程学院,巴彦淖尔015000)
摘要:介绍了钩子的基本原理及分类、钩子过程和相关的API 函数,以及VB 编程中全局钩子的使用方法,同时也对全局钩子在其他软件中的应用提出了思路。
关键词:动态链接库;全局钩子;API ;钩子过程
A Key to Hide and Show an Specified Application Program Window
with the Remote Hook Technology in the VB Programming
ZHANG Jing
(School of Mechanical Electronic &Information Engineer ,Hetao University ,Bayannaoer 015000)
Abstract:This paper introduced the basic principle of the ho ok ,the classification of the hook and the related API functions ,as well as the methods used in the VB programming about the remote hook,but also put forward ideas on how to apply the remote hook in the other software.
Key words:dynamic link library ;remote hook ;API ;hook function
作者简介:张静,女,讲师,学士,研究方向:计算机应用技术及数据库技术。
收稿日期:2010-11-19
图1界面设计
Tools
本地磁盘(F :)
hao123--我的上网主页-Microsoft Internet Explorer 我的电脑
同花顺492-同花顺决策家III-自选报价
全局钩子技术在VB 编程中的应用-Microsoft Word Program Manager
名称
同花顺492-同花顺决策家III
隐藏键F5显示键F11
显示所有进程设置隐藏到托盘
帮助
结束
32
SOFTWARE DEVELOPMENT AND DESIGN软件开发与设计
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,
DWORD dwThreadId);
(1)参数说明
idHook:钩子的类型,此参数可以是表1列出的值之一。
lpfn:钩子处理函数地址。
hMod:包含钩子函数的模块句柄。
dwThreadid:钩子的监控线程,如果明确指定了某个线程ID就只监视该线程,此时钩子为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。
(2)函数说明
函数将在系统中挂上一个由idhook指定类型的钩子,监控并处理相应的特定消息。
如果调用成功,SetWindowsHookEx()函数的返回值就是所安装的钩子过程的句柄,否则返回NULL,如表1所示。
2.2.2钩子过程
钩子定义形式如下:
LRESUL CALLBACK HookProc(int nCode,WPARAM wparam,LPARAM lparam);
各参数的含义及取值如下:
(1)nCode
nCode参数是HOOK代码,HOOK过程使用这个参数来确定任务。
这个参数的值依赖于HOOK类型,每一种HOOK都有自己的HOOK代码特征字符集。
(2)wparam和lparam
wparam和lparam参的值依赖于HOOK代码,但是它们的典型值包含了关于发送或者接收消息的信息。
2.2.3CallNextHookEx()
每一个钩子处理函数在进行相应的处理完成之后,如果要把信息继续传递给钩子链表中下一个钩子过程,就可以通过函数CallNextHookEx()来实现。
该函数的功能是把钩子信息传递给链中下一个等待接收消息的钩子过程。
该函数的原型如下:
LRESULT CallNextHookEx(HHOOK hhk;int nCode,
WPARAM wParam,LPARAM lParam);
其中,参数hhk为由SetWindowsHookEx()函数返回的当前钩子句柄;其他3个参数与相应的钩子过程的参数相同,就是同HookProc()的参数相同。
2.2.4UnhookWindowsHookEx()
UnhookWindowsHookEx()为卸载钩子的函数,该函数只有一个参数用于指定此前由SetWindowsHookEx()函数所返回的钩子句柄,原型声明如下:
BOOL UnhookWindowsHookEx(HHOOK hhk);
3全局钩子在VB编程中的应用
3.1编写动态链接库,封装全局钩子
使用全局钩子时要编写一个动态链接库文件,即dll文件,在VB编程中通过调用dll中的导出函数,实现应用程序的目标。
首先在VC++6.0中创建dll文件,命名为hidedll.dll,其中hidedll.cpp中定义共享数据、钩子过程及钩子的安装、卸载函数如下:
#include<windows.h>
#include<stdio.h>
HHOOK gkeyhook=NULL;
UINT key1=NULL;
UINT key2=NULL;
#pragma data_seg("mydata”)
HWND g_hWnd=NULL;
UINT gKey1=NULL;
UINT gKey2=NULL;
#pragma data_seg()
LRESULT CALLBACK KeyProc(int code,WPARAM wParam,LPARAM lParam)
{if(wParam==gKey1)
{::ShowWindow(g_hWnd,SW_SHOW);}
if(wParam==gKey2)
{::ShowWindow(g_hWnd,SW_HIDE);}
return CallNextHookEx(gkeyhook,code,wParam,lParam);
}
void__stdcall SetHidehook(HWND ahwnd,UINT showk, UINT hidek)
{g_hWnd=ahwnd;gKey1=showk;gKey2=hidek;
gkeyhook=::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyProc,::GetModuleHandle("Hidedll.
dll"),0);
}
void__stdcall UnHidehook(HWND ahwnd)
{g_hWnd=ahwnd;
UnhookWindowsHookEx(gkeyhook);
}
另外,在dll的hidedll.def文件中指明导出函数并指出mydata的属性为可读可写且是共享的:
LIBRARY Hidedll
EXPORTS
SetHidehook
UnHidehook
SEGMENTS
mydata READ WRITE SHARED
idHook取值
WH_CALLWNDPROC
WH_CALLWNDPROCRET WH_CBT
WH_DEBUG
WH_FOREGROUNDIDLE WH_GETMESSAGE
WH_JOURNALPLAYBACK WH_JOURNALRECORD WH_KEYBOARD
WH_KEYBOARD_LL
WH_MOUSE
WH_MOUSE_LL
WH_MSGFILTER
WH_SYSMSGFILTER
WH_SHELL
说明
安装一个钩子过程,在操作系统将消息发送到目标窗口处理过程之前,对
该消息进行监视
安装一个钩子过程,对已被目标窗口过程处理后的消息进行监视
安装一个钩子过程,接受对计算机的训练(CBT)应用程序有用的消息
安装一个钩子过程,以便对其他钩子过程进行调试。
安装一个钩子过程,该钩子过程当应用程序的前台线程处于空闲状态时,
可以使用它执行低优先级的任务。
安装一个钩子过程,对发送到消息队列中的消息进行监视。
安装一个钩子过程,使用该钩子回放先前使用WH_JOURNALRECORD
钩子记录的一系列消息
安装一个钩子过程,对发送到系统消息队列的输入消息进行记录
安装一个钩子过程,对键盘按键消息进行监视
此钩子过程只能在Windows NT安装,用来对底层的键盘输入事件进行监视
安装一个钩子过程,对鼠标消息进行监视
此钩子过程只能在Windows NT安装,用来对底层的鼠标输入事件进行监视
安装一个钩子过程,以监视由菜单栏、滚动条、消息框或对话框中的输入
事件引发的消息
安装一个钩子过程,以监视由菜单栏、滚动条、消息框或对话框中的输入事
件引发的消息。
该钩子过程对系统中所有应用程序的这类消息都进行监视
安装一个钩子过程,以接受对外壳应用程序有用的通知
表1idHook取值
(下转到50页)
33
2009.
2011.02
2011.02
电脑编程技巧与维护
3.2VB 一键隐藏与显示的核心代码3.2.1声明钩子API 函数
Private Declare Sub SetHidehook Lib "Hidedll.dll"
(ByVal hwnd1As Long,ByVal key1As Long,ByVal key2As Long)
Private Declare Sub UnHidehook Lib "Hidedll.dll"(ByVal hwnd1As Long)3.2.2挂接钩子
在程序运行时选择要隐藏的程序,选择隐藏按键和显示按键,单击“设置”按钮时挂接钩子,代码如下:
Private Sub Command2_Click ()
If Len (Trim (Txthwnd.Text))<=0Then
MsgBox "请在列表框中双击您要隐藏的进程",vbOKOnly +vbInformation,"提示"Exit Sub Else
myhwnd =FindWindow (vbNullString,List1.List (List1.ListIndex))End If
Dim key1As Long,key2As Long If Combo1.Text =""Then
MsgBox "请选择您想用的显示键",vbOKOnly +vbInformation,"提示"Exit Sub Else
key1=K1End If
If Combo2.Text =""Then
MsgBox "请选择您想用的隐藏键",vbOKOnly +vbInformation,"提示"Exit Sub Else
key2=K2End If
If key1=key2Then
MsgBox "显示和隐藏不能是同一个键",vbOKOnly,"提示"
Exit Sub End If
Call SetHidehook (myhwnd,key1,key2)End Sub 3.2.3卸载钩子
单击“结束”按钮卸载钩子,代码如下:Private Sub Command3_Click ()UnHidehook myhwnd Call DelNotify End End Sub
4结语
系统钩子具有相当强大的功能,通过这种技术可对几乎
所有的Windows 系统消息进行拦截、监视、处理。
这种技术可以广泛应用于各种软件,以上只介绍了全局钩子技术对键盘消息的拦截结合VB 编程实现应用程序的一键隐藏与显示。
钩子及其相关的函数作为用户自定义API ,定义时使用了_stdcall 声明,只要是_stdcall (标准调用)声明的函数,可在任何语言中被调用,包括script 语言。
使用时只要把动态链接库文件复制到应用程序所在的目录,在应用程序中对导出函数作相应的声明,即可被调用。
参考文献
[1]刘基全.VC6.0下实现屏蔽键盘按键[J].电脑编程技巧与
维护,2010,4(下):111-113.
[2]宗平.Visual C++6.0应用与开发指南[M].北京:人民邮
电出版社,1999.
[3]龚沛曾,陆慰民,杨志强.Visual Basic 程序设计教程(6.0版)[M].北京:高等教育出版社,2000
(上接第33页)
开发的教职工工资查询系统主要是采用原型开发方法,这种开发方法是系统开发人员凭借自己对用户需求的理解,通过强有力的软件环境支持,构造出一个实在的系统原型,然后与用户协商,反复修改直至用户满意。
2.4安全设计
在设计工资查询系统时从3个方面进行安全性的考虑:在服务器端设置SQL Server 数据库,设置唯一的访问权限;在编写代码时对显示的用户名及口令进行加密处理,以掩码的形式显示个人信息;最重要的是采用脚本编码器命令行工具,它使脚本设计者可以对最终的脚本进行编码。
当脚本编码器被调用时,在开始标记前脚本块内的内容保持不变,而其他内容被编码,从而对数据库所在的服务器、数据库名称、用户名及密码信息进行了有效的保护。
3结语
开发的工资查询系统要求取代传统纸质工资条签领模式,
实现了工资项目的网络自助查询。
员工查询个人工资发放情况就像上网查询银行账单一样快捷、方便,极大地简化了人事与行政工作,并使得工资发放与查询达到了零耗时、零耗损,突破了时间和空间的限制,从而提高了学院行政部门的办公效率。
工资查询系统也是学院网络化办公的一部分,也推动了学院网络化办公的进程。
开发的学院工资查询系统灵活性、可扩充性强,通过修改员工信息的数据库,就可以实现不同性质、不同规模的企事业单位职工的工资查询。
参考文献
[1]强锋科技 项目开发指南[M].清华大学出版社,
2010.
[2]叶金平.基于ASP 工资查询系统的开发与应用[J].财会
通讯,2006,(06).
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
50。