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

原创 2005年06月11日 16:59:00
'窗体代码:

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 LongAs 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 LongAs Boolean
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As LongAs Boolean
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As LongAs Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As LongAs 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 LongAs 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 LongAs Long

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

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

Public Declare Function IsWindowVisible Lib "user32" _
   (ByVal hwnd 
As LongAs Long
  
Public Declare Function GetParent Lib "user32" _
   (ByVal hwnd 
As LongAs 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 LongAs 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 LongAs 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 LongAs 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 StringAs String
    GetKey 
= Right(str, Len(str) - 1)
End Function
Public Function MakeKey(str As StringAs String
    MakeKey 
= "A" & str
End Function

EnumWindows/EnumChildWindows/ 枚举窗口 子窗口 调用实例

在msdn中查到了 这4个函数之间的关系,可惜只有VB代码,只能费一点时间将其转化为VC代码,再继续研究。执行的顺序如下EnumWindows----EnumWindowsProc----EnumCh...
  • fanpeii
  • fanpeii
  • 2010年07月30日 17:45
  • 7721

vb 获取窗口句柄 并发信息

(本文中部分使用繁体字,如果在简体系统下请将第三部实例程序记事本标题换成相对应的简体名称) 第一部分: 常用的与窗体相关的API函数 Public Declare Function ShowWi...
  • liang890319
  • liang890319
  • 2011年11月29日 08:23
  • 10324

vb 获取任意程序窗体句柄

  • 2011年08月13日 04:12
  • 65KB
  • 下载

窗体句柄:枚举出当前系统所有窗体句柄

 窗体句柄:枚举出当前系统所有窗体句柄来源: 发布时间:星期三, 2008年10月29日 浏览:2次 评论:0有时玩需要一个软件在一定时间执行一件时情,而软件本身又不提供相关接口,更不用说可编程性了,...
  • bingwa
  • bingwa
  • 2008年11月01日 08:56
  • 391

vb枚举指定窗口下控件类名及句柄

  • 2010年11月12日 23:40
  • 4KB
  • 下载

VB枚举窗口句柄的源代码

  • 2011年09月28日 14:31
  • 5KB
  • 下载

区别 FindWindow,FindWindowEx,EnumWindows,EnumChildWindows

1. FindWindow() HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName); 功能:查找与指定窗口类名和窗口名称相匹配的顶级窗口,...
  • jiangqin115
  • jiangqin115
  • 2015年07月20日 13:54
  • 6760

VB 遍历已打开的MDI子窗体

 Private Sub new_Click()For Each mdifrm In VB.Forms    If mdifrm.Caption  Me.Caption Then        Unl...
  • jyh_jack
  • jyh_jack
  • 2008年02月15日 13:56
  • 1601

VB 查找游戏窗口句柄的方法

VB 查找游戏窗口句柄的方法信息来源:黑客代码 编辑:root 浏览次数:191 加入时间:2010-3-20 1:40:47 评论(0)  [问题一,不能获得窗口句柄]一般寻找窗口句柄都是直接Fin...
  • fengfengfengmy
  • fengfengfengmy
  • 2010年05月07日 18:59
  • 5276

vb大漠注册找字以及VB后台指定窗口鼠标点击详解

  • 2013年12月11日 22:46
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小工具-VB枚举顶级窗窗口及子窗口句柄和类名!
举报原因:
原因补充:

(最多只允许输入30个字)