当前位置 : 145z游戏站 | 魔域 | 技术教程 | 

魔域大漠插件后台鼠标停留物品提示消失的完整解决方法

热度:
用大漠插件绑魔域窗口做后台脚本,dx2图色加windows鼠标键盘模式,找图找色点击都正常,唯独鼠标移到装备或物品上面,提示框闪一下就没了,大概也就0.3秒左右,根本来不及识别上面的文字属性。这个问题很多写魔域脚本的人都碰到过,别人的辅助就能正常悬停看物品信息,自己写的就不行,试了一堆特殊属性也没用。下面把这个问题的根源和所有可行的解决路径从头到尾说清楚。

问题出在哪

先讲原理。魔域这个游戏里物品提示框的显示,靠的是鼠标停留在物品图标上方持续一小段时间后,游戏内部触发一个悬停计时器,时间到了就绘制提示窗体。提示框要一直保持显示,需要两个条件同时满足:一是鼠标指针坐标没有离开物品图标的矩形区域,二是游戏持续接收到鼠标在该区域内的状态信号。

用windows模式绑鼠标的时候,大漠是通过PostMessage或者SendMessage向目标窗口发送WM_MOUSEMOVE消息来模拟移动。这种消息模拟有个特点,它只在调用MoveTo的瞬间发一条消息过去,之后就不再发了。游戏窗口收到这条消息,知道鼠标挪过来了,于是启动悬停计时,大概几百毫秒后提示框弹出来。但问题在于,游戏为了判断鼠标是不是还在物品上面,会周期性地去读取当前鼠标的真实位置。当它发现真实的物理鼠标其实并不在窗口内,甚至根本不在物品坐标上,就会立刻关闭提示框,所以你看到的就是闪一下就没了。

简单说,windows鼠标模式只能模拟移动那一下,没法持续欺骗游戏的鼠标位置检测机制。游戏每帧或每隔几帧都会校验一次光标位置,一对不上就把提示刷掉。

换dx鼠标模式是最直接的办法

BindWindowEx第三个参数不要填windows,换成dx模式的属性组合。dx模式下,大漠是通过hook系统API的方式来伪造鼠标位置,游戏不管什么时候去读光标坐标,拿到的都是你设置的那个位置,这样悬停状态就能一直保持。

鼠标模式推荐从这个组合开始试:

text
dx.mouse.position.lock.api|dx.mouse.api|dx.mouse.state.api


绑定语句写成:

text
dm_ret = dm.BindWindowEx(hwnd, "dx2", "dx.mouse.position.lock.api|dx.mouse.api|dx.mouse.state.api", "windows", "", 0)


三个属性分别管不同的事。dx.mouse.position.lock.api是封锁GetCursorPos这类API,让游戏读到的鼠标位置永远是你最后一次MoveTo设置的坐标。这是保持悬停的核心,没有它游戏读到真实坐标就会把提示刷掉。dx.mouse.api是模拟dx鼠标输入,负责发送鼠标移动和点击的动作信号。dx.mouse.state.api是锁定鼠标按键状态,有些游戏会同时检查按键状态来判断是不是有效悬停,加上更稳妥。

如果上面这个组合绑完鼠标点击不正常,或者找图找色受影响,就换组合试。dx模式的属性有十几种,不是每个游戏都吃同一套,得自己测。

可以按顺序试下面这几组:

第一组,偏重位置锁定,悬停效果最好:

text
dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.state.api|dx.mouse.api


第二组,加输入锁定,防止前台鼠标干扰:

text
dx.mouse.position.lock.api|dx.mouse.input.lock.api|dx.mouse.state.message|dx.mouse.api


第三组,兼容性组合,老版本游戏用得上:

text
dx.mouse.position.lock.api|dx.mouse.focus.input.api|dx.mouse.api


第四组,如果上面都不行,试试加raw.input(付费版才有):

text
dx.mouse.position.lock.api|dx.mouse.raw.input|dx.mouse.api


每组绑完都做同一件事:把鼠标移到一个物品图标上,停两秒,看提示框能不能一直显示。能稳定显示就说明这个组合可用。

public属性里有两个关键项

BindWindowEx的第五个参数,也就是public参数,很多人绑定时直接留空,其实这里面有两个属性对鼠标悬停有直接影响。

一个是dx.public.active.api,另一个是dx.public.active.message。这两个是管窗口激活状态的。有些游戏判断鼠标悬停时,会顺带检查窗口是不是处于激活状态,如果窗口没激活,就算鼠标在物品上也不显示提示,或者显示一下就消失。魔域在某些版本里就有这个逻辑。

public参数加上试试:

text
dm_ret = dm.BindWindowEx(hwnd, "dx2", "dx.mouse.position.lock.api|dx.mouse.api|dx.mouse.state.api", "windows", "dx.public.active.api|dx.public.active.message", 0)


dx.public.active.api是通过API层面让游戏以为自己窗口一直是激活的,dx.public.active.message是通过消息层面伪造激活状态。两个一起上,覆盖不同的检测方式。

还有一个dx.public.hide.dll可以加上,防止游戏检测到大漠的dll注入导致一些异常行为,虽然跟悬停没有直接关系,但绑定时加上没坏处,也不占什么资源。

鼠标移动方式也得改

模式换对了只是第一步,MoveTo怎么用也影响悬停效果。

有些新手写的是直接MoveTo到物品坐标,然后Delay 2000等提示出来。这种写法在部分游戏里没问题,但魔域有时候不吃这一套。因为游戏内部的悬停触发逻辑,有的是靠WM_MOUSEHOVER消息,有的是自己内部计时。如果MoveTo只调用一次,游戏可能只在最开始触发了一次移动事件,之后内部计时器因为某些原因被重置了。

更稳妥的写法是,移动到目标位置后,每隔一小段时间就再调用一次MoveTo,重复往同一个坐标发移动信号,相当于不断提醒游戏鼠标还在这。间隔不用太短,50到100毫秒一次就够了,太频繁反而占CPU。

写成循环大概是这样:

text
dm.MoveTo x, y
For i = 1 To 20
Delay 100
dm.MoveTo x, y
// 这里可以加检测提示框是否出现的判断
Next


循环次数和延时自己调,目标是让提示框稳定出现并保持到你识别完文字。

还有个技巧,移到物品上之前,先移到物品旁边,再慢慢移进去,模拟人手操作的轨迹。有些游戏的悬停检测对瞬移过去的鼠标不感冒,会认为不是真人操作,不触发提示。分两三步移过去,每步间隔十几毫秒,触发率会高很多。

实在不行就用微动法维持提示

有些版本的魔域防外挂做的比较严,不管你怎么换绑定模式,提示框就是持续不了多久,几十秒甚至几秒就掉一次。这种情况下可以用微动法来维持。

原理很简单,提示框消失的触发条件是鼠标移出了物品区域。那只要你在提示框快要消失的时候,让鼠标在物品区域内轻微动一下,挪一两个像素,游戏就会认为鼠标还在活动,重新触发悬停计时,提示框就续上了。

具体做法是移到物品坐标后,每隔一段时间就把鼠标往右挪1像素再挪回来,或者上下动一下。移动幅度要小,不能移出物品图标的范围。物品图标一般是40x40左右的格子,在这个范围内来回微动就不会让提示消失。

示例代码:

text
dm.MoveTo x, y
Delay 500
// 进入维持循环
Do
// 右移1像素
dm.MoveTo x + 1, y
Delay 50
// 移回来
dm.MoveTo x, y
Delay 800
// 这里加退出条件,比如识别完文字就跳出
Loop


间隔时间自己根据实际情况调。有的游戏提示框5秒才开始倒计时,那就4秒动一次。有的1秒就没,那就800毫秒动一次。动的幅度也可以调,1像素不行就2像素,以不触发提示框消失为准。

这个方法的好处是不挑绑定模式,哪怕你就是用windows模式,只要能触发提示框,用微动法也能维持住。坏处就是脚本逻辑稍微复杂一点,要控制好移动范围和频率。

键盘模式可能也有影响

别小看键盘模式,某些情况下键盘模式没选对也会间接影响鼠标悬停。因为大漠的键鼠模拟有些是共享底层hook的,键盘模式冲突或者不稳定,可能连带鼠标的状态锁定也出问题。

键盘如果用的是windows模式,鼠标悬停有问题的话,可以把键盘也换成dx模式试试:

text
dx.keypad.api


或者:

text
dx.keypad.input.lock.api


整套键鼠都走dx模式,底层一致性更好,不容易出奇怪的兼容问题。

绑定语句变成:

text
dm_ret = dm.BindWindowEx(hwnd, "dx2", "dx.mouse.position.lock.api|dx.mouse.api|dx.mouse.state.api", "dx.keypad.api", "dx.public.active.api", 0)

系统和游戏设置层面的排查

有些时候不是插件参数的问题,是系统或者游戏本身设置导致的。

首先是系统的鼠标悬停时间。Windows控制面板里有个鼠标悬停时间的设置,虽然主要是给系统自己的tooltip用的,但有些游戏会读这个值。默认是400毫秒,如果你改过,改成默认值试试。

然后是游戏里的设置。魔域设置界面里找一下有没有物品提示、鼠标提示相关的开关,确认是打开状态。有些版本默认提示时间很短,可以在设置里调长一点。

还有显卡驱动。dx2模式是靠hook DirectX来截图和模拟的,显卡驱动版本太老或者太新都可能出兼容性问题。如果之前一直正常,更新驱动后出问题了,回滚驱动版本试试。

另外要注意,绑定dx模式必须用管理员权限运行脚本。右键脚本或者按键精灵,选以管理员身份运行,不然很多API hook不上,绑了也是白绑,鼠标状态锁不住。

测试时要注意的几个坑

测悬停效果的时候,有几个地方容易踩坑,导致你以为某个模式不行,其实是测的方法不对。

第一个,绑定前窗口必须完全显示出来。有些模式比如dx.mouse.clip.lock.api,要求绑定前窗口是完整可见的,被挡住或者最小化状态下绑,效果会异常。所以测试的时候,先把游戏窗口摆好,完整显示在屏幕上,再运行绑定代码。

第二个,绑定时前台鼠标不要放在游戏窗口里。用了position.lock以后,如果你真实的鼠标正好也在窗口内,两个信号会打架,游戏一会儿读到假坐标一会儿读到真坐标,提示框就会一闪一闪的。测试时把前台鼠标挪到游戏窗口外面去,再观察效果。

第三个,不要只测一个物品。不同位置的物品可能触发情况不一样,比如背包第一格和最后一格,有时候因为坐标计算偏差,你以为移上去了,实际上偏了几个像素,刚好处在边缘,就会导致提示不稳定。多测几个位置,排除是坐标不准的问题。

第四个,绑定后先测后台找色是不是正常。有些人换了dx鼠标模式后,图色模式没配对,截图黑屏或者花屏,连物品在哪都找不到,更别说悬停了。绑完第一件事先Capture一张图看看,确认图色是好的,再测鼠标。

换个思路绕开悬停

如果上面所有方法都试了,悬停还是搞不定,那就换个思路,不通过悬停来获取物品信息。

魔域的物品信息,本质上都存在内存里。提示框只是把内存里的数据画出来给你看。既然读提示框这么费劲,不如直接读内存。

用大漠的内存读写功能,先找到物品数据的基址和偏移,读到物品的ID、属性、品质这些数据,比识别提示框上的文字靠谱多了,速度也快。当然这个门槛高一些,需要用CE之类的工具去找地址,对新手不太友好。但一旦写好,就再也不用跟悬停较劲了。

如果不想碰内存,还有个折中方案。有些版本的魔域,你把物品拖到某个特定位置(比如背包空格、装备栏)的时候,会在状态栏或者聊天框显示物品信息。这种情况下你不用悬停,拖一下物品就能读到信息,比悬停稳定。

完整的测试流程

给你一个从易到难的测试顺序,按这个步骤来,大多数情况都能找到能用的方案。

第一步,管理员身份运行脚本,确保权限没问题。游戏窗口完整显示,前台鼠标移出窗口。

第二步,用最基础的dx鼠标组合绑定:

text
dm_ret = dm.BindWindowEx(hwnd, "dx2", "dx.mouse.position.lock.api|dx.mouse.api", "windows", "", 0)


绑完测MoveTo到物品上能不能持续显示提示。能就完事了,不能继续。

第三步,加上state属性和focus属性:

text
dx.mouse.position.lock.api|dx.mouse.api|dx.mouse.state.api|dx.mouse.focus.input.api


再测。

第四步,加上public的active属性:

text
dx.public.active.api|dx.public.active.message


再测。

第五步,键盘也换成dx模式,整套dx环境:

text
dx.keypad.api


再测。

第六步,如果还不行,就上微动法,在当前能用的模式下用循环微动维持提示框。

第七步,以上全失败,考虑读内存或者找替代操作路径。

别人的辅助为什么就行

最后说一下为什么你看别人的辅助也是大漠,人家就能正常悬停。原因很简单,人家的绑定参数跟你不一样。你看到的只是都叫大漠插件,但内部的模式组合、属性搭配、甚至调用方式都可能不同。

有些做辅助的人,鼠标用的是付费版大漠的高级属性,比如dx.mouse.raw.input、dx.mouse.input.lock.api2这些,免费版3.1233里没有,或者功能不完整。付费版的鼠标模拟更底层,兼容性自然更好。

还有些人不是纯靠大漠的鼠标悬停,而是用了上面说的微动法或者内存读取,表面上看跟悬停效果一样,底层实现完全不同。

另外就是大漠版本的问题。不同版本的大漠,同样的参数名,内部实现可能有差异。有些老版本对魔域的兼容性反而更好,新版本改了某些机制就不行了。如果你用的是最新版,可以退回去试试老版本,反过来也一样。

总之这个问题没有万能解,就是靠一个个模式组合去试,找到能在你当前系统和游戏版本下稳定工作的那一套。试的时候记好每个组合的效果,别试完就忘,到最后自己都不知道哪个能用哪个不能用。
[顶部]