1,486
社区成员
发帖
与我相关
我的任务
分享
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