首页 > 代码库 > AHK进阶之路

AHK进阶之路

小鸟学AHK(1)之运行程序或打开文档

 

AHK就是AutoHotKey,是一款免费的、Windows平台下开放源代码的热键脚本语言。

亲爱的朋友,叫我怎么向你推荐它呢!

COOL,对,就是酷,那么多干巴巴的介绍我不想COPY,如果你掌握了它,哪怕只是会一点点,也足够你炫耀了.比你身边所谓的电脑高手还要风光.这个理由够了吧?

那么AHK能做什么呢?对不起,我说不清楚,因为我也是小鸟,你正在看的垃圾本来就是本小鸟的学习笔记而已.但我可以肯定的一点是,你这个人能做的事它都能做,你所有在电脑里的行为除了人类主观的部分它都可以替你完成得更快更好.而这也只是它初级的部分.更厉害的是它可以做程序,甚至可以做病毒(听说的)

慢着别走,我知道你不想学编程,我也不想,AHK绝对不会拒绝你我这样的懒人的.它其实非常简单,非常容易非常的...cool!

只要你有一点点分析问题的逻辑推理能力就能上手.当然,要达到高级的境界还是应该有一些编程基础的.写批处理的能力就完全够了.

我一向认为男人至少要擅长一项运动,一种乐器,一种编程....和拿手的几个小炒.什么?你不是男人?OK,把照片和电话发给我.其实我也不合格因为我还不会什么乐器,扯远了.总之你不会后悔的.知道那些会做图做网页甚至会给别人下木马的骇客们有什么感觉么,对,很爽的一种控制与创造的感觉,一个男人如果没有体会到这种感觉,多遗憾!

先说这么多,先介绍一些AHK的基础知识,用过热键启动程序的软件么?我们今天来实现它.

AutoHotKey(安装版下载|绿色版,下文都简称为 AHK)。第一次下载 AHK 的朋友建议下载安装版,以后升级的话,下载绿色版,然后覆盖到 AHK 的安装目录。下载安装版的好处是:系统会自动关联 .ahk 文件。

在AHK目录里建立AutoHotKey.ini文件,用记事本打开输入代码,然后运行AHK程序就可以实现这些代码的功能.

1运行程序或打开文档

Run(运行)命令用来运行或打开程序、文档、网址(URL)或快捷方式,例如:

Run, Notepad

Run, C:\My Documents\Address List.doc

Run, www.yahoo.com

Run, C:\My Documents\My Shortcut.lnk

Run, mailto:someone@anywhere.com

上面例子中的命令都可以指配给含有 热键标识(hotkey label) 的热键。在下面的第一个例子里,被指配的热键是Win+N,而第二个是Control+Alt+C:

#n::Run, Notepad

^!c::Run, calc.exe

上面的例子都属于单行热键,因为它们都只是由一个命令组成。如果需要热键执行更多的命令,就要把第一行命令放到热键定义式的下面,并且使最后一行为 return(返回)。例如:

#n::

Run, http://www.google.com

Run, Notepad.exe

return

上面的Notepad.exe(记事本)、calc.exe(计算器)等都是系统程序,如果要运行非系统程序则需要指定它的完整路径:

Run, %ProgramFiles%\Winamp\Winamp.exe

在上面的例子中,%ProgramFiles% 是操作系统支持的 环境变量(environment variable)。之所以使用它而不是用像C:\Program Files这样的路径,那是因为这样可使得脚本有更好的可移植性,就算别的电脑的系统不是在C盘也可以正确执行命令。

如果希望脚本在程序或文档关闭后才继续执行下一步,那么就需要使用 RunWait(运行等待) 命令来代替Run命令。例如在下面的这个例子中,MsgBox(对话框)命令部分将不被执行,直到用户关闭了记事本之后才继续:

RunWait, Notepad

MsgBox, 任务完成(记事本已被关闭);弹出对话框提示任务完成.

;后的文字是注释,对程序没有任务影响.

小贴士 - Ctrl、Alt、Shift 在 AHK 怎么表示?

WIN的符号是 #

Ctrl 的符号是 ^

Alt 的符号是 !

Shift 的符号是 +

如果你想按下"Ctrl + Alt + Shift + Win + Q"(这个快捷键真牛×。- -b)来启动 QQ 的话,可以这样写:

^!+#q::run D:\qq\qq.exe

快增加自己的快捷键吧,保存 AutoHotKey.ini 后,右击系统托盘那个 H 图标,选择"reload this script"重启 AHK,要注意,每次修改脚本后都要重启脚本。(除介绍部分主要来自AHK帮助文件)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

小鸟学AHK(2)之发送键击或点击动作

2008-06-27 23:47

关于按键精灵,我认为它很一般,虽然国内的支持率很高,使用者很多,有点地头蛇垄断的感觉.对于小鸟来说,按键精灵太弱了,要实现稍微复杂一点的功能就要借用让人头疼而且为数不多的C语言插件函数,那我还不如直接编程算了.如果AHK也支持CS-script,那按键精灵就完败了.据说AHK很快就支持了.

当然对于我们小鸟来说,先不考虑这些也不用什么语言,AHK常用的命令就非常强大能做很多事,可以这么说,AHK的初级用户就相当于按键精灵的高级用户了.

就内存占用来说,按键精灵也太大了,不适合做系统常驻程序,而AHK一般只有1到2M.

我以前用按键精灵做过一些简单的事,比如在魔兽世界里练习附魔什么的,完全就是靠鼠标找点不停地来回点击,faint.现在已经完全放弃它.不过如果你有使用按键精灵的基础,相信会更容易理解和上手AHK的.

闲话到此,今天我们的课程是发送键击或点击动作

使用 Send(发送)命令来发送键击动作到激活窗口(指最前面的窗口)。在下面的这个例子里,Win+S 变成键入签名的热键。按下软件前必须确认窗口(例如编辑器或电子邮件草稿窗口)处于激活状态:

#s::

Send, Sincerely,{enter}John Smith

return

在上面的例子中,除了{enter}意外所有的字符都被逐字发送,因为{enter}模拟了回车键。下面的将举例说明一些其它常用的特殊字符:

Send, ^c!{tab}pasted:^v

上面的例子将会发送Control+C(复制),然后是Alt+Tab(切换窗口),最后是发送字串"pasted:"并接上一个Control+V(粘贴)。

鼠标点击: 对某个窗口发送点击动作需要测定点击位置的X轴和Y轴坐标。这可借助AutoHotkey附带的AutoScriptWriter或者Window Spy来实现。下面就是应用Window Spy的方法:

运行Window Spy(从开始菜单或者在AutoHotkey的托盘图标上点击右键出现的菜单中可找到它);

通过点击目标窗口的标题栏、使用Alt+Tab进行切换或者其他方法来激活窗口(Window Spy将一直是最上层窗口);

移动鼠标到目标窗口上需要进行点击的位置,记下此时Window Spy中显示的坐标值(或者按Shift-Alt-Tab来切换到Window Spy的窗口,它显示的坐标值将停止变化,因此可以方便用户复制和粘贴坐标值)

在 MouseClick(鼠标点击) 命令中使用上面获得的坐标值,例如:

MouseClick, left, 112, 223

如果只需要移动鼠标而不用点击的话,请使用 MouseMove(鼠标移动)命令。要拖动鼠标,请使用 MouseClickDrag(鼠标拖动)命令。

我现在用的一个登录代码

::/d::

Send, wildtoy {Tab} 123456 {Enter}

return

;你在百度登录框里只要输入/d,它就会把输入wildtoy,切换到密码输入框输入123456,最后回车,为什么要用/号呢,无论你用什么都行,你就是::aa::也可以,问题是你不想打字打到aa的时候突然变成自己的用户名和密码吧

::/mail::zhengwang79@gmail.com

;经常要输入电邮地址,电邮太长怎么办,像这样以后只要输入/mail回车或空格,就会变成电邮了.

下面附上常用的一些按键列表

鼠标(Windows NT/2000/XP或更高级版本)

LButton - 鼠标左键

RButton - 鼠标右键

MButton - 鼠标中键或滚轮

WheelDown - 鼠标滚轮向下滚动(向着身体的方向)

WheelUp - 鼠标滚轮向上滚动

以下定义仅支持Windows 2000/XP及更高级版本:

XButton1 - 只有某些鼠标才会有这个按键

XButton2 - 只有某些鼠标才会有这个按键

键盘

注意:单个字母键和数字键的名字就是它上面的符号,因此下面将不列出来,例如 b 就是代表 "b"键,而 5 就是"5"键

Space - 空格键

Tab

Enter (或 Return)

Escape (或 Esc)

Backspace (或 BS) - 退格键

Delete (或Del)

Insert (或 Ins)

Home

End

PgUp

PgDn

Up

Down

Left

Right

ScrollLock

CapsLock

NumLock

NumpadDiv - (小键盘上的)除号键/斜杠

NumpadMult - (小键盘上的)乘号键/星号

NumpadAdd - (小键盘上的)加号键

NumpadSub - (小键盘上的)减号键

NumpadEnter - (小键盘上的)回车键

当Numlock的状态是关闭时:

NumpadDel

NumpadIns

NumpadClear - 在大多数键盘上就是指Numpad5这个按键

NumpadUp

NumpadDown

NumpadLeft

NumpadRight

NumpadHome

NumpadEnd

NumpadPgUp

NumpadPgDn

当Numlock的状态是打开时:

Numpad0

Numpad1

Numpad2

Numpad3

Numpad4

Numpad5

Numpad6

Numpad7

Numpad8

Numpad9

NumpadDot - 小数点(句点)

从 F1 到 F24 - 大多数键盘上面的那一排功能键

AppsKey - 用来调用右键菜单的按键

LWin - 左边的Win键(徽标键)

RWin - 右边的Win键(徽标键)

Control (或 Ctrl)

Alt

Shift

注意: 在大多数情况下,下面这六个按键是不支持用在 Windows 95/98/Me系统上的,请使用上面列出的按键代替:

LControl (或 LCtrl) - 左边的control键

RControl (或RCtrl) - 右边的control键

LShift

RShift

LAlt - 左边的Alt键

RAlt - 注意:如果您的键盘布局是用了AltGr键而不是RAlt(即没有右边的Alt键),您可能就要通过 <^>! 这样的格式来令它变成热键前缀,详细说明请看 这里。此外,, "LControl & RAlt::" 将使得AltGr键本身变成热键。

PrintScreen

CtrlBreak

Pause

Break

 

   

 

 

 

 

 

 

 

 

 

 

 

 

小鸟学AHK(3)之创建脚本

2008-07-03 18:25

这几天补数据和找工作。主要还是因为看到了别的AHK爱好者的博客,受打击了。看来我还真的是鸟中鸟啊。到底继续不继续下去呢,反正也没人瞅,算是意志的锻炼吧

今天我们讲创建脚本

有人问了,装了软件学了前两课的代码了,往哪写啊,怎么实现功能啊,

别急有三种方式:

1.建个记事本文件,改扩展名为ahk,比如test.ahk ,用记事本软件打开编辑就行了。双击这个文件就可以运行,不过每运行一个脚本都会在托盘中多出一个图标。

2.把test.ahk编译成exe文件,这样你就可以发给朋友了,打开 AHK 所在文件夹下的 Compiler 文件夹,双击里面的 Ahk2Exe.exe。然后依次浏览文件:要编译的 AHK 文件,编译后的 exe 文件名,编译后的 exe 要显示的图标。其他一般不用输入。如下图(呵呵没图,谁想看图说声我发上来)选择好后,点击 convert。

3.打开 AHK 所在的文件夹,新建一个文本文件:AutoHotKey.ini。用记事本编辑,你可以把你所有的脚本都写在里面。

总结:1和2会在右下角出现很多图标,晕哦哪个是哪个啊。3是很整洁了就一个文件实现所有功能,但若是代码很长很长那编辑起来也会很麻烦很麻烦。。。咋办呐?

#Include 用这个,意思是载入文件,作用相当于把那个文件内容复制到当前位置

比如我的AutoHotKey.ini里面的内容是

#Include pm.ahk ; 同目录下闹钟代码

#Include myahk/tc.ahk ; 同目录下的myahk目录下的total commander软件有关的代码

#Include C:/game.ahk ;C盘根目录下的游戏中用的代码,

这样是不是整洁多了,既保持了一个图标,也方便了每个脚本的编辑与整理,当然我建议还是集中放到一个目录下了

今天的课很简单,但很重要哦

如果有比我还菜的鸟,一定要在下面通知我,让我也高兴一下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

小鸟学AHK(4)之高级教程:热键

2008-07-10 23:52

有朋友问了一些热键和热字符串的高级用法,本来我是想给如我一般的菜鸟一个入门的介绍,既然问到了,不回答面子过不去,可是俺也不会啊~~回头恶补了一下,发现要写成简易的文字还真是难,因为原文已经非常简易了。。。。只好原般照抄下来,关于热键和热字符串的简单用法看(1)就可以了,想深入系统学习的有志高手看下面吧。原文来自yonken翻译的AHK的帮助文档。

下章发热字符串,很想快点过去这段,给大家发些应用的小脚本。别着急啊

热键,也就是快捷键,可以用来触发某些指定的动作(例如运行一些程序或 宏指令(Macro))。下面这个例子中Win+N被设置为运行记事本的一个快捷键,井号[#]代表Win键(徽标键):

#n::

Run Notepad ;"开始→运行"中可运行的程序都可以使用,其他程序需要指定路径

return

上面的最后一行的"return(返回)" 用以表示此热键的结束。不过,如果此热键只需要处理一行命令的话,那一行命令就可以放到双冒号的右边(不需要空格),换句话来说就是 return(返回) 可以省略了:

#n::Run Notepad

要使一个热键有更多调节键,只需把它们连续列出即可。下面这个例子中 ^! 表示Control+Alt:

^!s::

MsgBox 您按了Ctrl+Alt+S.

return

值得注意的是,和其它常用的热键一样,它们是有一个先后顺序的,例如上面的例子中,如果先按下S键然后才按Control和Alt将不能触发热键。举个例子来说,我们用Ctrl+Alt+Del来调出Windows任务管理器,同样也是有个顺序的,您可以自己实践一下,以下不再说明。

您可以使用下列调节键来定义热键:

符号    相关描述

#    Win (徽标键)

!    Alt

^    Control

+    Shift

&    &可用在两个按键(包括鼠标按键)之间来组合它们成为一个自定义的热键。详细说明请看 下面。

<    使用成对按键(如Alt、Ctrl、Win)中左边的一个。例如<!a 和 !a 差不多,但是<!a是只有当按下左边的那个Alt时才会触发热键。此功能不支持Windows 95/98/ME。

>    使用成对按键(如Alt、Ctrl、Win)中右边的一个。同上,此功能不支持 Windows 95/98/ME。

<^>!    AltGr。如果您的键盘布局中AltGr键代替了右边的Alt键,这一系列的符号就是用来表示AltGr键的(仅支持Windows NT/2k/XP或更高级版本)。例如:

<^>!m::MsgBox 您按了AltGr+m.

<^<!m::MsgBox 您按了左边的Control+左边的Alt+m.

*    通配符:只要包含有指定调节键的按键被按下即触发热键,经常用在 映射(Remap) 按键或按钮的时候。例如:

*#c::Run Calc.exe ; Win+C, Shift+Win+C, Ctrl+Win+C等等,只要有Win+C即触发热键。

*ScrollLock::Run Notepad ; 按ScrollLock后运行记事本,不管是否同时有control/alt/shift/win按键按下。此功能不支持Windows 95/98/ME。

~    如果自定义的热键和系统/程序原有的热键相同,则这些热键同时触发。在以下的两个例子里,当用户按下鼠标右键后,自定义的热键功能和系统/程序原有的右键菜单将同时触发:

~RButton::MsgBox 您按下了鼠标右键

~RButton & C::MsgBox 您按下了C键和鼠标右键

需要说明的是:在上面的例子中若没有~(即RButton)则将屏蔽原有的右键菜单,另外,一些专门用来代替 alt-tab 的按键将总是忽略这一设置,此功能不支持Windows 95/98/ME。

$    此符号只有当脚本使用 Send(发送) 命令发送的按键正好包含有热键本身的时候才会用到。在不同的系统上使用$前缀运行起来会有一些变化:

在Windows NT4/2k/XP 或更高级版本:将强制使用 键盘钩子(keyboard hook) 来执行热键。它的副作用就是阻止了 Send(发送) 命令触发热键。使用$ 前缀与使用指定的 #UseHook 等效。

在Windows 95/98/Me 以及AutoHotkey v1.0.23以上: 在其 线程(thread) 的执行过程中热键将失效,此后才重新生效。它的副作用是就算 #MaxThreadsPerHotkey 被设置为大于1也跟设置为1一样。

UP    UP通常写在一个按键名后面,用来表示当某按键被松开后触发热键而不是在其被按下后。下面的例子把左边的Win键映射(替换)成左边的Control键:

*LWin::Send {LControl Down}

*LWin Up::Send {LControl Up} ; 这样当左边的Control键坏了的时候就可以用左边的Win键来代替它。注意:并非完全替代,例如当按下LWin+Alt+Del的时候,并不会像按下Ctrl+Alt+Del一样出现Windows任务管理器。

"Up" 还可以配合一些常用的热键,例如: ^!r Up::MsgBox 您按下并松开了Ctrl+Alt+R.

此功能不支持 游戏操纵杆按钮。同时还要求在v1.0.28版本以上以及 Windows NT4/2000/XP或更高级版本才能有效。

(查看 按键列表 获得完整的键盘/鼠标/游戏操纵杆按键名列表)

 

可以把热键标记当作是普通标记来使用:您可以使用 Gosub/Goto 命令转到指定的标记,也可以定义多个热键标记到相同的子程序,例如:

^Numpad0::

^Numpad1::

MsgBox 按下Control+Numpad0或Control+Numpad1都会显示此信息。

return

如果一个热键没有定义任何动作,则这个按键或组合键将被屏蔽。下面的这个例子就屏蔽了右边的Win键:

RWin::return

 

仅在Windows NT, 2K, XP及其上平台有效的功能:

您可以使用" & "连接两个按键来自定义一个组合热键。在下面的这个例子里,您可以按着小键盘上的0然后再按下1来触发热键:

Numpad0 & Numpad1::Run Notepad

Numpad0 & Numpad2::Run Calc

在上面的例子里,Numpad0 是个前缀按键。正如下面的这个例子一样,前缀按键也可以设定其自己的动作,但只有当按键被松开的时候才被触发,而且在按下按键的时候不会更改任何热键:

Numpad0::WinMaximize A ; 最大化激活窗口。

滚动鼠标滚轮(向上滚动或向下滚动)可以被定义为热键,例子:

MButton & WheelDown::MsgBox 您按着鼠标中键同时向下滚动了滚轮。

^!WheelUp::MsgBox 您按着Control+Alt同时向上滚动了鼠标滚轮。

还有一个功能是控制Numlock,Capslock,或Scrolllock这些键,使其保持开着或关闭的状态。例如:SetNumlockState, AlwaysOn

Windows内置的热键如Win-E(#e)和Win-R(#r)可通过在脚本中为它分配其他动作而达到屏蔽的目的。详细说明请查看 撤销或屏蔽热键 部分。

取替 Alt-Tab: AltTab和ShiftAltTab是两个比较特殊的命令,只跟热键结合使用才会有用,它们是用来取替Alt-Tab和Alt-Shift-Tab的。例如, 在下面这个例子里,你可以使用左边的Alt结合鼠标滚轮上下滚动来代替Alt-Tab和Alt-Shift-Tab进行切换。

LAlt & WheelDown::AltTab

LAlt & WheelUp::ShiftAltTab

类似地,只用鼠标也完全可以取替Alt-Tab,像下面一样,按下中键将显示切换界面,然后滚动鼠标滚轮即可进行切换,再次按下中键即可切换到选定窗口并退出切换界面:

MButton::AltTabMenu

WheelDown::AltTab

WheelUp::ShiftAltTab

如果您要用右手在键盘上切换(代替alt-tab),比较方便的方法是这样:

RControl & RShift::AltTab ; 按住右边的Ctrl键和Shift键来切换

RControl & Enter::ShiftAltTab ; 按住右边的Ctrl键和回车键来切换()

The other Alt-tab actions available are:

1) AltTabAndMenu: 如果存在切换界面则向右切换,否则显示切换界面。

2) AltTabMenuDismiss: 关闭切换界面。

现在您该知道以上所有关于Alt-tab的命令都必须像上面的例子一样分配给热键,否则它们将无效。

 

注意

由于Numlock键有开启/关闭两种状态,使得每个小键盘上的按键可在不同状态下触发两个不同的热键。当然,也可以把它们设置为触发同一个热键而不管Numlock的状态如何:

NumpadEnd::

Numpad1::

MsgBox, 热键将忽略Numlock的状态而触发

return

如果(~)结合前缀按键使用过一次,则含有那个前缀按键的热键都会向激活窗口发送前缀按键的动作。例如在下面的例子里,鼠标右键(RButton)就是前缀按键,上面的第一行命令规定了在按着鼠标右键的同时按下左键将触发热键而显示对话框,而且由于~的存在,右键命令也同时触发(例如显示右键菜单,如果有的话);需要注意的是第二行的命令规定了在按着鼠标右键的同时往上滚动鼠标滚轮将触发热键而显示对话框,而且由于没有~,右键命令将被屏蔽(例如屏蔽右键菜单) ,然而当此脚本执行的时候,右键命令依然会触发(例如不该出现的右键菜单出现了),因此需要特别注意这一点。

~RButton & LButton::MsgBox 您按着右键同时按下了左键。

RButton & WheelUp::MsgBox 您按着右键同时往上滚动了鼠标滚轮。

Suspend(中断) 命令可以临时关闭除了指定热键以外的所有热键。

在脚本运行的过程中,热键可以通过 Hotkey(热键) 命令动态地创建。Hotkey命令还可以修改、关闭或开启脚本中已有的热键。

游戏操纵杆热键目前不支持像^ (Control)和# (Win)这样的调节键前缀。不过,您可以使用 GetKeyState 来模拟它的效果,如下面这个例子:

Joy2::

GetKeyState, ControlState, Control

if ControlState <> D ;在这里D表示按键被按下

return ; 表明如果按钮未被按下则没有动作

MsgBox 您按着Control键同时按下了游戏操纵杆的第二个按钮。

return

这个程序有点类似 多线程, 它允许在前一个热键子程序仍在运行的时候运行新的热键,例如上面有一个热键被触发并显示 MsgBox(对话框),新的热键仍可以运行。

 

 

 

 

 

 

 

 

 

 

 

 

小鸟学AHK(5)之高级教程:热字串和自动扩展

2008-07-10 23:58

下面很麻烦,简单的用法看(1)就可以了,其实就是两个双冒号之间插入缩写词,其后加上触发结果,扩展就是第一个双冒号间可以加参数改变具体的触发行为,高手您慢慢看(原文来自yonken翻译的AHK的帮助文档。

热字串主要用来实现自动扩展,例如当你键入一些单词的缩写时自动扩展成完整词句,不过热字串也同样可以用来执行任何脚本动作,在这一方面它和 热键 类似,但它们由更多的字符组成,因此才被称为热字串。

要定义一个热字串,只需要在两个双冒号之间插入缩写词,其后加上触发结果(替换文字)即可。例如:

::btw::by the way

在上面的例子里,当键入btw这个缩写之后,再键入 结束符(ending character)即触发热字串,使其自动扩展为"by the way"。结束符可以是指空格、句号或回车(如果要直接触发热字串而不必键入结束符,可以使用 * 选项)

注意:后面的语句不能是中文,否则会变成乱码! :( 若要使用中文语句,可参考下面的 方法:

这个例子中热字串的作用就是自动地把"btw"删除然后替换为"by the way"从而实现所谓的自动扩展。另外,正如上面所说,热键串还可以用来定义其他动作,不过记住要把相关命令置于热键串之下:

::btw::

MsgBox 您键入了"btw"。;键入btw及结束符将显示此对话框,而btw将被删除(请看下面的说明)

return

尽管上面的热字串不属于自动扩展的一类,但用户键入的缩写词仍会被自动删除,这是因为它的默认设置为自动发出退格命令。如有需要可以使用 b0 选项 来取消这一设置。

结束符

在默认状态下,用户必须在键入热字串的缩写词后再键入一个缩写词,使用 * 选项 即可免去这一步。

结束符默认是指这些字符:-()[]{}‘:;"/\,.?!`n `t (注意:`n代表回车,`t代表Tab,在`n和 `t之间还有一个空格)。您可以仿照下面的语句来更改这一设置:

#Hotstring EndChars -()[]{}:;‘"/\,.?!`n `t ;右边的所有字符串都被定义为结束符

选项

热字串的默认行为可以有两种方法改变:

使用 #Hotstring 命令,用它结合下面的选项进行的设置会影响到其下脚本中的所有热字串,例如:

#Hotstring c r ; 区分大小写并且"发送原文";

在热字串的前两个冒号之间插入一个或多个选项,例如:

:c*:j@::john@somedomain.com ; 区分大小写并且取消结束符(也就是说不用结束符即可触发热字串)。

注意:当使用超过一个选项(下面列出)的时候,空格键可被随意添加到这些选项之间(而不会有影响)。

* (星号):不再需要结束符(例如空格和回车等等)来触发热字串。使用 *0 来恢复。在下面的例子里,当@号一被按下即触发热字串从而自动扩展缩写:

:*:yk@::yonken@163.com

? (问号):键入任何含有缩写词的词句都会触发热字串。举个例子,对于 :?:al::airline 这个热字串来说,键入含有"al"的"practical"这个单词将会生成"practicairline"(只是al被替换成了airline而不是整个单词,注意到了吗?)。 使用 ?0 (问号后面一个零)来恢复。

B0 (B后面接一个零): 自动退格删除缩写词的功能将被禁止。取消此功能后若想恢复可使用 B 选项。

C: 区分大小写:用户键入的缩写词必须和脚本中的严格一致(也就是说区分大小写)。使用 C0 (C后面接一个零)来取消此功能。注意:如果您需要为同一个缩写词分开定义为两个只有大小写格式不同的热字串的话,那么请在其中一个热字串的前两个冒号之间插入空格,用以和另外一个热字串区分。这样做是有必要的,因为热字串属于标识,而每个标识必须是唯一的。在下面的这个例子里,第一个热字串使用了一个额外的空格来与第二个区分:

:c :ceo::chief executive officer

:c:CEO::Chief Executive Officer

C1: 取消匹配大小写。使用这个选项来使得那些自动扩展的热字串对大小写不再敏感(即输出结果将和热字串中定义的完全一致)。使用C0 来恢复。热字串默认状态下是匹配大小写的,如果用户键入的缩写词全部都是大写则输出的结果也全部大写;如果键入的第一个字母是大写则输出的第一个字母也会是大写;其他情况的输出结果将和热字串中定义的完全一致。下面针对此热字串--:c :ceo::chief Executive officer来详细说明:124219529@qq.com

若键入CEO加结束符则输出结果为CHIEF EXECUTIVE OFFICER(全部字母都大写);

若键入Ceo/CEo/CeO等则输出结果为Chief Executive officer(也就是说只是第一个字母改为大写而已);

其他格式的输出结果都是和热字串原来定义的一致,也就是chief Executive officer。

Kn: 按键延迟;通常来说几乎所有使用自动退格和自动扩展功能的热字串的按键延迟都是0。设置为零是被推荐的,因为这样既迅速而又可以很好地配合其它进程(由于内部设置了 Sleep 0)。若需要设置延迟,则给变量 n 赋值即可。用 -1 来表示完全没有延迟,如果您的CPU经常性的处于重负荷状态的话,这会使自动扩展的速度加快。

O: 当自动扩展的文字生成的时候省略结束符。这在你需要结束符来触发热字串而又不想让它输出到目标的时候非常有用。例如:通常我们是这样设置热字串的-::ar::aristocrat,当键入"ar"和空格会输出"aristocrat "(它画蛇填足地在后面添加了空格符);而当使用O选项后也即o:ar::aristocrat ,键入"ar"和空格会输出"aristocrat",注意它是没有空格符在后面的。使用O0 (字母O后面接一个零)来恢复。

Pn: 设置热字串的 优先级 (例如 P1)。此选项对实现自动扩展功能的热字串没有影响。

R: 发送替换文字的原文。也就是说热字串将完全一致地输出原文而不会解释{Enter}或^c这些特殊的字符串,从而避免那些有 延续部分(continuation section) 的热字串自动发出回车或Control-C等等命令, 使用 R0 (R后面接一个零)来恢复。

Z [v1.0.30+]: 每触发一次热字串则重设一次热字串识别器。这里的意思是脚本将会在每次热字串触发后消除对前一次键入内容的识别并等待新的热字串。举个例子来说明一下,下面的热字串没有Z选项,所以键入111后热字串将会触发两次而不是一次:

:b0*?:11::

Send xx

return

只要在b0前面插入一个Z,就必须键入1111而不是111来触发两次热字串。 使用 Z0 (Z后面接一个零)来恢复。

大段替换文本

在 v1.0.32以上版本中,通过添加 延续部分(continuation section),热字串可以输出大段的替换文本。例如:

::text1::

(

Any text between the top and bottom parentheses is treated literally, including commas and percent signs.

By default, the hard carriage return {Enter} between the previous line and this one is also preserved.

Also, the indentation {Tab} to the left of this line is preserved by default.

 

See continuation section for how to change these default behaviors.

)

 

特别需要注意的是,延续部分不能直接使用中文字符,否则会输出乱码,解决方法请参考下面。

延续部分的存在同时使得热字串从默认模式变为 原文模式。留意上面的文字,{Enter}和{Tab}都不会被认为是按键指令,要撤销这一设置的唯一一个方法是在每一个有延续部分的热字串中使用 r0 选项。

注意

热字串输出的语句是不直接支持中文的,不过也可换个思路,借助clipboard命令赋予剪贴板自定义的文字,然后通过发送Ctrl+V的方法来输出中文,例如:

::sbs::

clipboard = 顺便说一下

Send, ^v

Return

目前类似%MyVar%这样的变量参数不支持在替换文本中使用。要使用它们就不能把热字串设为自动扩展而是在缩写词之下使用 Send(发送) 命令并用一行Return接上。

内建变量 A_EndChar 就是那些用以触发最近的非自动扩展类的热字串的结束符。如果不需要结束符来触发(*选项的作用),那么它的值为空。此变量对于那些使用发送(Send)命令的热字串或那些键入不同结束符而有不同行为的热字串来说比较有用。要发送结束符自身,需要使用"SendRaw %A_EndChar%"(之所以使用 SendRaw(发送原文) 是因为类似 !{} 这样的字符不能通过普通的发送(Send)命令正确发送。

尽管在热字串定义式中的逗号、百分比符号和单冒号不需要进行 转义,但是那些有空格和空位(Tab)在其左边的重音符和分号就需要转义。请查看 转义列表 获得详细的列表。

尽管 Send(发送)命令的语法 被支持用在自动扩展文本部分(除非用了原文(raw)选项),但热字串的缩写词本身不能用它来表示。也就是说,在缩写词里不用{ENTER}来表示回车键或用{SPACE}来表示空格键。取而代之的方法是使用 `n 来表示回车以及用 `t 来表示跳格(Tab)(请查看 转义列表 获得详细的列表)。 下面举个例子说明:

:*:ok{ENTER}::no problem ; 键入"ok"再加一个回车键不能触发热字串,除非键入完整的ok{ENTER}。

:*:ok`n::no problem ; 键入"ok"再加一个回车键即可触发热字串。

热字串定义了空格和空位(Tab)将被直接认作是字符本身,例如下面的热字串将产生两种不同的结果:

::btw::by the way

::btw:: by the way ; 比上面多了一个空格,那么这个空格也会严格地输出来。

热字串的缩写词不可以超过30个字符。如果长度超出了程序会提醒您的。热字串的替换文本也有AutoHotkey最大行数的限制,但它最多可以达到16,383个字符。不过也可以通过一个巧妙的方法来突破这一限制,那就是在热字串中使用 Send %自定义变量% 。 例如您可以预先设置自定义变量并赋值为超过限制部分的字符,然后在热字串中调用即可。

热字串的先后顺序决定了它们的优先级,换句话来说就是如果有超过一个的热字串符合用户键入的内容,则只有排在最前面的那个热字串才会生效。

运行脚本时用户进行的任何退格行为都将被视为企图核对热字串。但是,如果用户在编辑器中使用了上/下/左/右箭头、PageUp、PageDown、Home和End这些按键时将导致热字串识别重设,也就是说消除对这一次键入内容的识别并等待新的热字串。

即使处于激活状态的窗口忽略用户的键击行为热字串也依然可以输入,也就是说就算替换文本不可见热字串还是会被触发。此外,退格键也还是会撤销最近的键击,尽管您看不到效果。

可以使用 Gosub 或 Goto 来转到指定的热字串标识(Label), 只要在标识名前面加上一对冒号即可。不过,如果在冒号之间没有选项符则必须对双冒号进行转码。例如: Gosub `::btw

尽管热字串不被监控而且在不可见的 输入(Input) 命令生效期间将不会被触发,但可见的输入是可以触发它们的。

热字串不会被AutoHotkey脚本发出的键击行为触发。这样避免了发生热字串反复触发导致无限循环的可能。

在某些方面来说 输入(Input) 命令比热字串更加灵活。例如,它允许在激活窗口中键击的不可见(例如游戏)。它还支持像Escape键这样的非字符式结束键。

所有包含热字串的脚本都将自动使用 键盘钩子(keyboard hook)。

热字串和热键的相同反应:

它们都会受到 中断(Suspend) 命令的影响;

都服从 #MaxThreads 和 #MaxThreadsPerHotkey (除了#MaxThreadsBuffer)的设置;

含有热字串的脚本都将自动 持续(persistent);

非自动扩展类的热字串运行时将会创建新 线程(thread),此外它们还将更新内建的热键变量,例如 A_ThisHotkey 。

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

小鸟学AHK(6)之鼠标动作

2008-08-27 09:32

下面开始讲课,主要就一个命令,学好它基本就能实现简单的大部分行为了。认真听讲啊。

click 30,40 right 2 r

(1) (2) (3) (4)

(1)坐标,可用函数如 %x%,%y%,省略则默认为当前位置。(坐标默认的是相对于当前窗口,不是屏幕,当然这个默认是可以改的,你要改么?嗯?你有这么厉害?那别看了)

(2)right 右键,left左键,middle 中键,省略则默认left

(3)鼠标行为:

数字表示点击次数:省略则默认为1;写0的话则表示移动鼠标(不点击再加上坐标当然是移动了,什么?你不加坐标?别逗电脑了);

down为按下,up 为弹起,用这两个组合起来实现拖动。

(4) r ,表示坐标是以当前鼠标位置为原点的相对坐标,省略则默认是绝对坐标,原点在哪?窗口左上角啊,前面刚说完。

举例:

click ;当前位置鼠标单击左键

click 2 ;当前位置鼠标双击左键

click 30,40 0 ;移动鼠标到30,40

click 30,40 down

click 50,60 up ;这两行组合在一起即是拖动某东东

高手进阶

一,滚轮

click wheelup 2 ; 滚轮向上滚2次,数字省略则默认为1次,如

click wheeldown ; 滚轮向下滚一次. wheelup 可以写成WU,相对应的就是WD了。不过有些程序不认数字,所以最好采取兼容性更 高的循环法,如

loop 5

click WD ; 向下滚5次

二,sendmode模式

是为了实现特殊点击,而且兼容性更高,要习惯多用这种模式哦,

比如要实现ctrl+鼠标双击

send ^{click 100,200 2}

三,设置延迟和鼠标移动速度

有时为了让观众能看清楚鼠标动作,有必要设置一下速度

SetDefaultMouseSpeed 30; 默认的是2 ,可以从0调到100,越小越快,调0您的鼠标就是博尔特了

每个鼠标动作结束之后,为了能让电脑反应过来做下个动作,默认都有个延迟,默认是10毫秒

SetMouseDelay 30; 我改成30了,有必要么,没什么必要,不过省得你写一堆sleep 30了

四,取当前点坐标,窗口或控件

MouseGetPos x,y m, n ;四个变量,当然都可以省的,但省的时候得留下逗号,这行执行完了后,变量x和y的值就是取得的坐标,m变量为当前鼠标悬停的窗口的ID,n为当前鼠标悬停的控件的名称(ClassNN),估计目前的您还用不着,mn省了吧。

 

基本上以上这些就OK了,完完全全的够用,MouseClick,MouseMove什么的菜鸟就别看了,人的记忆细胞是有限的,一个万能的click多灵活啊。要是controllclick翻译出来了,那鼠标的部分我就OK了。最后感谢一下AHK翻译小组的辛苦。我在此也不过是做了一个白话和浓缩介绍的工作,希望没有版权问题。

 

   

 

 

 

 

小鸟学AHK(7)之数学命令

2008-09-02 09:12

总结几个我能看懂的并且好总结的命令。

 

1.付值

看一下下面的例子,猜一下y的值

x=1

y=x ;y的值是1么?非也,y的值是x,是一个字符

y:=x ;这回y的值才是1, :=x 的作用是把右边的表达式执行并将结果传给y,永远记住自己在干什么

 

 

2.递加递减递乘递除

EnvAdd, x, 3 ;等效于下行的代码

x +=3 ;每执行一次,X值都会自动加3,这种不用记命令,是上行代码的简写形式,推荐使用。

x++ ;因为增值为1的命令经常会用到,所以有更简单的写法,相当于 x +=1 ,推荐常用。

 

其它用法与递加相同,递减:EnvSub, 递乘: EnvMult, 递除: EnvDiv, 举例如

x=100

loop 2

{

x /=10

x--

x *=2

} ; 拿计算器算算吧,看是不是1.6,递加就是这样和循环一起用的。怎么没有 x** 的?猪啊你!

 

3.随机

Random, x, 1,100 ; 在1到100之间随机一个值给x,简单吧,先这么地吧

 

4.条件

if (x < y)

{

}else{

} ;太难了,我解释不清,悟性好的自行参悟吧,哈哈,下面的条件命令和它一样的

IfEqual, x, 3 ; 相当于if x=3

IfNotEqual, x, 3 ; 相当于if x<>3

IfGreater, x, 3 ; 相当于if x>3

IfGreaterOrEqual, x, 3 ; 相当于if x>=3

IfLess, x, 3 ; 相当于if x<3

IfLessOrEqual, x, 3 ; 相当于if x<=3 , 唉,我怎么觉得解释才更好用呢,为了能让读程序的人看懂,多记一记吧

If x ; 这也可以?当然了,x不也是表达式么,空或0就返回fault,有值就返回true呗

if x (not) between 1 and 5 ; 哎我口好干

if x is type ;判断x的类型的,type有integer,float,等等八九个,自己查吧

 

5.其它

 

SetFormat, NumberType, Format ;设置数学运算得到的整数或浮点数的格式。比如

SetFormat, integer, H ;设置整数类型为十六进位格式,用不上吧你哈哈

 

Transform, x, Cmd, Value1 [, Value2] ;CMD表示某种运算方式,后面则是它所须要的参数,比如

Transform, x, Asc, A ; 把A的阿克斯码值传递给x,个人觉得就是函数方式x:=Asc(A)另一种写法。

搞定大家支持一下

 

6.递加进阶

这部分有点难,我都没太搞明白

EnvSub, Var, Value, TimeUnits ;相当于下面这行

Var -= Value, TimeUnits ;递加递减都可以,var就是我常用的变量x, value就是递变的数值,只不过最后加了一个TimeUnits参数,我理解的意思是按照时间的格式进行递变,时间格式就是YYYYMMDDHH24MISS 这样的数值形式,比如现在是08年9月1日下午5点15分20秒,用时间格式表达就是20080901171620,TimeUnits参数自然就有years,months,days,hours等几种了,咱们还是看例子吧

 

x=20050126

x -=20040126, days ; x值是366,因为2004年是闰年啊,哈哈。这种递变一般是用来做计时用,比如2010年全球病毒大暴发。。。再引用一个倒计时1分钟并显示提示的听歌脚本的部分代码,

 

倒计时=%A_Now% ;A_Now是系统当前时间

EnvAdd,倒计时,1,Minutes ;这里的倒计时变量将在下面循环括号中的if语句中参与其表达式的计算

Loop

{

倒计时传递=%倒计时%

EnvSub,倒计时传递,%A_Now%,Seconds ;之所以设置一个倒计时传递变量,是为了避免和下面的if语句中的倒计时变量重名,下面的倒计时 变量必须引用循环外那个加了1分钟的。

ToolTip,%倒计时传递%秒后开始休息:-)

Sleep,33 ;如果为零,循环将占用cpu50%。0~20一般没实际意义。

If A_Now>%倒计时% ;将当前获取的时间和循环括号外多加1分钟的倒计时变量进行判断

{

ToolTip ;将置顶提示清空

Break ;退出此循环

}

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附录:新鲜出炉的快速启动,快来尝鲜

2008-09-02 09:10

一直以来在努力习惯win+r启动,失败

一直觉得WIN自带的快速启动栏是最好的,可惜不排序,而且也经常因为单列太长找不到程序。。。

所以做了个类似的纯文字版的表格式的快速启动,图标是给老外看的,汉字本来就是象形,我看汉字比图标快。。。所以就不加图标了

虽然仍然有点小问题,但基本还算满意了,这才是我真正意义上的第一个完整的程序吧

 

使用方法:

代码默认快速启动目录为 我的文档\Quick Launch\下了,所以你要么改个目录要么建它,

里面的程序快捷方式文件名的前10字符不要有相同,不要有空格或特殊符号,否则会出错,

第一次运行 WIN+x 初始化,以后每次有变化都要WIN+x 一下,

然后你就可以享受任时任地的启动快感了: WIN+鼠标右键或WIN+空格

如果你编译成exe的话,就不好用了。请在AutoHotKey.ini里调用。

这几行破代码还费我半周时间琢磨,希望高手来改善。

 

 

现在发现一个bug,WIN+鼠标右键的时候,如果右键点慢了会出现窗口最小化

请先用WIN+空格的方式试试

#RButton::

#Space::

IfNotExist, temp.ahk

{

msgbox, 第一次运行、目标文件夹内容有变化、出错请按WIN+x初始化或修正,对AHK有兴趣的朋友请加群15155327, by 寂起寞飞(wildtoy)

return

}

MouseGetPos, zbx,zby

zbx := zbx-250

zby := zby-75

x:=0

y:=0

Loop, %A_MyDocuments%\Quick Launch\*.*

{

a:=x*100

b:=y*30

StringTrimRight, tempfilename, A_LoopFileName, 4

StringLeft, tempfilename, tempfilename , 10

Gui, Add, Button, x%a% y%b% w100 h30 , %tempfilename%

x++

if x=5

{

x -=5

y++

}

}

Gui, Show, x%zbx% y%zby% w500,5326858

return

 

#Include *i temp.ahk

#x::

IfExist, temp.ahk

{

filedelete , temp.ahk

sleep 30

}

Loop, %A_MyDocuments%\Quick Launch\*.*

{

StringTrimRight, tempfilename, A_LoopFileName, 4

StringLeft, tempfilename, tempfilename , 10

FileAppend,

(

Button%tempfilename%:

gui,destroy

run %A_LoopFileFullPath%

Reload

sleep 2000

return`n

) , temp.ahk

} ;;按钮激发执行程序,并退出界面

Reload

sleep 2000

return

AHK进阶之路