Autohotkey 中文论坛

完整版: AutoHotkey制作自己的Warkey
你目前正在浏览的是简化版. 请点击这里浏览完整版
认识和学习AutoHotkey还是因为Dota(改键)。Dota?有些人可能还不知道,没关系,知道是个游戏就照了,不过很好玩,推荐玩下,上瘾别怨我。照,继续讲,​AutoHotkey能做什么呢?能做的太多了,有兴趣自己体会。下面谈谈用它如何制作Warkey,需要有点AutoHotkey基础,版权归AutoHotkey以及​为之贡献的人所有,由本人理解拼凑。
显血就不说了,1.22之后版本可以勾选是否始终显血。主要就说下改键吧。先说不要GUI的,最直接的一种方法:q::Numpad7(小键盘7),按q就是Numpad​7了,很神奇吧,不过这就影响聊天啦,在AutoHotkey中在热键前加~原来键的功能不会被屏蔽,比如说~q::Numpad7,就会发送q7。所以我们这样改下,
~q::
Send, {Numpad7}{BS}
return
这样就不影响聊天而且能达到改键的目的,程序起始处加上#SingleInstance force(只运行一次程序),#IfWinActive, ahk_class Warcraft III(仅当war3为活动窗体热键有效)。然后根据自己的习惯,就可以制作个人的Warkey了。
再说下有GUI的,下面的是个单独的程序,就是没有标准INI文件存储用户输入信息,贴下程序代码:
#SingleInstance force
#NoEnv
#IfWinActive, ahk_class Warcraft III
SendMode Input
SetMouseDelay, -1,-1
SetKeyDelay, -1,-1
Gosub, D_Window ;进入主界面子程序
Gosub, D_Tray ;进入托盘子程序
;以下为显血部分;
Loop
{
IfWinActive, Warcraft III ahk_class Warcraft III
{
If (m_bIn == 0)
{
If (AllyHB == 1)
{
Send, {tab}
Sleep 200
Send, {[ Down}
}
If (EnemyHB == 1)
{
Send, {tab}
Sleep 200
Send, {] Down}
}
m_bIn := 1
}
}
Else
{
If (m_bIn == 1)
m_bIn := 0
}
Sleep 200
}
;============================;
D_Window: ;主界面
{
Menu, SetMenu, Add, 保存设置 (&S), D_Define
Menu, SetMenu, Add
Menu, SetMenu, Add, 退出程序 (&X), D_AppExit
Menu, HelpMenu, Add, 关于 (&A), D_HelpAbout
Menu, MyMenu, Add, 程序设置 (&D), :SetMenu
Menu, MyMenu, Add, 帮助 (&H), :HelpMenu
Gui, Menu, MyMenu
Gui, Add, GroupBox, x16 y7 w180 h130 , 物品栏
Gui, Add, GroupBox, x16 y147 w180 h50 , 血条栏
Gui, Add, Text, x26 y32 w90 h30 , 物品栏1:
Gui, Add, Text, x26 y92 w90 h30 , 物品栏2:
Gui, Add, CheckBox, Checked x26 y167 w80 h20 vAllyHB, 友方血条
Gui, Add, CheckBox, Checked x106 y167 w80 h20 vEnemyHB, 敌方血条
Gui, Add, Hotkey, x86 y27 w90 h20 vItem7, Q
Gui, Add, Hotkey, x86 y87 w90 h20 vItem8, ~
Gui, Show, x301 y147 h233 w217, MicrOperation
Gosub, D_Define ;进入定义子程序
Return
}
;============================;
D_Tray:
{
Menu, Tray, NoStandard
Menu, Tray, Add, 设置
Menu, Tray, Add, 退出
Menu, Tray, Default, 设置
Menu, Tray, Click, 1
Menu, Tray, Tip, MicrOperation
Menu, Tray, Icon, , , 1
Return
}
;============================;
D_Define:
{ ;下面两句是为了取消先前定义的热键,要是没有后果很严重,很多键乱了套。当然只定义一次是没问题的,要是定义后再改就会出现问题。
if Item7
HotKey, ~%Item7%, D_Item7,Off
if Item8
HotKey, ~%Item8%, D_Item8,Off
Gui, Submit ;托盘程序,并使用户输入信息与相关变量关联
if Item7
HotKey, ~%Item7%, D_Item7,On
if Item8
HotKey, ~%Item8%, D_Item8,On
Return
}
;============================;
D_Item7:
{
Send, {Numpad7}{BS} ;这里出现一个退格键足矣,相信不会有人定义组合键的,dota讲的是速度和操作,按键越简单越好
return
}
;============================;
D_Item8:
{
Send, {Numpad8}{BS}
return
}
;================================;
设置:
{
Gui, Show, , MicrOperation
Return
}
;============================;
D_HelpAbout:
{
Msgbox , 0, MicrOperation,AutoHotkey版权所有
Return
}
;============================;
D_AppExit:
GuiClose:
退出:
{
ExitApp ;退出程序
Return
}
GuiSize:
{
If (A_EventInfo==1) ;这里只是针对窗口最小化事件处理,就是将程序托盘并关联变量
Gosub, D_Define
}
;============================;
LWin:: ;屏蔽左Windows键
Return
[i=s] 本帖最后由 ashimoi 于 2009-7-31 10:14 编辑 [/i]

我发一个自己用的卡尔脚本,比常见的都强大,不过要求在1280x960分辨率下运行,如果不是的话,技能图标颜色需要重新抓取。版本6.61b
按键q/w/e是切换三种状态 恢复/移动/攻击,按一下就换成三个冰/雷/火 元素球
按键t/y/d/f/g/z/x/c/v/b是技能快捷键,按下时如果大招不在CD而且没有该技能,那么调出这个技能并回到按键前的元素状态,如果技能是就绪的,就放出技能,如果大招r在CD中,什么也不会发生。​
按键r是卡尔的技能帮助-invokelist
按键z是技能灵动迅捷,如果双击z会给自己加这个buff
OVER
代码:
;卡尔专用
K3 = eee
#Persistent
#SingleInstance, Force
DetectHiddenWindows, On
SetDefaultMouseSpeed, 0
WinGet,HWND,ID,Warcraft III ahk_class Warcraft III
SetTimer, Timer_检测, 1000

IME_CHECK(HWND)
{
AAA := DllCall("imm32\ImmGetDefaultIMEWnd", Uint, HWND, Uint)
SendMessage, 0x283, 0x005,,,ahk_id %AAA%
Return ErrorLevel
}

~*Enter::
Sleep, 30
Timer_检测:
If (WinActive("ahk_id "HWND) && !IME_CHECK(HWND))
        Suspend, Off
Else
        Suspend, On
Return

#F10::
Suspend, Permit
ExitApp






$q::
K3 = qqq
Send, %K3%
return

$w::
K3 = www
Send, %K3%
Return

$e::
K3 = eee
Send, %K3%
Return

$r::
Clipboard=-invokelist
Send,{Enter}^v{Enter}
Return

$y::        KAEL(0x383503,0x393504,"y","qqq")
$v::        KAEL(0x8AA780,0x88A779,"v","qqw")
$x::        KAEL(0x59534E,0x59524E,"x","qww")
$c::        KAEL(0x3F342E,0x3D332E,"c","www")
$d::        KAEL(0x3F5996,0x4A6698,"d","wee")
;$t::        KAEL(0x162779,0x152778,"t","eee")        6.60的天火
$t::        KAEL(0x0D89B9,0x0D44A9,"t","eee")
$f::        KAEL(0x010379,0x020479,"f","qee")
$g::        KAEL(0x700519,0x6F041A,"g","qqe")
$b::        KAEL(0x030D46,0x030D44,"b","qwe")


$z::
If (A_PriorHotkey = A_ThisHotkey && A_TimeSincePriorHotkey < 400)
{
        MouseGetPos, X, Y
        Send, {Click 35,70}
        MouseMove, X, Y
}
Else
        KAEL(0x160607,0x160707,"z","wwe")
Return
KAEL(S1,S2,K1,K2)
{
global K3
C1 := GET_COLOR(1089,824)
C2 := GET_COLOR(1159,824)
C3 := GET_COLOR(1228,893)
If (C1=S1 || C2=S2)
        Send, %K1%
Else If C3=0x24323E
        Send, %K2%r%K3%
Return
}
GET_COLOR(X,Y,Time=5)
{
        Loop, %Time%
        {
        PixelGetColor, C, %X%, %Y%
        If C<>0x000000
                Return C
        }
}
有没有更好的方法来判断当前是否为聊天状态呢?
这个对我有点帮助,我去试试
3# heavenzone
聊天时有个打字的边框,呈金黄色,截取它的颜色判断之。
非常ok的帖子,楼主辛苦了。


不是沙发也要顶!
参考网址