用VB6编写强力的windows隐藏引擎
2006-02-27 21:11:54 来源:WEB开发网编程爱好者一定经常见到能够隐藏桌面项目和状态栏等的软件,其中最著名的就是Hide-It。其实我们能够编写一个功能更加强大的即时超级隐藏引擎,它不仅可以隐藏桌面项目、开始按钮、状态栏、时钟栏,而且可以隐藏任何软件的按钮、菜单、工具栏、文本框、状态栏等等,只要是能够看见的独立部分——当然也可以轻松的将它们恢复出来。操作更是方便到了点击“开始隐藏”按钮,然后将鼠标放到需要隐藏的项目上,按下F12键即可——点哪就隐藏哪——这也是我称之为“隐藏引擎”的原因。
一、编程原理
(1)WINDOWSAPI函数ShowWindow可以实现对程序界面(包括WINDOWS9X和其他应用软件)以及子项目的显示控制,通过调用相关消息常数SW_HIDE=0(隐藏)和SW_SHOW=5(显示)就可以执行对指定界面项目的隐藏和重新显示出来。它所需要的另外一个参数是被隐藏项目的句柄;
(2)GetCursorPos函数能够返回当前鼠标所在位置的屏幕坐标,而函数WindowFromPointXY恰好能够根据屏幕坐标返回该位置的窗体项目句柄——这正是我们所需要的!
(3)为了方便操作,我们需要为它注册一个系统级工作(激活)热键,我选择了F12;SetWindowLong、GetWindowLong、CallWindowPRoc、RegisterHotKey、UnregisterHotKey是五个必须的热键注册、反注册函数;使用它们一定要小心谨慎,否则可能会导致开发平台的暂时崩溃,你不得不看到“该程序执行了非法操作,即将被关闭”的警示窗口,而且你的工作成果会立即化为乌有;但是如果你按照本文的编写方法,保你“一路平安”;
(4)为了方便“记忆力”不好的朋友,我们需要一个列表框来显示已经被隐藏的项目的句柄,以便能够适当、必要的提醒。
二、编程实践
(1)启动vb6,建立一个标准exe工程,添加一个窗体CHINAHIDE,添加四个command控件hideOK对应“开始隐藏”、unhide对应“恢复一个”、uNhideall对应“全部恢复”;添加listbox控件list1(用来纪录句柄);两个标签控件用来显示有关提示信息。调整上述控件到适当位置和合适大小,双击窗体,写入以下代码:
DimLasthWndAsInteger'被隐藏项目句柄
PrivateSubForm_Load()
'程序启动时注册功能热键F12
preWinProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
SetWindowLongMe.hwnd,GWL_WNDPROC,AddressOfWndproc
uVirtKey=vbKeyF12
RegisterHotKeyMe.hwnd,1,Modifiers,uVirtKey
EndSub
PrivateSubuNhideall_Click()
'恢复所有被隐藏项目
Forres=0ToList1.ListCount-1
LasthWnd=List1.List(res)
ShowWindowLasthWnd,SW_SHOW
Nextres
List1.Clear
'清空句柄列表框
EndSub
PublicSubhideOK_Click()
'当"开始隐藏"按钮被点击时,将窗口最小化
Me.WindowState=1
EndSub
PrivateSubUNHIDE_Click()
'恢复一个选定的被隐藏项目
IfList1.ListIndex<0Then
MsgBox"请首先选择一个被恢复的隐藏项目!",vbExclamation
ExitSub
EndIf'验证句柄列表栏目是否已经被选中
hideINDEX=List1.ListIndex
LasthWnd=List1.List(hideINDEX)
X=ShowWindow(LasthWnd,SW_SHOW)
'恢复选定的被隐藏项目
List1.RemoveItem(hideINDEX)
'移除该项目有关信息
EndSub
PrivateSubForm_Unload(CancelAsInteger)
'当程序被关闭时,取消已经注册的热键
SetWindowLongMe.hwnd,GWL_WNDPROC,preWinProc
UnregisterHotKeyMe.hwnd,uVirtKey
'取消系统级热键,释放资源
End'终止程序运行
EndSub
'主窗体代码结束
(2)添加一个标准模块,命名为MOULDLE1,写入以下代码:
PublicDeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
'在窗口结构中为指定的窗口设置信息
PublicDeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong)AsLong
'从指定窗口的结构中取得信息
PublicDeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
'运行指定的进程
PublicDeclareFunctionRegisterHotKeyLib"user32"(ByValhwndAsLong,ByValIDAsLong,ByValfsModifiersAsLong,ByValvkAsLong)AsLong
'向系统注册一个指定的热键
PublicDeclareFunctionUnregisterHotKeyLib"user32"(ByValhwndAsLong,ByValIDAsLong)AsLong
'取消热键并释放占用的资源
'上述五个API函数是注册系统级热键所必需的,具体实现过程如后文所示
PublicDeclareFunctionShowWindowLib"user32"(ByValhwndAsLong,ByValnCmdShowAsLong)AsLong
'本函数是实现隐藏的核心,参数HWND既是需要隐藏项目的句柄
'nCmdShow参数可以决定使隐藏还是显示
PublicDeclareFunctionGetCursorPosLib"user32"(lpPointaspOINTAPI)AsLong
'本函数得到当前鼠标所在位置的屏幕坐标
PublicDeclareFunctionWindowFromPointXYLib"user32"Alias"WindowFromPoint"(ByValxPointAsLong,ByValyPointAsLong)AsLong
'本函数根据屏幕坐标返回被隐藏项目的句柄
PublicTypePOINTAPI
XAsLong
YAsLong
EndType'鼠标坐标类型定义
PublicConstSW_HIDE=0'隐藏常数
PublicConstSW_SHOW=5'显示常数
PublicConstWM_HOTKEY=&H312
'热键标志常数,用来判断当键盘按键被按下时是否命中了我们设定的热键
PublicConstGWL_WNDPROC=(-4)
PublicpreWinProcAsLong,MyhWndAsLong,uVirtKeyAsLong
'定义系统的热键,原中断标示,被隐藏的项目句柄
'请紧记下面的热键拦截函数,它将对你将来编写WINDOWS32高级控制程序大有帮助!
PublicFunctionWndproc(ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
'热键拦截过程
IfMsg=WM_HOTKEYThen'如果拦截到热键标志常数
IfwParam=1Then
'如果是我们的定义的热键F12...
'为了节省篇幅,我对热键拦截处理不是非常严密...
hideDONE
'执行隐藏鼠标所指项目
EndIf
EndIf
'如果不是热键,或者不是我们设置的热键,交还控制权给
'系统,继续监测热键
Wndproc=CallWindowProc(preWinProc,hwnd,Msg,wParam,lParam)
EndFunction
PublicSubhideDONE()'最关键的项目隐藏过程
PublicSubhideDONE()
Dimpt32AsPOINTAPI
GetCursorPospt32''得到鼠标屏幕坐标
MyhWnd=WindowFromPointXY(pt32.X,pt32.Y)
''得到所在位置窗体项目句柄
IfMyhWnd=Chinahide.hwndThenExitSub
'拒绝隐藏程序自身
Chinahide.List1.AddItem(MyhWnd)
''添加相关信息
ShowWindowMyhWnd,SW_HIDE
'执行隐藏功能
EndSub
‘模块结束
本文代码不仅将向编程爱好者展示“隐藏引擎”的魅力,也将让您立刻成为一个后台控制和系统级热键的编程高手。它适用于windows95/98/nt4/me/2000,vb5/6开发平台。
看到这里,你一定会想到能够将它应用到哪里了吧(譬如加个密码就可以保护你的桌面!)——心动不如行动,DOITBYYOUSELF!
->- ››编写Linux系统下Daemon程序的方法步骤
- ››编写组件,使用JavaScript更新UpdatePanel
- ››编写多文档应用程序
- ››编写自定义的 Android Preference 组件
- ››编写高效的Android代码
- ››编写 Android第一个程序 Hello, Android!
- ››编写使用root权限的android应用程序
- ››编写 android 简单的手势切换视图示例
- ››编写高效的 Android 代码
- ››编写一个STL中的CString类
- ››编写操作 DB2 数据的 Web 应用程序(第 1 部分)
- ››编写操作 DB2 数据的 Web 应用程序(第 2 部分)
更多精彩
赞助商链接