请问如何模拟鼠标点击消息 使treeview的nodeclick事件发生

slowgrace 2009-03-25 07:39:32
请问如何模拟鼠标点击消息 使treeview的nodeclick事件发生

希望有详尽代码,谢谢!
...全文
1408 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
发热鼠标垫 2011-09-07
  • 打赏
  • 举报
回复
[DllImport("user32.dll")]
public static extern int GetWindowRect(IntPtr hwnd, out Rect lpRect);
public struct Rect
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("User32")]
public extern static void SetCursorPos(int x, int y);

WinAPI.Rect retCombox = new WinAPI.Rect();
WinAPI.GetWindowRect(hWndCombox, out retCombox);
WinAPI.SetCursorPos(retCombox.Left + 10, retCombox.Top + 10);
WinAPI.mouse_event(WinAPI.MouseEventFlags.LeftDown, retCombox.Left + 10, retCombox.Top + 10, 0, (IntPtr)0);
WinAPI.mouse_event(WinAPI.MouseEventFlags.LeftUp, retCombox.Left + 10, retCombox.Top + 10, 0, (IntPtr)0);
Thread.Sleep(500);
zjhzxxyh 2010-07-02
  • 打赏
  • 举报
回复
同问题求助
silencenet 2010-05-03
  • 打赏
  • 举报
回复
标记一下...
Tiger_Zhao 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 slowgrace 的回复:]
貌似只能找到和当前节点有特定关系的节点的hitem。如果就想找一个指定节点对应的hItem,和当前节点没任何关系的。该如何做?[/Quote]
http://topic.csdn.net/t/20041008/11/3433163.html
GetTVItemFromNode()
slowgrace 2009-04-16
  • 打赏
  • 举报
回复
谢谢各位指点。虽然问题没有完全解决,但是学到了很多东西,小结在这里:http://blog.csdn.net/slowgrace/archive/2009/04/15/4076404.aspx

遗留的问题开新帖继续讨教,恳请各位移步前来指点:http://topic.csdn.net/u/20090416/15/f990c1f4-34d0-48b6-8fdf-ac3bb4836bd7.html
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
我找到了postmessage和sendmessage的区别。我猜mouse-event是post方式。

可是我希望的是同步的。

我试了sendmessage WM_LBUTTONDOWN消息,像下面注释掉的这两行,但是这回点击动作压根不发生了好像。
' I = SendMessage(hwnd, WM_LBUTTONDOWN, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)
' I = SendMessage(hwnd, WM_LBUTTONUP, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)
clear_zero 2009-04-15
  • 打赏
  • 举报
回复
来学习的
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
另外,我很疑惑的是,何以用这种办法(mouse-event)发送消息,程序的流程是先执行发送消息之后的语句,再执行对应的事件过程;而用sendmessage,则是先执行对应的事件过程,再执行发送消息之后的语句。

比如,在那个帖子http://topic.csdn.net/u/20090412/21/5cc102c6-f281-4870-a7d6-3755f785c715.html,我是用SendMessage做的。那么执行顺序是:
m_tvw_expand()
msgbox "aaa"

而这个帖子用mouse-event, 执行顺序是
msgbox "aaa"
m_tvw_NodeClick()

注:msgbox "aaa"是紧接在发送消息之后的语句。
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
另外,你看我在14楼贴的GetHTreeItem函数,每次我都得改变treeview的当前节点。有没有什么办法不要改变当前节点,得到对应的hitem啊?

我看Public Enum TVGN_Flags
TVGN_ROOT = &H0
TVGN_NEXT = &H1
TVGN_PREVIOUS = &H2
TVGN_PARENT = &H3
TVGN_CHILD = &H4
TVGN_FIRSTVISIBLE = &H5
TVGN_NEXTVISIBLE = &H6
TVGN_PREVIOUSVISIBLE = &H7
TVGN_DROPHILITE = &H8
TVGN_CARET = &H9
#If (WIN32_IE >= &H400) Then ' >= Comctl32.dll v4.71
TVGN_LASTVISIBLE = &HA
#End If
End Enum

貌似只能找到和当前节点有特定关系的节点的hitem。如果就想找一个指定节点对应的hItem,和当前节点没任何关系的。该如何做?
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
谢谢zhao。ClientToScreen这个函数真好使。

还有个问题想请教:

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

上面这一句是不是等价于下面这两句
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

像这种dwflag类型的参数用or传进去多个的时候是怎么理解啊?
Tiger_Zhao 2009-04-15
  • 打赏
  • 举报
回复
用 ClientToScreen()、ScreenToClient()
或者 MapWindowPoints()
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
有什么办法可以根据hwnd得到对应的窗体的left和top绝对坐标么?
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
'basAPI
'****for nodeclick
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long '这个是设置鼠标的位置!
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) '定义鼠标事件
Public Const MOUSEEVENTF_LEFTDOWN As Long = &H2
Public Const MOUSEEVENTF_LEFTUP As Long = &H4

'for get treeitem position
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
谢谢zhao的提醒。可是折腾了半天,坐标还是搞不对。有两点折腾不对:

(1)getrectitem得到的是相对treeview控件的坐标,可我找不到treeview控件的left和top。比如,我用spy++看到treeview控件的左上角是(147,191)。可是我程序里得到的是(2098,1251)。一头雾水啊。我程序里是这么写的:
'for test
Public Property Get Left() As Long
Left = Forms(m_strTreeWnd).WindowLeft + Forms(m_strTreeWnd).Controls(m_strTreCtl).Left
End Property
'for test
Public Property Get Top() As Long
Top = Forms(m_strTreeWnd).WindowTop + Forms(m_strTreeWnd).Controls(m_strTreCtl).Top
End Property

其中,m_strTreeWnd是树窗的名字;strTreCtl是treeview控件的名字。


(2)后来我就直接把spy++得到的坐标代进去,这回鼠标能点到树控件里,可是点的位置不对,高度总是比我想要的位置少12.
Public Sub NodeClick(ByVal nodX As MSComctlLib.Node, trcX As CTreeCtl)
Dim rc As RECT

rc.Left = GetHTreeItem(nodX, trcX)
Call SendMessage(trcX.HTvw, TVM_GETITEMRECT, True, rc)

' Call SetCursorPos(trcX.Left + rc.Left, trcX.Top + rc.Top)
Call SetCursorPos(147 + rc.Left, 191 + rc.Top + 12) '现在只好这样写,晕死了
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Function GetHTreeItem(ByVal nodX As MSComctlLib.Node, trcX As CTreeCtl) As Long
nodX.Selected = True
GetHTreeItem = SendMessage(trcX.HTvw, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
Tiger_Zhao 2009-04-14
  • 打赏
  • 举报
回复
TVM_GETITEMRECT
注意项目的 hItem 是通过 rc.Left 传进去的。
slowgrace 2009-04-12
  • 打赏
  • 举报
回复
谢谢goosen。这个代码好用,可是我不知道如何得到节点的坐标?
goosen 2009-04-12
  • 打赏
  • 举报
回复
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long '这个是设置鼠标的位置!
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) '定义鼠标事件
Dim i As Long


'vb模拟鼠标在屏幕的x = 10 : y = 20 的位置上点击一下左键
Private Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = 2000 '2秒
End Sub

Private Sub Timer1_Timer()
Call SetCursorPos(10, 20) '让鼠标移动到(10,20)
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 '模拟鼠标的左键单击!
i = i + 1
Print "点击屏幕" & i
End Sub
slowgrace 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sonic_andy 的回复:]
用winrunner试试?
[/Quote]

感兴趣,你用过么?
sonic_andy 2009-04-12
  • 打赏
  • 举报
回复
用winrunner试试?
slowgrace 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 myjian 的回复:]
..........那还不是一样.

找到坐标......发送点击消息吧...
[/Quote]

可是的话,节点的坐标不好找吧,上百个节点呢
加载更多回复(7)
一、简介 通过这个课程带大家从零开发一款功能全面的后台管理系统,包括项目搭建、功能实现到最后的Linux系统部署全过程。本课程使用SpringMVC + Spring + Mybatis作为主体框架,使用AdminLTE作为前端框架,使用主流关系型数据库Mysql作为存储数据库,使用非关系型数据库Redis作为缓存数据库,并集成SpringSecuriy安全框架做权限的动态管理,集成Swagger2自动生成接口文档,集成Druid连接池进行SQL性能监控,集成ActiveMQ消息中间件进行异步解耦,提高性能。最后使用linux系统进行服务部署,并搭建nginx反向代理服务器提高网站性能。 二、学习目标 通过本课程的学习带大家掌握SSM框架的开发流程,并熟练使用SpringSecurity做为安全框架进行权限管理,整合相关优秀的开源框架进行功能开发。还在项目中带大家学习前端相关的Jquery、Bootstrap等知识。课程结束之后希望大家能做到独立进行开发项目的目的,增强解决问题的能力,具备功能落地实现的能力。 三、课程涉及知识点 SpringMVC源码分析Mybatis源码分析通用MapperMysql数据库Redis缓存实现ActiveMQ消息中间件SpringSecurity鉴权Swagger2接口文档生成自定义注解AOP切面编程自定义过滤器Logback日志整合Druid性能监控Linux系统Nginx反向代理Ajax异步请求技术Jquery基本使用AdminLTE前端框架Chart图表-线状图和饼状图百度地图定位城市BootStrap前端框架BootStrap-Table插件BootStrap-Treeview插件Markdown编辑器403、404、500错误页面配置数据库事务消息提示插件toastr.js图片上传插件bootstrap fileinput数字滚动效果pv/uv流量统计...四、课程部分内容截图如下 1、首页 2、菜单管理 3、图床管理 4、图标管理 5、留言反馈管理 6、druid监控 7、登录日志

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧