Excel 2010 cũng chạy được luôn!
Em hỏi thêm: "EXCEL<" là gì vậy anh? Chẳng lẽ là Class của thanh Formula?
Cả 1 dải chạy ngang màn hình gồm có 2 phần: phần trái là "Name box" có class là "Edit" còn phần phải "Formula Bar" có class là "EXCEL<"
Nhìn code thì biết tôi đã "kéo dài" cửa sổ "Formula Bar" về bên trái để nó chạy ngang hết cửa sổ. Bằng cách này thì UserForm che kín cả "Nane box" và cả "Formula Bar"
Nếu ai không muốn che "Name box" thì bỏ đoạn "kéo dài" ở sau.
-------------
Thực ra cái danh sách của bạn
thanhlanh ít dùng "thường ngày". Liệt kê tất cả các cửa sổ không khó (GetWindow, FindWindow + FindWindowEx, EnumWindows + EnumChildWindows ...) nhưng rồi nhìn vào cái danh sách ấy thì người không rành làm sao biết được cái cửa sổ ở dòng vd. 128 kia nó là cửa sổ nào? Và quan trọng thì cái cửa sổ mà ta quan tâm, mà ta đang nhìn thấy nó là cửa sổ ở dòng nào?
Thực dụng hơn là đọc một cửa sổ bất kỳ mà ta đang quan tâm, mà ta đang nhìn thấy.
Tôi đã viết một code trong Delphi để dùng "hàng ngày". Tôi dịch sang VB6 vì nó gần với mọi người trên diễn đàn hơn.
Trong tập tin đính kèm có EXE để chạy luôn và cũng có project để ai có VB6 thì tự compile.
Nếu ai lười kéo về thì dưới đây tôi có toàn bộ code trong VB6, ngắn thôi.
--------------
Trước hết nói về cách dùng
Chạy tập tin EXE.
Trong ListBox luôn có thông tin về cửa sổ ở tại vị trí trỏ chuột. Và thông tin về các cửa sổ "ông tổ", tức: cửa sổ bố, cửa sổ ông, cửa sổ cụ, kỵ ... Cứ đi sâu mãi thì sẽ có ông tổ mà Parent của "ông đó" là Desktop. Ví dụ ta mở Notepad. Cái vùng trắng mà ta viết văn bản là cửa sổ có class là "Edit". Cửa sổ này có cửa sổ "bố" với class là "Notepad". Cửa sổ "Notepad" có Parent - "bố" là Desktop.
Nếu ta đưa trỏ chuột vào đồng hồ ở khay hệ thống (vào icon ở khay thì lại khác) thì ta có cửa sổ có class là "TrayClockWClass", có "bố" với class là "TrayNotifyWnd", và "ông" với class là "Shell_TrayWnd"
Nếu ta đưa trỏ chuột vào thanh công thức Excel thì thấy cửa sổ có class là "EXCEL<" (Excel 2007, 2010) mà "bố" của nó có class là "XLMAIN". Ông bố này có Parent - "bố" là Desktop.
------------
Project VB:
Mở project mới --> đặt List1 (listbox) lên Form1 --> đặt Timer1 lên Form1 --> sửa Interval của Timer thành 500 hoặc giá trị nào đó.
code:
[GPECODE=vb]
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function IsWindowUnicode Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetParent Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetDlgCtrlID Lib "user32.dll" (ByVal hwnd As Long) As Long
Dim oldpt As POINTAPI
Private Sub Form_Load()
oldpt.x = -1
oldpt.y = -1
End Sub
Private Sub Form_Resize()
List1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
End Sub
Private Sub Timer1_Timer()
Dim pt As POINTAPI, bufor As String, s As String
Dim size As Long, h1 As Long, h2 As Long
' đọc vị trí trỏ chuột trên screen
GetCursorPos pt
' nếu vị trí thay đổi so với lúc trước thì ...
If (pt.x <> oldpt.x) Or (pt.y <> oldpt.y) Then
' nhớ vị trí hiện hành của trỏ chuột
oldpt = pt
List1.Clear
' đọc handle của cửa sổ nằm ở vị trí trỏ chuột
h1 = WindowFromPoint(pt.x, pt.y)
' nếu cửa sổ là unicode thì nhập thông tin vào caption của Form1
If IsWindowUnicode(h1) <> 0 Then
Me.Caption = "window unicode"
Else
Me.Caption = "khong window unicode"
End If
' đọc class của cửa sổ ở vị trí trỏ chuột
bufor = String(128, Chr(0))
size = GetClassName(h1, bufor, 128)
s = Mid(bufor, 1, size)
' đọc tiêu đề của cửa sổ ở vị trí trỏ chuột
size = GetWindowText(h1, bufor, 128)
s = h1 & ", " & GetDlgCtrlID(h1) & ", " & s & ", " & Mid(bufor, 1, size)
' nhập thông tin về cửa sổ vào listbox
List1.AddItem "Handle - HWND, ID, ClassName, WindowText:"
List1.AddItem s
List1.AddItem ""
List1.AddItem ""
' thông tin về các cửa sổ "bố", "ông", "cụ", "kỵ" ...
List1.AddItem "HWND, ClassName, WindowText cua cac Parent:"
' đọc ông tổ trực tiếp của cửa sổ ở trỏ chuột, tức "bố"
h2 = GetParent(h1)
' cho tới khi ông tổ hiện hành không là Desktop thì ...
Do While h2 > 0
' đọc class của ông tổ
size = GetClassName(h2, bufor, 128)
s = Mid(bufor, 1, size)
' đọc tiêu đề của ông tổ
size = GetWindowText(h2, bufor, 128)
s = h2 & ", " & s & ", " & Mid(bufor, 1, size)
List1.AddItem s
h2 = GetParent(h2)
Loop
End If
End Sub
[/GPECODE]