CTreeCtrl::SelectItem 光标 模拟鼠标点击

标签: selectitem光标模拟鼠标 | 分类: C /VC/WM/MFC |
我想要实现这么一个过程,新在树中添加一个子项,然后光标自动聚焦在这个子项上。
在使用CTreeCtrl::SelectItem的时候遇到了问题,虽然SelectItem成功了,但是树控件上的该单元并没有被聚焦。
如下,正常鼠标点击后:
CTreeCtrl::SelectItem 光标 模拟鼠标点击
使用CTreeCtrl::SelectItem:
如上所示,虽然确实被选中了,但是被选者的背景没有阴影效果。
怎样才能实现这种效果呢?
答案就是:模拟鼠标点击事件。
示例代码:
//给树m_VNTree的m_hRequest项下插入子项
hItem = this->m_VNTree.InsertItem(“123456”,this->m_hRequest);
//展开m_hRequest项
this->m_VNTree.Expand(this->m_hRequest,TVE_EXPAND);
//模拟鼠标点击,聚焦/选中这个新加的子项。需要#include "winuser.h"
CRect rcItem;
//bRet = this->m_VNTree.SelectItem(hItem);//鼠标点击本身就是select
// 取得该ITEM的坐标。CTreeCtrl::GetItemRect
this->m_VNTree.GetItemRect(hItem,&rcItem,TRUE);
// 转换到屏幕坐标
CPoint
pt.x = rcItem.left+rcItem.Width()/2;
pt.y = rcItem.top+rcItem.Height()/2;
::ClientToScreen(this->m_VNTree.m_hWnd,&pt);
SetCursorPos(pt.x,pt.y);
// mouse_event
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
以上是控制同一进程中的CTreeCtrl控件,要是不同进程该怎么办呢??
转自:http://blog.youkuaiyun.com/seu07201213/archive/2006/08/19/1097305.aspx
跨进程操作CTreeCtrl
(模拟鼠标发送双击消息给另一进程CTreeCtrl中指定ITEM)
进程之间的数据通讯方式有很多种,我们操作另一进程的子窗口一般采用发消息的方式,因为windows窗口之间都是用windows消息机制。如果有时想发消息根据返回的WPARAM wParam,LPARAM lParam参数获取信息,你会发现获取的信息并不是你想要的,例如:
RECT rc;
*(HTREEITEM*)&rc = hTreeItem;
SendMessage(hwndTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);
因为你将本进程内的内存地址传入其它进程,是不能指望它会正确填充该地址,那怎么解决呢?
查查相关资料:
http://www.codeproject.com/threads/int64_memsteal.asp
和优快云 krh2001(边城浪子)兄的提醒,问题得到了圆满的解决:-)
本人以模拟QQ游戏大厅的树操作(模拟鼠标双击火拼麻将进入游戏)为例,看看实现的效果:
*(HTREEITEM*)&rect = Child61;
//鼠标事件
//释放内存
上述代码有个几个核心函数:
GetWindowThreadProcessId
WriteProcessMemory,
把以上代码放到一个消息响应函数里,试试吧,前提是要打开qqgame,不然得用CreateProcess之类的函数启动qqgame进程