当前位置:编程学习 > C#/ASP.NET >>

一个棘手的问题,调用了一个DLL后引发的问题

近期通过VB.NET写了一款游戏的后台多线程挂机脚本

脚本的具体键鼠模拟是通过大漠插件(一个ActiveX DLL)搞定的

而由于这个插件本身的缺陷
我发现后台鼠标移动函数会影响到前台鼠标

当这个插件绑定了目标游戏窗口后,如果用户的鼠标在目标游戏窗口外,就会被强制拉扯到目标游戏窗口内。

也就是说,如果用户屏幕大于游戏窗口时,用户就没办法正常使用自己的鼠标了。

而由于脚本设计问题,我不能扩大游戏窗口让游戏窗口适应用户屏幕,否则界面改变后所有东西都要重写。

后来我试着在调用插件的后台鼠标移动前,先记录下用户鼠标坐标,调用插件后鼠标被扯到游戏屏幕内,再通过API模拟前台鼠标将用户鼠标恢复到之前的坐标

以解决这个问题


    Function movetofix(ByVal dm, ByVal x, ByVal y)
        Dim userX
        Dim userY
        userX = MousePosition.X
        userY = MousePosition.Y
        Dim dm2
        dm.moveto(x, y)
        SetCursorPos(userX, userY)
    End Function


但不幸的是,我发现在大漠插件绑定了目标游戏窗口后
任何一个API,无论是SetCursorPos还是mouse_event都无法将鼠标移到游戏窗口以外的任何一个坐标。

再由于ActiveX是封装的,我无法调试和修改这个插件的BUG。


这个情况有一个条件,就是只有鼠标出现在游戏边框外,才会导致这一BUG
也就是说,当游戏窗口大于屏幕的时候不会有这个BUG

既然用鼠标模拟没办法解决,修改DLL也不行


接下来就只能将错就错,把游戏窗口拉大,但是却不改变游戏界面以避免重写脚本

脚本在启动前会使用MoveWindow修正窗口分辨率(大小)以保证脚本运行正常。

经过查询,我发现MoveWindow给窗口发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息。

我想也正是这些消息让游戏客户端触发了客户端的相关事件,使得游戏分辨率和界面改变。

我的问题是:

1.如何在不触发游戏客户端的任何事件的情况下悄悄把游戏窗口拉到用户屏幕窗口那么大?
以避免游戏窗口内的界面改变
效果如图:


2.有没有比我现在这个解决思路更好的解决办法?

希望各位大大们能帮我想想办法,头大好久了  --------------------编程问答-------------------- 补充下,目标游戏是大型3D客户端 --------------------编程问答-------------------- 没太看懂,有一个按键精灵不是专门写游戏外挂的吗?用它那个试试 --------------------编程问答--------------------
引用 2 楼 gxingmin 的回复:
没太看懂,有一个按键精灵不是专门写游戏外挂的吗?用它那个试试


哪个写不了后台脚本啊
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,