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

本文介绍两种通过API函数发送鼠标点击消息的方法:使用Mouse_Event触发TreeView控件的NodeClick事件和使用PostMessage模拟tabstrip控件的点击事件。文中详细解释了如何定位目标元素并发送点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鼠标消息是队列消息,好像因为这个原因,所以得以投递的方式来发送消息,而用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.youkuaiyun.com/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.youkuaiyun.com/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.

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值