100分求 模拟鼠标发送双击消息给CTreeCtrl中指定ITEM的代码

summerICEREDTEA 2006-08-18 10:06:29
rt
...全文
582 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
summerICEREDTEA 2006-08-21
  • 打赏
  • 举报
回复
aluzi(aluzi)
确实是SendMessage啊 但是要发送位置参数啊
aluzi 2006-08-20
  • 打赏
  • 举报
回复
直接用SendMessage就行了,干吗模拟鼠标点击?
折腾_苏州 2006-08-20
  • 打赏
  • 举报
回复
楼上一点提醒,另我茅塞顿开啊,怎么没考虑到VirtualAllocEx:-)

针对楼主情况,我写了一篇blog,楼主可去看看;
http://blog.csdn.net/seu07201213/archive/2006/08/19/1097305.aspx
jerry 2006-08-18
  • 打赏
  • 举报
回复
如果你能得到该树的句柄.

TreeView_GetItemRect(hwndTree, hTreeItem, &rect, TRUE);


可以得到其它进程的控件信息
::ClientToScreen(hwndTree, &pt);
也可以运行


发送鼠标事件与进程无关. 所以. 你还是可以按这个方法去做
lixiaosan 2006-08-18
  • 打赏
  • 举报
回复
假如树是如此排列的
---1
|
---2
|
-----3
数句柄:hwnd
你找到他们的HTREEITEM,分别为hItem1, hItem2, hItem3

假如你要双击3

TreeView_EnsureVisible(hwnd, hItem3);
CRect rect;
TreeView_GetItemRect(hwnd, hItem3, &rect, TRUE);
CPoint pt;
pt.x = rect.left + rect.Width()/2;
pt.y = rect.top + rect.Height()/2;
::ClientToScreen(hwnd, &pt);
SetCursorPos(pt.x, pt.y);
mouse_event(MOUSEEVNETF_LEFTDOWN, 0, 0, 0);
mouse_event(MOUSEEVNETF_LEFTUP, 0, 0, 0);
mouse_event(MOUSEEVNETF_LEFTDOWN, 0, 0, 0);
mouse_event(MOUSEEVNETF_LEFTUP, 0, 0, 0);

mynamelj 2006-08-18
  • 打赏
  • 举报
回复
mark
jerry 2006-08-18
  • 打赏
  • 举报
回复
楼上。

*(HTREEITEM*)&rc = hTreeItem;
SendMessage(hwndTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);

跨进程不能这样做。 你将你进程内的内存地址传入其它进程,指望它会正确填充吗
这里需要有点技巧。可以用
OpenProcess 打开进程
VirtualAllocEx 在该进程内分配内存
lixiaosan 2006-08-18
  • 打赏
  • 举报
回复
CRect rect;
TreeView_GetItemRect(hwndTree, hTreeItem, &rect, TRUE);
ClientToScreen(....);
mouse_event(MOUSEEVENTF_LEFTDOWN, .....);
mouse_event(MOUSEEVENTF_LEFTUP, .....);
mouse_event(MOUSEEVENTF_LEFTDOWN, .....);
mouse_event(MOUSEEVENTF_LEFTUP, .....);
summerICEREDTEA 2006-08-18
  • 打赏
  • 举报
回复
krh2001(边城浪子)
谢谢你的指导

还有个问题忘了说了 我操作的是其他进程的树控件
http://community.csdn.net/Expert/topic/4951/4951006.xml?temp=.3357202
这是我的另一个帖子 你可以看看 我有什么问题吗
我发送TVM_GETITEMRECT消息 得不到正确的结果
jerry 2006-08-18
  • 打赏
  • 举报
回复
1) 取得该ITEM的坐标。CTreeCtrl::GetItemRect
2)转换到屏幕坐标 CTreeCtrl::ClientToScreen
2) mouse_event 发送模拟鼠标消息到该矩形内一点。
折腾_苏州 2006-08-18
  • 打赏
  • 举报
回复
TreeView_GetItemRect宏 跨进程似乎取不到rect;
RECT rc;
*(HTREEITEM*)&rc = hTreeItem;
SendMessage(hwndTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);
SendMessage会返回FALSE, 在同一进程是可以这么取的

跨进程,可这么解决:
先获取tree的位置,根据item的位置和item的高度结合tree的rect来确定其位置,最后
模拟鼠标事件
CRect和CPoint可用RECT和POINT替换


RECT rect;

POINT pt;
pt.x = rect.left + (rect.right-rect.left)/2;
pt.y = rect.top + (rect.bottom-rect.top)/2;
::ClientToScreen(htree, &pt);
SetCursorPos(pt.x, pt.y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);


littlepboy 2006-08-18
  • 打赏
  • 举报
回复
晕,这些要包含MFC的类啊
#include <afxwin.h>
Y___Y 2006-08-18
  • 打赏
  • 举报
回复
看看SendMessage()函数
m_dbsky 2006-08-18
  • 打赏
  • 举报
回复
是不是哪写错了,或是你Copy的代码,可能会有其他字符在里面

你查一下MSDN哦,
VOID mouse_event(
DWORD dwFlags,
DWORD dx,
DWORD dy,
DWORD dwData,
ULONG_PTR dwExtraInfo
);

MOUSEEVENTF_LEFTDOWN,MOUSEEVENTF_LEFTUP是这样写的
summerICEREDTEA 2006-08-18
  • 打赏
  • 举报
回复
MOUSEEVENTF_LEFTDOWN 也是未定义

我建立的是win32 project
summerICEREDTEA 2006-08-18
  • 打赏
  • 举报
回复
CRect和CPoint要包含什么头文件才能调用啊
我include <windows.h>
提示CRect : undeclared identifier
summerICEREDTEA 2006-08-18
  • 打赏
  • 举报
回复
非常感谢,早上有点忙 现在才看到
马上实验,成功就结贴
m_dbsky 2006-08-18
  • 打赏
  • 举报
回复
感谢lixiaosan(小三) 啊

我刚遇到一个类似的问题,模拟鼠标发送消息给CTabCtrl实现切换,搜索资料就跑到这来了,我借用了下lixiaosan(小三) 的代码,成功了,感谢lixiaosan(小三) 啊

以下是我的代码:(模拟鼠标发送消息给CTabCtrl实现切换),希望对你有用

void CMainFrame::MouseChengeTab(int i)
{
HWND hParent=AfxGetMainWnd()->m_hWnd;
HWND hwnd=::FindWindowEx(hParent,NULL,NULL,NULL);//
HWND hwnd_1=::FindWindowEx(hwnd,NULL,"#32770",NULL);
HWND hwnd_2=::FindWindowEx(hwnd,hwnd_1,"#32770",NULL);
HWND hTab=::FindWindowEx(hwnd_2,NULL,"SysTabControl32","Tab1");//tab的句柄
CRect rc;
TabCtrl_GetItemRect(hTab,i,&rc);//TCM_GETITEMRECT
CPoint pt;
pt.x = rc.left + rc.Width()/2;
pt.y = rc.top + rc.Height()/2;
::ClientToScreen(hTab, &pt);
SetCursorPos(pt.x, pt.y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP ,0, 0, 0, 0);
}

15,975

社区成员

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

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