`

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

    博客分类:
  • vb
阅读更多

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

 

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

分享到:
评论

相关推荐

    精通WindowsAPI 函数 接口 编程实例

    11.1.2 通过邮槽发送消息 299 11.2 管道(Pipe) 300 11.2.1 创建命名管道 300 11.2.2 管道监听 302 11.2.3 使用异步I/O进行读写 303 11.2.4 关闭管道实例 307 11.2.5 客户端 307 11.3 剪贴板 310 ...

    API之网络函数---整理网络函数及功能

    CreateScalableFontResource 为一种TureType字体创建一个资源文件,以便能用API函数AddFontResource将其加入Windows系统 DrawText 将文本描绘到指定的矩形中 DrawTextEx 与DrawText相似,只是加入了更多的功能 ...

    精通Windows.API-函数、接口、编程实例.pdf

    11.1.2 通过邮槽发送消息 299 11.2 管道(Pipe) 300 11.2.1 创建命名管道 300 11.2.2 管道监听 302 11.2.3 使用异步I/O进行读写 303 11.2.4 关闭管道实例 307 11.2.5 客户端 307 11.3 剪贴板 310 ...

    API函数大全(奉送)

    2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕...

    VC API常用函数简单例子大全.doc

    VC API常用函数简单例子大全第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄 4 第二个:SendMessage根据窗口句柄发送一个消息给窗口 4 第三个:GetCursorPos获取鼠标当前位置(屏幕) 6 第四个:...

    WindowsAPI参考手册

    Microsoft Win32 API 函数按照功能划分为窗口处理、设备上下文——DC 、绘图函数、 位图和图标、菜单处理、文件处理、同步、处理文本和字体、硬件和系统、Windows 消息、 进程和线程。 本书按功能对Win32 API 函数...

    VB编程入门学习视频【37课】

    资源名称:VB编程入门学习视频【37课】资源目录:【】VB制作自动发送QQ消息软件【】VB实现窗体鼠标右键功能【】VB编程API函数自动安装程序cap【】VB编程API函数获取指定句柄PID【】VB编程API函数获取窗口句柄并关闭...

    VC API常用函数简单例子大全89个

    第二个:SendMessage根据窗口句柄发送一个消息给窗口 第三个:GetCursorPos获取鼠标当前位置 第四个:WindowFromPoint根据坐标点获得对应的窗口句柄 第五个MoveWindow根据窗口句柄移动窗口,改变窗口大小 第六个...

    windows API

    GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条...

    window32 API大全 win32编程

    本书首先对Win32 API函数做完整的概述;然后收录五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的...

    windows api 查询器

    2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕...

Global site tag (gtag.js) - Google Analytics