大神們,本人新手一枚,最近想用VB6.0做了一個程式監控第三方程式某個按鈕是否被點擊。
目前該按鈕句柄已經獲取,但是監控按鈕的點擊事件無法實作。
已經驗證過的方法:SendMessage 函式未實作更能,使用方法如下(部分第三方程式可以監控到點擊事件):
#########################################################################################
一個timer,一個command,一個text。
VB codePrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const BM_GETSTATE = &HF2
Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Dim a As Long
a = SendMessage(Command1.hwnd, BM_GETSTATE, 0, 0)
Text1.Text = a
If a = 108 Then MsgBox "按鈕被按下了"
End Sub
#########################################################################################
大神們請幫忙看看有沒有其他方法可以實作,萬分感謝!
uj5u.com熱心網友回復:
自己頂一下,大神們拜托幫幫忙!uj5u.com熱心網友回復:
訊息HOOK不能“跨行程”,可能只有“DLL遠程注入”了吧。
用Timer控制元件,不能“及時”反應,很可能是獲取不到訊息的。
uj5u.com熱心網友回復:
感謝你的回復,第一次寫,有相關的實體參考嗎?uj5u.com熱心網友回復:
WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/uj5u.com熱心網友回復:
問題已經解決,謝謝大家幫忙!分享一下經驗:先抓到需要監控按鈕句柄,用findwindowex(可配合spy++查找句柄),然后用getwindowrect獲取句柄坐標,再用hook監控點擊事件。
uj5u.com熱心網友回復:
方法不錯,全域滑鼠訊息HOOK是可行的。
不過你這還得同時檢測一下“控制元件所在的視窗”是否是前臺視窗吧!

要不然,它被別的視窗擋住時、在別的視窗中但又是在那個控制元件區域點了滑鼠,你也認為“點擊了”?
還有一個,“控制元件所在視窗”是可以拖動位置的,這樣還需要每次獲取“控制元件矩形”才行呢。
uj5u.com熱心網友回復:
是存在這樣的問題“不過你這還得同時檢測一下“控制元件所在的視窗”是否是前臺視窗吧!”
這個用什么方法可以實作?
矩陣問題我是用timer不斷更新矩陣位置的,感覺方法有點笨,有沒有其他方法?
uj5u.com熱心網友回復:
你“找按鈕控制元件”,總要先找到“控制元件所在的視窗”吧!
保留這個視窗的句柄值,在監測到“滑鼠點擊”訊息時,
用API函式GetForegroundWindow()獲取一下前臺視窗的句柄,看跟“被監視視窗”是否一致。
(你不至于用Spy++直接查看按鈕的句柄,給你的“程式”用吧? 就算你這樣搞,也可以把視窗句給程式用啊)
視窗句柄相同時,再看“點擊位置”是否在那個按鈕上。
(ps : 其實你不應該用timer不斷更新“按鈕矩形”,應該就是在這兒獲取按鈕矩形區、再檢查點擊位置是否在這個區域內)
uj5u.com熱心網友回復:
謝謝,監控按鈕基本已經實作了,再請教個事,有方法將某個句柄(表格)中的某個單元格的文本資訊取出來嗎?uj5u.com熱心網友回復:
表格?
如果是“表格控制元件”,好像各種表格控制元件都不行的。
印象中只有ListView控制元件,可以通過句柄、訊息獲取內容。
你首先要確定的是你說的這個“表格”究竟是什么控制元件。
uj5u.com熱心網友回復:
參考下面代碼,把句柄換成外部按鈕的看看。’-------------------------------------視窗代碼
Private Sub Command1_Click()
MsgBox 1
End Sub
Private Sub Form_Load()
OldPrc = SetWindowLong(Command1.hwnd, -4, AddressOf CommandProc)
End Sub
‘-------------------------------------模塊代碼
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public OldPrc As Long
Public Function CommandProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Debug.Print Hex(Msg)
If Msg = &H201 Or Msg = &H100 Then Exit Function
CommandProc = CallWindowProc(OldPrc, hwnd, Msg, wParam, lParam)
End Function
代碼未測驗,參考自:https://zhidao.baidu.com/question/522714025.html
uj5u.com熱心網友回復:
你不知道 SetWindowLong( ) 不能實作“跨行程HOOK”啊?
uj5u.com熱心網友回復:
不知道,這樣的需求從來沒碰到過。。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/66987.html
標籤:API
上一篇:物件型別的公共變數如何傳遞
