VB 枚举窗口和关闭程序窗口的代码

这个VB代码模块提供了枚举桌面窗口并关闭特定窗口的功能。通过FindWindow和FindWindowEx等API函数,可以查找指定类名或窗口名的窗口,并使用PostMessage发送WM_CLOSE消息来关闭它们。
Attribute VB_Name  =   " Enum_Window "
Option   Explicit
Option  Base  0
'Powered by barenx
Public   Declare   Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As StringByVal lpWindowName As StringAs Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongByVal hWnd2 As LongByVal lpsz1 As StringByVal lpsz2 As StringAs Long
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As LongByVal hWndNewParent As LongAs Long
Public Const LWA_COLORKEY = &H1
Public Const LWA_ALPHA = &H2
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000
Public Const WS_EX_TRANSPARENT As Long = &H20&
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongByVal nIndex As LongAs Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongByVal nIndex As LongByVal dwNewLong As LongAs Long
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As LongByVal crKey As LongByVal bAlpha As ByteByVal dwFlags As LongAs Long

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongByVal wMsg As LongByVal wParam As LongByVal lParam As LongAs Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongByVal lpString As StringByVal cch As LongAs Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As LongByVal wCmd As LongAs Long
Public Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Public Const GW_CHILD = 5
Public Const GW_HWNDNEXT = 2
Public Const WM_CLOSE = &H10
Public Const WM_QUIT = &H12
Public Const MAX_PATH As Integer = 260

'***************************************************************************************************************
Public Sub CloseWindow(ByRef WinText() As String)
  
On Error Resume Next
  
Dim i As Long, lngDeskTopHandle As Long, lngHand As Long, StrName As String
  lngDeskTopHandle 
= GetDesktopWindow()
  lngHand 
= GetWindow(lngDeskTopHandle, GW_CHILD)
  
Do While lngHand <> 0
    StrName 
= Space(MAX_PATH)
    GetWindowText lngHand, StrName, MAX_PATH
    StrName 
= StrCutNull(Trim$(StrName))
    
If StrName <> vbNullString Then
      
For i = 0 To UBound(WinText)
        
If InStr(1UCase$(StrName), UCase$(WinText(i))) > 0 Then
          PostMessage lngHand, 
&H11, 00 'public Const WM_QUERYENDSESSION = &H11
          PostMessage lngHand, WM_QUIT, 00
          PostMessage lngHand, 
&H16, 00 'public Const WM_ENDSESSION = &H16
          PostMessage lngHand, WM_QUIT, 00
        
End If
      
Next i
    
End If
    lngHand 
= GetWindow(lngHand, GW_HWNDNEXT)
  
Loop
  CloseHandle lngDeskTopHandle
  CloseHandle lngHand
End Sub


Public Sub GetWindowsList(ByRef WindowsName() As String)
  
On Error Resume Next
  
Dim i As Long, lngDeskTopHandle As Long, lngHand As Long, StrName As String
  lngDeskTopHandle 
= GetDesktopWindow()
  lngHand 
= GetWindow(lngDeskTopHandle, GW_CHILD)
  i 
= 0
  
Do While lngHand <> 0
    StrName 
= Space(MAX_PATH)
    GetWindowText lngHand, StrName, MAX_PATH
    StrName 
= StrCutNull(Trim$(StrName))
      
If StrName <> vbNullString Then
        
ReDim Preserve WindowsName(i)
        WindowsName(i) 
= StrName
        Debug.Print StrName
        i 
= i + 1
      
End If
    lngHand 
= GetWindow(lngHand, GW_HWNDNEXT)
  
Loop
  CloseHandle lngDeskTopHandle
  CloseHandle lngHand
End Sub

Public Function StrCutNull(IStr As StringAs String
  
Dim i As Long
  i 
= InStr(1, IStr, Chr(0))
  
If i <= 1 Then
    StrCutNull 
= vbNullString
  
Else
    StrCutNull 
= Left$(IStr, i - 1)
  
End If
End Function

 
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值