• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tự động tìm hWnd đến lớp con cháu

Các mẹo vặt linh tinh khác, không thuộc nhóm nào
User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Tự động tìm hWnd đến lớp con cháu

Postby truongphu » Wed 18/03/2009 3:41 pm

Thủ thuật: Tự động tìm hWnd đến lớp con cháu
Tác giả: truongphu
Mô tả: Với hàm FindWindowEx, tự động tìm hWnd đến lớp con cháu


Projet nén Ðê Quy HWnd.Rar đính kèm có trình HardCopy là trình tôi dùng để test bài nầy vì có nhiều cửa sổ con cháu.
Code sau đây chạy khá tốt, Khi cho chạy nền HardCopy, các cửa sổ con cháu hiện rõ... và quan trọng nhất là thoát dễ dàng
Nhưng đoạn code cuối của sub ÐêQuyHWnd(XhWnd&) thì viết không đẹp lắm:
  1. ' For aaa = 1 To List1.ListCount    
  2. Dim VH&: VH& = Val(List1.List(5))      
  3.  ÐêQuyHWnd (VH&)      
  4. '  Next
nghĩa là với mỗi giá trị Val(List1.List(6)), Val(List1.List(7)), Val(List1.List(8)) đều có lớp con cháu
Nhưng kẹt mỗi cái là tôi đưa vào vòng lặp không được, chúng biến thành vòng Vô tận
Mong anh NoBi sửa lại đoạn nầy giùm. cảm ơn

[vb]Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 SendMessage Lib "user32" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const WM_GETTEXTLENGTH = &HE: Const WM_GETTEXT = &HD
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Dim D As New Dictionary, dd%, aaa%

Public Function WinGetText$(hwnd&)
Dim Length&
Length& = SendMessage(hwnd&, WM_GETTEXTLENGTH, ByVal 0, ByVal 0) + 1
WinGetText$ = Space(Length&)
SendMessage hwnd&, WM_GETTEXT, ByVal Length&, ByVal StrPtr(WinGetText$)
WinGetText$ = Left$(WinGetText$, Length&)
End Function
Private Sub Command1_Click()
List1.Clear
Dim h&, i&, C&, lpClassName$: lpClassName = Space(256)
Do
DoEvents
h& = FindWindow(vbNullString, Text1)
If (h& = 0) Or (h& = i&) Then Exit Do
List1.AddItem h
List2.AddItem WinGetText$(h&)
C& = GetClassName(h&, lpClassName$, 256)
List3.AddItem Left$(lpClassName, C&)
i& = h&
Loop
ÐêQuyHWnd (h&)
End Sub

Private Sub ÐêQuyHWnd(XhWnd&)
On Error Resume Next
Dim Xh&, C&, lpClassName$: lpClassName = Space(256)

Do: DoEvents
Xh& = FindWindowEx(XhWnd&, Xh&, vbNullString, vbNullString)
If Xh& = 0 Then Exit Do
If D.Exists(Xh) Then
Exit Do
Else
D.Add Xh, dd
List1.AddItem Xh
List2.AddItem WinGetText$(Xh&)
C& = GetClassName(Xh&, lpClassName$, 256)
List3.AddItem Left$(lpClassName, C&)
dd = dd + 1
End If
Label3.Caption = D.Count
Loop

' For aaa = 1 To List1.ListCount
Dim VH&: VH& = Val(List1.List(5))
ÐêQuyHWnd (VH&)
' Next
End Sub[/vb]
untitled.JPG

.
.
.
Ðê Quy HWnd.rar
(44.05 KiB) Downloaded 559 times


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
NoBi
Quản trị
Quản trị
Posts: 961
Joined: Tue 18/03/2008 1:22 pm
Location: Sài Gòn
Has thanked: 53 times
Been thanked: 66 times
Contact:

Re: Ðệ Quy HWnd. (Kính nhờ NoBi sửa)

Postby NoBi » Thu 19/03/2009 9:45 am

Có phải ý chú là làm như thế này?.
Attachments
Untitled.jpg
HWnd.rar
(1.94 KiB) Downloaded 348 times
:>

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Ðệ Quy HWnd. (Kính nhờ NoBi sửa)

Postby truongphu » Thu 19/03/2009 10:32 am

Cảm ơn NoBi, Đúng ý :D

- Đơn giản với getChild1 và getChild2 thế đệ quy
- NoBi lấy code của bài "Cha và con" thế bài đệ quy nầy !

còn code đệ quy tạm treo
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh


Return to “[VB] Mẹo vặt khác”

Who is online

Users browsing this forum: No registered users and 0 guests