直奔主题 我自己做了个程序代码很简单
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

解决方案 »

  1.   

    Private Sub Picture1_Click()
    MsgBox "单击事件响应了"
    End Sub
    我自己做的程序啊。就这么简单没有任何判断
      

  2.   

    VB6是怎么把鼠标点击消息转化为Click事件的,谁都不知道。
    你怎么确信它没有判断当前位置?
      

  3.   

    也许只需要设置Picture所在的Form.KeyPreview=True
      

  4.   

    sendmessage api声明的最后2个参数全部写成 byval xx as long,再试
      

  5.   

    如果“别人的程序”不是通过响应消息来处理,
    而是直接读取硬件状态(典型:绝大多数的DirectX游戏)来操作,那你发什么消息都没用。第二种可能,就是可能你的API声明不对。
    你直接从API浏览器中Copy的API声明,SendMessage()/PostMessage()的最后一个参数是ByRef的,
      而VB6中传递数值时也默认为ByRef。
    但实际上API在处理鼠标的移动、按下、放开、单击等几个消息时,最后一个参数是包含的“鼠标坐标”,
      如果把参数按ByRef方式传递,那传给API的“指针”值,很有可能就因为“坐标值不对”造成程序没有
    正确响应。必须把第4个参数用ByVal方式传递,才有可能正确。
      

  6.   

    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