VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 在 VB 中实现关联窗口的隐藏
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:13754, 日期:2002-03-29
在 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.d1vb.com 来我们一起讨论。