发表回复 
多开自动跟随和重复鼠标和指定键盘按键v3.0-多线程
2012-04-01, 02 : 00
多开自动跟随和重复鼠标和指定键盘按键v3.0-多线程
功能:
多开,随便几开,其他窗口,重复玩家的鼠标和键盘指定按键操作,按键列表可自定义。

原理:
循环产生多线程,每个线程监控一个按键

用法:
* 快捷键启动或暂停跟随。

* 脚本基于autohotkey_h扩展版和autohotkey.dll,去这里下载:
http://www.autohotkey.net/~HotKeyIt/AutoHotkey.zip
解压后,autohotkey.exe和lib文件夹,覆盖到autohotkey安装目录,autohotkey.dll放到脚本目录。

同时,还必须下_Struct.ahk, 一个是 sizeof.ahk 这两个脚本库,放在安装目录的lib目录下:
http://www.autohotkey.com/forum/topic59581.html

* 一共4个脚本,使用时,只需要运行主进程脚本,会自动调用其他3个。

其他三个脚本的文件名,必须和代码中,脚本名字的参数一样。三个脚本不能独立运行,只能接受调用。

注意:
键盘跟随的时候,由于有的游戏有沙盒和登录器,脚本中的ControlSend目前是发往游戏的父窗口。因此,如果按键不起作用,把ControlSend中的 ahk_parent 去掉(逗号要保留)即可。


下面是代码:

主进程脚本:多开自动跟随和重复鼠标和指定键盘按键v3.0-多线程.ahk

代码: (全选)
; 多开游戏,不止双开,随便开几个,只要机器跑得动。
; 所有其他窗口的人物,自动跟随玩家在操作的那个窗口的鼠标左右键的点击 和 指定的键盘操作(要跟踪的按键要指定)

#NoEnv
#Include <AhkDllThread>
SetWorkingDir % A_ScriptDir
v_Enable=0
SetTitleMatchMode, 2
CoordMode, Mouse, Window
CoordMode, Pixel, Window
CoordMode, ToolTip, Window

; 线程脚本文件名
LeftClickScript := "FollowLeftClick.ahk"
RightClickScript := "FollowRightClick.ahk"
KeyPressScript := "FollowKeyPress.ahk"


v_WindowName := "游戏窗口标题"          ;游戏窗口标题中必须包含这个名字


v_MouseFollow = 1                      ;跟随的窗口,是否重复玩家窗口的鼠标操作,1表示重复,0表示不重复
v_KeyFollow = 0                        ;跟随的窗口,是否重复玩家窗口的键盘操作,1表示重复,0表示不重复

v_KeyList := ["F1", "F2"]           ;要跟踪的键盘操作列表,注意,列表尽量少,每跟踪一个按键,就是模拟一个新的线程,按键多了,可能会有意想不到的问题出现

v_NormalSleep = 500                       ;程序普通休眠周期,单位是毫秒

#s::        ;win + s 启动或关闭
{
v_Enable:=!v_Enable

    ;定义按下快捷键的操作,按下一次,开始工作,再按一次,停止工作
    If (v_Enable=0)
    {

        ToolTip, Pausing, 300, 30, R
        
        ; 暂停鼠标跟随
        if (v_MouseFollow=1)
        {
            dllLeft.ahkPause("On")
            dllRight.ahkPause("On")
        }

        ; 暂停键盘跟随
        if (v_KeyFollow = 1)
        {
            for index, v_KeyValue in v_KeyList
            {
                dllKey%index%.ahkPause("On")
            }
        }

        ToolTip Paused, 300, 30, R
        Sleep, 1000
        ToolTip

        Exit
    }
    Else
    {

        ToolTip, Preparing, 300, 30, R

        ; 开始解决多开问题
        Winget, GameID, List, %v_WindowName%      ;扫描所有打开的窗口,获得所有游戏窗口的唯一ID



        ;重设每个游戏窗口的窗口名字,让每个窗口名字不一样,完全是为了玩家好区分而已。。。
        i = 1
        while (i<=GameID)
        {
            ;给窗口起个新名字
            new_name := v_WindowName . i

            curr_game_id := GameID%i%


            WinSetTitle, ahk_id %curr_game_id%, , %new_name%

            i++
        }


        ;如果跟踪已经在运行,只是被暂停了,那么就继续跟踪,而不是重新开始,否则,就启动新线程开始工作
        if (v_MouseFollow=1)
        {
            
            if dllLeft.ahkReady()
                dllLeft.ahkPause("Off")
            else
                gosub, LeftMouseFollow

            if dllRight.ahkReady()
                dllRight.ahkPause("Off")
            else
                gosub, RightMouseFollow
        }
        
        if (v_KeyFollow = 1)
        {
            for index, v_KeyValue in v_KeyList
            {
                if dllKey%index%.ahkReady()
                    dllKey%index%.ahkPause("Off")
                else
                    gosub, KeyPressFollow
            }
        }
        
        ToolTip
    }

}
Return


; 鼠标左键跟随
LeftMouseFollow:
{

    Tooltip, % "preparing left click",300, 30, R


    ; 鼠标跟随
    if (v_MouseFollow=1)
    {
                
        ;跟随左键
        
        ;装载用于多线程的DLL
        dllLeft:=AhkDllThread("AutoHotkey.dll")
        
        ;启动空线程
        dllLeft.ahktextdll() ;启动 #Persistent + #NoTrayIcon 模式的空线程
        
        If dllLeft.addFile(LeftClickScript) ;添加鼠标左键跟随脚本,但不执行
        {
                ;将窗口名字赋给加载的脚本文件
                dllLeft.ahkassign.v_WindowName := v_WindowName
                
                ;将休息时间传递到线程脚本中
                dllLeft.ahkassign.v_NormalSleep := v_NormalSleep

                ;运行脚本中的operation模块开始跟随操作
                dllLeft.ahkLabel.Operation
        }
        else
        {
            ToolTip, % "Could not find " LeftClickScript, 500, 30, R
            Sleep, 1000
            ToolTip
            return
        }
    }
}
return

; 鼠标右键跟随
RightMouseFollow:
{
    
    ; 鼠标跟随
    if (v_MouseFollow=1)
    {
        
        Tooltip, % "preparing right click",300, 30, R

        ;装载用于多线程的DLL
        dllRight:=AhkDllThread("AutoHotkey.dll")
        
        ;启动空线程
        dllRight.ahktextdll() ;启动 #Persistent + #NoTrayIcon 模式的空线程

        ;跟随右键
        If dllRight.addFile(RightClickScript) ;添加鼠标左键跟随脚本,但不执行
        {
                ;将窗口名字赋给加载的脚本文件
                dllRight.ahkassign.v_WindowName := v_WindowName
                
                ;将休息时间传递到线程脚本中
                dllRight.ahkassign.v_NormalSleep := v_NormalSleep

                ;运行脚本中的operation模块开始跟随操作
                dllRight.ahkLabel.Operation
        }
        else
        {
            ToolTip, % "Could not find " RightClickScript, 500, 30, R
            Sleep, 1000
            ToolTip
            return
        }

    }
    
}
return


; 键盘跟随
KeyPressFollow:
{
    
    ; 键盘跟随
    if (v_KeyFollow=1)
    {
        Tooltip, % "preparing keyboard",300, 30, R

        for index, v_KeyValue in v_KeyList
        {
            dllKey%index%:=AhkDllThread("AutoHotkey.dll")
            dllKey%index%.ahktextdll() ;启动 #Persistent + #NoTrayIcon 模式的空线程
            
            If dllKey%index%.addFile(KeyPressScript) ;添加鼠标左键跟随脚本,但不执行
            {
                    ;将窗口名字赋给加载的脚本文件
                    dllKey%index%.ahkassign.v_WindowName := v_WindowName
                    
                    ;将休息时间传递到线程脚本中
                    dllKey%index%.ahkassign.v_NormalSleep := v_NormalSleep
                    
                    ;将要监控的按键传递过去
                    dllKey%index%.ahkassign.v_Key := v_KeyValue

                    ;运行脚本中的operation模块开始跟随操作
                    dllKey%index%.ahkLabel.Operation
            }
            else
            {
                ToolTip, % "Could not find " KeyPressScript, 500, 30, R
                Sleep, 1000
                ToolTip
                return
            }

        }
        
        Tooltip, % "Done",300, 30, R
        sleep, 1000
        tooltip
    }

}
Return

线程脚本:FollowLeftClick.ahk


代码: (全选)
; 跟随鼠标右键
; 该脚本不能单独使用,是用于被主脚本调用,成为一个线程


;执行操作
Operation:
{

#NoEnv
SetTitleMatchMode, 1
CoordMode, Mouse, Window
CoordMode, Pixel, Window
CoordMode, ToolTip, Window

; 开始解决多开问题
Winget, GameID, List, %v_WindowName%      ;扫描所有打开的窗口,获得所有游戏窗口的唯一ID

;跟随左键
SetTimer, FollowLeftClickSub, %v_NormalSleep%

}
return


;鼠标左键跟随模块
FollowLeftClickSub:
{

    ; 等待鼠标左键被按下
    KeyWait, LButton, D

    ;取到鼠标位置
    MouseGetPos, now_x, now_y

    ; 一旦按下了,就对其他窗口执行这些操作,不过要调过玩家主窗口
    i = 2
    while (i<=GameID)
    {
        curr_game_id := GameID%i%


        click_x := "X"+now_x
        click_y := "Y"+now_y

        ControlClick, %click_x% %click_y%, ahk_id %curr_game_id%,, LEFT, 1

        i++
    }
}
Return

线程脚本:FollowRightClick.ahk

代码: (全选)
; 跟随鼠标右键
; 该脚本不能单独使用,是用于被主脚本调用,成为一个线程

;执行操作
Operation:
{

#NoEnv
SetTitleMatchMode, 1
CoordMode, Mouse, Window
CoordMode, Pixel, Window
CoordMode, ToolTip, Window

; 开始解决多开问题
Winget, GameID, List, %v_WindowName%      ;扫描所有打开的窗口,获得所有游戏窗口的唯一ID

;跟随左键
SetTimer, FollowRightClickSub, %v_NormalSleep%

}
return


;鼠标右键跟随模块
FollowRightClickSub:
{

    ; 等待鼠标左键被按下
    KeyWait, RButton, D

    ;取到鼠标位置
    MouseGetPos, now_x, now_y

    ; 一旦按下了,就对其他窗口执行这些操作,不过要调过玩家主窗口
    i = 2
    while (i<=GameID)
    {
        curr_game_id := GameID%i%


        click_x := "X"+now_x
        click_y := "Y"+now_y

        ControlClick, %click_x% %click_y%, ahk_id %curr_game_id%,, RIGHT, 1

        i++
    }
}
Return

线程脚本:FollowKeyPress.ahk

代码: (全选)
; 跟随键盘按键
; 该脚本不能单独使用,是用于被主脚本调用,成为一个线程


Operation:
{

#NoEnv
SetTitleMatchMode, 1
CoordMode, Mouse, Window
CoordMode, Pixel, Window
CoordMode, ToolTip, Window

        ; 开始解决多开问题
        Winget, GameID, List, %v_WindowName%      ;扫描所有打开的窗口,获得所有游戏窗口的唯一ID


        ;跟随键盘
        SetTimer, FollowKeyPressSub, %v_NormalSleep%

}
Return



; 键盘跟随模块
FollowKeyPressSub:
{

    ; 等待按键被按下
    KeyWait, %v_Key%, D

    ; 一旦按下了,就对其他窗口执行这些操作,不过要跳过玩家主窗口
    i = 2
    while (i<=GameID)
    {
        curr_game_id := GameID%i%

        ControlSend, ahk_parent,{%v_Key%},ahk_id %curr_game_id%

        i++
    }



}
Return

在win7 32下测试通过。由于autohotkey_H这个扩展版不算太稳定,所以,运气不好的话,可能会碰到问题,而且也不会有人给你解决,所以将就吧。。。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-04-01, 02 : 22
 
补个题外话,由于ahk不是强类型,也不支持多线程,IDE也不咋的,这个方向已经注定了落没了。

之前,ahk和其他脚本引擎相比,ahk用途比较广泛,不光是用于游戏。

但这个优势如今也没有了,有个刚诞生不久的TC简单脚本,是强类型,代码风格接近C#,简单易读、易调试,有多线程,支持大漠插件,IDE也做得还不错,用了office​ 2007风格的工具栏面板,整体在往visual studio express的风格靠拢。就是那个中文编程太蛋疼了。。。还好它也支持英文。。。

这玩意也不光做游戏脚本,啥应用程序都在做。而且这玩意诞生才8个月,就有这个效果了。。。

嘛,这玩意目前还不算强,但被很多人看好前景。

而ahk真的是不进则退。

有个可以救ahk的思路是,玩多进程。。。一个主进程,控制其他进程。就像如今的浏览器。这样ahk就能做其他脚本引擎做不到的事情,就还能有些市场。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-04-16, 23 : 09
 
看了你的好多贴子,很是仰慕,能交流一下吗?有求助于你!希望能留个联系方式!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2013-09-06, 19 : 23
RE: 多开自动跟随和重复鼠标和指定键盘按键v3.0-多线程
MARK!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合