我知道用findwindow可以得到某些視窗的hWnd,可是像輸入法用顯示語言列,那個小視窗就沒辦法套用了,因為他沒有視窗標題,或者像是輸入法整合器,他有標題,可是也無法得到hWnd,但是假如用WindowFromPoint卻又可以得到。想請問的是,像這些比較特別的視窗,除了用滑鼠以外,還有沒有什麼其他的方法可以知道他的hWnd值呢?(例如我放了一個timer,在語言列一出現,就馬上可以知道他的hWnd,不用再把滑鼠移過去才能知道!)謝謝~
2006-03-10 12:17:05 · 2 個解答 · 發問者 藍 2 in 電腦與網際網路 ➔ 程式設計
謝謝兩位的熱心回答,不過因為人目前在外面,所以無法測試,等回家後在測試看看!
2006-03-12 11:05:23 · update #1
'我有個笨方法,先把你要找的視窗裡所有元件的Class Name都找出來記錄好,再用Timer逐一列舉出所有hWnd的子Class Name,比對之前記錄如果相同就有可能是你要的hWnd(當然如果有2個以上完全相同就不準了),以下是找出所有hWnd的子Class Name的方式,須加1模組,表單上置2個ListBox跟1個CommandButton'以下在模組Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongDeclare Function EnumThreadWindows Lib "user32" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As LongDeclare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongDeclare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As BooleanPublic A() As String, N As Long, St As StringPublic Function EP(ByVal hwnd As Long, ByVal lParam As Long) As BooleanDim T As Long, P As LongSt = "": Form1.List1.AddItem hwndT = GetWindowThreadProcessId(hwnd, P)EnumThreadWindows T, AddressOf ET, 0ReDim Preserve A(N): A(N) = Left(St, Len(St) - 1): N = N + 1EP = TrueEnd FunctionPublic Function ET(ByVal hwnd As Long, ByVal lParam As Long) As LongDim R As Long, S As StringS = Space(255): R = GetClassName(hwnd, S, 255): S = Left$(S, R)St = St & S & " "ET = 1End Function'以下在表單Private Sub Command1_Click()List1.Clear: List2.Clear: Erase AEnumWindows AddressOf EP, ByVal 0&End SubPrivate Sub List1_Click()Dim I As Integer, S() As StringList2.ClearS = Split(A(List1.ListIndex))For I = 0 To UBound(S) List2.AddItem S(I)NextEnd Sub'執行後List1會顯示所有的hWnd,按其中之一的hWnd List2會顯示該Hwnd的所有子Class Name
2006-03-14 11:40:52 補充:
不同的hWnd有相同的Class Name是很正常的,例如你開2個記事本就會這樣,因為它們的元件都是一樣的.為了更精準你可以用GetWindowText來取得每個子元件的Caption,相同的Class Name Caption不一定一樣^^
2006-03-10 16:28:10 · answer #1 · answered by W.J.S. 7 · 0⤊ 0⤋
關於取得視窗 hWnd 的方式也可以用
GetForegroundWindow 取得目前擁有 Focus 的視窗
不過如果要隨時得知有沒有新的視窗產生
建議用 EnumWindows 列出系統中目前所有的視窗
這是一個 Callback 函數
詳細的使用方式建議你可以用 Google
或是參考 MSDN 裡的說明
2006-03-09 22:46:33 · answer #2 · answered by Luke 4 · 0⤊ 0⤋