小工具-VB枚举顶级窗窗口及子窗口句柄和类名!

' 窗体代码:

Option   Explicit

Private   Sub  Check1_Click()
    
Dim  t  As   Long
    
If  Me.Check1.Value  =   1   Then
        t 
=  HWND_TOPMOST
    
Else
        t 
=  HWND_NOTOPMOST
    
End   If
    
Call  SetWindowPos(Me.hwnd, t, Me.Left, Me.Top, Me.Width, Me.Height,  3 )
End Sub

Private   Sub  cmdEnumAll_Click()
    Me.lvDetail.ListItems.Clear
    
Call  EnumWindows(AddressOf EnumWindowProc,  & H0 & )
End Sub

Private   Sub  cmdEnumChild_Click()
    
If  Me.lvDetail.SelectedItem  Is   Nothing   Then
        
MsgBox   " 无子窗体可枚举 " , vbOKOnly  +  vbInformation,  " 提示 "
        
Exit   Sub
    
End   If
    
Dim  lParam  As   Long
    lParam 
=   0
    
Call  EnumChildWindows(GetKey(Me.lvDetail.SelectedItem.Key), AddressOf EnumChildWindowProc, lParam)
    
If  lParam  =   0   Then
        
MsgBox   " 当前窗口无子窗口! " , vbOKOnly  +  vbInformation,  " 提示 "
    
End   If
End Sub

Private   Sub  cmdEnumParent_Click()
    
If  Me.lvDetail.SelectedItem  Is   Nothing   Then
        
MsgBox   " 无上一级窗体可枚举 " , vbOKOnly  +  vbInformation,  " 提示 "
        
Exit   Sub
    
End   If
    
If  GetParent(GetKey(Me.lvDetail.SelectedItem.Key))  =   0   Then
        
MsgBox   " 当前窗体是顶级窗口! " , vbOKOnly  +  vbInformation,  " 提示 "
        
Exit   Sub
    
Else
        
If  GetParent(GetParent(GetKey(Me.lvDetail.SelectedItem.Key)))  =   0   Then
            
Call  cmdEnumAll_Click
        
Else
            
Dim  lParam  As   Long
            lParam 
=   0
            
Call  EnumChildWindows(GetParent(GetParent(GetKey(Me.lvDetail.SelectedItem.Key))), AddressOf EnumChildWindowProc, lParam)
        
End   If
    
End   If
End Sub

Public   Sub  cmdGetMouseWindow_Click()
    idHotKey 
=   1
    
If  Timer1.Enabled  =   False   Then
        Me.Timer1.Interval 
=   1
        Me.Timer1.Enabled 
=   True
        Me.cmdGetMouseWindow.Caption 
=   " 停止鼠标获取(CTRL+S) "
        Modifiers 
=  MOD_CONTROL
        idHotKey 
=   1
        
If  RegisterHotKey(Me.hwnd, idHotKey, Modifiers, vbKeyS)  =   False   Then
            
MsgBox   " 注册Ctrl+S热键失败 " , vbOKOnly  +  vbYesNo,  " 提示 "
        
End   If
        preWinProc 
=  SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndProc)
    
Else
        Me.Timer1.Enabled 
=   False
        Me.cmdGetMouseWindow.Caption 
=   " 鼠标获取 "
        SetWindowLong Me.hwnd, GWL_WNDPROC, preWinProc
        
If  UnregisterHotKey(Me.hwnd, idHotKey)  =   False   Then
            
MsgBox   " 取消热键Ctrl+S失败 " , vbOKOnly  +  vbInformation,  " 提示 "
        
End   If
    
End   If
End Sub

Private   Sub  cmdSendMessage_Click()
    
On   Error   GoTo  errHandle:
    
Call  SendMessage( CLng (Me.txthWnd.Text),  CLng (Me.txtMsg.Text),  CLng (Me.txtWparam.Text),  CLng (Me.txtlParam.Text))
    
Exit   Sub
errHandle:
    
MsgBox  Err.Description

End Sub

Private   Sub  Form_Load()
    Me.Check1.Value 
=   0
    Me.Check1.Value 
=   1
End Sub

Private   Sub  Timer1_Timer()
    
Dim  PT  As  POINTAPI
    
Dim  strTitle  As   String
    
Dim  strClassName  As   String
    
Dim  myItem  As  ListItem
    
Call  GetCursorPos(PT)
    
Dim  hwnd  As   Long
    hwnd 
=  WindowFromPoint(PT.x, PT.y)
    
Call  GetTitleClass(hwnd, strTitle, strClassName)
    Me.lvDetail.ListItems.Clear
    
Set  myItem  =  Me.lvDetail.ListItems.Add(, MakeKey( CStr (hwnd)))
    myItem.Text 
=  strTitle
    myItem.SubItems(
1 =  strClassName
    myItem.SubItems(
2 =  hwnd
End Sub
' 模块代码:

Option   Explicit

Public   Const  LVIF_INDENT  As   Long   =   & H10
Public   Const  LVIF_TEXT  As   Long   =   & H1
Public   Const  LVM_FIRST  As   Long   =   & H1000
Public   Const  LVM_SETITEM  As   Long   =  (LVM_FIRST  +   6 )
Public   Const  HWND_TOPMOST  =   - 1
Public   Const  HWND_NOTOPMOST  =   - 2
Public   Const  SWP_SHOWWINDOW  =   & H40
Public   Const  WM_HOTKEY  =   & H312
Public   Const  MOD_ALT  =   & H1
Public   Const  MOD_CONTROL  =   & H2
Public   Const  MOD_SHIFT  =   & H4
Public   Const  GWL_WNDPROC  =  ( - 4 )

Public  preWinProc  As   Long
Public  Modifiers  As   Long , uVirtKey  As   Long , idHotKey  As   Long

Public  Type POINTAPI
        x 
As   Long
        y 
As   Long
End  Type

Public  Type LVITEM
   mask 
As   Long
   iItem 
As   Long
   iSubItem 
As   Long
   state 
As   Long
   stateMask 
As   Long
   pszText 
As   String
   cchTextMax 
As   Long
   iImage 
As   Long
   lParam 
As   Long
   iIndent 
As   Long
End  Type

Public  Declare  Function  WindowFromPoint Lib  " user32 "  (ByVal xPoint  As   Long , ByVal yPoint  As   Long As   Long
Public  Declare  Function  GetCursorPos Lib  " user32 "  (lpPoint  As  POINTAPI)  As   Long
Public  Declare  Function  RegisterHotKey Lib  " user32 "  (ByVal hwnd  As   Long , ByVal id  As   Long , ByVal fsModifiers  As   Long , ByVal vk  As   Long As   Boolean
Public  Declare  Function  UnregisterHotKey Lib  " user32 "  (ByVal hwnd  As   Long , ByVal id  As   Long As   Boolean
Public  Declare  Function  SetWindowLong Lib  " user32 "  Alias  " SetWindowLongA "  (ByVal hwnd  As   Long , ByVal nIndex  As   Long , ByVal dwNewLong  As   Long As   Long
Public  Declare  Function  GetWindowLong Lib  " user32 "  Alias  " GetWindowLongA "  (ByVal hwnd  As   Long , ByVal nIndex  As   Long As   Long
Public  Declare  Function  CallWindowProc Lib  " user32 "  Alias  " CallWindowProcA "  (ByVal lpPrevWndFunc  As   Long , ByVal hwnd  As   Long , ByVal msg  As   Long , ByVal wParam  As   Long , ByVal lParam  As   Long As   Long
Public  Declare  Function  SetWindowPos Lib  " user32 "  _
    (ByVal hwnd 
As   Long , ByVal hWndInsertAfter  As   Long , _
    ByVal x 
As   Long , ByVal y  As   Long , ByVal cx  As   Long , ByVal cy  As   Long , _
    ByVal wFlags 
As   Long As   Long

Public  Declare  Function  EnumWindows Lib  " user32 "  _
  (ByVal lpEnumFunc 
As   Long , _
   ByVal lParam 
As   Long As   Long
  
Public  Declare  Function  EnumChildWindows Lib  " user32 "  _
  (ByVal hWndParent 
As   Long , _
   ByVal lpEnumFunc 
As   Long , _
   ByRef lParam 
As   Long As   Long

Public  Declare  Function  GetWindowTextLength Lib  " user32 "  _
    Alias 
" GetWindowTextLengthA "  _
   (ByVal hwnd 
As   Long As   Long
   
Public  Declare  Function  GetWindowText Lib  " user32 "  _
    Alias 
" GetWindowTextA "  _
   (ByVal hwnd 
As   Long , _
    ByVal lpString 
As   String , _
    ByVal cch 
As   Long As   Long
   
Public  Declare  Function  GetClassName Lib  " user32 "  _
    Alias 
" GetClassNameA "  _
   (ByVal hwnd 
As   Long , _
    ByVal lpClassName 
As   String , _
    ByVal nMaxCount 
As   Long As   Long

Public  Declare  Function  IsWindowVisible Lib  " user32 "  _
   (ByVal hwnd 
As   Long As   Long
  
Public  Declare  Function  GetParent Lib  " user32 "  _
   (ByVal hwnd 
As   Long As   Long

Public  Declare  Function  SendMessage Lib  " user32 "  _
   Alias 
" SendMessageA "  _
  (ByVal hwnd 
As   Long , _
   ByVal wMsg 
As   Long , _
   ByVal wParam 
As   Long , _
   lParam 
As  Any)  As   Long
Public   Function  wndProc(ByVal hwnd  As   Long , ByVal msg  As   Long , ByVal wParam  As   Long , ByVal lParam  As   Long As   Long
    
If  msg  =  WM_HOTKEY  Then
        
If  wParam  =  idHotKey  Then
            
Call  frmLookWindow.cmdGetMouseWindow_Click
        
End   If
    
End   If
    wndProc 
=  CallWindowProc(preWinProc, hwnd, msg, wParam, lParam)
End Function

' EnumWindows函数所需要的回调函数
Public   Function  EnumWindowProc(ByVal hwnd  As   Long , _
                               ByVal lParam 
As   Long As   Long
    
Dim  myItem  As  ListItem
    
Dim  nSize  As   Long
    
Dim  strTitle  As   String
    
Dim  strClassName  As   String
    
If  GetParent(hwnd)  =   0   And  IsWindowVisible(hwnd)  Then
        
Call  GetTitleClass(hwnd, strTitle, strClassName)
        
Set  myItem  =  frmLookWindow.lvDetail.ListItems.Add(, MakeKey( CStr (hwnd)))
        myItem.Text 
=  strTitle
        myItem.SubItems(
1 =  strClassName
        myItem.SubItems(
2 =  hwnd
    
End   If
    EnumWindowProc 
=   1
End Function
' EnumChildWindows函数所需要的回调函数
Public   Function  EnumChildWindowProc(ByVal hwnd  As   Long , _
                                    ByRef lParam 
As   Long As   Long
    
Dim  myItem  As  ListItem
    
Dim  nSize  As   Long
    
Dim  strTitle  As   String
    
Dim  strClassName  As   String
    
If  lParam  =   0   Then
        frmLookWindow.lvDetail.ListItems.Clear
    
End   If
    lParam 
=   1
    
Call  GetTitleClass(hwnd, strTitle, strClassName)
    
Set  myItem  =  frmLookWindow.lvDetail.ListItems.Add(,  " A "   &  hwnd)
    myItem.Text 
=  strTitle
    myItem.SubItems(
1 =  strClassName
    myItem.SubItems(
2 =  hwnd
    EnumChildWindowProc 
=   1
End Function
' 获得标题和类名
Public   Sub  GetTitleClass(ByVal hwnd  As   Long , Title  As   String , ClassName  As   String )
    
Dim  nSize  As   Long
    
Dim  strTitle  As   String
    
Dim  strClassName  As   String
    nSize 
=  GetWindowTextLength(hwnd)
    
If  nSize  >   0   Then
        strTitle 
=   Space ( 255 )
        
Call  GetWindowText(hwnd, strTitle,  Len (strTitle))
        strTitle 
=   Trim (strTitle)
    
Else
        strTitle 
=   " No Title "
    
End   If
    strClassName 
=   Space ( 255 )
    
Call  GetClassName(hwnd, strClassName,  Len (strClassName))
    strClassName 
=   Trim (strClassName)
    Title 
=  strTitle
    ClassName 
=  strClassName
End Sub
Public   Function  GetKey(str  As   String As   String
    GetKey 
=   Right (str,  Len (str)  -   1 )
End Function
Public   Function  MakeKey(str  As   String As   String
    MakeKey 
=   " A "   &  str
End Function

转载于:https://www.cnblogs.com/fxwdl/archive/2006/08/08/471285.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值