关于AHK

###详情及本人常用热键脚本见如下链接,主要包括常用热键、选择即复制/剪贴/替换、excel水平滚动等功能:https://pan.baidu.com/s/1WWQb8y9Qm9pINVRQG-DKkQ?pwd=c3t9

###补全了之前说ahk定义的foobar热键:鼠标放在歌单界面,alt+1/2/3切换歌单,放在歌单界面左侧,alt+1/2/3/4/5,实现可视化功能切换

★★★◆◆◆☻✘✔『』※♣♠♥§◤◇♀♂☞♫♪◎

【关键点】

  • (30)(29)(28)(27)(26)(25)(24)(23)(22)(21)(20)(19)(18)(17)(16)(15)(14)(13)(12)(11)(10)(9)(8)(7)

  • (6)版本:要用大漠,只能安装32位版本

    • v1.1.32之前版本找色只能从左上角开始,之后版本可以从矩形的任意一个角开始
  • (5)与其他编程语言对比

    • AHK和Python的比较(GUI)
  • (4)开发工具:

    • ★★★★★VS code添加ahk开发插件后还不错
    • AutoAHK-史上最强,最适合中文Autohotkey开发者的开发环境,没有之一

注意

  • (3)注意

    • ahk中字符串连接不用&用空格即可

      b := 123
      ;c显示出来为abc123
      c :=  a  b
      msgbox,% c
      c显示出来为abc123
      • 路径拼接

        folder = G:\Programme\AutoHotkey\Speos\test 
        name:="456.xmp"
        ahh:= folder "\" name
        ;拼接结果为G:\Programme\AutoHotkey\Speos\test\456.xmp
    • GUI-edit控件的变量名称前必须加字母v,但若要调用变量中的值,需要使用变量名%ShiJian%,而非%vShiJian%:例如Gui, Add, Edit, vShiJian ym

    • 创建变量无需使用%,但获取变量值必须加%,如%AppNow%,如果不加%,得到的结果为字符串AppNow

      • 但如下情况可不加%
        • 在参数中的输入或输出变量: StringLen, OutputVar, InputVar

        • 在赋值的左侧,可以不加,但右侧变量必须加: Var = 123abc

        • 在传统(非表达式) if 语句的左侧: If Var1 < %Var2%

        • 在表达式中的任意位置.

          • 例如: Var1 := Var2 + 100

          •                                                                                                                                                                                                                                                                                                                               ImageSearch, FoundX, FoundY,  800,  39,  1110,  415,  *100  %A_WorkingDir%\image\Snipaste_2022-07-03_17-50-41.bmp
                                                                                                                                                                                                                                                                                                                                          X:=FoundX+9
        • if (AppNow="Code.exe")

        • APP和AppNow均为变量,都不嫩加%,否则报错if (App = AppNow)

        • 内置变量: if (A_Cursor="IBeam")

    • if下要执行多行内容,必须用大括号,否则只能执行第一行

      !z::
      ;『EXCEL』账号表修改注册表
      If WinActive("账号 - Excel") 
          send,^+c
      If WinActive("ahk_exe XYplorer.exe")
          {
          Click,Right
          Send,I
          }
      Return

优缺点

  • (2)优缺点:AHK相对于大漠和按键精灵的优缺点

    • 优点:
      • ★★★★可以随意组合按键指定为热键,如按下X和B,执行某个流程。用按键精灵发现热键不够用,但用AHK发现热键多的用不完
      • ★★★★★大漠对窗口操作特别麻烦,操作窗口前必须要绑定窗口,但AHK完全不需要
      • ★★★★按键精灵只能设置一个快捷键,但AHK可以为一个脚本设置无数个快捷键;所以按键精灵一个快捷键只能对应一个脚本文件,但AHK可以将很多脚本放在一个文件中分别设置快捷键
      • 即使在屏幕分辨率和缩放比是非百分之百的情况下ahk也能正常的识别;而按键精灵这个固执的的开发者这个bug一直没有改掉
      • ★★★★★超级强的权限,甚至可以随意修改系统的默认快捷键
      • ★★★执行速度快于按键精灵和大漠
      • ★★★★可拦截系统快捷键,非常适合设置快捷键,快捷键可随意组合
    • 缺点:
      • ◆◆◆◆后台不行:无法后台找图找色

帮助文档

【问题】

  • (60)(59)(58)(57)(56)(55)(54)(53)(52)(51)(50)(49)(48)(47)(46)后台单击控件如何超时

  • (45)AHK如何把变量值传给ppt的宏

  • (44)如何表示appdata目录:

    • 该命令似乎不起作用:If FileExist(%USERPROFILE%\AppData\Local\Mozilla\Firefox\Profiles)

    • 这个凑合用If FileExist("C:\Users\"A_UserName "\AppData\Local\Mozilla\Firefox\Profiles")

  • (43)拦截广告弹窗

  • (42)通过teamviewer远程控制发送ahk设置的热键不起作用:用rustdesk软件远程控制可正常使用

  • (41)单击命令无法像uipath一样超时

  • (40)调用大漠提示没有注册类:如果已经注册大漠,那么很可能是安装了64为AHK,大漠只兼容32为AHK

  • (39)win11上无法输入特殊符号:但win10上可以正常使用,

  • (38)ahk让ppt运行组合命令

    • 前台发送热键干涉

    • 后台热键怎么不起作用

  • (37)如何判断一个软件是否支持通过com对象操作

  • (36)如何用ahk保存PPT

    • 直接调用com对象

      ppt:=ComObjActive("powerpoint.application")
      ppt.Visible := true
      ppt.ActivePresentation.Save()
    • 向窗口发消息

  • (35)如何遍历所有按键,判断当前被按下没弹起的按键

    if GetKeyState("Shift")
        MsgBox At least one Shift key is down.
    else
        MsgBox Neither Shift key is down.
  • (34)按钮的位置单击如何变成直接类似uipath单击控件:窗口大小改变或者不同分辨率的电脑中位置单击会错位

    • 找图分辨率变了还是遇见找不到的问题

    • uipath能解决大部分类似问题,但执行速度较慢,每次运行都要调用robot

    • PyAutoGUI

    • 如何向软件发送消息操作软件替代鼠标单击

  • (33)如何激活lucidshape中的小窗口:

    • ControlFocus,LucidShape_openGL_Window1, ahk_exe LucidShape.exe可以使得焦点切换到窗口上,但还是未激活,工具栏无法点击

    • ControlClick, LucidShape_openGL_Window1, ahk_class OWL_Window ahk_exe LucidShape.exe与上面命令相同的问题

  • (32)ahk如何判断一个无界面的后台软件是否在后台运行:利用存在元素活动,如下框中需要输入进程名称『如果为ahk脚本,最好发布为名称不同的exe程序,直接运行ahk脚本显示的进程名都是AutoHotkey.exe如果后台多个ahk脚本在运行则无法判断』

  • (31)ahk隐藏窗口标题栏后最大化窗口不能填充满屏幕:非ahk之罪,实则鼠标手势软件StrokesPlus.net只过,将该软件的最小化窗口由命令改为快捷键alt+esc即可

  • (30)热键脚本shift+鼠标滚轮实现水平滚动失效:重启excel可解决

  • (29)对指定excel文件的操作热键失效:失误操作导致同时选中了多个表,此时打开的工作簿标题后多加了个组字,而ahk脚本是按工作簿标题识别窗口的,此时相当于标题改变,自然无法识别到指定的窗口

  • (28)winclose无法关闭部分窗口,如

    WinClose, ahk_exe ManicTimeClient.exe

    • 尝试PostMessage, 0x0112, 0xF060,,, WinTitle, WinText ; 0x0112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE

    • 尝试:WinKill, Calculator

    • 直接发送热键关闭

      WinWait, ahk_exe ManicTimeClient.exe
      SendInput,!{f4}
  • (27)给ASC软件后台发送热键不起作用

    ControlSend,,{AltDown}{f4}{AltUp},ahk_exe ASC.exe

  • (26)xyporer利用ahk最小化窗口不起作用:

    • run后加min不起作用

    • 利用WinMinimize则会让窗口隐藏:执行前加WinActivate激活窗口

      Run,D:\SoftWare\XYplore\XYplorer.exe,,
      WinWait, ahk_exe D:\SoftWare\XYplore\XYplorer.exe
      WinActivate,ahk_exe D:\SoftWare\XYplore\XYplorer.exe
      WinMinimize
  • (25)搜狗中文导致快速输入当前日期错误输入04、3、021/2:英文输入法可正常输入:关闭智能调整数字后标点,且自定义标点输入/不改为、

  • (24)ahkinfo1.3.5界面中的图标是如何绘制的:图形是可以直接转化为代码的

  • (23)ahk如何后台找色:无后台找色功能

    • 可调用大漠插件执行后台找色

      #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
      ; #Warn  ; Enable warnings to assist with detecting common errors.
      SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
      SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
      ;安装键盘和/或鼠标钩子
      #InstallKeybdHook
      #InstallMouseHook
      
      ;F12::
      
      ;WinSet, AlwaysOnTop , Off,雷电模拟器-spe
      CoordMode Mouse
      CoordMode,Pixel,Screen
      #SingleInstance force			;;执行程序前先关闭程序
      ;创建大漠对象
      dm:=ComObjCreate("dm.dmsoft")
      ver:= dm.ver() ;调用大漠的插件版本查询函数,只会出现两种情况返回值为空及返回值为版本号。
      /*
      if (ver) ;如果版本号存在
          MsgBox,,,注册成功!版本号为%ver%,1
      else 
          MsgBox,,,注册失败!`n请检查ahk版本及大漠是否已注册到系统`n请参考大漠接口说明-常见问题-创建对象失败怎么办,4
      
      
      ;设置目录
      dm_ret = dm.SetPath("D:\Program Files (x86)\damo\zhuce")
      */
      ;找色必备函数
      ComVar(Type=0xC)
      {
          static base := { __Get: "ComVarGet", __Set: "ComVarSet", __Delete: "ComVarDel" }
          ; 创建含 1 个 VARIANT 类型变量的数组.  此方法可以让内部代码处理
          ; 在 VARIANT 和 AutoHotkey 内部类型之间的所有转换.
          arr := ComObjArray(Type, 1)
          ; 锁定数组并检索到 VARIANT 的指针.
          DllCall("oleaut32\SafeArrayAccessData", "ptr", ComObjValue(arr), "ptr*", arr_data)
          ; 保存可用于传递 VARIANT ByRef 的数组和对象.
          return { ref: ComObjParameter(0x4000|Type, arr_data), _: arr, base: base }
      }
      ComVarGet(cv, p*) { ; 当脚本访问未知字段时调用.
          if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[]
              return cv._[0]
      }
      ComVarSet(cv, v, p*) { ; 当脚本设置未知字段时调用.
          if p.MaxIndex() = "" ; 没有名称/参数, 即 cv[]:=v
              return cv._[0] := v
      }
      ComVarDel(cv) { ; 当对象被释放时调用.
          ; 必须进行这样的处理以释放内部数组.
          DllCall("oleaut32\SafeArrayUnaccessData", "ptr", ComObjValue(cv._))
      }
      ;下面就是脚本部分了 省略——————————————————————
      ;hwnd := dm.FindWindowByProcess("hexin.exe","","")
      hwnd := dm.FindWindow("Afx:00400000:b:00010003:00000006:00091749","")
      ;hwnd := dm.GetForegroundWindow()
      ;后台绑定
      dm_ret := dm.BindWindow(hwnd,"dx2","normal","normal",0)
      ;if dm_ret=1
      ;MsgBox,绑定成功
      ;前台绑定
      ;dm_ret = dm.BindWindow(hwnd,"normal","normal","normal",0)
      intX:=ComVar()
      intY:=ComVar()
      dm_ret2 := dm.FindColor(700,825,1520,826,"00e600-000000",1.0,2,intX.ref,intY.ref) 
      If (dm_ret2=0)
          MsgBox,没找到
      else
          MsgBox,% intX[] "," intY[]
          dm.MoveTo(intX[],intY[])
      
      F11::Reload  ; 调试热键
      return
  • (22)如何先按列找色,而不是先按行:加FAST为按行找色,取消fast为按列找色,但按列找色速度超慢,如果找色区域太大,则需要花费很长时间PixelSearch, OutputVarX, OutputVarY, 1518,810,818,976,0xFFFF00,0,Fast RGB

  • (21)找色位置并非实际的位置,总有偏移:

    • 找色代码前需设置为相对于整个屏幕找色CoordMode,Pixel,Screen

    • 同时设置鼠标相对于整个屏幕:

      CoordMode,Mouse,Screen

  • (20)该热字符串单独测试正常,但放在热键脚本中无法使用::smm::X1789961457Y

    • 按键S被作为辅助键了,导致s键失效,利用$s::s实现S键的输入,所以按下s键后不是由键盘输入的S键,而是由ahk脚本输入的,况且又开了勾子,自然无法检测到输入的S键smm

  • (19)自动保存脚本中利用ControlSend,,{CtrlDown}s{CtrlUp},%App%发送保存命令,经常出现只发送按键s,导致原来内容被破坏

    • 可以直接像工具栏控件发送命令,而非整个窗口,如向xmind工具栏发送保存命令ControlSend,ToolbarWindow3210,{CtrlDown}s{CtrlUp},%App%

    • excel中可利用com命令实现保存,参考问题18

  • (18)AHK如何利用代码替换ctrl+s按键保存命令

    • excel中可使用如下命令实现保存:但编辑状态下总是弹窗提示

      xl := ComObjActive("Excel.Application") ;获取当前活动的 Excel 实例的句柄 
      xl.Visible := true
      xl.ActiveWorkbook.Save()
      • 但该命令保存时若excel正在处理数据或有其他操作,则会提示被呼叫方拒绝接受呼叫错误:可利用try/catch捕获异常弹窗『Tty后的大括号内为经常抛出异常的代码』

        Try
            {
              xl := ComObjActive("Excel.Application") ;获取当前活动的 Excel 实例的句柄 
              xl.Visible := true
              xl.ActiveWorkbook.Save()
            }
  • (17)A_Now< %now_date%160000比较结果错误

  • (16)AHK时间如何相加减

    • EnvSub:必须带日期

      var1 := 20050126
      var2 := 20040126
      EnvSub, var1, %var2%, days
      MsgBox, %var1%  ; 结果将是 366, 因为 2004 是个闰年.
  • (15)何为键盘勾子:使用 键盘钩子 的热键不会被 Send 命令的方法触发

    • 一篇搞懂键盘钩子问题

  • (14)移动指定窗口不起作用WinMove,ahk_exe 倒计时.exe,, 0, 0

  • (13)AHK如何实现判断某段时间内是否有按键,如按键精灵中GetLastKey():执行了GetLastKey()一遍后,会抹除记录,如果中间没有再按键,再次执行GetLastKey(),会得到0,也就是没有按键

    • ★★★★★内置变量A_TimeIdle:从系统最后一次接收到键盘, 鼠标或其他输入后所经过的毫秒数

    • ★★★★★★内置变量A_TimeIdlePhysical:与上面类似, 但在安装了相应的钩子(键盘或鼠标) 后会忽略模拟的键击和/或鼠标点击; 即此变量仅反应物理事件. (这样避免了由于模拟键击和鼠标点击而误以为用户存在.) 如果两种钩子都没有安装, 则此变量等同于 A_TimeIdle. 如果仅安装了一种钩子, 那么仅此类型的物理输入才会对 A_TimeIdlePhysical 起作用(另一种/未安装钩子的输入, 包括物理的和模拟的, 都会被忽略).

    • %A_PriorKey%变量可以得到最后一个按键,但不能清洗历史状态,且不支持鼠标点击;可以没隔一段时间获取一次,跟上次获取的按键对比

  • (12)keywait如何监控鼠标滚轮?AHK如何判断鼠标滚轮活动

  • (11)IF判断运行报错:if (App = AppNow)中变量不能加%,否则报错

  • (10)热键脚本频繁卡死导致部分按键失效

    • 似乎是平滑滚动脚本导致,失效时滚动鼠标滚轮立马正常

    • 鼠标手势软件StrokesPlus.net也会导致ahk程序卡死,结束鼠标手势软件后ahk程序可正常退出

    • ★★★类似x::x的代码,导致程序进入死循环,正确写法应该为$x::x,修改后偶尔还会出现快捷键失效

    • ★★★★加入代码F7::Reload,实现按下F7重启代码

    • 未加延迟,在重要流程之间加延迟:sleep,100

    • MouseClick,left,2导致热键失效,改为

      MouseClick, left
      sleep,10
      MouseClick, left
  • (9)如何让打开脚本就自动执行,执行完退出即可:

    • 脚本加载完成后, 它会从顶行开始执行, 直到遇到 Return, Exit, 热键/热字串标签或脚本的底部(无论最先遇到哪个). 脚本的这个顶端部分被称为自动执行段:相当于要自动执行的部分不能出现return,exit,以及热键设置

    • ★★★★★★脚本末端加Exitapp,即可执行完自动退出

  • (8)经常出现按键按下无法弹起『主要是ctrl』,导致其他按键都无法使用:

    • 可能是按下与弹起分开的热键导致{CtrlDown}{shiftDown}a{shiftup}{CtrlUp}

    • 似乎是在excel界面下!3或!4热键导致该问题:将SendInput,^{PgDn}修改为SendInput,{CtrlDown}{PgDn}{CtrlUp}问题似乎解决了,三键组合可以写为sendinput {CtrlDown}{shiftDown}a{shiftup}{CtrlUp}

    • 可能是用包含ctrl的热键调用自身导致:$^c::^c

    • 用热键调用其他组合热键时『热键中被调用的热键有相同按键』,等待热键释放后再调用『但会导致按下热键后有延迟』

      $!s::
      KeyWait Alt
      KeyWait Control
      send,^!z
      return

    • ★★制作弹起脚本,挨个弹起所有按键

    • ★设置热键重启脚本F7::Reload ; 调试热键

  • (7)热键发送自身为何会出错:

    • 热键 ^c::Send ^c 将导致一个无限键击循环 。要避免这种情况,为热键定义添加 $ 前缀 (例如 $^c::),使得热键不能被 Send 命令触发。

      !c::
      send,!c
  • (6)字母辅助热键导致作为辅助热键的字母输入缓慢:前缀按键也可以设定其自己的动作,但只有当按键被松开的时候才被触发,可能是为了区分是单独按键还是组合按键

    • ★★★★没必要判断大写是否打开:虽然不能完全解决输入缓慢的问题,但输入速度应该算相对快的了『后期输入尽量使用讯飞语音吧』

      x & c::^!c
      x::x
    • ★★★根本原因是类似d::的单独按键作为快捷键时,鼠标弹起才会生效,而一般输入法按下字母按键即可生效,快速打字过程中,频繁出现一个字母未弹起时按下另一个字母按键,从而导致作为热键的字母无法输入:执行命令前加入{backspace}删除输入的字符:虽然完全解决了输入缓慢的问题,但会导致excel中英文输入状态下错误删除表格中的内容

      x & c::send {backspace}^!c
      ~x::
    • 感觉差不多if GetKeyState("CapsLock", "T")是否比

      GetKeyState, state, CapsLock,T

      if (state = "D")更快捷:作用不大

    • SendInputSend输入按键更快

    • ★★★取消判断cspslock是否打开,直接用$x::x,该方法不影响大写字母的输入:有点效果,但还是会出现有时无法输入

    • 使用~符号:但会导致输入d键~d & 2::send ◆◆

  • (5)字母辅助热键导致作为辅助热键,xyplorer中快速跳转到快捷方式功能失效:shift切换为英文状态下搜索,而非切换为大写搜索

  • (4)修改注册表

  • (3)如下代码导致无法输入书名号『将按键设置为热键』

    , & o::!o ;Alt+O打开欧陆词典搜词界面
    ,::send, ,
    +,::<
  • (2)导致热键不起作用,单字母按键可正常使用

    Space & e:: 
    Space::send, {Space}
    • 调整两行代码的先后顺序后完美解决

      Space::Send, {Space}
      Space & e::
  • (1)指定excel快捷键

【碎片】

  • (100)(99)(98)(97)(96)(95)(94)(93)(92)(91)(90)(89)(88)(87)(86)(85)(84)(83)(82)(81)(80)(79)(78)(77)(76)(75)(74)(73)(72)(71)(70)(69)(68)(67)遍历文件夹,拿到指定格式文件的文件名

    folder = G:\Programme\AutoHotkey\Speos\test 
    Loop, %folder%\*.xmp
    {
    FileAppend %A_LoopFileName%|,%folder%\out.txt,UTF-8
    }
    return
  • (66)操作软件菜单命令:大多数软件不支持,目前似乎只有记事本和xmind可用

    • 用swapy64软件可以识别到!menu的都可以使用上面命令操作
    • 在记事本界面选择打开命令:WinMenuSelectItem, ahk_exe NOTEPAD.EXE,,文件,打开
    • 操作speos的界面:WinMenuSelectItem, ahk_exe VisionLabViewer.exe,,Tools,Color Management,Color space conversion,Maintain lightness and hue
  • (65)操作PPT

  • (64)保存当前打开的CATIA文档:

    CATIA := ComObjActive("CATIA.Application")
    CATIA.Visible := true
    CATIA.ActiveDocument.Save()
  • (63)复选框的选择与取消筛选:

    • 选择复选框:Control, Check, , Button6, ahk_exe VisionLabViewer.exe

    • 取消复选框:Control, Uncheck, , Button6, ahk_exe VisionLabViewer.exe

  • (62)选择下拉列表的项目:

    • 根据项目字符串选择:Control, ChooseString, Local adaptation, ComboBox1, ahk_exe VisionLabViewer.exe
    • 根据项目排序位置选择:Control, Choose, 5, ComboBox1, Installer
  • (61)鼠标位置相对于弹出窗口的位置:

    • ahhinfo脚本获取的位置有偏差
    • ahk自带的windows spy获取的位置准确:
  • (60)文件及文件夹操作

    • 创建文件夹:FileCreateDir,%USERPROFILE%\AppData\Local\FastStone

    • 创建删除文件夹:

      FileRemoveDir, %AppData%\SmoothScroll, 1

    • 复制文件:FileCopy, C:\*.txt, C:\My Folder

    • 移动文件夹及其所有子文件夹和文件. 它还可以重命名文件夹:

      • 移动文件夹『不需要加引号』:FileMoveDir, C:\My Folder, D:\My Folder

      • 只重命名:FileMoveDir, C:\My Folder, C:\My Folder (renamed), R

  • (59)检查文件或文件夹或驱动器是否存在:路径需要加引号

    • if FileExist("D:\")
      MsgBox "The drive exists."

    • 引用变量不要加%:If FileExist("C:\Users\"A_UserName "\AppData\Local\Mozilla\Firefox\Profiles")

  • (58)相对路径:%A_ScriptDir%代表当前脚本所在目录

    Run, %A_ScriptDir%\firefox.exe --profile "%A_ScriptDir%\defaults\pref"

  • (57)后台向foobar发送热键不起作用:ControlSend, NGLV1,!s,ahk_class {E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}

  • (56)AHK调用其他脚本代码:如果我们需要让 AHK 暂停,先运行调用的脚本直到运行起来的脚本退出才继续,可以用 RunWait 命令取代 Run,除了这个区别,用法上和 Run 是一致的。

    • 调用脚本当前目录下的bat文件

      Run, %A_ScriptDir%\mklink.bat

    • 调用其他ahk脚本:

      • ★★★★GB2312编码下路径不能有中文,否则会出错『编码格式设置为UTF-8 with BOM可解决该问题』

      • Include命令『相当于把调用的文件中的代码完全复制到主脚本当前位置执行,所以如果调用的代码结尾为exitapp,则执行完毕后会退出主脚本』:#Include G:\Programme\AutoHotkey\AutoZhuiZong.ahk

    • AHK调用uipath发布的流程『UTF-8 WITH BOM编码格式下路径可以有中文』:

      run,"C:\Program Files (x86)\UiPath\Studio\UiRobot.exe" -file "G:\Programme\UiPath\Robot\慧博报表数据.1.0.1.nupkg"

操作excel

  • (55)操作excel:AutoHotkey实现Excel自动化

    • 获取的单元格行号和列号为变量:

      Hang:=4
      lie:=2
      strCell := objExcel.Cells(Hang,lie).Value
      MsgBox,  % strCell
    • 将D5:L5数据复制到D19:L19:objExcel.Range("D19:L19").Value := objExcel.Range("D5:L5").Value

      • 若19为变量,可现在excel中获取变量单元格范围,如D20:L20,后用ahk操作

        Range01:=objExcel.Range("C2").Text
        objExcel.Range(Range01).Value:= objExcel.Range("D5:L5").Value
    • 等待刷新完后计算:似乎有问题,不起作用

      xlapp = win32com.client.DispatchEx("Excel.Application")
      xlapp.CalculateUntilAsyncQueriesDone() ;直到刷新完毕
      strCell := objExcel.Calculate
    • 刷新当前激活的工作簿:strCell := objExcel.ActiveWorkbook.RefreshAll

    • 计算当前工作簿:strCell := objExcel.Calculate

    • A1单元格中写入AutoHotkeyobjExcel.Cells(1, 1).Value := "AutoHotkey"

    • 读取单元格E2内容:

      objExcel :=  ComObjActive("Excel.Application")
      strCell := objExcel.Cells(2,5).Value
      MsgBox,  % strCell
  • (54)等待窗口动作:

    • 等待标题中包含属性的窗口关闭:WinWaitClose, 属性

    • 等待窗口出现:WinWait,ahk_exe Everything.exe

    • 等待进程出现:Process, Wait, exit.exe

  • (53)字符串转化为图片文件:

    Null_ico:="0000010001002020100000000000E8020000160000002800000020000000400000000100040000000000000200000000000000000000100000001000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000007770CCCCCCCCCCCCCCCCCCCCC07770007070CCCCCCCCCCCCCCCCCCCCC07070007770CCCCCCCCCCCCCCCCCCCCC0777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF80000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000FFFFFFFFFFFFFFFFFFFFFFFF"
    Null_ico_File=%A_Temp%\Null.ico
    ;字符串转二进制
    StrToBin(Str) {
        XMLDOM:=ComObjCreate("Microsoft.XMLDOM"), xmlver:="<?xml version=`"`"1.0`"`"?>"
        XMLDOM.loadXML(xmlver), Pic:=XMLDOM.createElement("pic"), Pic.dataType:="bin.hex", pic.nodeTypedValue := Str, StrToByte := pic.nodeTypedValue
        return StrToByte
    }
    ; 数据流保存为文件
    BYTE_TO_FILE(body, filePath) {
        Stream := ComObjCreate("Adodb.Stream"), Stream.Type := 1, Stream.Open(), Stream.Write(body), Stream.SaveToFile(filePath,2), Stream.Close()
    }
    BYTE_TO_FILE(StrToBin(Null_ico),Null_ico_File)
  • (52)匹配标题:需提前开启匹配模式,要匹配的标题无需添加正则表达式*

    ;标题匹配模式
    SetTitleMatchMode, 2
    SetTitleMatchMode, Fast
  • (51)输入字符串:

    • 后台输入:ControlSetText,Edit1,300502,ahk_exe hexin.exe
  • (50)AHK操作EXCEL

    • 在第一行第一列输入“AutoHotkey”:

      objExcel.Cells(1, 1).Value := "AutoHotkey"

    • 现在我们把刚才存入的数据读取并显示出来:strCell := objExcel.Cells(1, 1).Value

    • 另存为其他文件objExcel.ActiveWorkbook.SaveAs("C:\test.xls")

    • 保存objExcel.Workbook.Save()

    • 保存激活的工作簿

      xl := ComObjActive("Excel.Application") ;获取当前活动的 Excel 实例的句柄 
      xl.Visible := true
      xl.ActiveWorkbook.Save()
    • 参考

      • AutoHotkey实现Excel自动化
  • (49)操作office:

    • office(Excel word PPT)各功能的消息号不完全枚举(PostMessage用)

    • Autohotkey在office中的应用

  • (48)运算

    • 取余数:mod(5, 3),结果为2
    • 舍去小数位:Floor(1.2),结果为1

找色

  • (47)找色:只支持前台找色,窗口被遮挡后无法找色,后台找色需要借助大漠

    • 获取指定坐标的颜色值,获取的结果相当于16进制颜色值前加0xPixelGetColor, OutputVar, 1510, 931,RGB

    • 在指定范围内找色『ErrorLevel结果为1则没找到,为0则找到,且ErrorLevel需要放在找色命令的下一行,中间不能间隔其他代码,否则不再是找色的结果』:颜色代码前必须加0x否则,不管什么颜色都显示已经找到,且输出找到的颜色位置错误

      CoordMode Mouse ; 设置获取鼠标坐标系为全屏
      CoordMode Pixel ; 设置取色坐标系为全屏取色
      PixelSearch, OutputVarX, OutputVarY, 1506,840,1521,967,0x00FF00,0 ,Fast, RGB
      If (ErrorLevel=0) 
      MsgBox,%OutputVarX%,%OutputVarY%
      else
      MsgBox,未找到
      return
      • 默认BGR颜色格式,代码后RGB才能按RGB格式找色
  • (46)弹窗实现方案

    • msgbox弹窗『窗口位置样式无法自定义,但最简单』:msgbox,要显示的内容
    • ToolTip『窗口位置可定义,但样式无法自定义』:高兼容 高性能 简单易用 自定义效果丰富的 ToolTip
    • GUI弹窗『可以随意定义样式和位置,但最为复杂』
  • (45)文件写入与读取

    • 读取文件中的内容,读取结果存入变量DaiMa:FileRead, DaiMa,E:\展望未来\代码.txt

    • 写入内容到文件

      • 利用变量title中的内容覆盖文件title.txt中的内容『先删除title.txt,后新建该文件』

        FileDelete, %A_ScriptDir%\中转站.txt
        FileAppend,%title%,%A_ScriptDir%\中转站.txt,UTF-8
  • (44)设置窗口状态:

    • 隐藏窗口到后台:Winhide,ahk_exe Suo10_SmartRAM.exe

      • 任务栏图标存在,且会导致SmartRAM软件任务栏图标打不开软件
    • 最大化指定窗口:WinMaximize,ahk_exe Speos.Labs.Pre.LivePreview.exe,若不起作用,可尝试PostMessage, 0x0112, 0xF030,,,ahk_exe Speos.Labs.Pre.LivePreview.exe,或者多加个标题匹配

    • 标题为消息框的窗口置顶:WinSet,

      AlwaysOnTop , On,消息框

    • 取消置顶

      • 取消标题为消息框的窗口置顶:WinSet, AlwaysOnTop , Off,消息框

      • 取消foobar2000窗口置顶:WinSet, AlwaysOnTop , Off,ahk_exe foobar2000.exe

    • 置底:同花顺置底不起作用

      WinSet,Bottom,,分析 ahk_class Afx:00400000:b:00010003:00000006:09EC0857

  • (43)移动指定窗口到左上角

    WinWait, ahk_exe 倒计时.exe
    WinMove,0,0
  • (42)输入框

    • inputbox的输入框界面样式难以调节:InputBox, OutputVar , Title, Prompt, HIDE, Width, Height, X, Y, Locale, Timeout, Default

    • GUI输入框

      ; 示例: 要求输入姓名的简单输入框:
       
      Gui, Add, Text,, First name:
      Gui, Add, Text,, Last name:
      Gui, Add, Edit, vFirstName ym  ; ym 选项开始一个新的控件列.
      Gui, Add, Edit, vLastName
      Gui, Add, Button, default, OK  ; ButtonOK(如果存在)会在此按钮被按下时运行.
      Gui, Show,, Simple Input Example
      return  ; 自动运行段结束.在用户进行操作前脚本会一直保持空闲状态.
       
      GuiClose:
      ButtonOK:
      Gui, Submit  ; 保存用户的输入到每个控件的关联变量中.
      MsgBox You entered "%FirstName% %LastName%".
      ExitApp

GUI

  • (41)GUI:并不能像消息框一样阻断后续脚本运行

    • 按钮控件位置设置

      • X向相对于上一控件『文本』的最右边向左移动450像素,Y向相对于上一控件的底边向下移动10像素GUI, ADD, BUTTON,X+-450 Y+10 W200 Default gquxiao, 取消提示
    • AHK倒计时测试

    • GUI弹窗『可定义显示位置』

      SetBatchLines -1
      Gui, +LastFound +ToolWindow +AlwaysOnTop
      ;弹窗背景色
      Gui, Color,A3CEA3 
      ;字体设置
      GUI, Font, w200 Q5 s25 bold c2b2b2b , Microsoft Yahei
      ;弹窗显示的内容
      GUI, ADD,TEXT, W200 CENTER  vtime1, % "01:00:00"
      ;显示弹窗标题及设置弹窗位置
      gui,show,autosize X1500 Y933, 倒计时测试
      return
      • +ToolWindow 避免显示任务栏按钮
      • AlwaysOnTop: 让窗口置顶
      • LastFound: 设置窗口为上次找到的窗口(对于 Gui 线程这是多余的, 因为它自动设置了), 这样允许类似 WinSet 这样的命令对此窗口进行操作, 即使它当前为隐藏状态(即不需要使用 DetectHiddenWindows). 需要在显示窗口之前改变其属性时, 这是非常有用的
  • (40)倒计时

    • MsgBox倒计时的三种方法
    • AHK倒计时测试
  • (39)关闭窗口

    • 关闭窗口『似乎软件也被关闭而不是在后台继续运行』: WinClose, Calculator
    • 强制关闭WinKill, Calculator
    • 只关闭窗口不退出软件『类似于按下热键Alt+F4』:PostMessage, 0x0112, 0xF060,,,ahk_exe PopBlock.exe
    • 发送热键『容易被其他操作干扰』:SendInput,!{f4}
  • (38)关闭, 重启或注销系统

    • 关机:Shutdown,1
    • 休眠:DllCall("PowrProf\SetSuspendState", "int", 0, "int", 0, "int", 0)
  • (37)换行: `n

    • 消息弹窗内容换行:MsgBox,123 `n 456
  • (36)表达式计算

    • 若C2单元格为19,则结果为C19:D19

      position:=objExcel.Range("C2").Text
      Range01=D%position%:L%position%
    • 到x结果为1+1:x=1+1

    • 赋值:得到x的结果为2:x:=1+1

  • (35)经过时间:

    • 变量A_TickCount:计算机启动后经过的毫秒数, 最多为 49.7 天. 通过把 A_TickCount 保存到变量中, 经过一段时间后从最近的 A_TickCount 值中减去那个变量, 可以计算出所经过的时间. 例如:

      StartTime := A_TickCount
      Sleep, 1000
      ElapsedTime := A_TickCount - StartTime
      MsgBox, %ElapsedTime% milliseconds have elapsed.

案例

  • (34)脚本案例

    • 鼠标_选择文字释放右键自动复制
    • 倒计时休眠
    • 根据输入时间倒计时

后台

  • (33)后台窗口操作

    • 获取窗口控件中文本:ControlGetText, OutputVar, Edit19, ahk_exe XYplorer.exe

    • 后台输入:

      • 如下为
        输入公司名称

        • 一次输入,速度更快:ControlSetText,Edit1,300502,ahk_exe hexin.exe

        • 该命令一个一个输入字符串,由于软件每输入一个数字都需要时间检索,所以该命令无法正常输入:ControlSend,Edit1,300502,ahk_exe hexin.exe

    • 后台单击『必须加NA,否则目标窗口会激活』:

      • 单击坐标:ControlClick, x640 y1034,ahk_exe hexin.exe,,Left,1,NA

      • 单击控件:ControlClick, Edit1, 分析 ahk_exe hexin.exe,,Left,1,NA

    • 给后台的进程名为XMind.exe的软件发送保存命令:ControlSend,,^s,ahk_exe XMind.exe

      • 当xmind窗口为活动窗口时,该命令不起作用,可修改为ControlSend,,{CtrlDown}s{CtrlUp},ahk_exe XMind.exe
    • 给后台的标题名为变量%App%的软件发e送保存命令:ControlSend,,^s,%App%

    • 后台发送按键和操作鼠标

  • (32)前台发送按键

    • 发送保存命令『速度更-快,且不会与用户正在输入内容干涉』:SendInput,^s
    • 速度较慢:Send,^s

循环

  • (31)循环

    • 循环三次

      Loop,3
       {
          ...
      }
    • 无限循环,循环体中不能出现return和break

      Loop {
          ...
      }
    • 若在loop的循环体中加入return,则只能循环一次

      Loop
          {
              MsgBox 123
              return
          }
  • (30)跳转:

    Goto, MyLabel
    ; ...
    MyLabel:
    Sleep, 100
    ; ...
    • 可从括号内跳转到括号外,但不能从括号外跳转到括号内,也不能从一个括号跳转到另一个括号
      • 正常跳转

        {
        Goto,BiaoQian13
        BiaoQian12:
        MsgBox, BiaoQian12
        }
        BiaoQian13:
        MsgBox, BiaoQian13
      • 运行报错

        Goto,BiaoQian13
        {
        BiaoQian12:
        MsgBox, BiaoQian12
        BiaoQian13:
        MsgBox, BiaoQian13
        }
  • (29)等待鼠标按键按下

    • 超时2S,若鼠标左键未单击则ErrorLevel返回值为1,否则返回0:KeyWait, LButton, D T2
  • (28)等待键盘按键按下『只能监控键盘按键,无法监控鼠标点击』:若有列出的任一按键按下,则执行后续流程,此时ErrorLevel返回值为Match;否则超时5s后,仍然执行后续流程,但ErrorLevel返回值为Timeout;若要输入内容到活动窗口,则必须加V,设置为可见,不加V,将导致部分按键按下不起效果

    Input, UserInput,T5 V,{esc}{LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Delete}{Ins}{BS}{CapsLock}{NumLock}{PrintScreen}{Pause}{RButton},a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
    if (ErrorLevel = "Timeout")
        {
            ;鼠标单击:超时2S
            KeyWait, LButton, D
        }

获取窗口参数

  • (27)获取窗口参数

    • 根据进程名获取窗口相关参数

      • 获取窗口标题:WinGetTitle,title,ahk_exe hardware02.exe
    • 获取鼠标指向窗口的相关参数

      • 获取窗口进程名:获取的结果会存入变量OutputVar中WinGet, OutputVar, ProcessName,A
      • 获取窗口类名:WinGetClass,OutputVar, A
      • 获取窗口标题WinGetActiveTitle, OutputVar
  • (26)获取鼠标状态:直接利用内置变量%A_Cursor%可获取

    • 当前显示的鼠标光标类型. 其值为下列单词的其中一个: AppStarting(程序启动, 后台运行–箭头+等待), Arrow(箭头, 正常选择–标准光标), Cross(十字, 精确选择), Help(帮助, 帮助选择–箭头+问号), IBeam(工字光标, 文本选择–输入), Icon, No(No, 不可用–圆圈加反斜杠), Size, SizeAll(所有尺寸, 移动–四向箭头), SizeNESW(东南和西北尺寸, 沿对角线调整 2–双箭头指向东南和西北), SizeNS(南北尺寸, 垂直调整–双箭头指向南北), SizeNWSE(西北和东南尺寸, 沿对角线调整 1–双箭头指向西北和东南), SizeWE(东西尺寸, 水平调整–双箭头指向东西), UpArrow(向上箭头, 候选–指向上的箭头), Wait(等待, 忙–沙漏或圆圈), Unknown(未知). 与 size 指针类型一起的首字母表示方向, 例如 NESW = NorthEast(东北)+SouthWest(西南). 手型指针(点击和抓取) 属于 Unknown 类别.
  • (25)脚本执行完自动退出,在脚本末 尾加Exitapp,但之前不能用returnreturn相当与结束命令,会导致之后的所有脚本无法运行

找图

  • (24)找图:严格匹配,包括颜色

    ImageSearch, FoundX, FoundY, 810, 68, 1040, 358, G:\Programme\AutoHotkey\image\Snipaste_2022-07-03_16-57-31.bmp
    • 找图并单击图片中心:AHK找图坐标x,y均小于『偏移』实际坐标位置6个像素,所以图片中心坐标为(找图坐标+图片尺寸一般-6)

      CoordMode Mouse
          CoordMode,Pixel,Screen
          ImageSearch, FoundX, FoundY, 800, 39, 1110, 415, *100 %A_WorkingDir%\image\Snipaste_2022-07-03_16-57-31.bmp
          X:=FoundX+9
          Y:=FoundY+15
          ;ControlClick,x%X% y%Y%,ahk_exe Joplin.exe;后台单击
          Click,%X%  %Y%;前台单击
    • 提前设置工作路径

      ImageSearch, FoundX, FoundY, 800, 39, 1110, 415, *100 %A_WorkingDir%\image\Snipaste_2022-07-03_17-50-41.bmp
    • 若图像颜色有轻微变化,可以在图像路径前添加*n设置颜色匹配度

      ImageSearch, FoundX, FoundY, 978, 39, 1352, 415, *100 G:\Programme\AutoHotkey\image\Snipaste_2022-07-03_16-57-31.bmp
  • (23)输入当前日期:

    ;输入当前日期
    s & r::
    FormatTime, now_date, %A_Now%, MM/dd/yyyy ;获取当前时间
    Send, % now_date ;输出时间戳
    Return
  • (22)等待 Control  被释放,按键释放后才会执行后续流程KeyWait Control

    • 等待鼠标左键被按下:KeyWait, LButton, D
  • (21)按键按下与弹起

    *LWin::Send {LControl down}
    *LWin Up::Send {LControl up}
    Send, {b down}{b up}
  • (20)设置调试热键^!r::Reload ; Ctrl+Alt+R

  • (19)获取位置坐标:

    • 获取控件左上角位置:
    • 获取鼠标当前坐标位置MouseGetPos, xpos, ypos

输入指定内容

  • (18)输入指定内容(输入字符串)

    • 写入剪贴板后粘贴

      clipboard := "『』"
      Send ^v{Left}
    • 不切换输入法,实现中英文混合输入『win10支持,win11上无法输入后面的汉字』SendInput,{Text}1784961452@qq.com啊哈

    • 发送大写T,且不弹出输入法窗口:SendInput, {Text}T

    • 输入特殊符号s & 3::send {U+0E4F},特殊符号代码查看Unicode 符号表 - 所有 Unicode 字符及其代码都在一页上 (◕‿◕) SYMBL

      • 输入项目符号黑点•:send {U+2022}
      • 输入项目符号⁋:send {U+204B}
      • ↪:21AA
      • ☪:262A
      • ☯:262F
      • ♣:2663
      • ⮚:2B9A
      • ⮞:2B9E
  • (17)若软件不存在则打开,若没激活,则激活

  • (16)运行指定程序

    • 用指定软件打开指定文run,D:\Program Files\ANSYS Inc\v241\Optical Products\Viewers\XmpViewer.exe "G:\Programme\AutoHotkey\Speos\test\456.xmp"

    • 显示窗口:Run, D:\Program Files (x86)\XYplorer\XYplorer_v22.90.0100.7\XYplorer.exe

    • 不显示窗口运行『后台』:Run, D:\SoftWare\欧路词典\OLED&欧路词典-Spe.exe,,Hide

    • 运行后最小化窗口:

      Run, D:\SoftWare\欧路词典\OLED&欧路词典-Spe.exe,,Min

      • 部分软件不支持该命令:可手动设置开机启动,后在注册表中查看形成的代码,不同软件的隐藏命令不同
        • SmartRAM可用如下实现启动最小化:Run,D:\SoftWare\Advanced SystemCare 8\Suo10_SmartRAM.exe /m
        • ASC:Run,D:\SoftWare\Advanced SystemCare 8\ASCTray.exe /auto
  • (15)让鼠标滚轮实现水平滚动

    ~LControl & WheelUp::  ; 向左滚动.
    ControlGetFocus, fcontrol, A
    Loop 2  ; <-- 增加这个值来加快滚动速度.
        SendMessage, 0x114, 0, 0, %fcontrol%, A  ; 0x114 是 WM_HSCROLL, 它后面的 0 是 SB_LINELEFT.
    return
    
    ~LControl & WheelDown::  ; 向右滚动.
    ControlGetFocus, fcontrol, A
    Loop 2  ; <-- 增加这个值来加快滚动速度.
        SendMessage, 0x114, 1, 0, %fcontrol%, A  ; 0x114 是 WM_HSCROLL, 它后面的 1 是 SB_LINERIGHT.
    return
  • (14)取消格式粘贴:定义x+v为取消格式粘贴快捷键

    ;取消格式粘贴
    x & v::
    clipboard := clipboard
    send,^v
    Return
  • (13)根据不同的激活窗口执行不同的命令

    • 方案一:括号中内容需要加引号,若根据窗口进程名查找则为If WinActive("ahk_exe notepad.exe")

      ;自动化表筛选K列
      !x::  
      If WinActive("数据自动化 - Excel") 
          Send,^+l              
      ;EXCEL-Next表刷新筛选
      If WinActive("Next - Excel") 
          Send,^!l
      • 多个窗口都执行同一命令,or连接即可

        If WinActive("ahk_exe UiPath.Studio.exe") or WinActive("ahk_class XLMAIN")
                send,^!{Right}
    • 方案二:似乎不起作用

      #IfWinActive ahk_class Notepad
      ^!c::MsgBox You pressed Control+Alt+C in Notepad.
      #IfWinActive ahk_class WordPadClass
      ^!c::MsgBox You pressed Control+Alt+C in WordPad.
      #IfWinActive
      ^!c::MsgBox You pressed Control+Alt+C in a window other than Notepad/WordPad.

激活窗口

  • (12)激活窗口wintitle:

    • 根据窗口标题名称激活WinActivate,Joplin
    • 根据窗口类名激活:WinActivate, ahk_class ConsoleWindowClass
    • 根据窗口进程名称激活WinActivate, ahk_exe notepad.exe
    • 根据窗口进程路径激活:WinActivate, ahk_exe G:\Programme\AutoHotkey\AHKInfo-1.3.5.ahk
  • (11)判断当前激活的窗口标题是否为joplin,若为joplin,则执行后续流程。

    • 若指定窗口未激活,则激活;若已经激活,则最小化

    • 方案一:不管是否有激活窗口都可以执行

      ;激活雷电模拟器
      ~Space & l:: 
      IfWinNotActive ahk_exe dnplayer.exe 
       WinActivate,ahk_exe dnplayer.exe     
      Else
          WinMinimize
      Return
    • 方案二:必须当前有激活窗口,否则不起作用

      ;激活火狐
      ~Space & f:: 
      if WinActive("ahk_exe firefox.exe")
          WinMinimize    
      Else
          WinActivate,ahk_exe firefox.exe   
      Return
    • 根据窗口进程名称判断:if WinActive("ahk_exe Code.exe")其中Code.exe为窗口的进程名称

    • 根据窗口标题判断

      if WinActive("Joplin")
          MsgBox, 4, ,拾取坐标 x:%x%  y:%y% 此弹窗3秒后关闭, 3
      Return
      • 窗口标题有时候不是大漠抓取的窗口,而是strokesplus抓取的根所有者窗口标题
  • (10)消息弹窗:脚本格式最好修改为GB2312,否则中文显示乱码

    • MsgBox At least one Shift key is down.
    • MsgBox, 4, ,拾取坐标 x:%x% y:%y% 此弹窗3秒后关闭, 3
  • (9)实现按一下F1,脚本暂停,再按一下F1,脚本启用,按键替换也是一样F1::Pause

  • (8)区分左右alt键:<!为左alt,>!为右alt

发送热键/按键

  • (7)发送热键/按键:

    • 按下ctrl:Send, {Control down}
    • 发送大写T,且不弹出输入法窗口:SendInput, {Text}T
    • 多字母按键:send, {up}
    • 单按键:Send,^!1
  • (6)延迟:Sleep, 125

  • (5)注释:

    • 行注释:;注释内容

    • 段落注释

      /*
      注释段落 
      */

热键设置

  • (4)设置执行快捷键『』

    • 用双击作为热键

      ~RButton:: 
      intInterval := 500 ; 若两次连击在这个时间间隔中,则视为双击。
      if (A_PriorHotkey <> "~RButton" or A_TimeSincePriorHotkey > intInterval)
      {
          KeyWait, RButton
          return
      }
      ;TO DO……此处写入你想要热键干的事
      return
    • 热字符串:输入btw后会被替代为by the way::btw::by the way,但与组合热键b & 2::Send 『』{Left}同时使用会失效,同时占用按键b

    • ★★★★★自定义组合热键:不影响t键单独使用,且输入按下大写T不会输入小写t

      t & c::!o ;Alt+O打开欧陆词典搜词界面
      t::
      GetKeyState, state, CapsLock,T ;不管热键的第一个按键为哪个字母,该行中字母T不能改变
      if (state = "D")
          SendInput, {Text}T
      Else
          send t
      Return
    • 按下S+2,输入『』,需要加^s::^s,否则ctrl+s保存功能无法使用『当字母键作为辅助热键时,其他利用该字母的组合热键都需要重建,否则无法使用』

      S & 2::
      Send 『』
      Send,{Left}
      ^s::^s
      s::
      GetKeyState, state, CapsLock,T
      if (state = "D")
          SendInput, {Text}S
      Else
          send s
      Return
    • 自定义组合热键:不影响t键单独使用,但使用热键前会输入字母t~t & c::

    • 自定义组合热键:导致t键单独无法使用t & c::

    • 按下F1键,执行鼠标左键双击

      SC03B::
      MouseClick,left,,,2
      return
    • 热键(含命令:keywait、pause/suspend、#if系列、hotkey、settimer)

    • 热键(鼠标、操纵杆和键盘快捷键) - AutoHotkey 中文手册 - 文江博客

    • 通过AutoHotkey定义常用快捷键

鼠标单击与移动

  • (3)鼠标单击与移动

    • 按下鼠标中键:MouseClick, Middle, , , , ,D,

    • 鼠标滚动:click wheelup 2 ; 滚轮向上滚2次,数字省略则默认为1次,如click wheeldown ; 滚轮向下滚一次

    • click单击是相对于活动窗口,且无法设置鼠标移动速度;MouseClick相对于活动窗口,但可设置鼠标移动速度;DllCall相对于整个屏幕

    • 相对(FoundX,,FoundY)移动(22,22),移动速度为1,移动后单击该位置:MouseClick,,FoundX+22,FoundY+22,,1

    • 相对与当前位置移动(50,30)后单击

      MouseClick,,50,30,,1,,R

    • 获取鼠标当前位置坐标:

      • 相对于活动窗口:MouseGetPos, xpos, ypos

      • 若相当于整个屏幕,需要在上面代码之前加 CoordMode,Mouse,Screen,将鼠标位置设置为相对与整个屏幕

    • ★★★★相对于整个屏幕的鼠标移动DllCall("SetCursorPos", "int", 100, "int", 400)

    • ★★★鼠标移动到坐标200,100,移动速度为1『该方法移动坐标是相对与激活窗口的,所以如果点击后有弹窗,则移动位置会出错』:MouseMove, 200, 100,1

    • 鼠标相对当前位置移动:MouseMove, 70, 264,0, R

    • 释放鼠标右键Click, Up Right

    • 在指定坐标处点击鼠标右键Click, 100 200 Right

    • 移动鼠标光标到指定位置而不点击鼠标Click, 100 200 0

    • 在鼠标光标的当前位置点击鼠标左键Click

    • 鼠标光标要移动到的 X 和 Y 坐标后单击. 例如,

      • 设置鼠标移动速度为1:MouseClick,,190,407,,1
      • 不可设置鼠标移动速度,且移动速度慢:Click, 100 200
    • 在鼠标光标的当前位置点击鼠标右键

      • Send,{RButton}
      • 为何不起作用Click, Right
    • 按下鼠标左键不放Click, Down

    • 左键单击两次,即左键双击『详细参考鼠标单击

      • MouseClick,left,,,2

      • Click, 2

  • (2)定义脚本执行的快捷键:如^符号代表键盘的ctrl键,WIN的符号是 #,Alt 的符号是 !,Shift 的符号是 +,j代表字母j键,ctrl+j设置为热键『按下该热键后执行后续流程』:^j::

  • (1)AutoHotKey怎么编译成EXE文件,并修改文件图标『编译后图标不是添加的图标,可以利用Resource Hacker修改exe文件的图标』:AutoHotKey软件有一个工具Ahk2Exe.exe,这种工具可以把AutoHotKey脚本编译成EXE文件。Source选择ahk脚本文件,Destination为输出的exe文件。还可以通过Custom Icon设置EXE文件的图标。

                                       

<think>嗯,用户之前已经问过关于AHK中如何确定矩阵大小和位置的问题,现在他们又问到“ahk矩阵获取代码”。我需要先理解他们的具体需求。可能用户想要的是如何从矩阵中获取数据,或者如何创建矩阵,或者如何操作矩阵的元素。 回顾之前的对话,我之前已经详细介绍了如何确定矩阵的行数、列数,检查是否为矩形矩阵,以及如何定位元素和查找特定值的位置。现在用户可能希望得到更具体的代码示例,或者更深入的获取方法,比如如何动态创建矩阵,如何从文件读取数据填充矩阵,或者如何提取子矩阵等。 用户可能在使用AHK处理矩阵时遇到了具体的问题,比如数据获取不正确,或者代码运行出错。需要确保提供的代码示例正确无误,并且涵盖常见的矩阵操作场景。另外,要注意AHK的数组索引从1开始,这一点需要特别强调,避免用户因为索引问题出错。 可能还需要考虑用户对性能的需求,尤其是处理大型矩阵时的效率问题。如果用户需要处理大量数据,可能需要建议优化方法,或者推荐使用其他更适合处理矩阵的编程语言,如Python,同时说明AHK适用的轻量级场景。 另外,用户可能需要了解如何将矩阵数据输出或保存,比如如何将矩阵转换为字符串显示,或者写入文件。这些也是获取矩阵数据的一部分。需要检查之前的回复是否已经涵盖这些内容,如果没有的话,需要补充相关代码示例。 最后,要确保回答结构清晰,步骤明确,代码示例正确且易于理解。使用中文回答,避免专业术语过多,必要时进行解释。同时提醒用户注意AHK的特性,如索引从1开始,避免常见的错误。</think>在 AutoHotkey (AHK) 中,矩阵通过嵌套数组实现,其操作逻辑与常见编程语言略有不同(例如索引从 `1` 开始)。以下是 **矩阵创建、元素获取和遍历** 的核心代码示例: --- ### 一、**矩阵的创建** #### 1. 直接定义矩阵 ```ahk ; 定义一个3x3矩阵 matrix := [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] ; 不规则矩阵(非矩形) matrixIrregular := [ [1, 2], [3, 4, 5], [6] ] ``` #### 2. 动态生成矩阵 ```ahk rows := 3 cols := 4 dynamicMatrix := [] Loop % rows { row := [] Loop % cols { row.Push(A_Index) ; 填充1到cols的值 } dynamicMatrix.Push(row) } ; 结果:[[1,2,3,4], [1,2,3,4], [1,2,3,4]] ``` --- ### 二、**获取矩阵元素** #### 1. 直接通过索引访问 ```ahk ; 获取第2行第3列的值(注意索引从1开始) value := matrix[2][3] ; 结果为6 MsgBox % value ``` #### 2. 遍历所有元素 ```ahk output := "矩阵内容:`n" for rowIndex, row in matrix { for colIndex, element in row { output .= "[" rowIndex "," colIndex "] = " element "`n" } } MsgBox % output ``` #### 3. 提取整行或整列 ```ahk ; 获取第2行 row2 := matrix[2] ; 结果为[4,5,6] ; 获取第3列(需遍历) col3 := [] for row in matrix { col3.Push(row[3]) ; 注意检查列是否存在! } ; 结果为[3,6,9] ``` --- ### 三、**矩阵的验证与保护** #### 1. 防止索引越界 ```ahk targetRow := 5 targetCol := 2 if (targetRow > matrix.Length() || targetRow < 1) { MsgBox 行索引 %targetRow% 无效! } else if (targetCol > matrix[targetRow].Length() || targetCol < 1) { MsgBox 列索引 %targetCol% 无效! } else { MsgBox 值:% matrix[targetRow][targetCol] } ``` #### 2. 检查是否为矩形矩阵 ```ahk isRectangular := true firstCols := matrix[1].Length() for row in matrix { if (row.Length() != firstCols) { isRectangular := false break } } MsgBox % isRectangular ? "是标准矩形矩阵" : "存在不规则行" ``` --- ### 四、**实用函数封装** #### 1. 获取矩阵维度 ```ahk GetMatrixSize(matrix) { if (matrix.Length() = 0) return "空矩阵" rows := matrix.Length() cols := matrix[1].Length() return {rows: rows, cols: cols} } size := GetMatrixSize(matrix) MsgBox 行数:% size.rows `n列数:% size.cols ``` #### 2. 查找元素位置 ```ahk FindInMatrix(matrix, target) { positions := [] for rowIndex, row in matrix { for colIndex, element in row { if (element = target) { positions.Push({row: rowIndex, col: colIndex}) } } } return positions } result := FindInMatrix(matrix, 5) if (result.Length() > 0) { pos := result[1] MsgBox 找到值5,位置:第%pos.row%行,第%pos.col%列 } ``` --- ### 五、**注意事项** 1. **索引起点**:AHK 数组默认从 `1` 开始,与大多数编程语言不同。 2. **性能限制**:AHK 的数组操作效率较低,建议: - 小型矩阵(如10x10以内)直接操作 - 大型数据改用其他语言(如 Python + NumPy) 3. **非矩形处理**:若行长度不一致,需在遍历时动态检查 `row.Length()`。 通过上述代码,可以灵活实现 AHK 中矩阵的创建、元素获取和基础分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值