我来问个问题吧 都来看看 发消息的问题 其实挺简单的 就是搞不定~ - -

FireBirdCN 2009-05-16 12:49:42
我平时喜欢玩DOTA 在VS对战平台
但很多时候 进房间是一件很繁琐的事情
低级房间不想进 不解释
高级房间进去的几率太低,但也没办法,每次想打 都要从都一号房开始一个一个的尝试
一般在试验完所有非1级房时 都能进去
就是这个重复的过程 我想写个程序替我完成
spy++了
也FindWindow了
最终一点点的
也找到那个房间列表CListCtrl了
也可以获取房间名了
对房间已满的对话框也判断了
然后最最让我头疼的是
向这个CListCtrl发送双击消息(因为进房间 要双击该房间的哇)
总是在双击第一个房间 - -

list->SetItemState(i,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

list->SetFocus();

list->SetHotItem(i);

list->GetItemRect(0,rc,LVIR_BOUNDS);
list->PostMessage(WM_LBUTTONDBLCLK,1,MAKELONG(rc.left+3*i,rc.top+3*i));

这些方法都用过了
// WriteProcessMemory(process, _rect, &Rect, sizeof(RECT), NULL);
// list->SendMessage(LVM_GETITEMRECT, (WPARAM)i, (LPARAM)&Rect);
// ::SendMessage(list->m_hWnd,LVM_GETITEMRECT,(WPARAM)i,(LPARAM)&Rect);
这方法也用过了
总是不成功 郁闷
请各位帮忙出出主意
这个不能算作 纯粹的挤房间器
只是物理的模仿操作行为
我觉得VS是不会限制的
...全文
229 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-05-18
  • 打赏
  • 举报
回复
这种方法SendMessage中不会出现&符号。
FireBirdCN 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cnzdgs 的回复:]
引用 9 楼 FireBirdCN 的回复:
回馈:
想用SendInput 或者 mouse_event 发现两种方法都要知道 鼠标的位置
顶楼中我用的
// WriteProcessMemory(process, _rect, &Rect, sizeof(RECT), NULL);
// list->SendMessage(LVM_GETITEMRECT, (WPARAM)i, (LPARAM)&Rect);
// ::SendMessage(list->m_hWnd,LVM_GETITEMRECT,(WPARAM)i,(LPARAM)&Rect);
的方法 总是不成功 获得不到rect 此方法没成功 各路大侠指教一下 获…
[/Quote]
偶是用的这种方法
取得 每一项的TEXT(LVM_GETITEMTEXT) 有用
但获得RECT 总搞不对 获取不到
看来还得继续弄这个 - -

cnzdgs 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 FireBirdCN 的回复:]
回馈:
想用SendInput 或者 mouse_event 发现两种方法都要知道 鼠标的位置
顶楼中我用的
// WriteProcessMemory(process, _rect, &Rect, sizeof(RECT), NULL);
// list->SendMessage(LVM_GETITEMRECT, (WPARAM)i, (LPARAM)&Rect);
// ::SendMessage(list->m_hWnd,LVM_GETITEMRECT,(WPARAM)i,(LPARAM)&Rect);
的方法 总是不成功 获得不到rect 此方法没成功 各路大侠指教一下 获得RECT的方法

三楼的方法也…
[/Quote]
跨进程发消息不能直接传递本进程中的指针(&Rect),需要用VirtualAllocEx在目标进程中分配内存,SendMessage返回后,再用ReadProcessMemory将内存中的数据复制到本进程。
FireBirdCN 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ljz888666555 的回复:]
搞定后代码给我份行吗,帮你顶次.
ljz888666555@163.com
[/Quote]

搞定一定给你
这是造福 广大VS玩家的东东啊
到时发到CSDN资源里去
ljz888666555 2009-05-18
  • 打赏
  • 举报
回复
搞定后代码给我份行吗,帮你顶次.
ljz888666555@163.com
FireBirdCN 2009-05-18
  • 打赏
  • 举报
回复
被54了? 人工置顶一次
FireBirdCN 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 TianChong 的回复:]
单设计选中状态显然是不行的,起作用的代码在你双击该房间时被触发运行,所以你应该发送双击事件,而非仅仅设置状态。发送双击事件有二种方法,一种是发送双击消息,上面有老大也提到的了:SendMessage(WM_NOTIFY,NM_CLICK,(LPARAM)&pNMLV); ,另一种是用mouse_event模拟鼠标事件,其实还有一种,就是你设置了选中状态之后,发送回车键看看。说不定这个也有作用。那一种简单就用哪一种吧。因为不是你自己的程序,别人处理了哪些事…
[/Quote]
我是设置了选中 然后又发送的双击消息 但双击的却不是选中的那项 是否是因为这两个动作不是一起发出的原因?
回车键不管用 在VS里 选中按回车也是没反应的 应该是没有做此项处理 只有有默认焦点的对话框回车才起作用
FireBirdCN 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq14923349 的回复:]

[/Quote]
兄台为何如此表情?
FireBirdCN 2009-05-18
  • 打赏
  • 举报
回复
回馈:
想用SendInput 或者 mouse_event 发现两种方法都要知道 鼠标的位置
顶楼中我用的
// WriteProcessMemory(process, _rect, &Rect, sizeof(RECT), NULL);
// list->SendMessage(LVM_GETITEMRECT, (WPARAM)i, (LPARAM)&Rect);
// ::SendMessage(list->m_hWnd,LVM_GETITEMRECT,(WPARAM)i,(LPARAM)&Rect);
的方法 总是不成功 获得不到rect 此方法没成功 各路大侠指教一下 获得RECT的方法

三楼的方法也试验了 用SendMesage发送 返回0 不成功 用PostMessage发送 返回1 成功 但是没反应
不晓得啥意思
恕小弟愚笨
各路大侠再指导一二
jishu520 2009-05-17
  • 打赏
  • 举报
回复
如果确认是LISTBOX控件,那么发送消息应该是可以的NM_CLICK消息应该是可以的,查看这个消息,看看它的参数怎么构成.如果还不行可以用模拟鼠标mouse_event,先得到LISTBOX控件在屏幕上的位置(GetWindowRect),然后在定位行的位置,应该也是可以的.

___________________________________________________________________________________________
www.520jishu.com
提供C++工程师远程培训(语音视频、在线答疑、电子教材、赠送实用代码库、推荐就业、就业后1年技术支持)
qq14923349 2009-05-16
  • 打赏
  • 举报
回复
TianChong 2009-05-16
  • 打赏
  • 举报
回复
单设计选中状态显然是不行的,起作用的代码在你双击该房间时被触发运行,所以你应该发送双击事件,而非仅仅设置状态。发送双击事件有二种方法,一种是发送双击消息,上面有老大也提到的了:SendMessage(WM_NOTIFY,NM_CLICK,(LPARAM)&pNMLV); ,另一种是用mouse_event模拟鼠标事件,其实还有一种,就是你设置了选中状态之后,发送回车键看看。说不定这个也有作用。那一种简单就用哪一种吧。因为不是你自己的程序,别人处理了哪些事件不好说,因此要试一下才能知道。
jameshooo 2009-05-16
  • 打赏
  • 举报
回复
Hot并不等于Selected
FireBirdCN 2009-05-16
  • 打赏
  • 举报
回复
反应一个现象
在程序运行过程中
我用鼠标 选中其中一个房间 比如专房20
那 就开始尝试进该房间了
我觉得 把鼠标单击选中这个专房20的动作模仿好了 就可以实现
鼠标选中该项 我就是用了顶楼我写的那些方法
但是
不起作用
每次放送双击消息前 我都有获取当前选中的房间名 房间名是对的 (依次1、2、3、4……)
该房间也出现了被选中的高亮显示
发送来的双击消息 还是在双击第一行 (就是弹出“请稍后再试” (VS为了防止一直挤同一房间设置的这个机制 试图进入一个房间不成功后 若很快再双击进入 就会提示“请稍后再试”))
情况就是这样了

两位大牛 提供的方式 我会试下 稍后回来反应情况
biweilun 2009-05-16
  • 打赏
  • 举报
回复
//发送消息点击List的第i行
 
NMHDR nh;
nh.hwndFrom = hList;
nh.idFrom=IDC_LIST_DEP;
nh.code=0xfffffffe;

NMLISTVIEW pNMLV;
pNMLV.hdr= nh;
pNMLV.iITem = i-1;
SendMessage(WM_NOTIFY,NM_CLICK,(LPARAM)&pNMLV);
cnzdgs 2009-05-16
  • 打赏
  • 举报
回复
在响应鼠标消息时,经常要获取鼠标的位置,如果鼠标的实际位置与模拟的位置不同,则会出现问题。建议用mouse_event模拟鼠标事件,也可以试试用SetCursorPos设置鼠标的位置。
oyljerry 2009-05-16
  • 打赏
  • 举报
回复
这些消息可能并不一定会被控件等处理..
可以模拟鼠标点击等,直接点击 SendInput()

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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