剑仙十号 外挂工程师
关注数: 19 粉丝数: 442 发帖数: 3,966 关注贴吧数: 96
TC简单开发。大漠绑定的原理。 新手 : 绑定窗口,是不是只有大漠插件才可以啊?TC自带的 没有绑定窗口? 稳定。 : TC也可以绑定,需要自己编写绑定函数。用下面的方法,自定义绑定函数。 TC简单开发。大漠绑定的原理。 COM接口dll 是类库的内容。 dm.BindWindow(窗口句柄, 图色, 鼠标, 键盘, 模式) 绑定,就是在COM接口dll内部,设置4,,5,,个dll 程序集变量。 ======================================================= dll 开始 var 类变量句柄 = 0 var 类变量图色 = "普通前台" var 类变量鼠标 = "普通前台" var 类变量键盘 = "普通前台" var 类变量模式 = "普通前台" //选项有:"普通前台", "window后台", "dx", "dx2" ,默认为 "普通前台" var 绑定 = 0 类函数 BindWindow(窗口句柄0, 图色0, 鼠标0, 键盘0, 模式0) 类变量句柄 = 窗口句柄0 类变量图色 = 图色0 类变量鼠标 = 鼠标0 类变量键盘 = 键盘0 类变量模式 = 模式0 绑定 = 1 结束 //类函数结束 类函数 键盘按键() if(绑定 == 0) 调用普通系统api() end // if(绑定 == 1) if(类变量键盘=="普通前台") //窗口获取座标() //窗口座标转屏幕座标() 调用普通系统api(hwnd, ) elseif(类变量键盘=="window后台") 调用后台系统api(hwnd, ) elseif(类变量键盘=="dx") 调用后台DX函数1(hwnd, ) elseif(类变量键盘=="dx2") 调用后台DX函数2(hwnd, ) end end 结束 //类函数结束 编写其它 鼠标键盘的操作函数,方法类似. ………… ………… dll结束 ======================================================= 安装VS2008。 下载天使插件_源代码。用VC++2008,打开天使源代码,里面有这项内容. http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fbbs.tyuyan.net%2Fforum.php%3Fmod%3Dviewthread%26tid%3D45659&urlrefer=81b1331ab93e6f6a250330228aac2a01 TC简单开发。编写COM接口DLL。 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fbbs.tyuyan.net%2Fforum.php%3Fmod%3Dviewthread%26tid%3D71091&urlrefer=f768cb2c48b076f57e00f81b4423a6af
文件类。文件对话框(模式,过滤符,父窗口句柄) 文件类。文件对话框(模式,过滤符,父窗口句柄) 函数参数: mode 0:保存文件,1:打开文件,2,选择文件夹 title:如下描述 参数2: 当参数1选择 模式0,或模式1时,参数2要用"||"来结尾。 文件选择类型过滤,"显示内容1|*.txt|显示内容2|*.doc||",显示内容与实际过滤项用"|"隔开,实际过滤项用*.加文件后缀设置,多个用"|"隔开,这样选择文件的时候只会显示指定的项, 这里的举例显示的是只显示.txt文件,与.doc结尾的文件,默认将显示所选目录下所有文件,结尾用"||"双竖线 模式3下的标题描述(非窗口标题),默认无标题 parentHwnd: 父窗口句柄(模式2下有效),弹出的选择文件夹对话框将会属于该窗口,并以模态窗口模式弹出,如不填或是错误的句柄值,将没有父窗口 返回值: 选择路径, 点确定后, 返回选择的路径。 如果直接点关闭或点取消,将返回一个空字符串 英文示例: var path=filedialog(0) 中文示例: 变量 path=文件对话框(0) ======================================================= 新手 : 功能 按钮1_点击() var 路径=文件对话框(0,".txt|*.txt|.doc|*.doc||") 调试输出("路径 :" & 路径) 结束 稳定。 : 运行tc,热键F1_帮助文档,window平台,文件类,文件对话框() 就有详细说明 函数参数: 参数1,模式, 0:保存文件,1:打开文件,2,选择文件夹 参数2: 当参数1选择 模式0,或模式1时,参数2要用"||"来结尾。 例如: var path=文件对话框(1, "||") //这样是显示全部文件 messagebox(path) 例子: var path=文件对话框(1, "显示内容1|*.txt||") //这样是 只显示txt文件 messagebox(path) 例子: var path=文件对话框(1, "显示内容2|*.doc||") //这样是 只显示doc文件 messagebox(path) 参考帮助文档,多测试几次就会了。 填好参数1,参数2,不用理会参数3。参数3是做子界面1,子界面2,子界面3的 ======================================================= 新手 : 你看看我那个代码,有什么问题吗 我测试,有两次是可以的 但是其他几次是执行了 但是没有找到刚才保存的文件 稳定。 :这样写: 功能 按钮1_点击() var 路径=文件对话框(0,".txt|*.txt||") 调试输出("路径 : " & 路径) 结束 如果脚本不稳定,你就重新新建一个脚本,一行行的敲代码进去。 你要敲代码,不要复制代码,特别是: 不要复制 网页的代码, 不要复制 按键精灵代码, 不要复制 大漠帮助文档的代码。 这些代码中,往往带有不可显示字符,使你的脚本,带有不可预知的因素 对程序员来说,不可见的网页字符,是很可怕。一个不可见符号,可以使你浪费半天的纠错时间。 脚本代码是对的,但经常神经错乱,有时执行,有时不执行。群主也是向高手请教,才知道这问题。从此脚本稳如狗 不可见字符,例如:网页上的美元符号 不可见字符,非常可怕 ======================================================= 稳定。 : var path=文件对话框(0, "显示内容1|*.txt||") traceprint(path) 变量 文件句柄=文件创建(path& "text.txt", "读写|共享读|共享写|总是创建") 如果(文件句柄==0) 消息框("文件创建失败") 否则 消息框("文件创建成功") 文件关闭(文件句柄) 结束 ======================================================= 把这些代码,复制到 执行() 按F9测试,再到你刚才选择的路径,寻找 text.txt 新手: 用文件创建() 去保存文件是可行的 稳定。 : 文件对话框() ,作用是获取路径。 所以说,你不懂 文件对话框() ,需要使用的情景模式。 新手 : 但昨天一开始,我没有用文件创建去建立文件,单单只是文件对话框() 去保存一个txt文件也是可行的。 这就很奇怪了 没有这种事。 如果文件本来存在,才可行的 嗯嗯¡ 谢啦
学习方向。编程四大法 学习方向。编程四大法: 流程控制,变量和数组,函数多线程,系统api 之后学习类的三要素: 类的封装,类的继承,类的多态 想学习内存的,必须学习类。 一个纯虚类(基因模块),可以造出无数个 该类的对象。 如植物大战僵尸,一个植物类,可以实例化成 无数植物, 一个僵尸类,可以实例化成 无数僵尸, 一个卡槽类,可以实例化成 10个卡槽, 一个物品类,可以实例化成 无数阳光,金币,银币,钻石, 学完类,你就知道 类变量,怎样生成基址,怎样生成偏移, 类函数(子程序,子函数),怎样生成call 你会造锁,你就会解锁 你会造车,你就会修车 ======================================================= 学完编程四大法,类的三要素,编程就大成了。其它东西不要学,浪费精力 人的精力和时间 是有限的。 有人学了 5,6年按键精灵,还是找图找色 那水平。 找图() 找色() 是封装好的函数,又叫模块。 模块的东西,看几次就会了,不要长期去研究 群主参考 天使插件的源码,也能写一个找图() 找色() 了。 用易语言来说,是创建一个位图对象, bmp.载入("路径") //把bmp加载到内存, bmp.截图(x0, y0, x1, y1) 读取bmp颜色信息(位图),保存到二维数组0。 读取bmp颜色信息(截图),保存到二维数组1。 对比两组bmp数组的信息,再找图,找色。 写完找图() 找色() 函数,编程已经大成。
函数多线程。临界区 函数多线程。临界区 多线程脚本中,临界区有啥作用 TC的临界区,跟易的线程许可区一样? jrflsh : 嗯,线程要进入临界区,需要挂号排队。一个出来了,另外一个线程才能进去。 jimye0526 : CriticalSection,翻译过来就是“临界区”。E的叫法是:进入许可证/许可区 365是的啊 : 临界区是lock,一种锁。避免多个线程,抢夺改写同一个全局变量。例子: var ret序号 功能 线程1() lock for(var i=0; i<10; i++) ret序号 = i end unlock 结束 功能 线程2() lock for(var i=10; i<20; i++) ret序号 = i end unlock 结束 新手 : 在多线程中,两个线程同时查找同一个图片,会卡机吗?多个线程同时查找同一个图片,会卡机吗? 365是的啊: 不会 ======================================================= 稳定。 : //先上代码。 var 句柄, hThread1, hThread2, hThread3 功能 启动_热键() 句柄 = 临界区创建() var bool = 线程获取状态(hThread1) if(bool == 0) hThread1 = 线程开启("线程1", "") hThread2 = 线程开启("线程2", "") hThread3 = 线程开启("线程3", "") end 结束 功能 终止_热键() 线程关闭(hThread1) 线程关闭(hThread2) 线程关闭(hThread3) 临界区删除(句柄) 结束 功能 线程1() 临界区进入(句柄) for(var i=0; i<10; i++) 鼠标移动(*, *) sleep(100) 鼠标左键单击() sleep(100) end 临界区离开(句柄) 结束 功能 线程2() 临界区进入(句柄) for(var i=0; i<10; i++) 鼠标移动(*, *) sleep(100) 鼠标左键单击() sleep(100) end 临界区离开(句柄) 结束 功能 线程3() 临界区进入(句柄) // 临界区离开(句柄) 结束 ======================================================= 稳定。 : TC的临界区,在按键精灵叫互斥体,在易语言叫许可证。 临界区,就是设置一个服务区,线程办理业务,需要挂号排队。避免多个线程,争夺同一资源,使0x********内存地址不能为read. . 用银行业务来举例, 临界区创建(),在银行区域,划分几个服务区(柜台)。 临界区进入(句柄),这句命令包括三个步骤:到银行挂号,等待叫号,办理业务。 临界区离开(句柄),用户离开服务区(柜台)。 临界区删除(句柄),回收系统资源。 . 前台鼠标只有一个。多个线程 绑定同一个游戏窗口,多个线程抢用前台鼠标,线程_临界区就派上用场。相关教程: 【深入浅出篇】第五课 TC线程 【深入浅出篇】第六课 临界区的使用 【深入浅出篇】第七课 消息路由和消息过程
托儿。现在的手游托真多,我被坑了4千。 托儿。现在的手游托真多,我被坑了4千。你们遇到过吗? 速度快见面 : 我就大学生一个,和同学一起玩一款手游。我和我同学一人充了100块钱,玩得好好的。谁知道第二天就来了一个土豪,在游戏里各种揍我们。后来没办法,打不过就得充钱呗!就这样玩了大概半个月的样子。我充了4千,我同学充了两千。直达有一天才知道那个土豪是个托。他因为不听从游戏运营商安排,号被封了。所以开了几个小号在世界聊天上爆内幕。我们知道这些气得不行。 其实游戏里面,并没有那么多土豪,那些充几千几万的大部分都是托。他们充值全是游戏运营商发放的,托号玩家不用花一分钱。游戏运营商每天给托号发放500-1000的充值,要求他们去游戏里刺激玩家消费。 我同学了解这些后,就想当托。不用再花钱充值玩游戏了。他到处寻找当托的渠道,花了半个月时间。终于在维信公众号《游神天堂》内拿到个托号。他也就帮游戏运营商当了两个月的托,游戏运营商给他号上发放了2w多充值。还有2000多块钱的奖金。 后来我也去看了一下,发现现在不止几款游戏有托。除了竞技类型的游戏,基本上所有游戏都有托号。所以大家以后玩游戏留个心眼吧! http://tieba.baidu.com/p/5911550634 请给我治疗 : 楼主这个托 bd888wp : 么得,现在打广告的,都是博士后了吗?打得这么有水平 bd888wp : 么得,现在打广告都是博士后了吗?打的这么有水平
编码。字符和字符编码_的相互转换 编码。字符和字符编码_的相互转换 随机数(#4e00,#9fff) 这个随机数出来的, 有简体,繁体和符号。#是十六进制数。 我只想要简体中文,代码应该怎样写。 var hThread 功能 执行() var 汉字 for(var i = 0; i < 100; i++) 汉字 = 随机7000常用汉字() traceprint(汉字) end 结束 功能 启动_热键() var bool = 线程获取状态(hThread) if(bool == 0) hThread = 线程开启("执行", "") end 结束 功能 终止_热键() 线程关闭(hThread) 结束 功能 随机7000常用汉字() //言术 : 变量 编码1 = 数组(#7684, #4e00, #4e86, #662f, #6211, #4e0d, #5728, #4eba, #4eec, #6709, #6765, #4ed6, #8fd9, #4e0a, #7740, #4e2a, #5730, #5230, #5927, #91cc, #8bf4, #5c31, #53bb, #5b50, #5f97) 变量 编码2 = 数组(#4e5f, #548c, #90a3, #8981, #4e0b, #770b, #5929, #65f6, #8fc7, #51fa, #5c0f, #4e48, #8d77, #4f60, #90fd, #628a, #597d, #8fd8, #591a, #6ca1, #4e3a, #53c8, #53ef, #5bb6, #5b66) 变量 编码3 = 数组(#53ea, #4ee5, #4e3b, #4f1a, #6837, #5e74, #60f3, #751f, #540c, #8001, #4e2d, #5341, #4ece, #81ea, #9762, #524d, #5934, #9053, #5b83, #540e, #7136, #8d70, #5f88, #50cf, #89c1) 变量 编码4 = 数组(#4e24, #7528, #5979, #56fd, #52a8, #8fdb, #6210, #56de, #4ec0, #8fb9, #4f5c, #5bf9, #5f00, #800c, #5df1, #4e9b, #73b0, #5c71, #6c11, #5019, #7ecf, #53d1, #5de5, #5411, #4e8b) 变量 编码5 = 数组(#547d, #7ed9, #957f, #6c34, #51e0, #4e49, #4e09, #58f0, #4e8e, #9ad8, #624b, #77e5, #7406, #773c, #5fd7, #70b9, #5fc3, #6218, #4e8c, #95ee, #4f46, #8eab, #65b9, #5b9e) 变量 编码6 = 数组(#5403, #505a, #53eb, #5f53, #4f4f, #542c, #9769, #6253, #5462, #771f, #5168, #624d, #56db, #5df2, #6240, #654c, #4e4b, #6700, #5149, #4ea7, #60c5, #8def, #5206, #603b, #6761) 变量 编码7 = 数组(#767d, #8bdd, #4e1c, #5e2d, #6b21, #4eb2, #5982, #88ab, #82b1, #53e3, #653e, #513f, #5e38, #6c14, #4e94, #7b2c, #4f7f, #5199, #519b, #5427, #6587, #8fd0, #518d, #679c) 变量 编码8 = 数组(#600e, #5b9a, #8bb8, #5feb, #660e, #884c, #56e0, #522b, #98de, #5916, #6811, #7269, #6d3b, #90e8, #95e8, #65e0, #5f80, #8239, #671b, #65b0, #5e26, #961f, #5148, #529b) 变量 编码9 = 数组(#5b8c, #5374, #7ad9, #4ee3, #5458, #673a, #66f4, #4e5d, #60a8, #6bcf, #98ce, #7ea7, #8ddf, #7b11, #554a, #5b69, #4e07, #5c11, #76f4, #610f, #591c, #6bd4, #9636) 变量 编码10 = 数组(#8fde, #8f66, #91cd, #4fbf, #6597, #9a6c, #54ea, #5316, #592a, #6307, #53d8, #793e, #4f3c, #58eb, #8005, #5e72, #77f3, #6ee1, #65e5, #51b3, #767e, #539f, #62ff, #7fa4) 变量 编码11 = 数组(#7a76, #5404, #516d, #672c, #601d, #89e3, #7acb, #6cb3, #6751, #516b, #96be, #65e9, #8bba, #5417, #6839, #5171, #8ba9, #76f8, #7814, #4eca, #5176, #4e66, #5750) 变量 编码12 = 数组(#63a5, #5e94, #5173, #4fe1, #89c9, #6b65, #53cd, #5904, #8bb0, #5c06, #5343, #627e, #4e89, #9886, #6216, #5e08, #7ed3, #5757, #8dd1, #8c01, #8349, #8d8a, #5b57, #52a0, #811a, #7d27, #7231, #7b49, #4e60, #9635, #6015, #6708, #9752, #534a, #706b, #6cd5, #9898, #5efa, #8d76, #4f4d, #5531, #6d77, #4e03, #5973, #4efb, #4ef6, #611f) 变量 编码13 = 数组(#51c6, #5f20, #56e2, #5c4b, #79bb, #8272, #8138, #7247, #79d1, #5012, #775b, #5229, #4e16, #521a, #4e14, #7531, #9001, #5207, #661f, #5bfc, #665a, #8868, #591f, #6574, #8ba4, #54cd, #96ea, #6d41, #672a, #573a, #8be5, #5e76, #5e95, #6df1, #523b, #5e73, #4f1f, #5fd9, #63d0, #786e, #8fd1, #4eae, #8f7b, #8bb2, #519c, #53e4, #9ed1) 变量 编码14 = 数组(#544a, #754c, #62c9, #540d, #5440, #571f, #6e05, #9633, #7167, #529e, #53f2, #6539, #5386, #8f6c, #753b, #9020, #5634, #6b64, #6cbb, #5317, #5fc5, #670d) 变量 编码15 = 数组(#96e8, #7a7f, #5185, #8bc6, #9a8c, #4f20, #4e1a, #83dc, #722c, #7761, #5174, #5f62, #91cf, #54b1, #89c2, #82e6, #4f53, #4f17, #901a, #51b2, #5408, #7834) 变量 编码16 = 数组(#53cb, #5ea6, #672f, #996d, #516c, #65c1, #623f, #6781, #5357, #67aa, #8bfb, #6c99, #5c81, #7ebf, #91ce, #575a, #7a7a, #6536, #7b97, #81f3, #653f, #57ce) 变量 编码17 = 数组(#52b3, #843d, #94b1, #7279, #56f4, #5f1f, #80dc, #6559, #70ed, #5c55, #5305, #6b4c, #7c7b, #6e10, #5f3a, #6570, #4e61, #547c, #6027, #97f3, #7b54, #54e5) 变量 编码18 = 数组(#9645, #65e7, #795e, #5ea7, #7ae0, #5e2e, #5566, #53d7, #7cfb, #4ee4, #8df3, #975e, #4f55, #725b, #53d6, #5165, #5cb8, #6562, #6389, #5ffd, #79cd, #88c5) 变量 编码19 = 数组(#9876, #6025, #6797, #505c, #606f, #53e5, #533a, #8863, #822c, #62a5, #53f6, #538b, #6162, #53d4, #80cc, #7ec6) // var 随机结果 = 数组(), 大小, unicode 选择(随机数(1, 19)) 条件 1 随机结果 = 编码1 条件 2 随机结果 = 编码2 条件 3 随机结果 = 编码3 条件 4 随机结果 = 编码4 条件 5 随机结果 = 编码5 条件 6 随机结果 = 编码6 条件 7 随机结果 = 编码7 条件 8 随机结果 = 编码8 条件 9 随机结果 = 编码9 条件 10 随机结果 = 编码10 条件 11 随机结果 = 编码11 条件 12 随机结果 = 编码12 条件 13 随机结果 = 编码13 条件 14 随机结果 = 编码14 条件 15 随机结果 = 编码15 条件 16 随机结果 = 编码16 条件 17 随机结果 = 编码17 条件 18 随机结果 = 编码18 条件 19 随机结果 = 编码19 结束 大小 = 数组大小(随机结果) unicode = 随机结果[随机数(0, 大小 - 1)] //在计算机中,每个汉字,都有一个十六进制.unicode编码. //用字符串格式化(), 把参数2的unicode, 转换成参数1格式的字符串. return 字符串格式化("%c", unicode) 结束
获取活动窗口句柄() var hthread 功能 执行() //由于GetActiveWindow()函数,只能获取自身进程的窗口句柄. //所以调用AttachThreadInput()函数,把代码线程,附加到目标进程空间. var hwnd顶层 = GetForegroundWindow() //获得顶层窗口句柄. traceprint("hwnd顶层:" & hwnd顶层) var ProcessId //根据顶层窗口句柄,获取顶层窗口的线程ID var ForeThreadId = GetWindowThreadProcessId(hwnd顶层, ProcessId) var SelfThreadId = GetCurrentThreadId() // var bool = AttachThreadInput(ForeThreadId, SelfThreadId, 1) //附加线程 //讲白话点,把当前线程附加到目标进程空间。 var hwnd活动 = GetActiveWindow() //获取活动窗口句柄 traceprint("hwnd活动:" & hwnd活动) bool = AttachThreadInput(ForeThreadId, SelfThreadId, 0) //取消附加线程 //通过对比句柄,顶层窗口和活动窗口,都是主窗口. 窗口设置位置(hwnd活动, 0, 0) 结束 功能 启动_热键() var bool = 线程获取状态(hthread) if(bool == 0) hthread = 线程开启("执行", "") end 结束 功能 终止_热键() 线程关闭(hthread) 结束 功能 GetForegroundWindow() //获得顶层窗口句柄. return dllcall("User32.dll", "long", "GetForegroundWindow") 结束 功能 GetWindowThreadProcessId(hwnd顶层, &ProcessId) //根据顶层窗口句柄,获取顶层窗口的线程ID return dllcall("User32.dll", "long", "GetWindowThreadProcessId", "long", hwnd顶层, "plong", ProcessId) 结束 功能 GetCurrentThreadId() //获取本身的线程ID return dllcall("kernel32.dll", "long", "GetCurrentThreadId") 结束 // 功能 AttachThreadInput(ForeThreadId, SelfThreadId, bool0) //附加线程 //取消附加线程 return dllcall("User32.dll", "long", "AttachThreadInput", "long", ForeThreadId, "long", SelfThreadId, "long", bool0) 结束 功能 GetFocus() //获取具有输入焦点的窗口句柄 return dllcall("User32.dll", "long", "GetFocus") 结束 功能 GetActiveWindow() //获取活动窗口句柄() return dllcall("user32.dll", "long", "GetActiveWindow") 结束
获取活动窗口句柄() var hthread 功能 执行() //由于GetActiveWindow()函数,只能获取自身进程的窗口句柄. //所以调用AttachThreadInput()函数,把代码线程,附加到目标进程空间. var hwnd顶层 = GetForegroundWindow() //获得顶层窗口句柄. traceprint("hwnd顶层:" & hwnd顶层) var ProcessId //根据顶层窗口句柄,获取顶层窗口的线程ID var ForeThreadId = GetWindowThreadProcessId(hwnd顶层, ProcessId) var SelfThreadId = GetCurrentThreadId() // var bool = AttachThreadInput(ForeThreadId, SelfThreadId, 1) //附加线程 //讲白话点,把当前线程附加到目标进程空间。 var hwnd活动 = GetActiveWindow() //获取活动窗口句柄 traceprint("hwnd活动:" & hwnd活动) bool = AttachThreadInput(ForeThreadId, SelfThreadId, 0) //取消附加线程 //通过对比句柄,顶层窗口和活动窗口,都是主窗口. 窗口设置位置(hwnd活动, 0, 0) 结束 功能 启动_热键() var bool = 线程获取状态(hthread) if(bool == 0) hthread = 线程开启("执行", "") end 结束 功能 终止_热键() 线程关闭(hthread) 结束 功能 GetForegroundWindow() //获得顶层窗口句柄. return dllcall("User32.dll", "long", "GetForegroundWindow") 结束 功能 GetWindowThreadProcessId(hwnd顶层, &ProcessId) //根据顶层窗口句柄,获取顶层窗口的线程ID return dllcall("User32.dll", "long", "GetWindowThreadProcessId", "long", hwnd顶层, "plong", ProcessId) 结束 功能 GetCurrentThreadId() //获取本身的线程ID return dllcall("kernel32.dll", "long", "GetCurrentThreadId") 结束 // 功能 AttachThreadInput(ForeThreadId, SelfThreadId, bool0) //附加线程 //取消附加线程 return dllcall("User32.dll", "long", "AttachThreadInput", "long", ForeThreadId, "long", SelfThreadId, "long", bool0) 结束 功能 GetFocus() //获取具有输入焦点的窗口句柄 return dllcall("User32.dll", "long", "GetFocus") 结束 功能 GetActiveWindow() //获取活动窗口句柄() return dllcall("user32.dll", "long", "GetActiveWindow") 结束
获取具有输入焦点的窗口句柄() var hthread 功能 执行() //由于GetFocus()函数,只能获取自身进程的控件句柄. //所以调用AttachThreadInput()函数,把代码线程,附加到目标进程空间. var hwnd顶层 = GetForegroundWindow() //获得顶层窗口句柄. var ProcessId //根据顶层窗口句柄,获取顶层窗口的线程ID var ForeThreadId = GetWindowThreadProcessId(hwnd顶层, ProcessId) var SelfThreadId = GetCurrentThreadId() traceprint("ProcessId:" & ProcessId) // var bool = AttachThreadInput(ForeThreadId, SelfThreadId, 1) //附加线程 //讲白话点,把当前线程附加到目标进程空间。 var hwnd焦点 = GetFocus() //获取具有输入焦点的窗口句柄 bool = AttachThreadInput(ForeThreadId, SelfThreadId, 0) //取消附加线程 // //对记事本输出信息,要使用窗口发送字符(hwnd焦点, 13) //窗口发送按键(hwnd焦点, 13) 这个无效。 窗口发送字符串(hwnd焦点, "ProcessId:" & ProcessId) 窗口发送字符(hwnd焦点, 13) 窗口发送字符串(hwnd焦点, "hwnd焦点:" & hwnd焦点) 窗口发送字符(hwnd焦点, 13) 结束 功能 启动_热键() var bool = 线程获取状态(hthread) if(bool == 0) hthread = 线程开启("执行", "") end 结束 功能 终止_热键() 线程关闭(hthread) 结束 功能 GetForegroundWindow() //获得顶层窗口句柄. return dllcall("User32.dll", "long", "GetForegroundWindow") 结束 功能 GetWindowThreadProcessId(hwnd顶层, &ProcessId) //根据顶层窗口句柄,获取顶层窗口的线程ID return dllcall("User32.dll", "long", "GetWindowThreadProcessId", "long", hwnd顶层, "plong", ProcessId) 结束 功能 GetCurrentThreadId() //获取本身的线程ID return dllcall("kernel32.dll", "long", "GetCurrentThreadId") 结束 // 功能 AttachThreadInput(ForeThreadId, SelfThreadId, bool0) //附加线程 //取消附加线程 return dllcall("User32.dll", "long", "AttachThreadInput", "long", ForeThreadId, "long", SelfThreadId, "long", bool0) 结束 功能 GetFocus() //获取具有输入焦点的窗口句柄() return dllcall("User32.dll", "long", "GetFocus") 结束 功能 GetActiveWindow() //获取活动窗口句柄() return dllcall("user32.dll", "long", "GetActiveWindow") 结束
获取具有输入焦点的窗口句柄() var hthread 功能 执行() //由于GetFocus()函数,只能获取自身进程的控件句柄. //所以调用AttachThreadInput()函数,把代码线程,附加到目标进程空间. var hwnd顶层 = GetForegroundWindow() //获得顶层窗口句柄. var ProcessId //根据顶层窗口句柄,获取顶层窗口的线程ID var ForeThreadId = GetWindowThreadProcessId(hwnd顶层, ProcessId) var SelfThreadId = GetCurrentThreadId() traceprint("ProcessId:" & ProcessId) // var bool = AttachThreadInput(ForeThreadId, SelfThreadId, 1) //附加线程 //讲白话点,把当前线程附加到目标进程空间。 var hwnd焦点 = GetFocus() //获取具有输入焦点的窗口句柄 bool = AttachThreadInput(ForeThreadId, SelfThreadId, 0) //取消附加线程 // //对记事本输出信息,要使用窗口发送字符(hwnd焦点, 13) //窗口发送按键(hwnd焦点, 13) 这个无效。 窗口发送字符串(hwnd焦点, "ProcessId:" & ProcessId) 窗口发送字符(hwnd焦点, 13) 窗口发送字符串(hwnd焦点, "hwnd焦点:" & hwnd焦点) 窗口发送字符(hwnd焦点, 13) 结束 功能 启动_热键() var bool = 线程获取状态(hthread) if(bool == 0) hthread = 线程开启("执行", "") end 结束 功能 终止_热键() 线程关闭(hthread) 结束 功能 GetForegroundWindow() //获得顶层窗口句柄. return dllcall("User32.dll", "long", "GetForegroundWindow") 结束 功能 GetWindowThreadProcessId(hwnd顶层, &ProcessId) //根据顶层窗口句柄,获取顶层窗口的线程ID return dllcall("User32.dll", "long", "GetWindowThreadProcessId", "long", hwnd顶层, "plong", ProcessId) 结束 功能 GetCurrentThreadId() //获取本身的线程ID return dllcall("kernel32.dll", "long", "GetCurrentThreadId") 结束 // 功能 AttachThreadInput(ForeThreadId, SelfThreadId, bool0) //附加线程 //取消附加线程 return dllcall("User32.dll", "long", "AttachThreadInput", "long", ForeThreadId, "long", SelfThreadId, "long", bool0) 结束 功能 GetFocus() //获取具有输入焦点的窗口句柄() return dllcall("User32.dll", "long", "GetFocus") 结束 功能 GetActiveWindow() //获取活动窗口句柄() return dllcall("user32.dll", "long", "GetActiveWindow") 结束
内存类。dm.ReadInt() 内存类。dm.ReadInt() 函数简介: 读取指定地址的整数数值,类型可以是8位,16位 或者 32位 函数原型: long = ReadInt(hwnd,addr,type) 参数定义: hwnd 整形数: 指定搜索的窗口句柄或者进程ID. 默认是窗口句柄.如果要指定为进程ID,需要调用SetMemoryHwndAsProcessId() addr 字符串: 用字符串来描述地址,类似于CE的地址描述,数值必须是16进制,里面可以用[ ] + -这些符号来描述一个地址。+表示地址加,-表示地址减。模块名必须用<>符号来圈起来 例如: 1. "4DA678" 最简单的方式,用绝对数值来表示地址 2. "<360SE.exe>+DA678" 相对简单的方式,只是这里用模块名来决定模块基址,后面的是偏移 3. "[4DA678]+3A" 用绝对数值加偏移,相当于一级指针 4. "[<360SE.exe>+DA678]+3A" 用模块定基址的方式,也是一级指针 5. "[[[<360SE.exe>+DA678]+3A]+5B]+8" 这个是一个三级指针 总之熟悉CE的人 应该对这个地址描述都很熟悉。 type 整型数。 整数类型,取如下数值。 0 : 32位有符号 1 : 16 位有符号 2 : 8位有符号 3 : 16位无符号 4 : 8位无符号 返回值:整型数。 返回值,是ReadInt()读取到的数值。 如果要想知道函数是否执行成功,请查看GetLastError函数. 示例: var value = dm.ReadInt(hwnd,"4DA678",0) messagebox(value) 参数2的地址,必须是字符串。 参数2的数值,使用16进制数值。 在TC中,参数2的格式,使用 字符串格式化() 来获取。 "使用字符串连接符" & "来拼接"。 示例: //下载dm.dll,并添加到 项目管理,资源。 var address植物, hwnd, dm 功能 植物类() var ret = 注册插件("rc:dm.dll", 真) traceprint("插件。注册情况:" & ret) dm = com("dm.dmsoft") hwnd = dm.FindWindow("", "窗口标题名") if(hwnd == 0) messagebox("窗口未开启。", "提示") end // address植物 = dm.ReadInt(hwnd, "[[006A9EC0]+768]+AC", 0) var 当前植物数量 = dm.ReadInt(hwnd, "[[006A9EC0]+768]+BC", 0) 当前植物数量 = 当前植物数量 + 10 //就算10个植物被连续去掉,处在最后面的植物对象 也能遍历到. // for(var i = 0; i < 当前植物数量; i++) var offset3种类 = #24 + #14C * i //#14C * i为下一个植物对象。i从0--当前植物数量。 var address3种类 = address植物 + offset3种类 var str_address = 字符串格式化("%X", address3种类) var 植物代号 = dm.ReadInt(hwnd, str_address, 0) if(植物代号 == 47) traceprint("植物数组下标:" & i &",转换为16进制:" & 字符串格式化("%X", i)) end end 结束
首页 2 3 4 5 6 7 下一页