如何遍历系统中正在运行的所有程序的窗口句柄

时间:2021-03-06 05:02:51
如何遍历系统中正在运行的所有程序的窗口句柄

8 个解决方案

#1


EnumWindows,EnumDesktopWindows

#2


chenhui 能够为enumdesktopwindows 举一个例程吗?

#3


这还要我写??google上N多,而且这个函数很简单就是注册一个回调函数而已

#4


人家指了路,就自己走吧.

难不成还让人背你~~~

#5


VB获取所有运行程序的句柄
http://zhidao.baidu.com/question/32186766.html
http://www.hur.cn/program/bbs/VB/200201/620029.html

#6


VB获取所有运行程序的句柄
http://zhidao.baidu.com/question/32186766.html
http://www.hur.cn/program/bbs/VB/200201/620029.html

#7


以下模块:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

'自定义数据类型
Public Type mType
   fhwnd As Long        '窗口句柄
   fText As String * 255    '窗口标题
   fRect As RECT        '窗口矩形
   pHwnd As Long        '父窗句柄
   pText As String * 255    '父窗标题
End Type

'获取控件信息,写成SUB了,其实用FUNCTION返回值也可以,只是函数里面定义就多了,总的来看需要2个mType数组,这样做只需要一个,占用空间小了
Public Sub mGetAllWindow(m_Type() As mType)

   Dim Wndback As Long        '上一个被查找的目标句柄
   Dim i As Long            '数组控制

   Do
     ReDim Preserve m_Type(i)
     DoEvents
     '获取hwnd,第一个参数指定为0,查找桌面子窗口,第2个参数是开始查找的窗口,第34个参数使函数查找所有窗口
     m_Type(i).fhwnd = FindWindowEx(0, Wndback, vbNullString, vbNullString)
    
     If m_Type(i).fhwnd = 0 Then    '=0时已经查找一遍了,退出
         Exit Sub
     Else                    '否则获取控件相关消息
         '获取标题
         GetWindowText m_Type(i).fhwnd, m_Type(i).fText, 255
         '获取RECT
         GetWindowRect m_Type(i).fhwnd, m_Type(i).fRect
         '获取父HWND
         m_Type(i).pHwnd = GetParent(m_Type(i).fhwnd)
         '获取父标题
         GetWindowText m_Type(i).pHwnd, m_Type(i).pText, 255
     End If
     Wndback = m_Type(i).fhwnd      '保存上一个查的句柄
     i = i + 1
   Loop
End Sub

以下在窗体:(添加一个LISTVIEW1,一个COMMAND1)



Private Sub Command1_Click()

   Dim cType() As mType
   mGetAllWindow cType()
  
   Dim i As Long
  
   ListView1.ListItems.Clear
  
   For i = LBound(cType) To UBound(cType)
     ListView1.ListItems.Add , "a" & i, cType(i).fhwnd
     ListView1.ListItems("a" & i).SubItems(1) = cType(i).fText
     ListView1.ListItems("a" & i).SubItems(2) = cType(i).fRect.Left
     ListView1.ListItems("a" & i).SubItems(3) = cType(i).fRect.Bottom
     ListView1.ListItems("a" & i).SubItems(4) = cType(i).fRect.Top
     ListView1.ListItems("a" & i).SubItems(5) = cType(i).fRect.Right
     ListView1.ListItems("a" & i).SubItems(6) = cType(i).pHwnd
     ListView1.ListItems("a" & i).SubItems(7) = cType(i).pText
   Next

End Sub

Private Sub Form_Load()

   ListView1.ColumnHeaders.Add , , "句柄", 1200
   ListView1.ColumnHeaders.Add , , "标题", 2800
   ListView1.ColumnHeaders.Add , , "Rect.Left", 800
   ListView1.ColumnHeaders.Add , , "Rect.Bottom", 800
   ListView1.ColumnHeaders.Add , , "Rect.Top", 800
   ListView1.ColumnHeaders.Add , , "Rect.Right", 800
   ListView1.ColumnHeaders.Add , , "父窗句柄", 1200
   ListView1.ColumnHeaders.Add , , "父窗标题", 2800

   ListView1.View = lvwReport
   ListView1.FullRowSelect = True
   Command1.Caption = "刷新"
  
End Sub

#8


以后需再关注,现在先帮你顶一下

#1


EnumWindows,EnumDesktopWindows

#2


chenhui 能够为enumdesktopwindows 举一个例程吗?

#3


这还要我写??google上N多,而且这个函数很简单就是注册一个回调函数而已

#4


人家指了路,就自己走吧.

难不成还让人背你~~~

#5


VB获取所有运行程序的句柄
http://zhidao.baidu.com/question/32186766.html
http://www.hur.cn/program/bbs/VB/200201/620029.html

#6


VB获取所有运行程序的句柄
http://zhidao.baidu.com/question/32186766.html
http://www.hur.cn/program/bbs/VB/200201/620029.html

#7


以下模块:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

Private Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

'自定义数据类型
Public Type mType
   fhwnd As Long        '窗口句柄
   fText As String * 255    '窗口标题
   fRect As RECT        '窗口矩形
   pHwnd As Long        '父窗句柄
   pText As String * 255    '父窗标题
End Type

'获取控件信息,写成SUB了,其实用FUNCTION返回值也可以,只是函数里面定义就多了,总的来看需要2个mType数组,这样做只需要一个,占用空间小了
Public Sub mGetAllWindow(m_Type() As mType)

   Dim Wndback As Long        '上一个被查找的目标句柄
   Dim i As Long            '数组控制

   Do
     ReDim Preserve m_Type(i)
     DoEvents
     '获取hwnd,第一个参数指定为0,查找桌面子窗口,第2个参数是开始查找的窗口,第34个参数使函数查找所有窗口
     m_Type(i).fhwnd = FindWindowEx(0, Wndback, vbNullString, vbNullString)
    
     If m_Type(i).fhwnd = 0 Then    '=0时已经查找一遍了,退出
         Exit Sub
     Else                    '否则获取控件相关消息
         '获取标题
         GetWindowText m_Type(i).fhwnd, m_Type(i).fText, 255
         '获取RECT
         GetWindowRect m_Type(i).fhwnd, m_Type(i).fRect
         '获取父HWND
         m_Type(i).pHwnd = GetParent(m_Type(i).fhwnd)
         '获取父标题
         GetWindowText m_Type(i).pHwnd, m_Type(i).pText, 255
     End If
     Wndback = m_Type(i).fhwnd      '保存上一个查的句柄
     i = i + 1
   Loop
End Sub

以下在窗体:(添加一个LISTVIEW1,一个COMMAND1)



Private Sub Command1_Click()

   Dim cType() As mType
   mGetAllWindow cType()
  
   Dim i As Long
  
   ListView1.ListItems.Clear
  
   For i = LBound(cType) To UBound(cType)
     ListView1.ListItems.Add , "a" & i, cType(i).fhwnd
     ListView1.ListItems("a" & i).SubItems(1) = cType(i).fText
     ListView1.ListItems("a" & i).SubItems(2) = cType(i).fRect.Left
     ListView1.ListItems("a" & i).SubItems(3) = cType(i).fRect.Bottom
     ListView1.ListItems("a" & i).SubItems(4) = cType(i).fRect.Top
     ListView1.ListItems("a" & i).SubItems(5) = cType(i).fRect.Right
     ListView1.ListItems("a" & i).SubItems(6) = cType(i).pHwnd
     ListView1.ListItems("a" & i).SubItems(7) = cType(i).pText
   Next

End Sub

Private Sub Form_Load()

   ListView1.ColumnHeaders.Add , , "句柄", 1200
   ListView1.ColumnHeaders.Add , , "标题", 2800
   ListView1.ColumnHeaders.Add , , "Rect.Left", 800
   ListView1.ColumnHeaders.Add , , "Rect.Bottom", 800
   ListView1.ColumnHeaders.Add , , "Rect.Top", 800
   ListView1.ColumnHeaders.Add , , "Rect.Right", 800
   ListView1.ColumnHeaders.Add , , "父窗句柄", 1200
   ListView1.ColumnHeaders.Add , , "父窗标题", 2800

   ListView1.View = lvwReport
   ListView1.FullRowSelect = True
   Command1.Caption = "刷新"
  
End Sub

#8


以后需再关注,现在先帮你顶一下