直奔主題 我自己做了個程式代碼很簡單
Private Sub Picture1_Click()
MsgBox "單擊事件回應了"
End Sub
一個picture控制元件。正常用滑鼠單擊可以彈出對話框 可是由于這只是個測式我要做的是別人的程式。于是用訊息來處發,先是到網上找到sendmessage 和postmessage進行傳滑鼠單擊 不管用 然后又傳滑鼠按下和抬起。還是不管用。于是用SPY++戴取了訊息然后按照SPY++戴取的訊息一條一條的模擬。然后在戴取。發現我模擬的和真實點擊的都一模一樣了連反回的訊息都一樣了可是為什么還是沒有回應單擊事件啊。請各位大牛指教
真時滑鼠點擊時SPY++戴取
<00001> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00002> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00003> 000403EA S WM_SETCURSOR hwnd:000403EA nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00004> 000403EA R WM_SETCURSOR fHaltProcessing:False
<00005> 000403EA P WM_MOUSEMOVE fwKeys:0000 xPos:117 yPos:126
<00006> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00007> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00008> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00009> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00010> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00011> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00012> 000403EA S WM_SETCURSOR hwnd:000403EA nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00013> 000403EA R WM_SETCURSOR fHaltProcessing:False
<00014> 000403EA P WM_MOUSEMOVE fwKeys:0000 xPos:117 yPos:126
<00015> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00016> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00017> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00018> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00019> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00020> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00021> 000403EA S WM_MOUSEACTIVATE hwndTopLevel:000503B2 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00022> 000403EA R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00023> 000403EA S WM_SETCURSOR hwnd:000403EA nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
<00024> 000403EA R WM_SETCURSOR fHaltProcessing:False
<00025> 000403EA P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:117 yPos:126
<00026> 000403EA P WM_LBUTTONUP fwKeys:0000 xPos:117 yPos:126
<00027> 000403EA S WM_CAPTURECHANGED hwndNewCapture:00000000
<00028> 000403EA R WM_CAPTURECHANGED
<00029> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00030> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00031> 000403EA S WM_KILLFOCUS hwndGetFocus:001004EE
<00032> 000403EA R WM_KILLFOCUS
我模擬發送的點擊訊息
<00001> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00002> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00003> 000403EA S WM_SETCURSOR hwnd:000403EA nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00004> 000403EA R WM_SETCURSOR fHaltProcessing:False
<00005> 000403EA P WM_MOUSEMOVE fwKeys:0000 xPos:117 yPos:126
<00006> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00007> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00008> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00009> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00010> 000403EA S WM_SETCURSOR hwnd:000403EA nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00011> 000403EA R WM_SETCURSOR fHaltProcessing:False
<00012> 000403EA P WM_MOUSEMOVE fwKeys:0000 xPos:117 yPos:126
<00013> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00014> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00015> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00016> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00017> 000403EA S WM_MOUSEACTIVATE hwndTopLevel:000503B2 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00018> 000403EA R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00019> 000403EA S WM_SETCURSOR hwnd:000403EA nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
<00020> 000403EA R WM_SETCURSOR fHaltProcessing:False
<00021> 000403EA P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:117 yPos:126
<00022> 000403EA P WM_LBUTTONUP fwKeys:0000 xPos:117 yPos:126
<00023> 000403EA S WM_CAPTURECHANGED hwndNewCapture:00000000
<00024> 000403EA R WM_CAPTURECHANGED
<00025> 000403EA S WM_NCHITTEST xPos:125 yPos:159
<00026> 000403EA R WM_NCHITTEST nHittest:HTCLIENT
<00027> 000403EA S WM_KILLFOCUS hwndGetFocus:(null)
<00028> 000403EA R WM_KILLFOCUS
我程式代碼
Private Sub Command3_Click()
List1.Clear
lHwnd = 263146
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_NCHITTEST, 0, 125 + 159 * &H10000) & " WM_NCHITTEST"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_SETCURSOR, lHwnd, 1 + WM_MOUSEMOVE * &H10000) & " WM_SETCURSOR"
Sleep (20)
List1.AddItem PostMessage(lHwnd, WM_MOUSEMOVE, 0, 117 + 126 * &H10000) & " WM_MOUSEMOV"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_NCHITTEST, 0, 125 + 159 * &H10000) & " WM_NCHITTEST"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_NCHITTEST, 0, 125 + 159 * &H10000) & " WM_NCHITTEST"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_SETCURSOR, lHwnd, 1 + WM_MOUSEMOVE * &H10000) & " WM_SETCURSOR"
Sleep (20)
List1.AddItem PostMessage(lHwnd, WM_MOUSEMOVE, 0, 117 + 126 * &H10000) & " WM_MOUSEMOVE"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_NCHITTEST, 0, 125 + 159 * &H10000) & " WM_NCHITTEST"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_NCHITTEST, 0, 125 + 159 * &H10000) & " WM_NCHITTEST"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_MOUSEACTIVATE, 328626, 1 + WM_LBUTTONDOWN * &H10000) & " WM_MOUSEACTIVATE"
Sleep (20)
'List1.AddItem SendMessage(lHwnd, WM_IME_SETCONTEXT, 1, &HC000000F) & " WM_IME_SETCONTEXT"
'Sleep (20)
'List1.AddItem SendMessage(lHwnd, WM_SETFOCUS, 0, 0&) & " WM_SETFOCUS"
'Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_SETCURSOR, lHwnd, 1 + WM_LBUTTONDOWN * &H10000) & " WM_SETCURSOR"
Sleep (20)
List1.AddItem PostMessage(lHwnd, WM_LBUTTONDOWN, MK_LBUTTON, 117 + 126 * &H10000) & " WM_LBUTTONDOWN "
Sleep (20)
List1.AddItem PostMessage(lHwnd, WM_LBUTTONUP, 0, 117 + 126 * &H10000) & " WM_LBUTTONUP"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_CAPTURECHANGED, 0, 0&) & " WM_CAPTURECHANGED"
Sleep (20)
List1.AddItem SendMessage(lHwnd, WM_NCHITTEST, 0, 125 + 159 * &H10000) & " WM_NCHITTEST"
List1.AddItem SendMessage(lHwnd, WM_KILLFOCUS, 0, 0&) & " WM_KILLFOCUS"
End Sub
uj5u.com熱心網友回復:
有可能程式中會判斷當前滑鼠的位置,所以模擬點擊要把滑鼠真正移到相應的位置上去。uj5u.com熱心網友回復:
Private Sub Picture1_Click()MsgBox "單擊事件回應了"
End Sub
我自己做的程式啊。就這么簡單沒有任何判斷
uj5u.com熱心網友回復:
VB6是怎么把滑鼠點擊訊息轉化為Click事件的,誰都不知道。你怎么確信它沒有判斷當前位置?
uj5u.com熱心網友回復:
可是如果是個按鈕控制元件那就回應事件了。再說我測式過 把滑鼠放在控制元件上面然后傳訊息也不管用uj5u.com熱心網友回復:
也許只需要設定Picture所在的Form.KeyPreview=Trueuj5u.com熱心網友回復:
sendmessage api宣告的最后2個引數全部寫成 byval xx as long,再試uj5u.com熱心網友回復:
如果“別人的程式”不是通過回應訊息來處理,而是直接讀取硬體狀態(典型:絕大多數的DirectX游戲)來操作,那你發什么訊息都沒用。
第二種可能,就是可能你的API宣告不對。
你直接從API瀏覽器中Copy的API宣告,SendMessage()/PostMessage()的最后一個引數是ByRef的,
而VB6中傳遞數值時也默認為ByRef。
但實際上API在處理滑鼠的移動、按下、放開、單擊等幾個訊息時,最后一個引數是包含的“滑鼠坐標”,
如果把引數按ByRef方式傳遞,那傳給API的“指標”值,很有可能就因為“坐標值不對”造成程式沒有
正確回應。必須把第4個引數用ByVal方式傳遞,才有可能正確。
uj5u.com熱心網友回復:
API宣告問題
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long,Byval lParam As Any) As Long
注意最后一個引數,宣告要加byval
uj5u.com熱心網友回復:
這句話不是很懂:“可是由于這只是個測式我要做的是別人的程式。于是用訊息來處發(是“觸發”吧?)”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/86807.html
標籤:API
上一篇:vb與Plc通訊
