模拟鼠标点击第三方SysTreeView32树状控件难题

oceanmeng 2009-08-20 08:57:16
模拟鼠标点击第三方SysTreeView32树状控件,内容如下
[]桌面
[]我的电脑
 []C:
[]文件夹名
...
...
[]文件名
....
 []D:
[]文件夹名
...
...
[]文件名
....


比如:模拟鼠标点击C:所在节点前面的checkbox框,我这样写的VB程序,

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
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)

Private Type POINTAPI ' pt
x As Long
y As Long
End Type

Private Type RECT ' rct
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Const GW_CHILD = 5
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const TVGN_ROOT = &H0
Private Const TVGN_CHILD = &H4
Private Const TVGN_Caret = &H9
Private Const TV_FIRST = &H1100
Private Const TVM_GETITEMRECT = (TV_FIRST + 4)
Private Const TVM_GETNEXTITEM = (TV_FIRST + 10)
Private Const TVM_SELECTITEM = (TV_FIRST + 11)

Private Sub Command1_Click()
Dim rc As RECT
Dim pt As POINTAPI
Dim phwnd As Long
Dim hTreeView As Long
Dim hTVRoot As Long
Dim hTVItem As Long

phwnd = FindWindow(vbNullString, "TREEVIEW-CHECKBOX") '获得TREEVIEW-CHECKBOX.exe窗体句柄
hTreeView = GetWindow(phwnd, GW_CHILD) '获得SysTreeView32控件句柄
hTVRoot = SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&) '获得SysTreeView32控件根节点"桌面"的句柄
hTVItem = SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hTVRoot) '获得SysTreeView32控件第一子节点“我的电脑”的句柄
hTVItem = SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hTVItem) '获得SysTreeView32控件第一子节点德子节点“C:”的句柄

SendMessage hTreeView, TVM_SELECTITEM, TVGN_Caret, ByVal hTVItem '选中C:所在的节点

rc.Left = hTVItem 'C:节点的句柄
Call SendMessage(hTreeView, TVM_GETITEMRECT, True, rc)

pt.x = rc.Left
pt.y = rc.Top
'节点的相对坐标要变为绝对坐标
Call ClientToScreen(hTreeView, pt)
Call SetCursorPos(pt.x - rc.Left +10, pt.y -2) '在处理第三方的TreeView时我发现只能是pt.x - rc.Left,而网上查到的仅是pt.x,不知道为什么? 另外+10和-2是根据第三方的这个控件不同适当的调整其鼠标偏移量

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub



但发现存在问题
1)每次都是鼠标自动到根节点去点击,而不是我希望的C:节点处点击,即便我调整“rc.Left = 其他节点的句柄”也是这样的
2)经常出现An unhandled win32 exception occurred in TREEVIEW-CHECKBOX.exe [4140].异常,就把TREEVIEW-CHECKBOX.exe 结束了


各位高手,帮小弟改改以上程序,看看这是为什么?万分感谢
...全文
820 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-10-15
  • 打赏
  • 举报
回复
模拟鼠标动作
使用mouse_event函数可以模拟。
chenhui530 2009-10-15
  • 打赏
  • 举报
回复
直接用SendMessage就可以更改Checkbox的状态的
getemail 2009-10-14
  • 打赏
  • 举报
回复
用尽全身力气帮楼主顶此贴

1,486

社区成员

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

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