模拟鼠标点击第三方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 LongPrivate 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 TypePrivate Type RECT ' rct
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate 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 Longphwnd = 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 结束了各位高手,帮小弟改改以上程序,看看这是为什么?万分感谢
[]桌面
[]我的电脑
[]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 LongPrivate 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 TypePrivate Type RECT ' rct
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate 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 Longphwnd = 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 结束了各位高手,帮小弟改改以上程序,看看这是为什么?万分感谢
解决方案 »
- 哈哈...,这棋赢得漂亮!
- 如何让datagrid刷新不显示滚动状态
- ListView绑定TextBox,在ListView中按下方向键,TextBox位置保持不变,如何实现相对移动
- activeBar上的标签的内容为什么显示不出来?
- VB+ACCESS 设计一个登陆框的问题
- 我真是晕了,学完了c++,java再学vb怎么觉得vb那么乱!!!不知从何学起!!*高手进
- 高分求救高手:[Microsoft][ODBC SQL Server Driver]没有执行可选特性
- 打印时打印机问题!
- ActiveReports 2.0中如何指定(上下左右)頁邊距?
- 求:Windows2002的序列号!!
- 如何抓取某应用程序界面
- c/s软件连接太卡了
使用mouse_event函数可以模拟。