通过API函数发送鼠标点击消息

此文来自http://topic.csdn.net/u/20090325/07/ab133e9f-de30-4ae0-a3d0-4c0238a651ff.html和http://topic.csdn.net/u/20090325/07/dcb048a0-c0ee-481f-b0ec-29e4e31e8acc.html这两个帖子的讨论,感谢Tiger_Zhao,goosen,myjian的指点。

鼠标消息是队列消息,好像因为这个原因,所以得以投递的方式来发送消息,而用sendmessage貌似就不灵。我知道两种投递鼠标消息的办法,一种是用PostMessage,一种是用Mouse_Event。分述如下:

 

一、Mouse_Event方法

假设我们希望发送鼠标消息到TreeView控件的节点上使它的NodeClick事件发生,可以用如下代码:

Dim rc As RECT
Dim pt As POINTAPI

'TVM_GETITEMRECT消息的lparam参数是hitem,通过rc.left传进去,节点的坐标位置则通过rc返回
rc . Left = GetTVItemFromNode( trcX . HTvw , nodX)
Call SendMessage( trcX . HTvw , TVM_GETITEMRECT , True , rc)
   
pt . x = rc . Left
pt . y = rc . Top
'节点的相对坐标要变为绝对坐标
Call ClientToScreen( trcX . HTvw , pt)
Call SetCursorPos( pt . x , pt . y)

mouse_event MOUSEEVENTF_LEFTDOWN , 0 , 0 , 0 , 0
mouse_event MOUSEEVENTF_LEFTUP , 0 , 0 , 0 , 0

其中GetTVItemFromNode函数的说明见这篇文章:http://blog.csdn.net/slowgrace/archive/2009/04/16/4083667.aspx。其他函数、结构和常量都可从Win32API中查到。

 

二、PostMessage方法

假设我们希望通过模拟鼠标点击来是tabstrip控件的click事件发生,可以通过投递鼠标点击消息在相应位置来达成。

Public Function SendClick( hwnd As Long , mX As Long , mY As Long)
    Dim i As Long
    
    i = PostMessage( hwnd , WM_LBUTTONDOWN , 0 , ( mX And & HFFFF) + ( mY And & HFFFF) * & H10000)
    i = PostMessage( hwnd , WM_LBUTTONUP , 0 , ( mX And & HFFFF) + ( mY And & HFFFF) * & H10000)
End Function

Private Sub cmdTest_Click()
    Dim aa As MSComctlLib . TabStrip

    Set aa = Me . TabStrip0 . Object
    Call SendClick( aa . hwnd , aa . Tabs( 2 ). Left / 15 , aa . Tabs( 2 ). Top / 15)
    Set aa = Nothing
End Sub

注意,这里面这个15,那是缇和像素之间的转换窍要,呵呵。参看这里:http://blog.csdn.net/slowgrace/archive/2009/02/22/3916962.aspx以及下面的摘抄:“Left-返回或设置对象内部的左边与它的容器的左边之间的距离。Top-返回或设置对象的内顶部和它的容器的顶边之间的距离。对于窗体,Left 和 Top 属性总以缇为单位来表达;对于控件,它们的度量单位决定于它的容器的坐标系统。这些属性值随着用户或程序中移动该对象而改变。”
另外,关于WM_LBUTTONDOWN消息的lParam,摘抄如下http://baike.baidu.com/view/1514116.htm
  The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
  The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.

你可能感兴趣的:(控件,事件及消息,API)