請教大家,我想查運行的qq.exe程式的程式路徑,使用以下的程式。但我用鍵盤HOOK來執行就出錯,而在主視窗中用按鈕就可以正常執行。為什么,有辦法解決嗎,請高手指點。
For Each ename In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_ '回圈行程
If UCase(ename.Name) = UCase("qq.exe") Then MsgBox ename.executablepath '查找名為QQ.exe的行程路徑
Next
----------------------------
form1.frm
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MyKBHook, App.hInstance, 0)
If hHook = 0 Then End '如果鉤子注冊失敗會回傳0,否則回傳注冊的鉤子句柄
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx hHook
End Sub
Private Sub Command1_Click()
Dim ename As Object
For Each ename In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_ '回圈行程
If UCase(ename.Name) = UCase("qq.exe") Then MsgBox ename.executablepath '查找名為QQ.exe的行程路徑
Next
End Sub
---------------------------------
Module1.bas
Public hHook As Long '用來存放鉤子的句柄
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public a As Long
Public Type EVENTMSG
vKey As Long
sKey As Long
flag As Long
time As Long
End Type
Public mymsg As EVENTMSG
Public Const WH_KEYBOARD_LL = 13
Public Const WM_KEYDOWN = &H100
Public Function MyKBHook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim ename As Object
'這些引數在不同鉤子中具有不同含義,在這里ncode 是型別代碼
If ncode = 0 Then
If wParam = WM_KEYDOWN Then '在這里wParam 表示鍵盤事件,具體的按鍵資訊保存在lParam 指標所指向的記憶體區域中
'把記憶體中lParam 指標所指向的資料復制到mymsg這個自定義型別
CopyMemory mymsg, ByVal lParam, Len(mymsg)
If wParam = WM_KEYDOWN Then
CopyMemory mymsg, ByVal lParam, Len(mymsg)
Select Case mymsg.vKey
Case vbKeyTab '按下TAB鍵
MsgBox "tab"
For Each ename In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_ '回圈行程
If UCase(ename.Name) = UCase("qq.exe") Then MsgBox ename.executablepath '查找名為QQ.exe的行程路徑
Next
End Select
End If
' Form1.Text1.Text = mymsg.sKey
End If
End If
'將訊息傳給下一個鉤子,如果你想鎖定鍵盤,只需要把這句改成MyKBHook =-1,表示吃掉這個訊息,這樣鍵盤就輸入不了了:-)
MyKBHook = CallNextHookEx(hHook, ncode, wParam, lParam)
End Function
uj5u.com熱心網友回復:
在你的按鈕事件定義時改一下Public Sub Command1_Click()
然后在你的處理程序呼叫該事件看看,如
Case vbKeyTab '按下TAB鍵
Form1.Command1_Click
End Select
uj5u.com熱心網友回復:
按樓上的試了一下,還是一樣出問題。說是自動化錯誤。1.點擊按鈕操作,正常。

2.按Tab鍵,彈出自動化錯誤。是 Command1_Click函式出錯。

uj5u.com熱心網友回復:
你不用wmi,換成api來列舉應該沒問題,wmi的效率低,而且涉及com/com+與內部服務通訊,所以換種方法可能會比較好轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/147847.html
標籤:VB基礎類
