求助:程序如何模拟鼠标点击一个TreeView节点?

void CreateTreeViewControl(HWND hMainWnd)
{
	g_hTreeView = CreateWindow(WC_TREEVIEW, _T("Tree View"), WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT, 5, 5, 320, 480, hMainWnd, NULL, hInst, NULL);

	TVINSERTSTRUCT tvInsertStruct = {0};
	tvInsertStruct.hParent        = NULL;
	tvInsertStruct.hInsertAfter   = TVI_ROOT;
	tvInsertStruct.itemex.mask    = TVIF_TEXT/* | TVIF_STATE */;
	tvInsertStruct.itemex.pszText = _T("根节点");
	tvInsertStruct.itemex.state   =  TVIS_EXPANDED;

	//插入根节点
	HTREEITEM hRoot = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));
	DWORD dwErrorID = 0;
	if(hRoot == NULL)
		dwErrorID = GetLastError();

	//不能在这里展开根节点,因为此时根节点还没有任何子项,这样SendMessage函数会调用失败,返回0!
	//msdn says: Attempting to expand or collapse a node that has no children is considered a failure and SendMessage returns zero.
	DWORD dwRet = SendMessage(g_hTreeView, TVM_EXPAND, TVE_EXPAND, (LPARAM)(hRoot));

	//插入子节点
	tvInsertStruct.hParent        = hRoot;
	tvInsertStruct.hInsertAfter   = TVI_LAST;
	tvInsertStruct.itemex.mask    = TVIF_TEXT;
	tvInsertStruct.itemex.pszText = _T("子节点1");
	HTREEITEM hSubitem1 = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));

	tvInsertStruct.itemex.pszText = _T("子节点2");
	HTREEITEM hSubitem2 = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));

	tvInsertStruct.itemex.pszText = _T("子节点3");
	HTREEITEM hSubitem3 = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));

	tvInsertStruct.itemex.pszText = _T("子节点4");
	HTREEITEM hSubitem4 = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));

	tvInsertStruct.itemex.pszText = _T("子节点5");
	HTREEITEM hSubitem5 = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));

	tvInsertStruct.itemex.pszText = _T("子节点6");
	HTREEITEM hSubitem6 = (HTREEITEM)SendMessage(g_hTreeView, TVM_INSERTITEM, 0, (LPARAM)(&tvInsertStruct));

	//展开根节点
	dwRet = SendMessage(g_hTreeView, TVM_EXPAND, TVE_EXPAND, (LPARAM)(hRoot));

	//SetFocus(g_hTreeView);

	//选中某个节点
	TVITEM tvItem    = {0};
	tvItem.mask      = TVIF_STATE | TVIF_HANDLE;
	tvItem.hItem     = hSubitem1;
	tvItem.stateMask |= TVIS_SELECTED;
	tvItem.state     = TVIS_SELECTED;
	BOOL bRet = FALSE;
	//TODO: 这里为什么不成功?
	//bRet = SendMessage(g_hTreeView, TVM_SETITEM, 0, (LPARAM)(&tvItem));
	//bRet = 0;
	//bRet = SendMessage(g_hTreeView, TVM_SELECTITEM, TVGN_CARET, (LPARAM)(hSubitem4));

	<span style="color:#ff0000;">bRet = SendMessage(g_hTreeView, TVM_SELECTITEM, TVGN_CARET, (LPARAM)(hSubitem4));</span>

	//HTREEITEM hSelItem = NULL;
	//hSelItem = (HTREEITEM)SendMessage(g_hTreeView, TVM_GETNEXTITEM, TVGN_CARET, 0);

	//模拟鼠标点击
	<span style="color:#3366ff;">RECT rc = {0};
	*(HTREEITEM*)&rc = hSubitem6;
	SendMessage(g_hTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);

	POINT pt = {(rc.right-rc.left)/2+rc.left, (rc.bottom-rc.top)/2+rc.top};
	//ClientToScreen(g_hTreeView, &pt);
	//SetCursorPos(pt.x, pt.y);
	SendMessage(g_hTreeView, WM_LBUTTONDOWN, 0, MAKELONG(pt.x, pt.y));</span>

	g_OldTreeViewWndProc = (WNDPROC)GetWindowLong(g_hTreeView, GWL_WNDPROC);
	//if(SetWindowLong(g_hTreeView, GWL_WNDPROC, (long)newTreeViewWndProc) == 0)
		//MessageBox(hMainWnd, _T("子类化TreeView窗口失败!"), _T(""), MB_OK | MB_ICONERROR);
}

LRESULT CALLBACK newTreeViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	if(message == WM_LBUTTONDOWN)
	{
		//MessageBox(NULL, _T("鼠标按下消息!"), _T(""), MB_OK); 

		return TRUE;
	}
	else
		return CallWindowProc(g_OldTreeViewWndProc, hWnd, message, wParam, lParam);

}

我的意图是想【实现TreeView某个节点被点击选中的效果】,使用了两种方法来实现,都未成功:

方法一:给TreeView控件发送TVM_SELECTITEM,虽然能选中指定节点,但是该节点不会高亮显示。

方法二:给指定节点发送鼠标单击事件,但是显示效果位置总是不对,如上面代码中所示,我打算选中节点6,为何程序运行出来的效果是选中了节点4?(我也考虑了窗口坐标和全局桌面坐标的关系)如下图:

希望哪位大神路过看到此文,不吝赐教。特此感谢!!

时间: 2024-11-08 23:17:11

求助:程序如何模拟鼠标点击一个TreeView节点?的相关文章

使用powershell/vbs自动化模拟鼠标点击操作

今天想做windows上的自动化,所以才有了模拟鼠标点击的需求,先考虑用powershell实现: 首先先安装一个名为“WASP”免费可用的Powershell扩展程序,下载地址:http://wasp.codeplex.com/ 下载解压之后放到C:\Windows\System32\WindowsPowerShell\v1.0\Modules\下,如图: 之后,在开始->运行处输入powershell,以管理员方式运行, 执行Import-Module WASP,则引入了扩展程序, 假如有个

模拟鼠标点击按钮的简单示例

原理 首先枚举到目标按钮所在程序的窗口,然后在该窗口内枚举控件获取控件的句柄,获取到按钮的句柄后可通过SendMessage或者PostMessage来发送消息模拟鼠标点击按钮等交互方式.但是因为枚举窗口和句柄都是使用WIN32 API,所以只能枚举到WIN32的控件,对于那些不是微软提供的控件则表示无能为力了.本示例简单地模拟一个往打字机里面写入数据,点击确认的方法. 主要代码 HWND hBtnAdd = NULL; HWND hEditAdd = NULL; HWND hEditMain

WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都是用document对象模拟点击,这个方法基本能应对一般的情况,但是例如广告联盟的点击XXX就有检测机制(不多解释,你们懂的).所以完全模拟鼠标的点击事件就比较完美.于是我用了最常见的SendMessage. 接下来就要解决一个问题,webbrowser的句柄问题.从控件本身得到的句柄不是真正的浏览

jQuery模拟鼠标点击事件失效的问题

最近使用jQuery操作浏览器获取数据,需要对分页的信息进行处理,发现直接使用$('div#pager a.next').click();的这种写法无法触发点击事件. 使用trigger('click')的写法也是无济于事. 在网上一顿扒拉后,发现使用$('div#pager a.next')[0].click();就OK了. $('div#pager a.next')[0]这种写法其实就相当于把jQuery对象转换为Dom对象了. 模拟点击不生效的原因 如果使用jQuery的写法:$('a#t

利用python模拟鼠标点击自动完成工作,提升你的工作效率!

没有什么能比学以致用让学习变得更有动力的了. 不知道大家在工作中有没有一些工作需要重复的点击鼠标,因为会影响到财务统计报表的关系,我们每个月底月初都要修改ERP中的单据日期,单据多的时候光修改就能让你点鼠标点到手麻.(这里要吐槽一下浪沙软件,别的单据都可以批量修改日期,就是这个移仓单不行,你们研发怎么就这么懒?剩下这么点工作就不完成他?)之前同事有跟我提到过键盘精灵,因为当时负责别的工作,一直没有去了解.现在公司人员减少了,这工作又回到我身上了,刚好之前我在学习连连看的时候,知道Python 也

模拟鼠标点击键盘按下

#include <Windows.h> #include <stdlib.h> //打开程序或网页 void open(char *str) { ShellExecuteA(0, "open", str, 0, 0, 1); } //关闭程序 void close() { system("http://taskkill /f /im liebao.exe"); } //模拟键盘按下实现输入 void search() { keybd_eve

用iTween实现一个鼠标点击一个地方平面中间出现一个向上抛然后下落的球

首先我们创建一个平面, 就用Cube来创建把,来X和Z设置成10,然后我们就有了一个地形了,然后我们创建需要生成的球,然后我们创建一个空物体,把我们的这个球放到这个空物体下面,然后制作成prefabs,然后我们建一个图标,这里我们就用Cube来代替这个图标,把颜色修改为红色,我们还需要创建一个空物体,让他离我们的地形Y为0.5f,主要是为了在这个地方实例化出球,然后我们在这个空物体上写一个C#脚本, 代码如下: using UnityEngine;using System.Collections

QT中模拟鼠标点击事件

传入座标,模拟鼠标点击QWebView中网页上的某一点 qDebug()<<"mouse clicked"; QPoint pos(403,34); QMouseEvent event0(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(view->page(), &event0); QMouseEven

CTreeCtrl获得鼠标点击时的节点

原文链接: http://blog.csdn.net/lcalqf/article/details/21321923 1.添加图标 HICON icon[10]; icon[0]=AfxGetApp()->LoadIcon(IDI_ICON1); icon[1]=AfxGetApp()->LoadIcon(IDI_ICON5); m_imagelist.Create(16,16,ILC_COLOR32| ILC_MASK,7,7);//16*16的图标,7*7为该list最多能容纳的图标数.