AutoHotkey是简易而功能强大的热键脚本语言。使用者可将键盘、鼠标甚至游戏摇杆的移动和点击动作记录下来。比较特别的一点是:AutoHotkey具备一个脚本编译器,当你用Record记录完成后,可以转换(Convert)功能将脚本转换成EXE可执行文件,这是非常有用的功能。
如果你能熟练地用好这款免费且开放源代码的工具,你的工作效率将大大提升。
目前AutoHotkey的最新版本是1.0.36.02,可到其官方网站http://www.autohotkey.com/获得最新版本。
点击此处下载安装程序
点击此处下载压缩包(不需安装)
如果你曾经安装过旧的版本,不需要卸载即可更新到新版本。如此强大而且又是免费的软件我怎会错过?
不过目前网上没有帮助文档的汉化版本,所以英语是不得不学啊!
第一次亲密接触AutoHotkey 续 [原]
安装AutoHotkey后右键菜单会多了一些命令,如新建 AutoHotkey Script命令,这将新建一个ahk文件。
同时AutoHotkey还关联了*.ahk文件,直接双击它将运行脚本,在其上点右键会有关联命令菜单。如下图,从上至下分别是运行脚本、编译脚本和编辑脚本的命令。
点击“Edit Script”,将会用记事本来打开脚本以供编辑。
要学习使用AutoHotkey,它的帮助文档是必看的,里面非常详细地说明了使用方法,好多英文啊~~
我的第一个作品就是仿照它的帮助说明做的,绑定Win+Z为打开浏览器并登陆百度主页的快捷键的脚本:
#z::Run www.baidu.com
运行此脚本后,在系统托盘上可看到一个H图标,说明正在运行脚本,此时按下快捷键Win+Z,预想马上实现,多么令人兴奋的一刻!
说明:#代表Win键,所以#z就是按下Win+Z键的意思,::后面的内容为此快捷键定义的命令。当然还有其他按键定义,如!对应Alt,^ 对应Control,+对应Shift等等, 帮助文档里面有详细说明。
使用AutoHotkey运行并控制软件 [原]
AutoHotkey的功能当然不会只是定义快捷键这么简单了,我最想知道的就是怎样利用它来控制软件的安装,从而达到自动安装软件的目的。
1.打开记事本
run, Notepad
看看上面的脚本,简单吧?其实就像Windows里面开始→运行→输入的命令,看来只要“运行”命令可以运行的系统程序都可以哦!点击此处查看开始→运行→输入的命令集锦
2.运行QQ的安装程序
要运行QQ的安装程序,需要指定QQ的位置,假设为 D:\qq\setup.exe ,那么脚本就是
Run, D:\qq\setup.exe
其实最好就是在D:\qq 文件夹下新建一个脚本,那么脚本中就不需要指定路径了:
Run, setup.exe
3.更进一步,开始控制程序
运行安装程序后当然是想办法控制程序安装啦,运行QQ2005 Beta2 珊瑚虫版的安装程序后,出现如下界面:
“下一步”按钮应该如何控制呢?试一试下面的脚本吧:
Run, setup.exe
Send, {ENTER}
就是这么简单,当然,还可以用快捷键的,例如“下一步”的快捷键是ALT+N,那么理论上只要发出按下ALT加N然后放开ALT键的命令即可,那么试试吧:
Run, setup.exe
Send, {ALTDOWN}n{ALTUP}
结果却失败了,因为QQ的安装程序未被激活(这里指它不是当前窗口,在Windows里最前窗口为当前工作窗口)
查看帮助文档,发现果然有相关命令如WinWait、IfWinNotActive、WinActivate、WinWaitActive等,然后修改上面的脚本,最后修改成功,如下:
Run, setup.exe
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, , WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
Send, {ALTDOWN}n{ALTUP}
说明(按行说明):
1.运行安装程序;
2.WinWait,等待指定窗口;命令格式:WinWait[, 窗口标题, 窗口文字, 等待/超时时间(秒), 排除指定的窗口标题, 排除指定的窗口文字]
窗口标题很好理解,在这里就是指QQ安装程序窗口的标题“腾讯 QQ2005 Beta2 珊瑚虫版 安装”,至于怎样获得窗口的准确标题就需要利用AutoHotkey的Window Spy了:开始→所有程序→AutoHotkey→AutoIt3 Window Spy
运行Window Spy后再运行QQ安装程序,即可在Window Spy看到所需窗口标题,鼠标移动还可以获得窗口任意位置的坐标和经过的控件类名以及文本等等,如图:
3.IfWinActive/IfWinNotActive,检查指定窗口是否存在并且已被激活;命令格式和WinWait一样。
4.WinWaitActive,等待指定窗口直到其被激活;
利用AutoHotkey实现全自动安装程序 [原]
还是以QQ2005 Beta2 珊瑚虫版为试验对象,完成未完事业
假设QQ安装程序的文件名为setup.exe,先在同一目录下新建一个脚本文件,命名为autosetup.ahk。
编辑前先要了解QQ2005 Beta2 珊瑚虫版安装的整个过程,并且获得如窗口标题、窗口文字、按钮名等必需信息。
安装的整个过程如下:
1.运行
2.出现声明窗口,选“下一步”(ALT+N);
3.出现软件许可证协议窗口,选“我接受”(ALT+I);
4.出现选择组件窗口,通过TAB切换,上下键以及空格键来解除勾选“中文上网官方版”组件(我不喜欢这些东东),选“下一步”(ALT+N);
5.出现选定安装位置窗口,设置路径为D:\QQ (我也不喜欢把软件装到C盘),选“安装”(ALT+I);
6.开始安装,等待...
7.出现安装完成窗口,通过TAB切换来解除勾选“立刻注册出价”(理由不用说了),选“关闭”(ALT+L)
此外,在程序安装的过程里,当然不能让用户乱按乱搞了,不然可能会影响自动安装的进行,最好就是在此过程里屏蔽鼠标和键盘的输入,让你无法捣乱。这就需要利用BlockInput, on/off 命令了。
好了,总算计划好了,下面是整个脚本:
Run, setup.exe
BlockInput, on
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 腾讯 QQ2005 Beta2 珊
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 腾讯 QQ2005 Beta2 珊, WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 腾讯 QQ2005 Beta2 珊
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 腾讯 QQ2005 Beta2 珊
Send, {ALTDOWN}n{ALTUP}
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 , 珊瑚虫工作室[Coral S
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 , 珊瑚虫工作室[Coral S, WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 , 珊瑚虫工作室[Coral S
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 , 珊瑚虫工作室[Coral S
Send, {ALTDOWN}i{ALTUP}{TAB}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{SPACE}{ALTDOWN}n{ALTUP}d{SHIFTDOWN};{SHIFTUP}\qq{ALTDOWN}i{ALTUP}
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成, WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成
Send, {TAB}{TAB}{TAB}{SPACE}{ALTDOWN}l{ALTUP}
BlockInput, off
脚本生成了,就要测试一下有没有问题,出错就要仔细检查,如果出现程序长时间停止响应的情况,按Ctrl+Shift+Esc调出任务管理器来终止此程序或进程。
现在需要把ahk文件转成可执行的exe程序。在脚本上点右键,选Compile Script进行编译。选好exe生成的位置,还可以选择程序图标,到网上找一下QQ的图标(ico文件)就更个性了。
或者通过开始→所有程序→AutoHotkey→Convert .ahk to .exe来执行也一样。
最后运行生成的autosetup.exe(文件大小通常只有几百K)即可自动安装QQ并实现一系列预定的效果。
使用AutoScriptWriter录制AutoHotkey脚本 [原]
开始→所有程序→AutoHotkey→AutoScriptWriter (recorder)即可运行AutoScriptWriter
点击界面上的“Browse”指定录制前需要运行的程序或直接在“Browse”旁边输入程序路径(notepad等系统程序直接输入名称即可)
依旧拿QQ做实验,指定QQ安装程序路径后点击AutoScriptWriter界面上的“Record”按钮将会运行QQ安装程序,同时你的一举一动都会被它记录在案。
你可以使用鼠标,也可以使用键盘,完成后点击屏幕左上方的的“STOP”按钮结束录制,回到AutoScriptWriter的主窗口。点击“Save”保存脚本即可。
生成如下脚本:
Run, G:\soft\setup.exe
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, , WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
Send, {ALTDOWN}n{ALTUP}
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 ,
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 , , WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 ,
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 ,
Send, {ALTDOWN}i{ALTUP}{TAB}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{SPACE}{ALTDOWN}n{ALTUP}d{SHIFTDOWN};{SHIFTUP}\qq{ALTDOWN}i{ALTUP}
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, , WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
Send, {TAB}{TAB}{TAB}{SPACE}{ALTDOWN}l{ALTUP}
运行此脚本,发现一个怪问题:脚本可以完全控制安装程序直到完成安装窗口出现,这是安装的最后一步,只需解除勾选“立刻注册出价”然后发出"ALT+L"命令即可完成,但就是这一步失去控制了。经过研究N久总算发现问题所在:细心查看上面的脚本可以发现从头到尾所指定的窗口名都是“腾讯 QQ2005 Beta2 珊瑚虫版 安装”,因此尽管安装程序还没有到完成安装那一步,脚本已经“迫不及待”地执行了Send, {TAB}{TAB}{TAB}{SPACE}{ALTDOWN}l{ALTUP} 等命令。因此必须准确定义最后这一步时窗口名称。自己执行一次安装程序直到最后一步,然后利用Window Spy获得窗口标题,显然一直都是“腾讯 QQ2005 Beta2 珊瑚虫版 安装”,再看看它的窗口文字,里面有很多,只需要能唯一定义它的就行了。这里我选择了“安装完成”,于是修改脚本,最终结果如下:
Run, setup.exe
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, , WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装,
Send, {ALTDOWN}n{ALTUP}
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 ,
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 , , WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 ,
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装 ,
Send, {ALTDOWN}i{ALTUP}{TAB}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{SPACE}{ALTDOWN}n{ALTUP}d{SHIFTDOWN};{SHIFTUP}\qq{ALTDOWN}i{ALTUP}
WinWait, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成
IfWinNotActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成, WinActivate, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成
WinWaitActive, 腾讯 QQ2005 Beta2 珊瑚虫版 安装, 安装完成
Send, {TAB}{TAB}{TAB}{SPACE}{ALTDOWN}l{ALTUP}
AutoHotkey实例:制作KV杀毒伴侣[原]
由于最近一直在研究和制作光盘,经常需要制作KV杀毒伴侣到一指定的文件夹,重复操作效率太低了,于是理所当然的就想到了AutoHotkey,有了它,一切都变得简单多了尤其是对我这种懒人来说
其实制作脚本很简单,有了前面的经验,很快就搞掂了脚本如下:
#NoTrayIcon ; 隐藏托盘图标
FileInstall, nomousy.exe, %A_WorkingDir%\nomousy.exe, 1 ; 装入nomousy工具,用以隐藏鼠标
BlockInput, On ; 屏蔽用户输入
Run, nomousy.exe /h ; 运行前面已经装入的隐藏鼠标工具
FileDelete, e:\kv\*.* ; 删除以前的文件
Run, d:\kv2005\KvXP.kxp ; 启动KV
WinWait, 江民杀毒软件KV2005, ; 等待窗口出现
IfWinNotActive, 江民杀毒软件KV2005, , WinActivate, 江民杀毒软件KV2005,
WinWaitActive, 江民杀毒软件KV2005,
Send, {ALTDOWN}t{ALTUP}
MouseClick, , 274, 113, 江民杀毒软件KV2005
WinWait, 江民杀毒软件软盘制作工具,
IfWinNotActive, 江民杀毒软件软盘制作工具, , WinActivate, 江民杀毒软件软盘制作工具,
WinWaitActive, 江民杀毒软件软盘制作工具,
ControlSetText, Edit1, E:\kv, 江民杀毒软件软盘制作工具,
ControlClick, Button3, 江民杀毒软件软盘制作工具
WinWait, 江民杀毒软件软盘制作工具,
IfWinNotActive, 江民杀毒软件软盘制作工具, 制作成功, WinActivate, 江民杀毒软件软盘制作工具, 制作成功
WinWaitActive, 江民杀毒软件软盘制作工具, 制作成功
ControlClick, Button2, 江民杀毒软件软盘制作工具
WinWait, 江民杀毒软件KV2005,
IfWinNotActive, 江民杀毒软件KV2005, , WinActivate, 江民杀毒软件KV2005,
WinWaitActive, 江民杀毒软件KV2005,
WinClose, 江民杀毒软件KV2005,
BlockInput, Off ; 解除输入屏蔽
Run, nomousy.exe ; 再次运行nomousy工具显示鼠标
FileDelete, %A_WorkingDir%\nomousy.exe
d:\kv2005\KvXP.kxp是启动江民杀毒软件的程序,上面的脚本指定了制作KV杀毒伴侣到E:\KV文件夹,把这个脚本放到桌面或干脆编译成程序,以后只要运行它就可以迅速地完成工作了
用AutoHotkey编辑注册表与对话框[原]
在AutoHotkey中可编辑注册表的相关命令有RegRead, RegWrite, RegDelete和Registry-loop,命令在帮助文档里有详细说明及实例。经常用到的是下面前三个,其命令格式为:
RegRead, 输出变量, 主键名, 子键名 [, 键项]
RegWrite, 数据类型, 主键名, 子键名 [, 键项, 数值]
RegDelete, 主键名, 子键名 [, 键项]
MsgBox用来显示简单的对话框,可配合IfMsgBox命令设置按钮反应,其命令格式为:
MsgBox [, 选项, 对话框标题, 对话框信息文本, 超时时间]
其中“选项”用以设置对话框种类及按钮布局,默认为零。
一个例子:
读取操作:
获取系统版本号(以XP为例)
键名:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
操作:读取字符串"BuildLab"的数值数据并在对话框中显示
写入操作:
调整WINXP启动时Chkdsk的等待时间
键名:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
操作:修改DWORD值"AutoChkTimeOut",设置键值为"1",使得Chkdsk的等待时间为一秒,在对话框中提供确认,设置错误提示。
删除操作:
假设存在子键HKEY_LOCAL_MACHINE\SOFTWARE\test,删除此子键
键名:HKEY_LOCAL_MACHINE\SOFTWARE\test
操作:删除此子键,在对话框中提供确认,设置错误提示。
大概的思路就是这样了,下面是完整的脚本(分号后面是解释):
RegRead, OutputVar, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows NT\CurrentVersion, BuildLab
MsgBox, 0, 系统版本号, 你的系统版本号是: %OutputVar% ;设置BuildLab数值为变量名OutputVar并在对话框中显示。
MsgBox, 4, 修改确认, 确认修改指定注册表项目? ;询问是否进行操作
IfMsgBox, Yes
RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Control\Session Manager, AutoChkTimeOut, 1 ;;如果Yes按钮被按下则进行指定操作
If ErrorLevel
MsgBox, 0, 错误, 无法进行指定操作 ;出现错误则提示用户
MsgBox, 4, 修改确认, 确认删除指定注册表项目?
IfMsgBox, Yes
RegDelete, HKEY_LOCAL_MACHINE, SOFTWARE\test,
IfMsgBox, No
Return
If ErrorLevel
MsgBox, 0, 错误, 无法进行指定操作
创建键盘或鼠标宏指令 [原]
这个是帮助文档里“Creating a Keyboard Macro or Mouse Macro”部分的内容,哈哈,比较少东西我就拿它下手了
链接不作修改....
********************************************************
所谓宏是指一系列按人的需求进行的的脚本动作。最常使用的宏就是对一个或多个指定窗口发出一系列 模拟键击 和 鼠标点击 命令,这些窗口将会对宏所发出的每一个键击或点击命令作出相应反应,实际效果就如用户真的进行相应操作一样,这样就可以迅速而轻松地实现自动完成各种繁重而又重复的操作了。
当然您可以自己手写宏,不过您会发现有了脚本录制器(AutoScriptWriter)的帮助,写更复杂的宏将变得简单。脚本录制器就是一个宏录制器,AutoHotkey就有附带(开始菜单→所有程序→AutoHotkey→AutoScriptWriter)。它就想一个摄影机一样记录键盘和鼠标动作,还可以获得窗口的 激活状态,然后就可以把这一系列的动作转换为可供以后迅速“回放”的宏(脚本文件)。
要进行“回放”,最方便的一种方法是把指定的宏绑定到一个 热键 或 热键串。例如,下面这个热键将会创建一个空白邮件并进行相关设置:
^!s:: ; 设定Control+Alt+S为热键,按下后将进行下面的操作
IfWinNotExist, Inbox - Microsoft Outlook
return ; 如果Outlook的收件箱窗口未被打开,则不进行任何操作,返回
WinActivate ; 激活上面命令中指定的窗口
Send ^n ; 发送Control+N键击命令创建一个新的空白邮件
Send {Tab 2}Product Recall for ACME Rocket Skates ; 按两次Tab键,输入主题
Send {Tab}Dear Sir or Madam,{Enter 2}We have recently discovered a minor defect ... ; 类似上面
return ; 此行用以表示热键结束
类似上面的热键宏对那些您每天都要重复进行的操作尤其有用。你可以把有用的脚本放到开始菜单或桌面方便使用。
要马上开始创建您自己的宏和热键,请阅读 菜鸟指南 。
热键 (鼠标, 游戏操纵杆和键盘快捷键) [原] 原文有表格,不倒转 -_-!
还是无聊之中~~这个暑假好热啊还是呆在家里混比较好既然没事,我继续搞搞这个所谓的翻译,哈哈,全是靠自己的理解翻译的,现在翻译的速度比之前的快多了,看来这样可以学会很多这些专业词汇呢(包括按自己理解写的)不过我还是挺高兴的,毕竟我自己看还是可以看懂的呢!里面的链接我就不改了,省时
***************************************************************************************
热键,也就是快捷键,可以用来触发某些指定的动作(例如运行一些程序或 宏指令)。下面这个例子中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.
* 通配符:只要包含有指定调节键的按键被按下即触发热键,经常用在 映射 按键或按钮的时候。例如:
*#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 您按着右键同时往上滚动了鼠标滚轮。
中断 命令可以临时关闭除了指定热键以外的所有热键。
在脚本运行的过程中,热键可以通过 Hotkey 命令动态地创建。Hotkey命令还可以修改、关闭或开启脚本中已有的热键。
游戏操纵杆热键目前不支持像^ (Control)和# (Win)这样的调节键前缀。不过,您可以使用 GetKeyState 来模拟它的效果,如下面这个例子:
Joy2::
GetKeyState, ControlState, Control
if ControlState <> D ;在这里D表示按键被按下
return ; 表明如果按钮未被按下则没有动作
MsgBox 您按着Control键同时按下了游戏操纵杆的第二个按钮。
return
这个程序有点类似 多线程, 它允许在前一个热键子程序仍在运行的时候运行新的热键,例如上面有一个热键被触发并显示 对话框(MsgBox),新的热键仍可以运行。
[url=http://yonken.blogcn.com/diary,103103196.shtml]http://yonken.blogcn.com/diary,103103196.shtml[/url]
使用SmartGUI Creator 3.5.1创建GUI [原]
SmartGUI Creator 3.5.1是编写AutoHotkey的用户界面(GUI)时非常有用的一个可视化设计工具,使用它可以很直观地设计界面并生成脚本。下载地址在这里,它支持Windows NT/2000/XP/2003及更高级版本;Windows 9x用户可下载此版本:
随意解压下载的zip文件到任意目录,运行其中的SmartGUI.exe即可启动SmartGUI Creator。运行后可看到一个蓝色的主界面和一个GUI助手(GUI Helper)在一侧,如图1所示。在主界面上点击右键就会显示相关命令,其中Add XXX那一列就是用来创建控件的(如图2所示)。选中后会立即在主界面上显示一个控件,此时控件左上角依附着鼠标,移动控件到合适的位置点击一次则鼠标自动跳到控件右下角,然后移动鼠标调整控件大小并再次点击则控件创建完毕。最后在目标控件上点击右键将显示相关命令,自上而下分别是复制控件、移动、定位、删除、修改标识、水平居中、垂直居中、对齐(左/中/右)等命令。由于默认设置了显示网格并自动对齐网格,因此若想对控件位置进行更加精细的调整,在右键菜单的“Options”中“MicroEditing”即可。
使用SmartGUI Creator 3.5.1创建的GUI可含有以下这些控件:
Button(按钮),Checkbox(复选框),ComboBox(选择框),DateTime(日期),DropdownList(下拉列表),Edit(编辑框),GroupBox(组框),Hotkey(快捷键),
ListBox(列表框),ListView(项目显示),MonthCal(月历),Picture(图片),Progress(进度条),Radio(单选框),Slider(拖动条),
Tab(标签),Text(文本),Updown(上下箭头)。
大家参见AutoHotkey帮助文档结合实际使用很快就可以了解它们的具体意义。在它的右键菜单中还有个比较有趣的功能,就是“GUI Stealer(偷窃者)”(留意图2)选中它后会提示你激活你想要“偷窃”的窗口,按下F12进行偷窃或按Esc退出。成功后会看到主窗口上居然把那窗口的界面(包括菜单、按钮、文本等控件)“复制”过来了!挺有趣的功能哦^_^不过它也不是个“神偷”,对很多的窗口它也是无能为力的哦,可惜可惜~
标签: [url=http://search.blogcn.com/ArticleResult.aspx?SearchType=0&ageIndex=1&txtQuery=AutoHotkey]AutoHotkey[/url],[url=http://search.blogcn.com/ArticleResult.aspx?SearchType=0&
ageIndex=1&txtQuery=GUI]GUI[/url],[url=http://search.blogcn.com/ArticleResult.aspx?SearchType=0&
ageIndex=1&txtQuery=%u6559%u7A0B]教程[/url]
热字串和自动扩展 [原]
这次翻译不太好搞,例如那个Tab,我就考虑了比较久,因为它可以被翻译为跳格键、空位键、制表键等等,用哪个比较适合我还是需要想想,而且在AutoHotkey的帮助文档里tab既可以指Tab键,也可以指Tab符,本来我想干脆不作翻译直接就是Tab了,后来还是翻译为“空位”了,毕竟比较贴切一点,一个Tab代表8个空格(也就是空位啦)。
*******************************************************************************************
提醒一下:热字串要求在Windows NT/2000/XP或更高级版本才有效。
热字串主要用来实现自动扩展,例如当你键入一些单词的缩写时自动扩展成完整词句,不过热字串也同样可以用来执行任何脚本动作,在这一方面它和 [url=file:///E:/AutoHotkey_web/Hotkeys.htm]热键[/url] 类似,但它们由更多的字符组成,因此才被称为热字串。
要定义一个热字串,只需要在两个双冒号之间插入缩写词,其后加上触发结果(替换文字)即可。例如:
::btw::by the way
在上面的例子里,当键入btw这个缩写之后,再键入 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#EndChars]结束符(ending character)[/url]即触发热字串,使其自动扩展为"by the way"。结束符可以是指空格、句号或回车(如果要直接触发热字串而不必键入结束符,可以使用 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#Asterisk]* 选项[/url])
注意:后面的语句不能是中文,否则会变成乱码! 若要使用中文语句,可参考下面的[url=file:///E:/AutoHotkey_web/Hotstrings.htm#rzccn] 方法[/url]:
这个例子中热字串的作用就是自动地把"btw"删除然后替换为"by the way"从而实现所谓的自动扩展。另外,正如上面所说,热键串还可以用来定义其他动作,不过记住要把相关命令置于热键串之下:
::btw::
MsgBox 您键入了"btw"。;键入btw及结束符将显示此对话框,而btw将被删除(请看下面的说明)
return
尽管上面的热字串不属于自动扩展的一类,但用户键入的缩写词仍会被自动删除,这是因为它的默认设置为自动发出退格命令。如有需要可以使用 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#b0]b0 选项[/url] 来取消这一设置。
结束符
在默认状态下,用户必须在键入热字串的缩写词后再键入一个缩写词,使用 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#Asterisk]* 选项[/url] 即可免去这一步。
结束符默认是指这些字符:-()[]{}\':;"/\,.?!`n `t (注意:`n代表回车,`t代表Tab,在`n和 `t之间还有一个空格)。您可以仿照下面的语句来更改这一设置:
#Hotstring EndChars -()[]{}:;\'"/\,.?!`n `t ;右边的所有字符串都被定义为结束符
选项
热字串的默认行为可以有两种方法改变:
使用 [url=file:///E:/AutoHotkey_web/commands/_Hotstring.htm]#Hotstring[/url] 命令,用它结合下面的选项进行的设置会影响到其下脚本中的所有热字串,例如:
#Hotstring c r ; 区分大小写并且“[url=file:///E:/AutoHotkey_web/Hotstrings.htm#raw]发送原文[/url]”;
在热字串的前两个冒号之间插入一个或多个选项,例如:
: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来详细说明:
若键入CEO加结束符则输出结果为CHIEF EXECUTIVE OFFICER(全部字母都大写);
若键入Ceo/CEo/CEO/CeO等则输出结果为Chief Executive officer(也就是说只是第一个字母改为大写而已);
其他格式的输出结果都是和热字串原来定义的一致,也就是chief Executive officer。
Kn: 按键延迟;通常来说几乎所有使用自动退格和自动扩展功能的热字串的按键延迟都是0。设置为零是被推荐的,因为这样既迅速而又可以很好地配合其它进程(由于内部设置了 [url=file:///E:/AutoHotkey_web/commands/Sleep.htm]Sleep 0[/url])。若需要设置延迟,则给变量 n 赋值即可。用 -1 来表示完全没有延迟,如果您的CPU经常性的处于重负荷状态的话,这会使自动扩展的速度加快。
O: 当自动扩展的文字生成的时候省略结束符。这在你需要结束符来触发热字串而又不想让它输出到目标的时候非常有用。例如:通常我们是这样设置热字串的-::ar::aristocrat,当键入“ar“和空格会输出“aristocrat ”(它画蛇填足地在后面添加了空格符);而当使用O选项后也即o:ar::aristocrat ,键入“ar”和空格会输出“aristocrat”,注意它是没有空格符在后面的。使用O0 (字母O后面接一个零)来恢复。
Pn: 设置热字串的 [url=file:///E:/AutoHotkey_web/misc/Threads.htm]优先级[/url] (例如 P1)。此选项对实现自动扩展功能的热字串没有影响。
R: 发送替换文字的原文。也就是说热字串将完全一致地输出原文而不会解释{Enter}或^c这些特殊的字符串,从而避免那些有 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#continuation]延续部分([/url][url=file:///E:/AutoHotkey_web/Scripts.htm#continuation]continuation[/url] [url=file:///E:/AutoHotkey_web/Hotstrings.htm#continuation]section)[/url] 的热字串自动发出回车或Control-C等等命令, 使用 R0 (R后面接一个零)来恢复。
Z [v1.0.30+]: 每触发一次热字串则重设一次热字串识别器。这里的意思是脚本将会在每次热字串触发后消除对前一次键入内容的识别并等待新的热字串。举个例子来说明一下,下面的热字串没有Z选项,所以键入111后热字串将会触发两次而不是一次:
:b0*?:11::
Send xx
return
只要在b0前面插入一个Z,就必须键入1111而不是111来触发两次热字串。 使用 Z0 (Z后面接一个零)来恢复。
大段替换文本
在 v1.0.32以上版本中,通过添加 [url=file:///E:/AutoHotkey_web/Scripts.htm#continuation]延续部分(continuation section)[/url],热字串可以输出大段的替换文本。例如:
::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 [url=file:///E:/AutoHotkey_web/Scripts.htm#continuation]continuation section[/url] for how to change these default behaviors.
)
特别需要注意的是,延续部分不能直接使用中文字符,否则会输出乱码,解决方法请参考[url=file:///E:/AutoHotkey_web/Hotstrings.htm#rzccn]下面[/url]。
延续部分的存在同时使得热字串从默认模式变为 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#raw]原文模式[/url]。留意上面的文字,{Enter}和{Tab}都不会被认为是按键指令,要撤销这一设置的唯一一个方法是在每一个有延续部分的热字串中使用 [url=file:///E:/AutoHotkey_web/Hotstrings.htm#raw]r0[/url] 选项。
注意
热字串输出的语句是不直接支持中文的,不过也可换个思路,借助clipboard命令赋予剪贴板自定义的文字,然后通过发送Ctrl+V的方法来输出中文,例如:
::sbs::
clipboard = 顺便说一下
Send, ^v
Return
目前类似%MyVar%这样的变量参数不支持在替换文本中使用。要使用它们就不能把热字串设为自动扩展而是在缩写词之下使用 [url=file:///E:/AutoHotkey_web/commands/Send.htm]发送(Send)[/url] 命令并用一行Return接上。
内建变量 [url=file:///E:/AutoHotkey_web/Variables.htm#EndChar]A_EndChar[/url] 就是那些用以触发最近的非自动扩展类的热字串的结束符。如果不需要结束符来触发(*选项的作用),那么它的值为空。此变量对于那些使用发送(Send)命令的热字串或那些键入不同结束符而有不同行为的热字串来说比较有用。要发送结束符自身,需要使用"SendRaw %A_EndChar%"[url=file:///E:/AutoHotkey_web/commands/Send.htm](之所以使用 SendRaw(发送原文)[/url] 是因为类似 !{} 这样的字符不能通过普通的发送(Send)命令正确发送。
尽管在热字串定义式中的逗号、百分比符号和单冒号不需要进行[url=file:///E:/AutoHotkey_web/commands/_EscapeChar.htm] 转码 [/url],但是那些有空格和空位(Tab)在其左边的重音符和分号就需要换码。请查看 [url=file:///E:/AutoHotkey_web/commands/_EscapeChar.htm#sequence]换码序列[/url] 获得详细的列表。
尽管 [url=file:///E:/AutoHotkey_web/commands/Send.htm]发送(Send)命令的语法 [/url]被支持用在自动扩展文本部分(除非用了原文(raw)选项),但热字串的缩写词本身不能用它来表示。也就是说,在缩写词里不用{ENTER}来表示回车键或用{SPACE}来表示空格键。取而代之的方法是使用 `n 来表示回车以及用 `t 来表示跳格(Tab)(请查看 [url=file:///E:/AutoHotkey_web/commands/_EscapeChar.htm#sequence]换码序列[/url] 获得详细的列表)。 下面举个例子说明:
:*k{ENTER}::no problem ; 键入"ok"再加一个回车键不能触发热字串,除非键入完整的ok{ENTER}。
:*k`n::no problem ; 键入"ok"再加一个回车键即可触发热字串。
热字串定义了空格和空位(Tab)将被直接认作是字符本身,例如下面的热字串将产生两种不同的结果:
::btw::by the way
::btw:: by the way ; 比上面多了一个空格,那么这个空格也会严格地输出来。
热字串的缩写词不可以超过30个字符。如果长度超出了程序会提醒您的。热字串的替换文本也有AutoHotkey最大行数的限制,但它最多可以达到16,383个字符。不过也可以通过一个巧妙的方法来突破这一限制,那就是在热字串中使用 Send %自定义变量% 。 例如您可以预先设置自定义变量并赋值为超过限制部分的字符,然后在热字串中调用即可。
热字串的先后顺序决定了它们的优先级,换句话来说就是如果有超过一个的热字串符合用户键入的内容,则只有排在最前面的那个热字串才会生效。
运行脚本时用户进行的任何退格行为都将被视为企图核对热字串。但是,如果用户在编辑器中使用了上/下/左/右箭头、PageUp、PageDown、Home和End这些按键时将导致热字串识别重设,也就是说消除对这一次键入内容的识别并等待新的热字串。
即使处于激活状态的窗口忽略用户的键击行为热字串也依然可以输入,也就是说就算替换文本不可见热字串还是会被触发。此外,退格键也还是会撤销最近的键击,尽管您看不到效果。
可以使用 [url=file:///E:/AutoHotkey_web/commands/Gosub.htm][/url][url=file:///E:/AutoHotkey_web/commands/Gosub.htm]Gosub[/url] 或 [url=file:///E:/AutoHotkey_web/commands/Goto.htm]Goto[/url] 来转到指定的热字串标识(Label), 只要在标识名前面加上一对冒号即可。不过,如果在冒号之间没有选项符则必须对双冒号进行转码。例如: Gosub `::btw
尽管热字串不被监控而且在不可见的[url=file:///E:/AutoHotkey_web/commands/Input.htm] 输入(Input)[/url] 命令生效期间将不会被触发,但可见的输入是可以触发它们的。
热字串不会被AutoHotkey脚本发出的键击行为触发。这样避免了发生热字串反复触发导致无限循环的可能。
在某些方面来说 [url=file:///E:/AutoHotkey_web/commands/Input.htm]输入(Input)[/url] 命令比热字串更加灵活。例如,它允许在激活窗口中键击的不可见(例如游戏)。它还支持像Escape键这样的非字符式结束键。
所有包含热字串的脚本都将自动使用[url=file:///E:/AutoHotkey_web/commands/_InstallKeybdHook.htm] 键盘钩子(keyboard hook)[/url]。
热字串和热键的相同反应:
它们都会受到 [url=file:///E:/AutoHotkey_web/commands/Suspend.htm]中断(Suspend)[/url] 命令的影响;
都服从 [url=file:///E:/AutoHotkey_web/commands/_MaxThreads.htm]#MaxThreads[/url] 和 [url=file:///E:/AutoHotkey_web/commands/_MaxThreadsPerHotkey.htm]#MaxThreadsPerHotkey[/url] (除了[url=file:///E:/AutoHotkey_web/commands/_MaxThreadsBuffer.htm]#MaxThreadsBuffer[/url])的设置;
含有热字串的脚本都将自动 [url=file:///E:/AutoHotkey_web/commands/_Persistent.htm]持续(persistent)[/url];
非自动扩展类的热字串运行时将会创建新 [url=file:///E:/AutoHotkey_web/misc/Threads.htm]线程(thread)[/url],此外它们还将更新内建的热键变量,例如 [url=file:///E:/AutoHotkey_web/Variables.htm#ThisHotkey]A_ThisHotkey[/url] 。
热字串助手
Andreas Borutta推荐使用下面的这个脚本,如果您经常使用热字串那么这个脚本应该非常有用。按下Win+H(或者您自己定义的热键),当前选定的文本就会变成热字串。例如,如果您在某个文本编辑软件中选定了"by the way",按下Win+H就会有个界面出来提示您键入缩写词(例如btw),这样就会往脚本里添加新定义的热字串,而且脚本会自动复载从而激活此热字串。此后您就可以键入"btw"和结束符来触发热字串"by the way"了。
#h:: ; Win+H 设置为热键
; 首先要获得当前选定的文本,我们使用 clipboard 而不是"ControlGet Selected"
; 这是因为它在大多数的编辑器(即文字处理软件)中更加有效
; 先保存当前剪贴板的内容以便稍后复原
; 尽管只能对纯文本进行操作,但总比没得做要好吧
AutoTrim Off ; 保留剪贴板中引头和结尾部分的空白字符
ClipboardOld = %ClipboardAll%
Clipboard = ; 这里必须是空值,以清空剪贴板
Send ^c ; 发送Ctrl+C命令,以复制选中的文字
ClipWait 0.5
; 用 `n 替换 CRLF 和/或 LF 以便使用"send-raw"热字串
; The same is done for any other characters that might otherwise
; be a problem in raw mode:
StringReplace, Hotstring, Clipboard, ``, ````, All ; 先完成这一替换以避免干扰到下面的
StringReplace, Hotstring, Hotstring, `r`n, ``r, All ; 在微软的Word中使用`r比使用`n更有效
StringReplace, Hotstring, Hotstring, `n, ``r, All
StringReplace, Hotstring, Hotstring, %A_Tab%, ``t, All
StringReplace, Hotstring, Hotstring, `;, ```;, All
Clipboard = %ClipboardOld% ; 还原此前剪贴板的内容。
; 移动InputBox控件的插入点(光标)到合适位置:
SetTimer, MoveCaret, 10
; 显示InputBox控件,提供默认热字串:
InputBox, Hotstring, 添加热字串, 请在下面显示的文本输入框中键入缩写词。您也可以在这里编辑替换文本。`n`n例如: :R:btw`::by the way,,,,,,,, :R:`::%Hotstring%
if ErrorLevel 0 ; 如果用户按下取消按钮则返回
return
IfInString, Hotstring, :R`:::
{
MsgBox 您没有提交缩写词,热字串添加失败。
return
}
; 否则就添加新的热字串并重新加载此脚本:
FileAppend, `n%Hotstring%, %A_ScriptFullPath% ; 在前面添加`n,以防文件尾部缺少空行
Reload
Sleep 200 ; 如果成功,前面的重新加载将会在延时期间关闭此实例,所以下面这些就不会执行
MsgBox, 4,, 看来刚才添加的热字串格式不正确,您希望打开脚本编辑吗?注意,无效的热字串就在脚本的最下端。
IfMsgBox, Yes, Edit
return
MoveCaret:
IfWinNotActive, 添加热字串
return
; 否则,移动InputBox控件的插入点到用户将要键入缩写词的地方:
Send {Home}{Right 3}
SetTimer, MoveCaret, Off
return
AutoHotkey菜鸟指南 [原]
此简介将会帮助您迅速开始编写您自己的宏和热键。
指南目录
创建脚本
运行程序或打开文档
发送键击或点击动作
激活与操纵窗口
使用对话框(MsgBox)、输入框(InputBox)等控件来获取用户输入的数据
使用变量与剪贴板(clipboard)
不断重复一系列的动作
对文件和文件夹进行操作
其他功能概述
创建脚本
其实所有脚本文件都是纯文本文件,它里面就是一些命令,这些命令由AutoHotkey.exe进行处理。一个脚本可能会有 热键(hotkeys)和 热字串(hotstrings),甚至完全就是由它们组成。但是,如果一个脚本没有定义热键或热字串,那么运行此脚本后即会从头到尾连续地执行它的命令。
要创建一个新的脚本:
打开Windows资源管理器并进入一个文件夹;
在菜单栏上依次选择文件→新建→AutoHotkey Script(其实新建文本文档也行,都一样)
键入文件名,确保它以.ahk结尾。例如: Test.ahk
右键单击次文件并选择“ Edit Script”
在空白的一行输入以下命令:
#z::Run www.google.com
上面命令中的井号[#]代表键盘上的Win键(徽标键),那么 #z 就代表需要同时按下Win键和Z键来激活热键。后面还有两个连在一起的冒号[::],它们表示当前面定义的热键按下时将执行后面的命令,在上面的例子中它将打开默认浏览器并登陆 Google。要试验这个脚本,请继续进行下面的步骤:
保存并关闭该脚本文件;
双击脚本来运息它。在任务栏右侧的系统托盘上会出现新的图标(绿色背景的H);
按着Win键不放同时按下Z键,指定的网页将由默认浏览器打开;
要退出或者编辑该脚本,在那个托盘图标上点击右键就会显示相关命令。
注意:多个脚本是可以同时运行的,每个脚本有各自的图标。
运行程序或打开文档
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, 任务完成(记事本已被关闭)
如果您想学习更多关于运行程序的内容--例如参数的添加、指定工作目录以及搜寻程序的退出代码等--请点击 这里 。
发送键击或点击动作
使用 Send(发送)命令来发送键击动作到激活窗口(指最前面的窗口)。在下面的这个例子里,Win+S 变成键入签名的热键。按下软件前必须确认窗口(例如编辑器或电子邮件草稿窗口)处于激活状态:
#s::
Send, Sincerely,{enter}John Smith
return
在上面的例子中,除了{enter}意外所有的字符都被逐字发送,因为{enter}模拟了回车键。下面的将举例说明一些其它常用的特殊字符:
Send, ^c!{tab}pasted:^v
上面的例子将会发送Control+C(复制),然后是Alt+Tab(切换窗口),最后是发送字串“pasted:”并接上一个Control+V(粘贴)。 请查看 Send(发送)命令的说明来了解特殊字符和按键的详细列表。
鼠标点击: 对某个窗口发送点击动作需要测定点击位置的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(鼠标拖动)命令。
激活与操纵窗口
要激活某个窗口(使它成为最上层的窗口),就要用到 WinActivate(激活窗口)命令。要检测某个窗口是否存在,请使用 IfWinExist(若窗口存在)或者 WinWait(等待窗口出现)命令。 下面举例说明这些命令的使用:
IfWinExist, 无标题 - 记事本
{
WinActivate
}
else
{
Run, Notepad
WinWait, 无标题 - 记事本
WinActivate
}
这个脚本首先搜寻任何以“无标题 - 记事本”(如果是英文则区分大小写)作为标题的窗口,如果此窗口存在则激活它。否则记事本程序将被运行,等到窗口出现后将激活它。 上面的例子同时还利用了最后寻得的窗口(last found window) 这个功能来避免了每次使用WinActivate命令都要指定窗口标题的繁琐。
还有其他常用的窗口命令:
IfWinActive: 检测指定窗口是否激活
WinWaitActive: 等待指定窗口激活(通常会在其后使用 Run(运行)命令)
WinClose: 关闭指定窗口
WinMove: 移动窗口和调整窗口大小
WinMinimize, WinMaximize, WinRestore: 对指定窗口进行最小化、最大化、向下还原
使用对话框(MsgBox)、输入框(InputBox)等控件来获取用户输入的数据
下面这个脚本将显示有两个按钮(“是”和“否”)的对话框:
MsgBox, 4, , 真的要继续吗? ;询问用户是否继续
IfMsgBox, No, return ;若用户按下“否”则返回(在这里相当于退出)
; 否则的话,那当然就是用户选择了“是”
MsgBox, 您选择了“是”
注意:按钮上显示的具体文字由系统决定,例如英文版的系统将显示英文的相关文字,但这并不影响实际使用,因为按钮的名称已被定义,所以无论何时编写脚本都是使用定义中的名字,而不要特意改为“是”“确定”“取消”这样的名字。
使用 InputBox(输入框)命令来提示用户输入字串。使用 FileSelectFile 或 FileSelectFolder 让用户选择文件或文件夹。如果需要更高级的功能,请使用 Gui(用户界面) 命令来创建自定义的数据输入表格和用户界面。
使用变量与剪贴板(clipboard)
变量是用来保存数值的存储区域。一个数值(有时候也可以说是字串)可以是一系列的字符或数字。尽管文字和数字之间没有差别(都是作为字串保存),但在某些地方纯数字类的字串会受到与其它(非纯数字类的)字串不同的对待。例如说这个 表达式(expression): InputString > BookmarkString,如果两个变量都含有数字类的值,那么将比较它们的大小,否则将按字母顺序来比较。
除了 函数(function) 中的局部变量以外,其它所有的变量都是全局变量;也就是说,在整个脚本中它们可以被任何 子程序(subroutine)读取或改变。另外,变量一般不被声明;它们会自动成立。
要指配一个字串到一个变量,请参考下面的例子:
MyVar1 = 123
MyVar2 = my string
要对某个变量和数字/字串进行比较,请参考下面的例子:
if MyVar2 = my string
{
MsgBox MyVar2 含有字串“my string”
}
if MyVar1 >= 100
{
MsgBox MyVar1 含有的数值是 %MyVar1%,比100还大
}
留意一下,上面第二个MyVar1是被附上了百分比符号了的。这样将会在对话框的相应位置显示MyVar1的值。这种方法也可用于复制某变量的值到另外一个变量中:只要在变量A的右方添上变量B的名称并附上百分比符号即可。例如下面这行脚本,变量MyVarConcatenated的值被指配为字串“123 my string”(后面两个变量的值请看上面的例子) :
MyVarConcatenated = %MyVar1% %MyVar2%
要比较某个变量和另外一个变量的大小,请参考下面的例子:
if (ItemCount > ItemLimit + 1)
{
MsgBox ItemCount的值是 %ItemCount%,比%ItemLimit% + 1还大
}
注意一下,第一行中使用了圆括号。圆括号的出现意味着那个if陈述句包含了 表达式(expression)。如果没有括号,该行将被认作“非表达式类if陈述句”,那么就需要为变量ItemLimit附上百分比符号。if陈述句被限制了只能使用单纯的比较运算符(仅针对关系表达),也就是说它们不能使用运算符号和连接词,例如"AND" and "OR"。
数学运算: 要进行数学运算,请使用冒号等号符来把 表达式(expression)的运算结果指配到一个变量中,例如:
NetPrice := Price * (1 - Discount/100)
请查看 表达式(expression)的说明来获得详细的数学运算符的列表。
剪贴板(Clipboard): 剪贴板(Clipboard)这个变量比较特殊,因为它含有当前Windows剪贴板的文本内容。虽然如此,它也是可以作为一个普通的变量来使用的。下面这个例子将会显示当前剪贴板的内容到一个对话框上:
MsgBox %clipboard%
要修改剪贴板的内容,可参考下面这个例子,它将使当前剪贴板的内容替换为后面指定的文字:
clipboard = 这是替换文本的第一行,`r`n这是第二行。`r`n在这里您可以尽情地使用中文了!
在上面的例子中,`r 和 `n (重音符后面接着字母"r"或"n")被用来表示两个特殊字符:回车和换行。这两个字符使得文本转入下一行,就像用户按下了回车键一样。
要附加文本到剪贴板(clipboard)(或任何其它变量),请参考下面的例子:
clipboard = %clipboard% 这里就是附加的文本。
详细说明请查看 剪贴板(clipboard)和 变量(variables) 部分。
不断重复一系列的动作
如果需要不断重复一系列的动作,loop(循环)就是您要的答案。例如,下面这个循环将显示对话框(MsgBox)三次:
Loop 3
{
MsgBox 此对话框将显示三次!
}
也可以在Loop命令后面指定一个变量,如果动作需要重复的次数是由脚本中的其它地方决定的,这样做就非常有用:
Loop %RunCount%
{
Run C:\Check Server Status.exe
Sleep 60000 ; 等待60秒
}
在上面的例子中,脚本将进行指定的循环次数,除非变量RunCount的值为0,这个循环才会完全跳过(结束)。
另外也可以设置循环在一个或多个条件发生改变的时候中止,例如下面这个例子:
Loop
{
PixelGetColor, Color, 11, 22 ;获取屏幕指定位置的象素颜色
if Color = 0xEEAA99 ; 如果上面获得的值符合此行指定的值
break ; 中止此次循环
; 否则,点击下面指定的按钮,直到象素改变颜色(为指定的值)
ControlClick, OK, 目标窗口的标题
}
上面这个例子的Loop(循环)就其作用来说其实和“只要...就...”是一样的。“只要...就...”这个表达语句用在循环中就是指只要某个/某些条件仍然成立就继续重复指定动作。因而上面的循环例子意思就是说只要象素颜色不符就继续点击指定按钮。当符合条件的颜色出现了,由于 break(中止)命令的作用,此循环将停止,使得脚本跳到下一行(大括号后面的部分)并执行其后的命令。
上面的例子是常用的一种循环。对于一些特殊需要,可使用下面这些循环命令:
File-reading/writing loop(文件循环读取/写入): 检索文本文件的内容,每次一段。也可以用来转换某个文件到不同的格式或修改为一段接一段的排版格式。另外还可以用来检索符合某个条件的文段。
Files and folders loop(文件与文件夹循环): 对某个文件夹中的文件和文件夹进行检索,每次一个文件/文件夹。这样就可以对符合条件的文件或文件夹进行操作。
Parsing loop(分解循环): 对某个字串的子字串进行检索,每次一个。这使得类似“Red,Green,Blue”这样的字串可以方便地分为三个部分。
Registry loop: 对指定注册表的子键进行检索,每次一个项目。
对文件和文件夹进行操作
要在某个文件的结尾处添加文字(或新建一个文件),请参考下面的例子。注意它使用了`n(换行符)来转到文本的下一行:
FileAppend, 这是附加的文字.`n, C:\My Documents\My Text File.txt
要覆盖某个已存在的文件,请在FileAppend(文件附加)命令之前先使用FileDelete(文件删除)命令。例如:FileDelete, C:\My Documents\My Text File.txt
这里还有一些其它常用的文件和文件夹命令:
FileRead(文件读取): 获得整个文件的内容并指配到某个变量中
File-reading Loop(文件循环读取): 按序获得指定文件的每一行的内容
IfExist(如果存在): 检查某个文件或文件夹是否存在
FileSelectFile(选择文件) 和 FileSelectFolder(选择文件夹): 显示一个通用文件/文件夹打开对话框给用户选择文件或文件夹
FileDelete(文件删除)/FileRecycle(文件回收): 对一个或多个文件进行删除/放入回收站的操作。请使用FileRemoveDir(目录删除)命令来删除整个文件夹。
FileCopy(文件复制)/FileMove(文件移动): 复制/移动一个或多个文件。请使用FileCopyDir(目录复制)/FileMoveDir(目录移动)命令来复制/移动整个文件夹。
File Loop(文件循环): 对某个文件夹中的文件和文件夹进行检索,每次一个文件/文件夹
FileSetAttrib(文件属性)和 FileSetTime(文件时间): 改变一个或多个文件的属性或其修改时间属性
IniRead(Ini读取),IniWrite(Ini写入),和 IniDelete(Ini删除): 对标准格式的INI文件进行创建、存取和删除等操作
RegRead(注册表读取),RegWrite(注册表写入),RegDelete(注册表删除), 和 Registry Loop(注册表循环): 对Windows的注册表进行相关操作
其他功能概述
(此部分仍在开发之中^_^;请查看 命令列表 获得所有命令的概述)
AutoHotkey指南 - 运行程序或打开文档(续) [原]
要令一个程序或文档在一打开的时候就最大化、最小化或隐藏,可用 hotkey(热键)子程序来实现。下面的例子中指配Win+Z作为热键来运行记事本的两个实例,第一个窗口将最大化,而第二个将最小化:
#z::
Run, Notepad, , max
Run, Notepad, , min
return
要指定某个文件夹作为程序的工作目录,可参考下面这个例子,热键Win+C触发后将打开命令提示符界面并进入指定的目录:
#c::Run, %comspec% /k, C:\My Documents
在上面的例子中, %comspec% 属于环境变量(environment variable),它用来指向C:\Windows\system32\cmd.exe(假设系统盘位于C盘)。实际上,上面的例子中的%comspec%改为cmd或cmd.exe也是等效的,但您要知道的是,cmd.exe对应于Windows NT以上操作系统,而command.exe则适用于Windows 9x操作系统,若要确保脚本在任何操作系统都能运行,就必须引入环境变量来提供支持。下面补充对上面例子中使用到的开关参数 /k 的说明:在调用某个命令后,确保窗口始终保持打开。这就是 /k 参数的用处。如果我们想要确保命令窗口会在该命令调用完成后被自动关闭,应该将 /k (keep) 修改为 /c (close)。如果没有此参数,窗口可能只会一闪而过就消失。
如果需要添加参数,只需直接在程序或文档的名称后面加入即可:
Run, %comspec% /k dir, C:\My Documents
Run, Notepad.exe "C:\My Documents\通信录.txt"
Run, %ProgramFiles%\AutoHotkey\AutoHotkey.exe "C:\脚本\测试脚本.ahk" 参数1 "含 空格符 的参数2" 参数3
在上面的第二行和第三行脚本中,含有空格符的参数被附上了双引号,这属于一种规则。与此相反的是,工作目录不能附上双引号,即时它含有空格符,如第一行脚本所示。
某些命令被作为系统行为而被支持。下面的第一行脚本将为指定文件打开其在资源管理器的属性对话框,第二行脚本将对指定文档进行打印。
Run, properties "C:\通信录.txt"
Run, print "C:\通信录.txt"
RunWait(运行等待)把内建的 错误返回码(ErrorLevel) 这个变量放置到它所运行的程序的退出码中。例如,下面的这个例子将会显示一个内容为错误返回码的值(非零)的对话框,因为命令解释程序将会指示错误的发生:
RunWait, %comspec% /c dir c:\并不存在的文件.txt, , hide
MsgBox, 返回的值是 \'n\'r %ErrorLevel%
AutoHotkey中鼠标与键盘的映射 [原]
要映射键盘或鼠标的按键,有两个方法:一个相对简单,另一个比较复杂。简单的方法是使用 Send(发送)命令来模拟输入,并代替您需要进行映射的那个按键。在下面的这些例子中,左边的四个字母按键将从QWERTY键盘布局转换为Dvorak键盘布局。这不是您必须做的事--因为操作系统本身就提供了更方便而且更适合改变键盘布局的功能--在这里仅作为对此方法的演示而已:
#UseHook ; 要成功映射按键,此行必需使用,举例来说就是A变成B,B变成A
SetStoreCapslockMode Off ; 此行属可选部分。 允许Capslock(大小写切换键)的状态为ON来发送大写的映射按键
s::Send o ;如果上面一行的SetStoreCapslockMode Off未被使用,那么无论Capslock键的状态如何,输出的结果都是小写的o,以下同理
d::Send e
f::Send u
g::Send i
+s::Send O ; 加号代表shift键
+d::Send E
+f::Send U
+g::Send I
Rwin::return ; 此行是个范例,用以说明如何屏蔽一个按键(例如这里的右Win键)
(请查看 按键列表 获得受支持的按键和鼠标/游戏操纵杆按的完整列表)
(另外也请查看 关于热键(Hotkeys)的说明)
前面提到的另外一个所谓比较复杂的方法其实更加完善。当需要在游戏中按着某个按键不放的时候就要用到这种方法。同时这种方法比较适合用于鼠标按键和像SHIFT键这样的调节键,因为它们都是在被按下的时候会有特殊反应的(例如鼠标的拖动)。下面将举例说明如何使某调节键(Right-ALT)变成另外的调节键(CONTROL):
*RAlt::Send {Control down} ; 星号前缀使得这个映射更加完善(在XP/2k/NT或更高级版本)
*RAlt up::Send {Control up}
下面这个例子演示如何使重音键(通常位于英式键盘的左上角)变成 鼠标左键。当然,鼠标左键的功能未被改变。
*` up::MouseClick, left, , , 1, 0, U ; 不能使用Send {LButton up},因为那样会妨碍shift+左键的功能
*`::
GetKeyState, LButtonState, LButton ;获得左键的按下/松开状态
if LButtonState = U ; 这一检查语句有效地防止了键盘按键自动重复的功能变成鼠标按键的自动重复(否则按下重音键[`]后将不断发出点击命令)
MouseClick, left, , , 1, 0, D ; 按住鼠标左键不放(松开时会转到前面指定的动作)
return
对游戏操纵杆按钮的映射需要使用稍微不同的方法。补充说明一下,所有在Windows 95/98/Me平台进行的映射都需要使用这种方法。下面举例说明如何使游戏操纵杆的按钮2变成键盘上的左箭头键:
Joy2::
Send {Left down} ; 按下左箭头键
KeyWait Joy2 ; 等待用户松开按钮2
Send {Left up} ; 上面的条件成立后(即按钮2松开),左箭头键同时也被松开
return
最后, 提醒您一下,使用 游戏操纵杆映射到鼠标 中的脚本可以用来映射游戏操纵杆的按钮和控制轴到鼠标按键上。
您也可以模仿这些例子自己进行尝试,只需把它们复制到新建的脚本文件中--例如"映射.ahk"--然后运行脚本即可。
AutoHotkey的高级热键功能 [原]
Windows NT/2000/XP或更高级版本的用户可享有以下这些额外功能,有些功能是只有AutoHotkey才能实现的,甚至连最强大的商业性热键软件都无法做到。
最容易接触到的按键 往往是最少用到的。让我们好好利用这些按键吧!例如,如果您很少使用右ALT键,那么您就可以仿照下面的例子让它做您平时最常干的事情:
RAlt::
MsgBox 您按下了右边的ALT键!
return
当然,您还可以既实现上面的功能而又不会失去右ALT键原本的功能,只要指配右ALT键为其它热键(至少一个)的“前缀”即可。例如下面这个例子,右ALT键变成了前缀之后,正如平常一样,它可以修改所有其它的按键。但是,如果您在没有使用右ALT键修改其它按键的情况下按下它然后松开,您就会发现它的热键动作(上面的例子)会马上生效(如果没有指定它的热键动作,那么就是它原本的功能):
RAlt & j::AltTab
不要局限于仅仅使用 CTRL, ALT, SHIFT, 和 WIN 作为调节键;您可以组合任意两个键盘或鼠标的按键变成自定义的热键。例如:同时按下小键盘的0键和1键来执行热键(句法:Numpad0 & Numpad1::);同时按下CapsLock键和其它键,或者点击鼠标按键来执行热键(句法:CapsLock & RButton::),因为要实现这个功能,所以当要用CapsLock键来执行热键而按下它的时候,它的开关状态将不会被改变。
转换鼠标滚轮 (或您喜欢的其它按键)的功能,使得它完全替代Alt-Tab。按下鼠标的滚轮按键来显示或隐藏切换界面,滚动它来进行切换操作。同时只要Alt-Tab的切换界面没出现,鼠标滚轮的原本功能的功能依然正常。句法:
MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab
令键盘按键变成鼠标按键, 或者当按着某个键盘或鼠标的按键时不断重复指定的动作。请查看 映射部分 的例子。
使您的热键更加灵活: 让您最常用的热键能够针对不同的工作窗口有不同的行为。例如:
RControl:: ; 这是右边的Control键
IfWinActive, 无标题 - 记事本
{
WinMenuSelectItem, , , 文件, 保存 ; 保存当前文件
}
else IfWinActive, 计算器
{
Send, ^c!{tab}^v ; 复制计算器显示的值到之前曾激活的窗口(记事本)
}
return
热字串:定义缩写词并使用它们进行扩展。 而这并不需要您进行特别的训练或要求编写脚本的丰富经验。例如,运行含有下列几行语句的脚本,那么无论何时您键入ceo、cfo和btw这些缩写词的时候它们都将自动扩展:
::ceo::Chief Executive Officer
::cfo::Chief Financial Officer
::btw::by the way
(更多详细说明请点击此处)
针对游戏的有趣功能:
减少手指的损伤:您可使用几乎 任何按键 作为热键,包括单个字母按键、方向键、小键盘按键,甚至是调节键(CTRL/ALT/WIN/SHIFT)。
创建鼠标热键,包括鼠标滚轮键/中键(MButton)以及滚动鼠标滚轮(WheelUp和WheelDown)。您还可以把键盘按键和鼠标按键组合起来成为一个热键。例如 control+右键,表达式为 ^RButton::
创建“传递”热键。举个例子,在游戏中按下鼠标左键可以用来同时触发热键和鼠标点击本身(也就是说点击鼠标可以触发热键,但它原本的功能也不会失效或被屏蔽),语法:~LButton::
利用 PixelSearch(象素搜寻) 和 PixelGetColor(象素色彩)命令来实现游戏动作的自动化。
设置 键盘钩子(keyboard hook)的开关选项并应用于热键,这使得热键的响应速度在CPU加载了游戏的时候比使用其它方法设置的热键更好。某些游戏可能会有规定哪些按键才可以被“映射”到游戏动作中的限制,而钩子就可以突破这样的限制。
请查看 热键(Hotkeys)部分获得更详细的说明。
AutoHotkey中键盘和鼠标/游戏操纵杆的按键列表 [原]
鼠标(Windows NT/2000/XP或更高级版本)
LButton - 鼠标左键
RButton - 鼠标右键
MButton - 鼠标中键或滚轮
WheelDown - 鼠标滚轮向下滚动(向着身体的方向)
WheelUp - 鼠标滚轮向上滚动
以下定义仅支持Windows 2000/XP及更高级版本:
XButton1 - 只有某些鼠标才会有这个按键
XButton2 - 只有某些鼠标才会有这个按键
游戏操纵杆
从 Joy1 到 Joy32: 都是指游戏操纵杆的按键。如果需要检测操纵杆的按键号码,请用此检测脚本[/url]。 注意,热键前缀符号[/url] 如 ^ (control) 和 + (shift) 都不被支持(可使用GetKeyState(按键状态)[/url] 代替)。此外还需注意,按下操纵杆的按钮将总是会“传递”到已激活窗口,如果该窗口的功能是检测操纵杆按钮是否被按下的话。
以下这些游戏操纵杆的按键名/按钮名不能用于热键,但它们可用于 GetKeyState(按键状态)[/url]:
JoyX, JoyY, 和 JoyZ: 操纵杆的 X (水平), Y (垂直), 和 Z (高度/深度) 轴。
JoyR: 方向舵或操纵杆的第四个轴
JoyU 和 JoyV: 第五和第六个轴
JoyPOV: point-of-view(控制视野的帽式开关)键
JoyName: 游戏操纵杆的名字或其驱动名
JoyButtons: 操纵杆支持的按键总数(不太精确)
JoyAxes: 操纵杆支持的轴总数
JoyInfo: 给出一个由零或下面这些字母组成的字串,用以显示该操纵杆具有的功能:Z (表明该操纵杆具有 Z 轴), R (具有 R 轴), U (具有 U 轴), V (具有 V 轴), P (具有 POV 控制功能), D (POV 开关装置是不连续的/不同的), C (POV 开关是连续的/精细的). 字串示例: ZRUVPD
多个操纵杆: 如果有不止一个操纵杆而您又希望副操纵杆(第二个),只要在按键名前面加上它的编号接口。例如,2joy1 表示第二个操纵杆的第一个按钮。
注意:如果您在编写用以识别操纵杆的脚本上有麻烦,据说需要指定除了 1 以外的操纵杆编号来解决,即使您只有一个操纵杆。目前还不太清楚究竟这是怎么一回事或者这是否正常现象,但试一试在这个操纵杆检测脚本[/url] 中指定它的编号或许对您的系统有用。
操纵杆当作鼠标来用:此脚本[/url] 可以把操纵杆“变成”鼠标。
键盘
注意:单个字母键和数字键的名字就是它上面的符号,因此下面将不列出来,例如 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键),您可能就要通过 ! 这样的格式来令它变成热键前缀,详细说明请看这里[/url]。此外,, "LControl & RAlt::" 将使得AltGr键本身变成热键。
PrintScreen
CtrlBreak
Pause
Break
Help - 大多数键盘都不存在此键。注意它和 F1键是不同的。
Sleep - 休眠键。注意,对有些键盘可能无效。
以下这些按键仅在那些有额外按键的多媒体键盘或网络键盘上有:
Browser_Back
Browser_Forward
Browser_Refresh
Browser_Stop
Browser_Search
Browser_Favorites
Browser_Home
Volume_Mute
Volume_Down
Volume_Up
Media_Next
Media_Prev
Media_Stop
Media_Play_Pause
Launch_Mail
Launch_Media
Launch_App1
Launch_App2
特殊按键
如果您的键盘上有按键在上面未被列出,您仍然可以通过下面这些步骤使它变成热键(要求在Windows XP/2000/NT或更高级版本):
确保至少一个装有[url=file:///E:/AutoHotkey_web/commands/_InstallKeybdHook.htm] 键盘钩子(keyboard hook)[/url]的脚本正在运行
双击该脚本的托盘图标,打开它的主窗口
此时请按下您键盘上的那个“神秘按键”
依次选择菜单项目 "View->Key history"
查看页面的最底部。按键历史列表的底部附近是按键被按下和松开的事件记录。注意:某些按键不会产生事件,因而也不会在列表里看到它们。如果该神秘按键的情况也是如此,您就不能让这个特殊按键作为热键,这是因为您的键盘驱动或硬件在底层管理该按键,使AutoHotkey不能使用它。如果这样的话,一个可选方案是尝试重新配置或删除任何键盘附带的软件,或者更改键盘驱动到更加标准的版本,例如系统内建的驱动。
如果该键被检测出来,请留意列表第二列的3位数的数值(假设是159)。
仿照下面这个例子定义该按键为热键:
SC159:: ; 把159替换为该按键的值即可
MsgBox, %A_ThisHotKey% 被按下
return
作为上面说明的可选或附加部分:如果要映射其它按键变成神秘按键,请仿照这个例子:#c::Send {vkFFsc159} ; 把159替换为该按键的值即可。把FF替换为该按键的虚拟按键即可(可在"View->Key history"列表第一列中找到)。
AutoHotkey 命令列表 [原]
http://yonken.blogcn.com/diary,103102987.shtml
建议看原文,不会转表格
AutoHotkey 命令列表 -- 点击命令的名称查看详细说明。以较大字体显示的命令是最常用的命令。(由于我是从翻译文档中直接复制过来,因此链接无效!)
命令 相关描述
{ ... } 表示一个陈诉块。陈诉块通常用于 函数(functions), (否则)Else, (循环)Loop, 以及IF-命令
AutoTrim 决定表达式 SetEnv and "var = value" 是否删除字串开头和结尾处的空格和空位。
BlockInput 屏蔽或开启用户通过键盘、鼠标以及其它输入设备与电脑交互的功能。
Break 退出(终止)某个循环(loop)。仅在 循环(loop)中有效。
ClipWait 等待,直到 剪贴板(clipboard)中含有数据为止。
Continue 跳过当前 循环(loop)反复的余下部分并开始新的循环。仅在 循环(loop)中有效。
Control 对某个控件进行各种修改。
ControlClick 向某个控件发送鼠标按键或鼠标滚轮的相关事件。
ControlFocus 设置某窗口上已有控件的输入焦点。
ControlGet 检索指定控件的各种信息。
ControlGetFocus 检索目标窗口中哪个控件具有输入焦点。
ControlGetPos 获取指定控件的位置和尺寸等信息。
ControlGetText 获取指定控件上的文字。
ControlMove 移动指定控件或重新设置其尺寸。
ControlSend / ControlSendRaw 向指定窗口或控件发送模拟的键击动作。
ControlSetText 修改指定控件上的文字。
CoordMode 设置各种命令的坐标关联模式,例如关联激活窗口或整个屏幕。
DetectHiddenText 用以决定窗口中的隐藏文本能否被脚本“认出”,通常用于区分/探寻含有不可见文本的窗口。此命令作用于 IfWinExist和WinActivate等命令
DetectHiddenWindows 用以决定隐藏窗口能否被脚本“认出”。
DllCall() 调用DLL文件的函数,例如标准的 Windows API函数。
Drive 弹出/关闭 CD或DVD 光驱,或者设置驱动器的卷标。
DriveGet 检索计算机驱动器的各种相关信息。
DriveSpaceFree 获取驱动器可用空间大小,以兆(M)为单位。
Edit 使用关联的编辑器打开当前脚本进行编辑。
Else 如果IF-命令部分为FALSE则执行Else块的命令。 当存在多个命令时,请用大括号括住它们,变成 陈述块(block) 的形式。
EnvAdd 使 变量(variable)增加指定的值(也可以用来增加或减少 日期-时间(date-time)变量中的值)。等价语法: var += 值
EnvDiv 使 变量(variable)除以指定的值。等价语法: var /= 值
EnvMult 使 变量(variable)乘以指定的值。等价语法: var *= 值
EnvSet 向 环境变量(environment variable)写入指定的值。
EnvSub 使 变量(variable)减去指定的值(也可以用来用来比较 日期-时间(date-time)变量中的值)。等价语法:var -= 值
EnvUpdate 通知操作系统及所有运行中的程序 环境变量(environment variable) 已经改变。
Exit 退出 当前线程 或整个脚本(如果不是 持久(persistent) 运行的非热键类脚本的话)。
ExitApp 无条件地终止当前脚本。
FileAppend 向文件附加文字(如不存在该文件则首先创建该文件)。
FileCopy 复制一个或多个文件。
FileCopyDir 连同子文件夹和文件在内复制整个文件夹(和 xcopy类似)
FileCreateDir 新建一个文件夹。
FileCreateShortcut 新建一个快捷方式(.lnk文件)。
FileDelete 删除一个或多个文件。
FileInstall 装入指定文件到 已编译的程序 中。
FileGetAttrib 获取指定文件或文件夹的属性,如只读、隐藏等等。
FileGetShortcut 检索指定快捷方式(.lnk文件)的相关信息,如目标文件等。
FileGetSize 获取文件的大小信息。
FileGetTime 获取文件或文件夹的修改日期。
FileGetVersion 获取文件的版本信息。
FileMove 移动或重命名一个或多个文件。
FileMoveDir 连同子文件夹和文件在内移动整个文件夹。也可以用来重命名文件夹。
FileRead 获得整个文件的内容并指配到某个 变量(variable)中。
FileReadLine 读取文件中指定的一行的内容并保存文本到 变量(variable)中。
FileRecycle 对文件或目录进行删除/放入回收站的操作。
FileRecycleEmpty 清空回收站。
FileRemoveDir 删除指定文件夹。
FileSelectFile 显示一个通用文件打开对话框给用户选择文件。
FileSelectFolder 显示一个通用文件夹打开对话框给用户选择文件夹。
FileSetAttrib 修改一个或多个文件/文件夹的属性。支持使用通配符。
FileSetTime 更新一个或多个文件/文件夹的修改日期。支持使用通配符。
FormatTime 转换 YYYYMMDDHH24MISS 格式的时间戳(timestamp)变为指定的日期/时间格式。
GetKeyState 检查键盘或鼠标/游戏操纵杆的某个按键是否被按下或松开。也可用来获取操纵杆的情况。
Gosub 跳到指定标识并继续执行命令,直至遇到 返回(Return)命令。
Goto 跳到指定标识并继续执行命令。
GroupActivate 激活在 GroupAdd(窗口组添加) 中已定义的窗口组的下一个窗口。.
GroupAdd 添加一个窗口到指定窗口组,若该窗口组不存在则创建它。
GroupClose 关闭由 GroupActivate(窗口组激活) 或 GroupDeactivate(非窗口组激活)命令激活的窗口。其后将激活该组的下一个窗口。也可用于一次关闭窗口组中的所有窗口。
GroupDeactivate 类似 GroupActivate(窗口组激活),但它是用来激活不属于窗口组的下一个窗口的。
GUI 创建并管理窗口与控件。这些窗口可用来作为数据登记表或自定义用户界面。
GuiControl 对GUI窗口中的指定控件进行各种修改。
GuiControlGet 检索GUI窗口中的指定控件的各种信息。
HideAutoItWin, On|Off [已废用 -- 使用这些命令代替:Menu, tray, NoIcon|Icon]
Hotkey 在脚本运行的时候创建、修改、启用或屏蔽指定热键。
if 当某个 变量(variable)的和一个值的比较关系为TRUE的时候执行指定命令。当存在多个命令时,请用大括号括住它们,变成 陈述块(block) 的形式。
if (expression) 当某个 表达式(expression)为TRUE时执行指定命令。
If var [not] between 检查某个 变量(variable)的值是否在数字上或字母上居于两个值之间(包括这两个值)。
If var [not] in/contains MatchList 检查某个 变量(variable)的值是否不匹配列表中的项目。
If var is [not] type
检查某个 变量(variable)的值是否纯数字或大写字母等等。
IfEqual/IfNotEqual
检查某个 变量(variable)的值是否和指定的值相等。等价语法:if var = 值 | if var <> 值
IfExist / FileExist()
检查指定的文件或文件夹是否存在。
IfGreater/IfGreaterOrEqual
检查某个 变量(variable)的值是否大于指定的值。等价语法: if var > 值 | if var >= 值
IfInString / InStr()
检查某个 变量(variable)是否含有指定的字串。
IfLess/IfLessOrEqual
检查某个 变量(variable)的值是否小于指定的值。等价语法: if var < 值 | if var <= 值
IfMsgBox
检查最近的 对话框(MsgBox)中哪个按钮被用户按下。
IfWinActive / IfWinNotActive
检查指定的窗口是否存在并且处于激活状态(最顶层窗口)。
IfWinExist / IfWinNotExist
检查指定窗口是否存在。
ImageSearch 搜寻屏幕某区域的图像。
IniDelete 删除标准格式的INI文件中指定的节。
IniRead 读取标准格式的INI文件中指定的节。
IniWrite 写入数据到标准格式的INI文件中指定的节。
Input 等待用户输入字串(不支持Windows 9x)。
InputBox 显示一个输入框提示用户输入字串。
KeyHistory 显示脚本信息&最近的键击和点击历史。
KeyWait 等待某个键或鼠标/游戏操纵杆按键被松开或按下。
LeftClick [已废用 -- 请使用 MouseClick(鼠标点击)命令代替]
LeftClickDrag [已废用 -- 请使用 MouseClickDrag(鼠标拖动)命令代替]
ListHotkeys 显示当前脚本正在使用的热键和它们的子程序是否正在运行,以及它们是否使用了keyboard(键盘钩子) 或 mouse(鼠标钩子)。
ListLines 显示脚本最近执行的命令行。
ListVars 显示脚本的 变量(variables):它们的名字&当前的内容。
#ClipboardTimeout [v1.0.31+]
更改脚本尝试打开剪贴板的超时时间。
#ClipboardTimeout 毫秒
参数
毫秒
以毫秒为单位的时间间隔。指定其值为 -1 则代表无限期,指定其值为 0 则代表仅尝试一次。未使用此命令的脚本默认值是 1000 毫秒。
注意
一些应用程序需要长时间保持对剪贴板的访问,可能是为了进行大量数据的读写。因此为了避免脚本过早放弃任务并显示错误信息就需要借此命令增加脚本等待的时间。
此命令将应用于所有关于 clipboard(剪贴板) 的操作。例如这样:
Var = %Clipboard%
Clipboard = 更新剪贴板的内容
只要脚本处于等候剪贴板可用的期间,任何新的 线程(thread)都不能 运行,同时 定时器(timer)中设定的程序也不会运行。但是,如果用户按下了 热键(hotkey) 、选择了某个自定义菜单项 或做了某种 GUI 动作 (例如按下按钮),其事件将会缓冲到稍后才发生;也就是说其子程序将要推迟到剪贴板最终可用时才执行。
相关命令
Clipboard, Thread
示例
#ClipboardTimeout 2000
#CommentFlag [原]
#CommentFlag
把脚本的注释符号改为其他字串。
#CommentFlag 新字串
参数
新字串
用来表示新的注释标记得一个或多个字符。最多可指定15个字符。
注意
默认的注释标记是英文分号(;)。
注释符号用来声明接在其后的文字属于说明或描述,因此在脚本运行时将被忽略(脚本运行时根本就不会加载注释部分)。
注释标记前必须有至少一个空格或空位,否则将不被认作是注释,例如:
MsgBox, Test1 ; 这是注释
MsgBox, Test2; 注释符前没有空格,因此这不是注释并且将显示在对话框中。
相关命令
[url=file:///E:/AutoHotkey_web/commands/_EscapeChar.htm]#EscapeChar[/url]
示例 #CommentFlag // ; 变成C++ 风格的注释。
AutoHotkey界面语言切换与检测升级的简单实现 [原]
这是实现程序界面语言切换的一个非常简单的方法,所有界面、菜单、对话框的文字都是用变量调用。程序启动时自动检测是否有更高级版本并提示用户(还可以再加入询问用户是否下载该升级,若获许可则下载并自动安装/替换升级版本等功能)。检测升级的方法是在服务器上放置某个含有升级信息的文件(比如INI文件,所谓升级信息指的是日期、版本等可供比较的字串),要检测时先下载该文件其后读取文件内容并比较版本等信息,若发现比当前程序高级则定义为升级可用,否则没有升级。在编写这个脚本时发现一个问题,使用一次URLDownloadToFile这个命令后脚本将自动使用IE缓存,因此再次检测升级时如果升级有效将不能成功检测到(脚本仍然认为升级信息和前一次的一样)。为了保证检测升级是实时只好把检测动作改为Reload,我自己是不太满意这个做法,但目前还没有更好的方案
。
下面是个简单的模板,适当修改一下即可
;##########################
#SingleInstance ignore
curver = 1.0 ; 声明当前版本
IfNotExist, set.ini
IniWrite, CN, set.ini, MenuLang, Lang
else
IniRead, lang, set.ini, MenuLang, Lang
If lang = EN
{
About = &About
Language = &Language
Update = &Update
Exit = E&xit
Error = Unexpectable error occurred`nPlease contact me by E-mail: [url=mailto:yonken@163.com]yonken@163.com[/url]
TipName = My Application
UpTipTitle1 = Update Available!
UpTipTitle2 = Update not necessary!
UpTipContent1 = Update Available!`nThe latest version is
UpTipContent2 = You already have the latest version!`nCurrent version is
AboutTitle = About My Application
AboutContent = Application v1.0`nAll Rights Reserved (C) 2005 by Yonken`nE-mail: [url=mailto:yonken@163.com]yonken@163.com[/url]
}
Else
{
About = 关于(&A)
Language = 语言(&L)
Update = 升级(&U)
Exit = 退出(&X)
Error = 出现意外错误`n请与我联系 E-mail: [url=mailto:yonken@163.com]yonken@163.com[/url]
TipName = 某某软件
UpTipTitle1 = 赶快升级
UpTipTitle2 = 尚无升级
UpTipContent1 = 检测到程序已经有更新了!`n最新的版本是
UpTipContent2 = 已经是最新版本了!`n当前版本是
AboutTitle = 关于 某某软件
AboutContent = 某某软件 1.0`n版权所有 (C) 2005 by 非常郁闷的流星`nE-mail: [url=mailto:yonken@163.com]yonken@163.com[/url]
}
Gosub, CheckUPD
Menu, Tray, NoStandard
Menu, LangSet, add, 中文(&C)
Menu, LangSet, add, &English
Menu, tray, add, %Language%, angSet
Menu, tray, add, %About%
Menu, tray, add, %Update%
Menu, tray, add, %Exit%
Menu, tray, Tip, %TipName%
Return
中文(&C):
IniWrite, CN, set.ini, MenuLang, Lang
Reload
Return
&English:
IniWrite, EN, set.ini, MenuLang, Lang
Reload
Return
&About:
关于(&A):
MsgBox, 0, %AboutTitle%, %AboutContent%
Return
&Update:
升级(&U):
Reload
Return
CheckUPD:
URLDownloadToFile, http://127.0.0.1/update/version.dat, %Temp%\version.dat
IniRead, newver, %Temp%\version.dat, Version, ModelVer
If newver = ERROR
MsgBox, 0, %TipName%, %error%
Else If newver > %curver%
TrayTip, %UpTipTitle1%, %UpTipContent1% %newver%, 10, 1
Else
TrayTip, %UpTipTitle2%, %UpTipContent2% %curver%, 10, 1
Return
#x::
E&xit:
退出(&X):
IfExist, %Temp%\version.dat
FileDelete, %Temp%\version.dat
ExitApp
;##########################
简单实现AutoHotkey的升级检测 [原]
运行时自动检测
脚本代码如下:
;########################################
; AutoHotkey Updater
;
; AutoHotkey Version: 1.0.38.02
; Language: Chinese
; Platform: WinXP SP2
; Author: Yonken <yonken@163.com>
;
; Script Function:
; Check Update of AutoHotkey.
;
#SingleInstance ignore
Menu, Tray, NoStandard
Menu, tray, add, 关于(&A)
Menu, tray, add, 版本信息(&I)
Menu, tray, add, 检查更新(&U)
Menu, tray, add, 退出程序(&X)
Menu, Tray, Default, 版本信息(&I)
Menu, tray, Tip, AutoHotkey 升级伴侣
RegRead, dir, HKEY_LOCAL_MACHINE, SOFTWARE\AutoHotkey, InstallDir
RegRead, curver, HKEY_LOCAL_MACHINE, SOFTWARE\AutoHotkey, Version
FileGetVersion, filecurver, %dir%\AutoHotkey.exe
FileGetTime, filecurdate, %dir%\AutoHotkey.exe
If dir =
dir = 未知
If curver =
curver = 未知
If filecurver =
filecurver = 未知
If ErrorLevel
filecurdate = 未知
;################# 重要部分 #################
UrlDownloadToFile, http://www.autohotkey.com/download/CurrentVersion.txt, %TMP%\ver.txt
FileReadLine, newver, %TMP%\ver.txt, 1
FileReadLine, newdate, %TMP%\ver.txt, 2
FileReadLine, newsize, %TMP%\ver.txt, 3
FormatTime, filecurdate, %filecurdate%, yyyy年MMMMd日 HH:mm:ss
FormatTime, newdate, %newdate%, yyyy年MMMMd日 HH:mm:ss
SizeKB = %newsize%
SizeKB /=1024
If curver = 未知
{
If filecurver = 未知
Gosub, NotFound
Else
{
curver = %filecurver%
Gosub, update
}
}
Else if filecurver = 未知
Gosub, NotFound
Else
Gosub, update
Return
;################# 重要部分 #################
NotFound:
MsgBox, 4, 错误, 无法检测软件位置`n请确定您已经正确安装了 AutoHotkey`n`n您要下载 AutoHotkey 吗?
IfMsgBox, Yes
Gosub, Download
IfMsgBox, No
ExitApp
Return
update:
If newver > %curver%
{
TrayTip, 赶快升级, 检测到 AutoHotkey 已经有更新了, 10, 1
MsgBox, 4, 升级, 有更新了!`n最新版本是 %newver%,要升级吗?
IfMsgBox, Yes
Gosub, Download
}
Else
TrayTip, 没有更新, 当前版本:%newver% 已经是最新版本了, 10, 1
Return
关于(&A):
Gui, -0x20000
Gui, Add, Button, Default x79 y87 w59 h28 gConfirm, 确定
Gui, Add, Text, cBlue x14 y5 w193 h66 +Center, AutoHotkey 升级伴侣 1.0`n`n版权所有(C) 2005 Yonken 编写
Gui, Add, Button, x20 y43 w179 h20 gBlog, http://yonken.blogcn.com
Gui, Add, Button, x21 y63 w179 h20 gMail, yonken@163.com
Gui, Show, h121 w229, 关于 AutoHotkey 升级伴侣
Return
版本信息(&I):
Gui, 2:Add, GroupBox, x6 y10 w410 h120, 当前版本信息
Gui, 2:Add, GroupBox, x6 y150 w410 h120, 升级版本信息
Gui, 2:Add, Text, x16 y40 w130 h20 +Left, AutoHotkey 程序路径:
Gui, 2:Add, Text, x16 y70 w130 h20 +Left, AutoHotkey 当前版本:
Gui, 2:Add, Text, x16 y100 w130 h20 +Left, AutoHotkey 安装日期:
Gui, 2:Add, Text, x16 y180 w130 h20 +Left, AutoHotkey 最新版本:
Gui, 2:Add, Text, x16 y210 w130 h20 +Left, 最新版本发布日期:
Gui, 2:Add, Button, x16 y280 w70 h30 gDownload, 下载(&D)
Gui, 2:Add, Button, x106 y280 w110 h30 gDownWeb, 官方下载页面(&W)
Gui, 2:Add, Button, x236 y280 w80 h30 gHomepage, 官方网站(&H)
Gui, 2:Add, Button, Default x336 y280 w70 h30 gClose, 关闭(&C)
Gui, 2:Add, Text, x16 y240 w130 h20 +Left, 文件大小:
Gui, 2:Add, Edit, ReadOnly x156 y40 w250 h20, %dir%
Gui, 2:Add, Text, x156 y70 w250 h20, %curver%
Gui, 2:Add, Text, x156 y100 w250 h20, %filecurdate%
Gui, 2:Add, Text, x156 y180 w250 h20, %newver%
Gui, 2:Add, Text, x156 y210 w250 h20, %newdate%
Gui, 2:Add, Text, x156 y240 w250 h20, %newsize% 字节 即 %SizeKB% 千字节
Gui, 2:Show, x319 y165 h321 w426, AutoHotkey 版本信息
Return
检查更新(&U):
Reload
Return
#x::
退出程序(&X):
ExitApp
Confirm:
Close:
GuiClose:
GuiEscape:
Gui, Destroy
Return
Download:
Run, http://home.tampabay.rr.com/kodi/ahk/AutoHotkeyInstall.exe
Return
DownWeb:
Run, http://www.autohotkey.com/download/
Return
Homepage:
Run, http://www.autohotkey.com/
Return
Blog:
Run, http://yonken.blogcn.com
Return
Mail:
Run, mailto:yonken@163.com
Return
;########################################
AHK-可变化的托盘图标
脚本作者:BoBo
出处:http://www.autohotkey.com/forum/viewtopic.php?t=1703
/*
Icon, 文件名 [, 图标号] [v1.0.13+]: Changes the script\'s icon to one of the ones from FileName (a .ico, .dll, or .exe file). If IconNumber is omitted, it defaults to 1 (the first icon in the file). Specify an asterisk (*) for FileName to restore the script to its default icon. This setting affects the tray icon and the one displayed by InputBox, Progress, and GUI windows. Compiled scripts are also affected even if a custom icon was specified at the time of compiling. The built-in variables A_IconNumber and A_IconFile contain the number and name (with full path) of the current icon (both are blank if the icon is the default).
Icon (不带参数) [v1.0.09+]: Creates the tray icon if it isn\'t already present. This will override #NoTrayIcon if that directive is also present in the script.
NoIcon [v1.0.09+]: Removes the tray icon if it exists. If this command is used at the very top of the script, the tray icon might be briefly visible when the script is launched. To prevent that, use #NoTrayIcon instead. In v1.0.13+, the built-in variable A_IconHidden contains 1 if the tray icon is currently hidden or 0 otherwise.
*/
#NoTrayIcon
Loop
{
Menu, Tray, Icon, C:\fish.ico
Menu, Tray, Icon
Sleep, 1000
Menu, Tray, Icon, C:\fish2.ico
Menu, Tray, Icon
Sleep, 1000
}
AHK-鼠标经过控件的工具提示
作者:Rajat
出处:http://www.autohotkey.com/forum/viewtopic.php?t=2891
Gui, Add, Button, x16 y17 w60 h30, Button
Gui, Add, Checkbox, x16 y57 w70 h30, Checkbox
Gui, Add, Edit, x116 y17 w140 h70, 更多脚本示例请访问官方论坛:`n`nhttp://www.autohotkey.com/forum/
Gui, Show, x158 y318 h103 w269, %TargetWin%
SetTimer, Tip, 2000
Return
GuiClose:
ExitApp
Tip:
IfWinNotActive, %TargetWin%
{
ToolTip
Return
}
MouseGetPos,,,, ACtrl
Tip =
If ACtrl = Button1
Tip = 这是个按钮
If ACtrl = Button2
Tip = 这是个复选框
If ACtrl = Edit1
Tip = 这是编辑区
If ACtrl <> %LastCtrl%
{
ToolTip, %Tip%
LastCtrl = %ACtrl%
}
Return
AHK-AutoHotkey实现RC4加密
先引用一下一篇介绍RC4加密算法的文章:
作者: Romeo 原文:http://killerzhu.bokee.com/2744756.html
****************************************************************
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。
RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。假设S-box长度和密钥长度均为为n。先来看看算法的初始化部分(用类C伪代码表示):
for (i=0; i<n; i++)
s=i;
j=0;
for (i=0; i<n; i++)
{
j=(j+s+k)%256;
swap(s, s[j]);
}
在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:
i=j=0;
while (明文未结束)
{
++i%=n;
j=(j+s)%n;
swap(s, s[j]);
sub_k=s((s+s[j])%n);
}
得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。
由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。关于如何破解xor加密,请参看Bruce Schneier的Applied Cryptography一书的1.4节Simple XOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是否会出现重复呢?经过我的测试,存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。
而且,根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!
****************************************************************
实现RC4算法相对简单一些,这是Rajat写的,也就是SmartGuiCreator的作者
;___RC4 Encryption by Rajat_____________________________________
RC4(RC4Data,RC4Pass)
{
global RC4Result
ATrim = %A_AutoTrim%
AutoTrim, Off
BLines = %A_BatchLines%
SetBatchLines, -1
StringLen, RC4PassLen, RC4Pass
Loop, 256
{
a := A_Index - 1
Transform, ModVal, Mod, %a%, %RC4PassLen%
ModVal ++
StringMid, C, RC4Pass, %ModVal%, 1
Transform, AscVar, Asc, %C%
Key%a% = %AscVar%
sBox%a% = %a%
}
b = 0
Loop, 256
{
a := A_Index - 1
TempVar := b + sBox%a% + Key%a%
Transform, b, Mod, %TempVar%, 256
T := sBox%a%
sBox%a% := sBox%b%
sBox%b% = %T%
}
StringLen, DataLen, RC4Data
RC4Result =
i = 0
j = 0
Loop, %DataLen%
{
TmpVar := i + 1
Transform, i, Mod, %TmpVar%, 256
TmpVar := sBox%i% + j
Transform, j, Mod, %TmpVar%, 256
TmpVar := sBox%i% + sBox%j%
Transform, TmpVar2, Mod, %TmpVar%, 256
k := sBox%TmpVar2%
StringMid, TmpVar, RC4Data, %A_Index%, 1
Transform, AscVar, Asc, %TmpVar%
Transform, C, BitXOr, %AscVar%, %k%
IfEqual, C, 0
C = %k%
Transform, ChrVar, Chr, %C%
RC4Result = %RC4Result%%ChrVar%
}
AutoTrim, %ATrim%
SetBatchLines, %BLines%
Return RC4Result
}
;___RC4 Encryption by Rajat_____________________________________
一个应用实例:
***************************脚本开始*****************************
原文 = 圣诞节快到了,祝大家圣诞节快乐!
密钥 = 根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!
密文 := RC4(原文,密钥)
解密 := RC4(密文,密钥)
msgbox,0,密文,经过加密后的数据是这样子的:`n`n%密文%
msgbox,0,原文,解密后:`n`n%解密%
;___RC4 Encryption by Rajat_____________________________________
RC4(RC4Data,RC4Pass)
{
global RC4Result
ATrim = %A_AutoTrim%
AutoTrim, Off
BLines = %A_BatchLines%
SetBatchLines, -1
StringLen, RC4PassLen, RC4Pass
Loop, 256
{
a := A_Index - 1
Transform, ModVal, Mod, %a%, %RC4PassLen%
ModVal ++
StringMid, C, RC4Pass, %ModVal%, 1
Transform, AscVar, Asc, %C%
Key%a% = %AscVar%
sBox%a% = %a%
}
b = 0
Loop, 256
{
a := A_Index - 1
TempVar := b + sBox%a% + Key%a%
Transform, b, Mod, %TempVar%, 256
T := sBox%a%
sBox%a% := sBox%b%
sBox%b% = %T%
}
StringLen, DataLen, RC4Data
RC4Result =
i = 0
j = 0
Loop, %DataLen%
{
TmpVar := i + 1
Transform, i, Mod, %TmpVar%, 256
TmpVar := sBox%i% + j
Transform, j, Mod, %TmpVar%, 256
TmpVar := sBox%i% + sBox%j%
Transform, TmpVar2, Mod, %TmpVar%, 256
k := sBox%TmpVar2%
StringMid, TmpVar, RC4Data, %A_Index%, 1
Transform, AscVar, Asc, %TmpVar%
Transform, C, BitXOr, %AscVar%, %k%
IfEqual, C, 0
C = %k%
Transform, ChrVar, Chr, %C%
RC4Result = %RC4Result%%ChrVar%
}
AutoTrim, %ATrim%
SetBatchLines, %BLines%
Return RC4Result
}
;___RC4 Encryption by Rajat_____________________________________
************************脚本结束*************************************
关于鼠标隐藏
为了能和更多的人分享和共同学习脚本编写的知识,在没有事先通知的情况下我私下做了一个决定:从现在开始把所有发给我的关于脚本的邮件在此贴出来,当然大家的邮箱地址我是不会公布的啦,放心
。(说明:若您认为把mail公布在此侵犯了您则请告知,我会处理的
)
有一位同学给我发了这封mail(留言里的我也看了):
#################################################################################
请教一些问题:
我想为一些软件的安装注册写脚本(先说明我对脚本一巧不通,全都是用录制的方法生成的,然后根据自己的理解再作修改),
下面是我写的一段,目的是先限制鼠标操作,然后为软件输入注册码(nomousy.exe 文件已经放在 system32 目录):
Run, nomousy.exe -f
Run, C:\Program Files\aa.exe
Send, {SPACE}
Send, {ALTDOWN}c{ALTUP}{CAPSLOCK}jhj94o9d6p66s9q9{CAPSLOCK}{ALTDOWN}o{ALTUP}
运行后软件能够正常注册,但是鼠标却没有被限制
,无论在注册过程中还是注册完毕后鼠标都可以正常使用。
这是什么问题?
另外我还写了一个批处理文件,内容如下
nomousy.exe -f
k.exe (这是上面那段去除 Run, nomousy.exe 后的脚本)
可是运行后,电脑运行第一行命令后就停止响应了,鼠标被限制,可是 k.exe 没有被执行。如果运行一次 nomousy.exe 后,
批处理文件就会继续执行下去。为何 nomousy.exe 会有这样的影响?
#################################################################################
首先我很奇怪为什么你要把“nomousy.exe 文件已经放在 system32 目录”?如果那样则你要指定nomousy.exe的路径,否则当然是运行不了的。按你的脚本来看应该是要把nomousy.exe放在脚本的同一目录下,也就是和脚本(程序)放在一起,这样就可以了。完成所需操作后记得要再运行一次nomousy.exe解除限制哦!
至于你说的批处理呢,我想这是因为到nomousy.exe -f这一句命令的时候,nomousy.exe并没有通知系统“工作已完成”,但批处理是一条一条命令来执行,而且是要执行完一条才执行下一条的,因此停在那里了。
下面给一个演示:
^!f:: ;这里代表一个热键(Ctrl+Alt+F)
Run, nomousy.exe -f ;这里表示锁定鼠标在当前位置
Return
^!q:: ;这里代表一个热键(Ctrl+Alt+Q)
Run, nomousy.exe ;再次运行此程序则解除鼠标限制
Return
AHK中对URLDownloadToFile的更新
最近AHK对URLDownloadToFile进行了更新,使得脚本程序在下载文件时不再从IE缓存中找了,这样能保证下载的文件是最新的啦,这对我来说是个很不错的更新。
URLDownloadToFile
从 Internet 上下载指定文件到本地。
URLDownloadToFile, URL, Filename
参数
URL
要下载文件的 URL(地址)。如果是类似 http://someorg.org 这样的非明确 URL 则获得的文件可能会是该组织(网站)的欢迎页面。
Filename
要在本地存放的文件名,若未明确指定路径,则认为是 %A_WorkingDir%。已存在的同名文件将被 覆盖。
ErrorLevel
若有错误发生则 ErrorLevel的值为1,否则为 0。
注意
有时候即使远程服务器上的文件并不存在而看起来却成功下载了,这通常是因为该web服务器发出了一个错误提示页面来代替了该文件,这样通过此命令下载到本地的文件就变成了该错误页面了。
要使此命令正常工作则必须安装 Internet Explorer 3 或以上版本。防火墙或多个网络设备的存在也可能会导致下载失败。另外,有些网站还可能会限制下载。
缓存区:
在 v1.0.44.07+,URL 将直接从远程服务器上获得(也就是说不再从 Internet Explorer 的页面缓存获得)。若需允许使用cache,可在URL的前面加上 *0 和一个空格,例如:*0http://someorg.org。跟在星号后面的那个零可以用任何合法的 dwFlags 数来代替,详情请在 www.micfosoft.com上搜索 InternetOpenUrl。
对于比 1.0.44.07 更旧的版本,要下载的文件将优先在 cache 中获得(如果有的话)。若不允许这样的话,可在URL的结尾处加上一个“查询字符串”(以问号(?) 开头的URL 的一部分,其中包含name=value 形式的任意信息)。例如:http://www.someorg.org/doc.html?fakeParam=42。注意:若频繁地下载同一个文件,则查询字符串(一般指数值)也应该要变化。
SmartGUI Creator 4.0 初试 [原]
SmartGUI Creator 4.0
原作者:Rajat
网站:http://file.autohotkey.net/rajat/SGUI/index.html
之前的一段时间都在忙于翻译,都没空介绍一下这个新版的SmartGUI,现在补回来。
SmartGUI Creator(以下简称SGUI)什么的?AutoHotkey(以下简称AHK)的用户应该知道,这是专为编写 AHK GUI 脚本而做的一个可视化界面设计工具,所有操作都是所见即所得的,广受用户好评,最新版本是 4.0。
究竟新版有些什么变化呢?让我们先来看看截图(大图,点击即可放大):
相对于之前的 3.0 版本,首先感觉到的变化肯定就是在窗口布局上,工作区(包括工具栏等)集成到了一个窗口上,右键菜单、托盘菜单都不再提供了,要添加控件就要点击工具栏的按钮,主窗口上还提供了菜单,其它的界面上的变化还看不出来,还是来看看官方的介绍吧,比自己去试要省不少时间:
提供了一个命令行参数“GiveMeSource”,执行后讲把 SGUI 的脚本源码(SmartGUI.Ahk)给释放到 SGUI 的根目录下(这下可好了,马上动手汉化它^_^);
添加了一个工具栏和一个菜单栏,所有功能的实现尽在此处。
仅当右键点击的目标是控件时才会出现右键菜单,原有的菜单被去掉(我是一开始就急着点右键,结果让我郁闷了一回
);
托盘图标及其菜单也跟我 say goodbye 了;
保存脚本文件时控件的各种属性将不再丢失(比如关联变量、g-label等),这个是不错的进步;
在控件菜单(在添加的控件上点击右键)上增加了一个添加属性的功能,这样各种控件属性都可以方便地添加了,而且效果立即就可以看到,比如 Edit 控件的 password 属性;
控件文本对齐功能优化了;
保存文件时可选择保存到剪贴板中;
添加的控件带有默认 label;
。。。还有其它细节问题的修复等等
看起来应该不错的样子,我初步试用了一下,下面讲一下我的一点体会:
1、使用工具栏来添加控件让我有点不适应的感觉,右键菜单其实可保留;
2、在现有的 GUI 脚本的基础上进行修改并保存后,原有的数据基本上能保存,不会像以前那样通通没掉,但窗口标题等却还是丢掉了;
3、这次的更新应该是针对新添加的控件类型而作,在功能上并没有多少增加;
4、提供的控件属性设置功能非常不错,可惜没有实现针对不同的控件显示相应的属性选择,而是统统罗列出来,另外如果再提供窗口属性、style的设置就更好了;
5、多窗口应该要加到 Todo 列表中了。
6、还有很大的进步空间。
AHK-隐藏任务栏或任务栏按钮 [转]
此文引用/修改自 AutoHotkey 官方论坛的下述帖子:
http://www.autohotkey.com/forum/viewtopic.php?p=68698#68698 (作者:Goyyah)
关于隐藏任务栏,AHK的帮助文档中有个实例:
WinHide ahk_class Shell_TrayWnd ;隐藏任务栏
WinShow ahk_class Shell_TrayWnd ;显示任务栏
Goyyah 找到了一个隐藏任务栏按钮的方法:利用DllCall() 来调用User32.dll 中一个未曾在官方文档中解释的函数GetTaskmanWindow,即可轻松实现:
WinHide, % "ahk_id " DllCall("GetTaskmanWindow") ;隐藏任务栏按钮
WinShow, % "ahk_id " DllCall("GetTaskmanWindow") ;显示任务栏按钮
AHK-窗口的移动 [转]
此文引用/修改自 AutoHotkey 官方论坛的下述帖子:
http://www.autohotkey.com/forum/viewtopic.php?p=64185#64185 (作者:Goyyah)
假设我们创建一个窗口,使用了-Caption则这个窗口将没有标题栏,这时除了利用系统菜单之外就没有其它方法移动窗口了;或者说有时候我们需要提供标题栏以外的区域(客户区)让用户移动窗口,应该怎么办?看看这个代码吧:
Gui, -Caption +ToolWindow +0x400000
Gui, Font, S14 Bold, Verdana
Gui, Add, Text, w200 h27 Border Center gWinMove, 点击此处并拖动
Gui, Show, AutoSize
Return
WinMove:
PostMessage, 0xA1, 2,,, A
Return
GuiEscape:
Exitapp
(请不要尝试拖动左边的图片!
)
很有意思吧,按下Text控件时只是简单地发送一个消息(WM_NCLBUTTONDOWN ( 0xA1 ))到窗口上就可以了!
发送消息到窗口或其控件[译文]
发送消息到窗口或其控件
原作者: Rajat
译者:yonken
译者注:
1、本文的首个示例的操作对象是 Outlook Express,请确定自己的系统是否装有 Outlook Express (默认位置:C:\Program Files\Outlook Express\)。
2、文中提及的“新邮件”窗口是指按此操作打开的窗口:Outlook Express 主窗口>>菜单项目“文件”>>“新建”>>“邮件” 或 “邮件”>>“新邮件” 或 快捷键 [Ctrl+N]。
此页将讨论 [url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url] 和 [url=file:///E:/ahk_new/docs/commands/PostMessage.htm]SendMessage[/url] 命令的使用,并将尝试回答下列问题:
“如何点击已被最小化的窗口上的按钮?”
“在 [url=file:///E:/ahk_new/docs/commands/WinMenuSelectItem.htm]WinMenuSelectItem[/url] 不起作用的时候如何选中某个菜单项目?!”
“那是个可换肤的窗口...如何保证我发送的每条命令都能成功执行?”
“如果那是个隐藏窗口又怎么办?!”
要求:AutoHotkey v1.0.09+ 和 Winspector Spy (http://www.windows-spy.com)
为引入第一个示例,我们注意到 [url=file:///E:/ahk_new/docs/commands/WinMenuSelectItem.htm]WinMenuSelectItem[/url] 无法对 Outlook Express 的“新邮件”窗口的菜单栏进行任何操作。也就是说,下列代码无法生效:
WinMenuSelectItem, 新邮件,, 插入(&I), 图片(&P)...
但是利用 [url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url] 却可以完成这个任务:
PostMessage, 0x111, 40239, 0, , 新邮件
神奇吧?!可是这代码究竟是什么意思?0x111 是消息 [url=file:///E:/ahk_new/docs/misc/SendMessageList.htm]wm_command[/url] 的十六进制代码,而 40239 则是能让目标窗口理解为(执行)选中“插入图片”菜单项(操作)的代码。现在我来告诉你怎样获得像 40239 这样的数值:
打开 Winspector Spy 和 “新邮件”这两个窗口。
点击 Winspector Spy 窗口上的十字型图标(控件)并拖曳鼠标到“新邮件”窗口的标题栏(未被 Winspector Spy 遮挡的部分)。
右键点击左侧窗口列表中被选中(高亮显示)的窗口并选择(弹出的菜单中的)“Messages”。(注:不要选错窗口了,若要检查某窗口是否目标窗口,可在该窗口名上点击右键,选择“Highlight(高亮显示此窗口)”,则可根据被高亮激活的窗口来判断,如下图所示:
右键点击右侧空白的窗口并选择“Edit message filter”。
点击按钮“Filter all”后双击左侧列表中的“wm_command”。这样做的目的是让它只监视此消息。点击按钮“OK”关闭窗口。
现在我们要操作“新邮件”窗口:依次选择 “插入”>>“图片”。
回到 Winspector Spy 并按下右侧窗口上的红绿灯按钮以暂停监视。
展开消息项 wm_command(其它消息不必理会)。
你将会看到的通常是 code 0 消息,有时 wm_command 消息项下还可能会显示“win activated”或“win destroyed”等等提示,这些都不是我们需要的。你要留意的是“Control ID: 40239”,这就是我们所要的!
现在我们得到所有的必须信息了,马上就动手编写上面的命令吧!40239 是 wParam 参数所需的值。
下一个示例中我将会以系统自带的“画图”作为演示对象,因为估计每个人的系统都有它。现在我们假设它就是我们要利用 AutoHotkey 进行操作的程序,我们的任务是要选中它的工具栏的某个工具,就以滴管工具(取色)为例吧。
你会怎么做?也许你会想到模拟鼠标点击这个工具栏按钮,对吧?可是你要知道大多的工具栏都是可以被移动或者隐藏的!而这个也是。所以,如果目标用户做了这类操作(移动或隐藏工具栏)则你的脚本将执行失败。不过,即使是这样,下面这个命令却仍可以正常工作:
PostMessage, 0x111, 639,,,未命名 - 画图
使用 [url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url] 的另外一个好处就是目标窗口可以是在后面的(非活动/激活)窗口,而与此相反的是,发送鼠标点击(一般)需要该窗口先被激活。
下面给出更多的例子。注意:我正在使用的系统是 WinXP 专业版(SP1) ... 如果你正在用的系统跟我的不一样,那么你可能需要改动一下某些参数(仅适用于写字板和记事本等 Windows 自带的程序,对于其它程序则一般无需改动参数):
;使写字板的字体颜色变成蓝绿色
[url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url], 0x111, 32788, 0, , 文档 - 写字板
;打开记事本的关于对话框
[url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url], 0x111, 65, 0, , 无标题 - 记事本
;切换记事本的自动换行属性
[url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url], 0x111, 32, 0, , 无标题 - 记事本
;播放/暂停 Windows Media Player
[url=file:///E:/ahk_new/docs/commands/PostMessage.htm]PostMessage[/url], 0x111, 32808, 0, , Windows Media Player
;暂停正在运行的 AHK 脚本的热键功能!
DetectHiddenWindows, on
SetTitleMatchMode, 2
PostMessage, 0x111, 65305,,, MyScript.ahk - AutoHotkey ; 65306 表示暂停热键。
上面的示例中使用的都是 PostMessage,[url=file:///E:/ahk_new/docs/commands/PostMessage.htm]SendMessage[/url] 的用法和功能跟它一样,但要等待返回值,我们可以利用这一点来获得 Winamp 正在播放的文件信息(请查看 [url=file:///E:/ahk_new/docs/misc/Winamp.htm]Automating Winamp[/url] 的示例)。
下面是一些注意事项:
上面的所有示例及注解都是假定系统为 XP,谨记操作系统不同则消息的值也可能不同。如果你找到一个能在你的系统上(针对某个软件版本)工作的消息,那么你应该确保这个消息也同时能对其它系统的同一软件版本正常工作。另外要提醒一下,一般而言大多数的程序的不同版本(针对同一事件)总是保持使用同一条消息的(比如 Windows Media Player 和 Winamp)。
如果你已经设置了过滤器(filter)以使 Winspector Spy 仅显示 wm_command 消息却仍看到大量的消息被捕获,你就应该右键点击该消息并选择隐藏该消息(Hide “消息名”)...一般我们并不需要这些没有和目标软件进行交互就“拼命”发送的消息。
Winspector Spy 的右侧窗口中带右箭头的消息项将显示该消息的值,而带左箭头的消息项则显示返回值。通常使用零值来表示“无错误发生”(若使用的是 SendMessage,返回值将保存在 [url=file:///E:/ahk_new/docs/misc/ErrorLevel.htm]%ErrorLevel%[/url])。
如果发送消息的目标窗口仅需匹配部分标题则请先添加下面这行代码到脚本中:
SetTitleMatchMode, 2
若要发送消息到隐藏窗口请先添加下面这行代码到脚本中:
DetectHiddenWindows, On
注意:这个技术可能会对某些程序无效,我自己就遇到对一些用 VB 或 Delphi 编写的程序无效的情况。这个技术最适合的是 C/C++ 的程序。对于 VB 写的程序,即使是同一个命令,它的“LParam”每次总是不同的;而对于 Delphi 写的程序...它的 GUI 甚至根本就不使用 wm_command。如果是这样,还是使用获得鼠标位置、模拟点击这种老办法吧。
其它的就请自己去探索吧....别忘了在 AutoHotkey 的论坛上分享你的经验。欢迎提供反馈信息!
本指南并不适合完全的新手(没有恶意),毕竟这里提到的命令都是些高级的功能。如果读完上面这些之后你还是觉得摸不着头脑的话,那么你还是忘了这篇文章好了。
-Rajat
小技巧:调用系统的关机对话框
最近看到有人讨论调用系统的关机对话框的方法,他们的方法是这样的:
AU3版本:WinClose("Program Manager")
AHK版本:WinClose, Program Manager ahk_class Progman
这个方法确实有效,原因是 Program Manager 是所谓“桌面”的一个窗口。顺便在此介绍一下,“桌面”其实不是这么简单的一个窗口而已的哦,至于具体它是怎么组成的,可以看看下面这个图:
而详细的介绍已有人写过了,有兴趣的可以看看:
http://blog.csdn.net/wuhuiran/archive/2006/05/29/761550.aspx
至于我的方法,则是调用系统API。不过这个API函数(Shell32.dll中)是没有名字的,所以在脚本中不能直接使用DllCall来调用,在此引用一下对这个函数的简单介绍(来源:http://www.qhtx.net/edu/program/vc/vc6/200601/10788.html):
【我们可以使用微软的1个没有公开的函数,来调用这个对话框,这个函数位于shell32.dll文件里,它不像别的函数那样容易使用,我们不可以直接使用它,必须先使用LoadLibrary函数来获得shell32.dll文件的句柄,然后使用GetProcAddress函数获得这个函数的地址的指针,最后再通过这个指针来调用这个函数】
要调用这个函数,方法是:rundll32.exe shell32.dll #60
AHK版本:Run, rundll32.exe shell32.dll #60
AU3版本:Run("rundll32.exe shell32.dll #60")
小技巧-简单的窗口动画效果
没有神奇之处,只是调用函数AnimateWindow实现,可用于自己的GUI中。
AW_HOR_POSITIVE = 0x00000001
AW_HOR_NEGATIVE = 0x00000002
AW_VER_POSITIVE = 0x00000004
AW_VER_NEGATIVE = 0x00000008
AW_CENTER = 0x00000010
AW_HIDE = 0x00010000
AW_ACTIVATE = 0x00020000
AW_SLIDE = 0x00040000
AW_BLEND = 0x00080000
Gui, Show, w400 h300, 动态效果
WinGet, MainWndID, ID, 动态效果 ahk_class AutoHotkeyGUI
Gui, Add, Button, gAni1, 渐隐渐现
Gui, Add, Button, gAni2, 中间
Gui, Add, Button, gAni3, 从左到右
Gui, Add, Button, gAni4, 从右到左
Gui, Add, Button, gAni5, 从上到下
Gui, Add, Button, gAni6, 从下到上
Return
GuiClose:
GuiEscape:
ExitApp
Ani1:
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_BLEND|AW_HIDE )
Sleep, 500
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_BLEND )
Return
Ani2:
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_CENTER|AW_HIDE )
Sleep, 500
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_CENTER )
Return
Ani3:
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_HOR_POSITIVE|AW_HIDE )
Sleep, 500
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_HOR_POSITIVE )
Return
Ani4:
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_HOR_NEGATIVE|AW_HIDE )
Sleep, 500
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_HOR_NEGATIVE )
Return
Ani5:
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_VER_POSITIVE|AW_HIDE )
Sleep, 500
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_VER_POSITIVE )
Return
Ani6:
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_VER_NEGATIVE|AW_HIDE )
Sleep, 500
DllCall( "AnimateWindow", "Int", MainWndID, "Int", 500, "Int", AW_VER_NEGATIVE )
Return
AHK-简单实现的注册表定位脚本
这几天清理硬盘,找出一些以前写过的小脚本,顺便把它们放上来吧
#NoEnv
SendMode Input
#NoTrayIcon
#SingleInstance ignore
; 注册表的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit
; 下的LastKey项保存了上一次浏览的注册表项位置,所以在打开注册表编辑器前修改它就行了
InputBox, NewLastKey, 注册表自动定位工具, 请输入要定位到的路径, , 800, 120
If(ErrorLevel = 1)
ExitApp
IfWinExist, 注册表编辑器 ahk_class RegEdit_RegEdit
{
WinClose
WinWaitClose
}
RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Applets\Regedit, LastKey, %NewLastKey%
Run, regedit.exe
AHK-IE控制
AHK在它的wiki上放了几个示例脚本演示了COM的应用,其中就有IEControl,虽然函数的丰富程度和功能比起AU3的IE系列UDF来说明显不够好,但自己修改增加也不是难事。
下面是个嵌入WebBrowser的脚本,相关资料及下载:
http://www.autohotkey.com/wiki/index.php?title=CoHelper
http://www.autohotkey.com/wiki/i ... et_Explorer_Control
#Include IEControl.ahk
#SingleInstance force
GoSub, GuiStart
Gui, +LastFound +Resize
Gui, Show, w800 h600 Center, WebBrowser
hWnd := WinExist()
CLSID_WebBrowser := "{8856F961-340A-11D0-A96B-00C04FD705A2}"
IID_IWebBrowser2 := "{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}"
pwb := CreateObject(CLSID_WebBrowser, IID_IWebBrowser2)
AtlAxAttachControl(pwb, hWnd)
IE_LoadURL(pwb, "www.google.com")
Return
GuiStart:
AtlAxWinInit()
CoInitialize()
Return
GuiClose:
Gui, %A_Gui%estroy
Release(pwb)
CoUninitialize()
AtlAxWinTerm()
ExitApp
在脚本中使用Send发送中文
最简单的方法其实是先把要发送的内容先保存到剪贴板中去,然后在要发送的时候“粘贴”一下(Send一个 Ctrl+V)即可。不过当要发送的内容非固定而“粘贴”的速度过快时往往会导致一个小问题:还没执行完“粘贴”操作之前剪贴板的内容就被修改了,结果发送了别的内容。
当然还有别的方法,先引用一下下面的内容:
我们通过键盘只能够输入键盘上有的字符,其实,按住 ALT 键,然后在数字键盘上按表示要输入字符的十进制代码值的键,等完成输入后,释放 ALT 键还可以输入键盘上没有的字符呢。
如果键入的第一个数字是“0”,该值将被识别为当前输入区域设置中的代码点或字符值。例如,在当前的输入区域设置为“英语(美国)”时(代码页 1252:Windows Latin-1),按住 ALT 键,然后在数字键盘上键入“0163”将产生英镑符号 £ (U+00A3)。在当前输入区域是 "Russia" (代码页 1251:Windows Cyrillic),相同的键顺序会产生西里尔大写字母 JE (U+0408)。
而如果键入的第一位数是“1”到“9”的任意数,该值将被识别为系统 OEM 代码页中的代码点。根据在“控制面板”的“区域选项”中所指定的 Windows 系统区域设置,结果各有不同。例如,如果您的系统区域设置是“英语(美国)”,代码页为 437(MS-DOS 拉丁美洲),那么只要按住 ALT 键,然后在数字键盘上键入“163”,就可以输入 ú(U+00FA, 带重音符号的小写拉丁字母 U)。如果系统区域设置是“希腊语”(OEM 代码页 737 MS-DOS 希腊),相同序列将产生希腊语小写字母 MU (U+03BC)。
新建一个文本文件,输入“中文”这两个字并保存,然后用UltraEdit等十六进制编辑器打开并用十六进制视图显示,可看到如下内容:
00000000h: D6 D0 CE C4 ; 中文
可知中文这两个字的十六进制分别是 0xD6D0、0xCEC4(即十进制的54992、52932),那么如果要输入“中”字,则只要按住Alt键,逐个输入其十进制数字54992即可。
这样,要实现自己的Send函数就简单了:
AHK脚本:
; GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中
; 汉字的相同。另外,GBK中还包含繁体字的编码,GBK中每个汉字仍然包含两
; 个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围
; 是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。
#NoEnv
SendMode Input
Run, Notepad, , , NotepadPID
WinWait, ahk_pid %NotepadPID% ahk_class Notepad
WinActivate
WinWaitActive
_SendRaw("简体中文And繁體中文")
Return
_SendRaw(Keys)
{
Len := StrLen(Keys) ; 得到字符串的长度,注意一个中文字符的长度是2
KeysInUnicode := "" ; 将要发送的字符序列
Char1 := "" ; 暂存字符1
Code1 := 0 ; 字符1的ASCII码,值介于 0x0-0xFF (即1~255)
Char2 := "" ; 暂存字符2
Index := 1 ; 用于循环
Loop
{
Code2 := 0 ; 字符2的ASCII码
Char1 := SubStr(Keys, Index, 1) ; 第一个字符
Code1 := Asc(Char1) ; 得到其ASCII值
if(Code1 >= 129 And Code1 254 And Index Len) ; 判断是否中文字符的第一个字符
{
Char2 := SubStr(Keys, Index+1, 1) ; 第二个字符
Code2 := Asc(Char2) ; 得到其ASCII值
if(Code2 >= 64 And Code2 254) ; 若条件成立则说明是中文字符
{
Code1 8 ; 第一个字符应放到高8位上
Code1 += Code2 ; 第二个字符放在低8位上
}
Index++
}
if(Code1 255) ; 如果此值仍
Code1 := "0" . Code1
KeysInUnicode .= "{ASC " . Code1 . "}"
if(Code2 > 0 And Code2 64)
{
Code2 := "0" . Code2
KeysInUnicode .= "{ASC " . Code2 . "}"
}
Index++
if(Index > Len)
Break
}
Send % KeysInUnicode
}
AU3脚本:
#cs
运行脚本时需用 AutoIt3A.exe
将 AutoIt 目录下的AutoIt3A.exe重命名为AutoIt3.exe即可(建议先备份AutoIt3.exe)
编译脚本时需用 Aut2exeA.exe
#ce
Run("notepad")
WinWaitActive("[CLASS:Notepad]")
_SendRaw("简体中文And繁體中文")
Func _SendRaw($Keys)
Local $KeysInUnicode = ""
Local $len = StringLen($Keys)
Local $char1
Local $code1
Local $char2
Local $code2
Local $index = 1
While True
$code2 = 0
$char1 = StringMid($Keys, $index, 1)
$code1 = Asc($char1)
If $code1 >= 129 And $code1 254 And $index $len Then
$char2 = StringMid($Keys, $index+1, 1)
$code2 = Asc($char2)
If $code2 >= 64 And $code2 254 Then
$code1 *= 256
$code1 += $code2
EndIf
$index += 1
EndIf
If $code1 255 Then $code1 = "0" & $code1
$KeysInUnicode &= "{ASC " & $code1 & "}"
If $code2 > 0 And $code2 64 Then
$code2 = "0" & $code2
$KeysInUnicode &= "{ASC " & $code2 & "}"
EndIf
$index += 1
If $index > $len Then ExitLoop
WEnd
Send($KeysInUnicode)
EndFunc