2006-08-17 11:34 簡易視窗檢視器
我們很少去了解系統的物件,比如說Excel好了:Excel有多少層視窗?每一個視窗的ClassName是什麼?[XLMAIN] [XLDESK] [EXCEL7] [EXCEL2] [EXCEL<] [EXCELE] [EXCEL4] [EXCEL;]…它們的關係為何?
微軟給User這方面的資訊很少。透過這個程序可以讓我們瀏覽一下桌面上具有視窗句柄(Window handle)的物件之Class Name及Window Name 或Caption,也許可以增加一點對Excel之架構甚或作業系統的了解。
'Coded by crdotlin@2006.1.5
'Purpose: 探測桌面物件的Window Handle, Window Name, Class name
'Module: 一般模組--Module1
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type POINTAPI
x As Long
y As Long
End Type
Public Declare Function WindowFromPoint _
Lib "user32" ( _
ByVal xPoint As Long, _
ByVal yPoint As Long) _
As Long
Public Declare Function GetWindowTextLength _
Lib "user32" _
Alias "GetWindowTextLengthA" ( _
ByVal Hwnd As Long) _
As Long
Public Declare Function GetCursorPos _
Lib "user32" ( _
lpPoint As POINTAPI) _
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
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
( _
ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, _
ByVal lpszWindow As String _
) As Long
Declare Function GetWindowRect Lib "user32" (ByVal Hwnd As Long, lpRect As RECT) 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 MoveWindow Lib "user32" _
(ByVal Hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Sub LookAtObject()
Dim Hwnd As Long
Dim myPoint As POINTAPI
Dim lastHwnd As Long
Dim WText As String
Dim WClass As String
Dim RetValue As Long
'將Userform放到[G14]儲存格, 請參考[黏在作用儲存格的UserForm]一文
MoveForm
Do
'獲取游標位置
GetCursorPos myPoint
'取得游標位置視窗的句柄
Hwnd = WindowFromPoint(myPoint.x, myPoint.y)
If Hwnd <> lastHwnd Then
lastHwnd = Hwnd
WClass = String(256, " ")
'取得該視窗的ClassName
RetValue = GetClassName(Hwnd, WClass, 255)
WClass = Left(WClass, InStr(WClass, vbNullChar) - 1)
'取得視窗名稱的長度
WText = String(GetWindowTextLength(Hwnd) + 1, Chr(0))
'取得視窗名稱
GetWindowText Hwnd, WText, Len(WText)
'將資料依序寫到Sheet1工作表
With Sheet1
.Range("a1") = "Window Handle: " & Hwnd
.Range("a2") = "Window Name: " & WText
.Range("a3") = "Class Name: " & WClass
End With
End If
'暫停一下,以便讓作業系統可以處理其它的事件。
DoEvents
'檢查[A4]儲存格是否為1, 是的話停止偵測
Loop Until Sheet1.Range("a4") = 1
'清空[a4]儲存格
Sheet1.Range("a4") = ""
'卸載Userform1
Unload UserForm1
End Sub
第二下載區



