把我在老博客上一些比较好的原创搬过来,这是我寒假里写的日志。
终于考完试了,可以在家好好呆一阵子了。这些天狂学VB,因为我知道不会编程始终都成为不了高手。我暑假里学过VB,借助的是黑鹰基地的VB教程,感觉stef老师和"快乐的青蛙"老师讲课都讲得很好。但那时是零起步,只是掌握一些基本的东西。现在有时间,我决定系统地进行学习。我的打算是从VB与文件系统(FSO)、VB与注册表、VB与API、VB与网络通信,最后是VB与木马病毒一步一步进行。据我现在所学的,VB操作注册表,一是调用API函数,还有就是用wscript.shell。这两天刚好学习到了API,感觉API的功能真是强大,不过也很难学,还好兴趣支持着我努力学习。
下面我就用VB结合API函数来实现Windows窗口的隐藏。
Windows的工作机制可以说是三个关键的概念:窗口、事件和消息。“资源管理器”窗口、弹出的对话框等都是窗口。可实际上,文本框、命令按钮、选择按钮、菜单条甚至图标也都是窗口。Windows操作系统通过给每一个窗口指定一个唯一的标识号来管理所有的窗口。我们调用showwindow这个API函数就可以实现对窗口的隐藏。如果是隐藏当前窗口,我们用getforegroundwindow这个API函数简单地实现,那如果是隐藏全部窗口呢?其实思路差不多的,再引入enumWindows这个API函数来枚举所有的父窗口从而取得全部窗口的句柄。还有一点,应用这个函数还需另个声明一个回调函数。回调函数这个东西我也不是很清楚,简单地说就是应用程序与系统DLL之间的调用函数。说说轻松,实现起来还是有点难度的,以下就是代码,并有比较详细的注释说明。
新建一个EXE工程,添加一个COMMAND按钮和一个标准模块。在模块中写入代码:
Option Explicit
Dim AllhWnd() As Long '动态数组,用来保存取得的全部窗口的句柄
Dim AllhWnd_i, AllhWnd_j As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal lParam As Long) As Long '枚举窗口列表中的所有父窗口(顶级和被所有窗口)
Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long '控制窗口的可见性
Const SW_HIDE = 0 '隐藏常数
Public Function EnumWindowsProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Long '这个就是回调函数,用来遍查全部窗口句柄
AllhWnd_i = AllhWnd_i + 1
ReDim Preserve AllhWnd(AllhWnd_i) '动态变量
AllhWnd(AllhWnd_i) = app_hwnd '保存句柄
EnumWindowsProc = True '循环,继续列举hwnd
End Function '注:每枚举一个窗口需调用一次回调函数
Public Function HideAllWindow() '自已定义的一个函数,用来设置全部窗口的隐藏。
EnumWindows AddressOf EnumWindowsProc, 0 '传递回调函数的指针给EnumWindows 函数。枚举窗口列表中的所有父窗口(顶级和被所有窗口)
For AllhWnd_j = 1 To AllhWnd_i
ShowWindow AllhWnd(AllhWnd_j), SW_HIDE '逐个隐藏全部窗口
Next
End Function
接下来双击COMMAND1,写入代码:
Private Sub Command1_Click() HideAllWindow '调用标准模块里的HideAllWindow函数 End Sub
编译成EXE文件,运行一下,就实现了对全部窗口的隐藏,可以在虚拟机里做下测试,也可以在本机上测试重起后还原全部窗口。
这个编程例子总的体会是想用VB实现强大的功能API是不可或缺的。
2007-02-08 02:37
本文永久链接地址:http://www.hack520.org/vb-windows-hide
