在 VB 中实现关联窗口的隐藏
发表于:2007-06-17来源:作者:点击数:
标签:
在 VB 中实现关联窗口的隐藏 作者 武汉 艾军 在以前的文章中,我曾经介绍过如何用 VB 来实现当前窗口、指定窗口的隐藏,但是对于关联窗口(在一个多窗口的程序中,有可能有多个子窗口,而对其中任何一个窗口的操作都应做用于全部的窗口,如隐藏该程序的任意
在 VB 中实现关联窗口的隐藏
作者 武汉 艾军
在以前的文章中,我曾经介绍过如何用 VB 来实现当前窗口、指定窗口的隐藏,但是对于关联窗口(在一个多窗口的程序中,有可能有多个子窗口,而对其中任何一个窗口的操作都应做用于全部的窗口,如隐藏该程序的任意一个窗口就可以隐藏该程序的全部窗口)的隐藏却不能实现,具体如下:运行 CuteFtp (如图1),这时如果隐藏当前(指定)窗口,则只会隐藏当前的窗口,而 CuteFtp 的其他窗口还没有隐藏,这样就达不到隐藏程序的作用呢?那么要如何操作,才能实现关联窗口的隐藏呢?
1、程序思路:
首先判断需要隐藏的窗口是父窗口,还是子窗口,如果是子窗口,则可以通过 API 函数 GetParent 来取得父窗口的句柄;如果是父窗口,则要通过 API 函数 EnumWindows 来取得系统的所有窗口句柄(可先通过 API 函数 IsWindowVisible 进行过滤),然后再取得每个窗口的父窗口的句柄,并和先前取得的所有窗口句柄进行比较,如果相同,则表示该窗口是某个窗口的子窗口。
2、完整代码:
Form1.frm 文件
Option Explicit
Dim i As Integer 注释:临时变量
Private Sub Command1_Click()注释:隐藏显示操作
If Command1.Caption = "隐藏" Then
If Val(Text1.Text) = 0 Then Exit Sub 注释:如果为 0 会出现一个小小的错误
GetRelatingWin Val(Text1.Text) 注释:取得关联窗口的全部句柄
For i = 0 To UBound(RelatingHwnd)
ShowWindow RelatingHwnd(i), SW_HIDE 注释:对取得关联窗口的全部句柄进行隐藏操作
Next
Command1.Caption = "显示"
Else
For i = 0 To UBound(RelatingHwnd)
ShowWindow RelatingHwnd(i), SW_SHOW 注释:注释:对取得关联窗口的全部句柄进行显示操作
Next
Command1.Caption = "隐藏"
End If
End Sub
Module1.bas 文件
Option Explicit
Dim AllhWnd() As Long 注释:用来保存取得的全部窗口的句柄
Dim m As Long 注释:临时变量
Dim TempHwnd As Long 注释:临时变量
Public RelatingHwnd() As Long 注释:用来保存所有关联窗口的句柄
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long 注释:判断指定窗口的父窗口
Private Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Any, _
ByVal lParam As Long) As Long 注释:枚举窗口列表中的所有父窗口(顶级和被所有窗口)
Private Declare Function IsWindowVisible Lib "user32" _
(ByVal hWnd As Long) As Long 注释:判断窗口是否隐藏
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 注释:控制窗口的可见性
Public Const SW_HIDE = 0 注释:隐藏窗口
Public Const SW_SHOW = 5 注释:用当前的大小和位置显示一个窗口,同时令其进入活动状态
Private Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean 注释:遍查全部窗口句柄
If IsWindowVisible(app_hwnd) <> 0 Then 注释:判断该窗口是否隐藏,如果隐藏则过滤掉
If GetParent(app_hwnd) = RelatingHwnd(0) Then
m = m + 1
ReDim Preserve RelatingHwnd(m)
RelatingHwnd(m) = app_hwnd
End If
End If
EnumProc = True 注释:循环
End Function
注释:自定取得指定窗口的所有关联句柄的函数
Public Function GetRelatingWin(ByVal hWnd As Long)
ReDim RelatingHwnd(0)
m = 0
RelatingHwnd(m) = hWnd
TempHwnd = GetParent(hWnd) 注释:取得指定窗口的父窗口的句柄
If TempHwnd <> 0 Then
m = m + 1
ReDim Preserve RelatingHwnd(m)
RelatingHwnd(m) = TempHwnd
End If
EnumWindows AddressOf EnumProc, 0
End Function
现在通过本程序,就可实现对一个程序的完全隐藏了,不管这个程序有多少个窗口同时显示出来,本程序在 VB6.0、Win98 下运行通过,大家如果还有什么问题可到 www.d1
vb.com 来我们一起讨论。
原文转自:http://www.ltesting.net