目录
- 使用编辑器
- 脚本注意
- 函数解释
- 信息调试方法
- 键盘获取方法
- 脚本练习
最近发现常用键盘的上下左右箭头去操作输入输出问题感觉很不是滋味,不像Linux那样,有vim的使用,就想着有没有什么方法更快捷,更方便的去使用电脑键盘,稍微搜索了一番,发现了这个强大的脚本工具 autohotkey
ahk帮助文档
使用编辑器
adventure:
 是autoahk编辑器的升级
 快捷键:
 注释:ctrl + q
 复制一行:ctrl + ⬇
#SingleInstance:
 确定脚本已在运行时是否允许再次运行.
~
 添加这个符号后,激发热键时, 不会屏蔽(被操作系统隐藏) 热键中按键原有的功能。
SetTitleMatchMode :定义wintitle的的模式
 1: 默认行为. 窗口标题必须以指定的 WinTitle 开头才能匹配.
 2: 窗口标题的任意位置包含 WinTitle 才能匹配.
 3: 窗口标题必须和 WinTitle 完全一致才能匹配.
脚本注意
-  跳过对话框, 自动替换旧实例. #SingleInstance force #NoEnv ;启用环境变量
-  热字串:使用空白时还会出现 
 O,(omit)表示忽略终止符,即不需要使用空白终止符;
 R,原样输出;
 C,区分大小写;
 b0,不会删除原字符:*b0:<font>::
 </font>{left 8}{Space}color{space}={space}`“`”{Right}
 #<font color = ""></font>
-  Send:- 只有一行代码时,v1和v2都可以简写
- 在v2使用{}包含多行代码,在v1版本只需用return返回即可
- 在v2中的send需用双引号包裹,为字符串,在v1中不需要双引号包裹
 当使用热键输出文本时,会遇到如下情况
 v1:按下a键忽略a的输出
 v2:按下a键在a后循环输出
 按下b时,出现对应的内容
 综上:使用a:: { send "baceh" } $b:: send "bcbbd"$可以将字符串原内容输出
 
-  禁用按键 >#:: return ;禁用 → win键 hotkey, a, 标签 hotkey, a, off return 标签:msgbox, a return
-  autohotkey有宏录制功能 
  
-  脚本流程中,多次创建同一个热键,热键功能指向最后一次代码运行的指向标签,最终执行为3 hotkey, a, 标签1 hotkey, a, 标签2 hotkey, a, 标签3 return 标签1:msgbox, 1 return 标签2:msgbox, 2 return 标签3:msgbox, 3 return
-  热键嵌套 ; 按下a/b/c任意一个键,输出l a:: | a:: b:: | b:: c::send, l | c:: ; %A_ThisHotkey% 保存了本次按下的热键| send l| return
-  添加钩子,防止热键冲突 ; 加钩子前 直接输出lll 1::send, a a::msgbox, lll; 加钩子后 不会发生冲突 1::send, a $a::msgbox, lll
函数解释
-  Click [ Options ] 
 Options:Coords, WhichButton, ClickCount, DownOrUp 和/或 Relative. 如果省略所有项目, 在鼠标光标的当前位置执行单次左键点击.Coords:如果省略, 则使用鼠标的当前位置. 否则, 请指定在点击前, 鼠标光标要移动到的 X 和 Y 坐标. 例如, Click “100 200” 在特定位置点击鼠标左键. 坐标相对于活动窗口的客户端区域, 除非曾使用 CoordMode 更改了这个设置. 如果省略, 则使用光标的当前位置.CoordMode "ToolTip", "Screen"WhichButton:默认为 Left. 可指定 Left, Right, Middle(或只是这些名称的首字母); X1(第四个按钮) 或 X2(第五个按钮). 例如, Click “Right”Relative:相对当前鼠标位置
-  inf := InputBox([Prompt, Title, Options, Default]):输入对话框Prompt:提示文本
 Title:标题
 Options:类型,eg:Password
 inf.value(获取对象输入的文本)
 inf.result(获取对象输入框的返回值),输入框是如何关闭的: OK, Cancel 或 Timeout.
-  KeyWait, KeyName [, Options]:等待按键的状态
 Options:
 为空,表示无限期等待;
 D: 等待按键被按下
 T: 超时(例如 T3). 超时前等待的秒数, 超时后设置 ErrorLevel 为 1.
-  Run, Target [, WorkingDir, Options, OutputVarPID]
 RunWait, Target [, WorkingDir, Options, OutputVarPID]
 Options:
 省略, 命令正常运行 Target, 并且当 Target 不能启动时显示警告对话框.
 Max: 最大化运行
 Min: 最小化运行
 Hide: 隐藏运行(不能和上面任意一个选项组合使用)
-  Winset(对指定的窗口进行各种设置)
 内容太长,其帮助文档传送
-  SetKeyDelay:设置每次Send系列的延迟
信息调试方法
- msgbox
- listvars
- outputdebug
键盘获取方法
-  双击/open脚本 
-  view – key history and script info 
 SC:键盘的Scan Code
 VK:键盘的Virtual Key 
-  使用PrintScreen键盘输出内容12345 SC137::Send 12345 VK2c::Send 12345
脚本练习
-  click命令 #SingleInstance Force CoordMode "Mouse","Screen"f1:: { Click 1919,716,0 Click 1879,20 Sleep 3000 Click 1622,161 Sleep 1000 Click 1616,78 }
-  send,合并单元格 #SingleInstance Force CoordMode "Mouse","Screen"; 拆分单元格 f1:: {send "{alt}"send "h"Sleep "200"send "m"Sleep "200"send "u" }
-  允许用户输入电话号码. IB := InputBox("Please enter a phone number.", "Phone Number", "w640 h480") if IB.Result = "Cancel"MsgBox "You entered '" IB.Value "' but then cancelled." elseMsgBox "You entered '" IB.Value "'."
-  鼠标在最上面改变音量 #SingleInstance Force CoordMode "Mouse","Screen";MouseGetPos &x, &y ;w:: ;{ ;获取坐标位置 ;MouseGetPos &xpos, &ypos ;MsgBox "The cursor is at X" xpos " Y" ypos ;}~WheelUp::{MouseGetPos &x, &yif (y==0){Send "{Volume_Up}"} } ~WheelDown::{MouseGetPos &x, &yif (y==0){Send "{Volume_Down}"} }
-  关闭视窗 #SingleInstance Force ;CoordMode "Mouse","Screen";使用ctrl alt f4关闭所有相同视窗 ^!f4::; 视窗存进 sClassWinGetClass, sClass, A; 关闭相同的类视窗while WinExist("ahk_class " . sClass) {WinClose} return;使用鼠标左键和esc关闭当前窗口 ~LButton & Escape::WinGetActiveTitle ,titleWinclose %title% return#n:: run notepad
-  音量控制 !NumpadAdd:: Send {Volume_Up} ;//Alt + numpad plus !NumpadSub:: Send {Volume_Down} ;//Alt + numpad minus !Numpad0::Send {Volume_Mute} ;//Alt + numpad 0
-  语音报告今日时间 !F2::date = %A_YYYY%年%A_MM%月%A_DD%日Speak("今天日期是 " . date)time = %A_Hour%点 %A_Min%分 %A_Sec%秒Speak("现在时间是 " . time)returnSpeak(say) {spovice:=ComObjCreate("sapi.spvoice")spovice.Speak(say) }
-  获取当前鼠标颜色 !a::MouseGetPos, MouseX, MouseYPixelGetColor, color, %MouseX%, %MouseY%, RGB Clipboard := "#" . SubStr(color, 3) ;color = 0x...... MsgBox, Current color is `n %Clipboard%return
-  按下鼠标中轮回到上层目录,在推特切下一个推文 ~MButton::WinGetClass,sClass,A;//MsgBox class=%sClass%;//FM=7-zip window, TFcFormMain=FreeCommanderif (sClass="TFcFormMain" || sClass="FM" || sClass="MultiCommander MainWnd") {Send, {BS}} else if (sClass="CabinetWClass") {Send, !{up} ; 回向上一层目录} else if (sClass="MozillaWindowClass" || sClass="Chrome_WidgetWin_1") {WinGetTitle, sTitle, A;//MsgBox title=%sTitle%if (InStr(sTitle, "Gmail") > 0) {Send {j}} else if (InStr(sTitle, "Twitter") > 0) {Send {j} ; 下一个推特}} return
-  连续按2次Esc关闭当前视窗 ~Esc:: Keywait, Escape, , t0.5 ; KeyWait读取键盘输入,如果0.5秒内不是按Escape则结束 if errorlevel = 1return elseKeywait, Escape, d, t0.1if errorlevel = 0 ; 0.5秒内按了Escape,则再读第二个按键,若为Escape则关闭视窗{WinGetActiveTitle, TitleWinClose, %Title%return}return ;若第二个按键不为Escape则结束
-  批量删除视窗 #SingleInstance Force SetTitleMatchMode 2 ; 设置wintitle的匹配模式#n::run notepadReturn^!f4::WinGetTitle sTitle, A; MsgBox %sTitle%; InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]InputBox sTitle, 视窗标题, 输入视窗标题名, , 300, 150, , , , , %sTitle%if (sTitle = "nb") {sTitle := "记事本" ;; 或 sTitle = 记事本} else if (sTitle = "ie") {sTitle := "Internet Explorer"}while WinExist(sTitle)WinCloseReturn
-  clipboard剪切功能 ^+g::current_clipboard = %Clipboard% ;把当前剪切板内容存储起来,剪切内容为文本send ^c ; 复制字符串存入剪切板Clipwait,1 ; 等待剪切板包含数据Run http://www.google.com/search?h1=zh&q=%Clipboard%Clipboard = %current_clipboard% ; 将剪切板内容恢复
-  截图工具的使用 
  !4::run,"%A_WinDir%\system32\Snippingtool.exe"sleep ,500WinActive, "Snipping Tool"send ,!msend ,r ; 矩形截图;send f ; 任意截图return#Persistent RunWait, %ComSpec% /c dir C:\ >>C:\DirTest.txt, , Min ; 程序运行结束后才向下运行 ComSpec,为cmd Run, C:\DirTest.txt Run, properties C:\DirTest.txt
-  对当前窗口的操作 
 https://autohotkey.top/zh-cn/docs/commands/WinSet.htm#Examples
-  设计开关 - 按下一个按键启动,在按一次停止; 单击a,连续点鼠标左键,再次单击,取消点击a::settimer, 循环a功能标签, % (开关变量 := !开关变量) ? 1 : "off" 循环a功能标签:send, {Lbutton} returnF1:: if (onoff := !onoff)MsgBox, 布尔值为%onoff%`n第一次开elseMsgBox, 布尔值为%onoff%`n第二次关 Return
- 分离式开关设计F1::F1onoff := !F1onoff, F2onoff=0SetTimer F2循环, OffSetTimer F1循环, % F1onoff=0 ? "Off" : 50ToolTip return F2::F2onoff := !F2onoff, F1onoff=0SetTimer F1循环, OffSetTimer F2循环, % F2onoff=0 ? "Off" : 50ToolTip return F1循环:ToolTip F1循环%F1onoff% return F2循环:ToolTip F2循环%F2onoff% return
 
- 按下一个按键启动,在按一次停止
-  设计markdown文档快速标题 ^1:: ^2:: ^3:: ^5:: ^6::numHashes := Substr(A_Thishotkey, 2) ; "^1" -> "1"Markdown_title(numHashes)returnMarkdown_title(numHashes){Clipboard := ""sendInput {home}sendInput {SHIFT}+{End}sleep 200Clipwait ,1 ; 等待剪切板包含数据text := Clipboardtext := RegExReolace(text, "^#{1,6}\s(.*)", "$1")SendInput {del}SendInput {home}{# numHashes}{End} }
-  常用热键整理 
 https://www.autoahk.com/archives/36311#H2-12
-  微知识点整理 
 https://www.autoahk.com/archives/9195
参考:
     基础到精通
     文档