AutoHotKey-study


最近发现常用键盘的上下左右箭头去操作输入输出问题感觉很不是滋味,不像Linux那样,有vim的使用,就想着有没有什么方法更快捷,更方便的去使用电脑键盘,稍微搜索了一番,发现了这个强大的脚本工具 autohotkey

ahk帮助文档

使用编辑器

adventure
是autoahk编辑器的升级
快捷键
注释:ctrl + q
复制一行:ctrl +

#SingleInstance
确定脚本已在运行时是否允许再次运行.

~
添加这个符号后,激发热键时, 不会屏蔽(被操作系统隐藏) 热键中按键原有的功能。

SetTitleMatchMode :定义wintitle的的模式
1: 默认行为. 窗口标题必须以指定的 WinTitle 开头才能匹配.
2: 窗口标题的任意位置包含 WinTitle 才能匹配.
3: 窗口标题必须和 WinTitle 完全一致才能匹配.

脚本注意

  1. 跳过对话框, 自动替换旧实例.

    #SingleInstance force
    #NoEnv	;启用环境变量
    
  2. 热字串:使用空白时还会出现
    O,(omit)表示忽略终止符,即不需要使用空白终止符;
    R,原样输出;
    C,区分大小写;
    b0,不会删除原字符

    :*b0:<font>::
        </font>{left 8}{Space}color{space}={space}`“`”{Right}
    #<font color = ""></font>

  3. Send

    • 只有一行代码时,v1和v2都可以简写
    • 在v2使用{}包含多行代码,在v1版本只需用return返回即可
    • 在v2中的send需用双引号包裹,为字符串,在v1中不需要双引号包裹
      当使用热键输出文本时,会遇到如下情况
          v1:按下a键忽略a的输出
          v2:按下a键在a后循环输出
          按下b时,出现对应的内容
      a:: {
      send "baceh"
      }
      $b:: send "bcbbd"
      
      综上:使用$可以将字符串原内容输出
  4. 禁用按键

    >#:: return	;禁用 → win键
    hotkey, a, 标签
    hotkey, a, off
    return
    标签:
    	msgbox, a
    return
    
  5. autohotkey有宏录制功能
    录制页面

  6. 脚本流程中,多次创建同一个热键,热键功能指向最后一次代码运行的指向标签,最终执行为3

    hotkey, a, 标签1
    hotkey, a, 标签2
    hotkey, a, 标签3
    return
    标签1:
        msgbox, 1
    return
    标签2:
        msgbox, 2
    return
    标签3:
        msgbox, 3
    return
    
  7. 热键嵌套

    ; 按下a/b/c任意一个键,输出l
    a::				|		a::
    b::				|		b::
    c::send, l		|		c::			; %A_ThisHotkey% 保存了本次按下的热键
    				|			send l
    				|		return
    
  8. 添加钩子,防止热键冲突

    ; 加钩子前	直接输出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

键盘获取方法

  1. 双击/open脚本

  2. view – key history and script info
    SC:键盘的Scan Code
    VK:键盘的Virtual Key

    图示

  3. 使用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."
    else
        MsgBox "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, &y
        if (y==0){
            Send "{Volume_Up}"
        }
    }
    ~WheelDown::{
        MouseGetPos &x, &y
        if (y==0){
            Send "{Volume_Down}"
        }
    }
    
  • 关闭视窗

    #SingleInstance Force
    ;CoordMode "Mouse","Screen"
    
    ;使用ctrl alt f4关闭所有相同视窗
    ^!f4::
      ; 视窗存进 sClass
      WinGetClass, sClass, A
      ; 关闭相同的类视窗
      while WinExist("ahk_class " . sClass) {
        WinClose
      }
    return
    
    ;使用鼠标左键和esc关闭当前窗口
    ~LButton & Escape::
        WinGetActiveTitle ,title
        Winclose %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)
      return
      
    Speak(say) {
      spovice:=ComObjCreate("sapi.spvoice")
      spovice.Speak(say)
    }
    
  • 获取当前鼠标颜色

    !a::
      MouseGetPos, MouseX, MouseY
      PixelGetColor, 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=FreeCommander
      if (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 = 1
      return
    else
      Keywait, Escape, d, t0.1
      if errorlevel = 0		; 0.5秒内按了Escape,则再读第二个按键,若为Escape则关闭视窗
        {
        WinGetActiveTitle, Title
        WinClose, %Title%
        return
        }
      return	;若第二个按键不为Escape则结束
    
  • 批量删除视窗

    #SingleInstance Force
    SetTitleMatchMode 2	; 设置wintitle的匹配模式
    
    #n::
      run notepad
      Return
      
    ^!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)
        WinClose
      Return
    
  • clipboard剪切功能

    ^+g::
    	current_clipboard = %Clipboard%		;把当前剪切板内容存储起来,剪切内容为文本
    	send ^c		; 复制字符串存入剪切板
    	Clipwait,1	; 等待剪切板包含数据
    	Run http://www.google.com/search?h1=zh&q=%Clipboard%
    	Clipboard = %current_clipboard%		; 将剪切板内容恢复
    
  • 截图工具的使用
    snippingtool

    !4::
    	run,"%A_WinDir%\system32\Snippingtool.exe"
    	sleep ,500
    	WinActive, "Snipping Tool"
    	send ,!m
    	send ,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

  • 设计开关

    1. 按下一个按键启动,在按一次停止
      ; 单击a,连续点鼠标左键,再次单击,取消点击
      	a::settimer, 循环a功能标签, % (开关变量 := !开关变量) ? 1 : "off"
      循环a功能标签:
          send, {Lbutton}
      return
      
      F1::
      if (onoff := !onoff)
          MsgBox, 布尔值为%onoff%`n第一次开
       else
          MsgBox, 布尔值为%onoff%`n第二次关
      Return
      
    2. 分离式开关设计
      F1::
      	F1onoff := !F1onoff, F2onoff=0
      	SetTimer F2循环, Off
      	SetTimer F1循环, % F1onoff=0 ? "Off" : 50
      	ToolTip
      return
      F2::
      	F2onoff := !F2onoff, F1onoff=0
      	SetTimer F1循环, Off
      	SetTimer F2循环, % F2onoff=0 ? "Off" : 50
      	ToolTip
      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)
    	return
    
    Markdown_title(numHashes){
    	Clipboard := ""
    	sendInput {home}
    	sendInput {SHIFT}+{End}
    	sleep 200
    	Clipwait ,1		; 等待剪切板包含数据
    	text := Clipboard
    	text := 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

参考:
    基础到精通
    文档

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值