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

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

一、Mouse_Event方法

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

Dim rc As RECTDim pt As POINTAPI

'TVM_GETITEMRECT消息的lparam参数是hitem,通过rc.left传进去,节点的坐标位置则通过rc返回

rc.Left=GetTVItemFromNode(trcX.HTvw,nodX)

CallSendMessage(trcX.HTvw,TVM_GETITEMRECT,True,rc)

pt.x=rc.Left

pt.y=rc.Top

'节点的相对坐标要变为绝对坐标

CallClientToScreen(trcX.HTvw,pt)

Call SetCursorPos(pt.x, pt.y)

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0mouse_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)

DimiAsLong

i=PostMessage(hwnd,WM_LBUTTONDOWN,0,(mXAnd&HFFFF)+(mYAnd&HFFFF)*&H10000)

i=PostMessage(hwnd,WM_LBUTTONUP,0,(mXAnd&HFFFF)+(mYAnd&HFFFF)*&H10000)

End Function

Private Sub cmdTest_Click()    Dim aa As MSComctlLib.TabStrip

    Set aa = Me.TabStrip0.Object

CallSendClick(aa.hwnd,aa.Tabs(2).Left/15,aa.Tabs(2).Top/15)

Setaa=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

Thelow-orderwordspecifiesthex-coordinateofthecursor.Thecoordinateisrelativetotheupper-leftcorneroftheclientarea.

  The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.

本文来自CSDN博客,转载请标明出处:file:///F:/資料/通过API函数发送鼠标点击消息%20-%20slowgrace的专栏%20-%20CSDN博客.htm

相关推荐