VS挤房间探索(含源码)

最近在网上看到一个VS挤房器,就想自己也实现一下玩玩。
这里主要是对远程进程空间中的控件发送消息的知识。
算法流程:
1. 先找到VS窗口
2. 找到VS窗口中显示房间列表的SysListView32控件
3. 读取房间列表, 这里是跨进程读取,方法是对SysListView32控件发送消息
4. 创建2个线程
5. 线程1任务:模拟不停的双击,由于VS中进入房间是通过双击进行的
6. 线程2任务:关闭房间人满窗口及重试窗口,由于VS中进入房间时如果房间人满,会弹出一个窗口,这个窗口我们需要关闭,另外,我们挤同一个窗口时会告诉你稍后重试,这个窗口也需要关闭
7. 同时,线程中判断我们是否已经成功进入房间,如果未成功则继续挤,成功则退出线程

下面说一下几个技术细节:
1. 为顾及版本兼容性,查找VS窗口我并没有直接FindWindow(NULL,"VS竞技游戏平台 -- 测试版-2.7.6"), 而是先找到VS进程ID,然后查找进程内窗口名前2个字节为'VS'的窗口,该窗口即为VS的主窗口

2. 查找SysListView32控件时可以直接EnumChildWindows, 从所有的子窗口中找到一个名为List1的控件,当然也可以由窗口类名为SysListView32作为判断条件

3. 对SysListView32控件发送消息的时候涉及到进程界限的问题,对远程控件发送消息时使用的数据结构必须在远程进程空间内,而不能在本进程空间内。所有先OpenProcess, 并用VirtualAllocEx申请远程进程空间内的内存,然后WriteProcessMemory把消息参数写入目标进程内,然后
SendMessage, 再ReadProcessMemory把返回值读出来,这个不懂可以看看Windows核心编程。

4. 如何模拟鼠标的双击呢?我一开始想的是发送WM_NOTIFY消息,没有成功,后来找资料,才找到直接发送WM_LBUTTONDBLCLK, 不过前提是选中房间。如何选中房间呢,如果当前已经选中某房间,必须把该房间的选择取消,然后再选中别的房间。选中房间的方法是发送LVM_SETITEMSTATE消息。另外,获取当前已选中房间的序号是发送LVM_GETNEXTITEM消息,关闭窗口是发送(WM_KEYDOWN, VK_ESCAPE)消息。

5. 线程通信问题,我这里主要是设置了2个EVENT, 分别代表双击事件和杀窗口事件(这里的杀窗口是指按ESC键), 这2个线程的逻辑是先双击需要进入的房间那一栏,然后等待房间人满窗口和重试窗口,如果发现这2个窗口,就关闭窗口双击下一个房间,如果没有发现这2个窗口而且SendMessage(WM_LBUTTONDBCLK)已经返回,则表示成功挤入房间。

附我的源码:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值