2014年8月16日 星期六

Autohotkey: 基本面

前言

  • 講了幾篇後,朋友試寫script一直遇到問題,我才發現最基本的東西沒講 orz
  • 其實最穩的方式還是讀autohotkey的說明檔,尤其autohotkey_L有簡體中文版本的說明,英文苦手可以考慮。
  • 以下列舉一些要點,但如果沒有詳細看說明檔還是可能會遇到問題,總之見招拆招!

環境設定

  • 之前這篇有提到過,目前所用的免安裝版主程式是Autohotkey_L Unicode 32bit,編輯器是SciTE4AutoHotkeySciTE的資料夾應該要放在Autohotkey內。如果都是安裝版,要先安裝autohotkey再裝SciTE,SciTE會自動裝到適當的地方。
  • 副檔名ahk的檔案本質上就是純文字檔,滑鼠點兩下可能會發生幾種事情:
    • 如果有安裝autohotkey、SciTE,可以直接執行這個script,或者直接打開SciTE編輯ahk檔案。
    • 如果用免安裝版,剛下載下來時電腦並不認得ahk檔,要選擇開啟ahk檔的程式(autohotkey、SciTE或者任何一種文字編輯程式)。
    • 如果是像我一樣裝在隨身碟裡到處跑,通常的流程是打開SciTE,然後直接把ahk檔拖曳到SciTE裡開啟,debug或執行都可以直接用SciTE完成(所以才說SciTE資料夾和autohotkey.exe要放一起)。
  • 在沒有裝autohotkey的電腦要能直接執行script,就要把ahk檔「編譯」(compile)成exe檔,其實本質上就是把autohotkey主程式和純文字script綁在一起。
    • 在SciTE裡按Ctrl + F7可以compile(其實是用ahk2exe.exe來完成的),產生的exe檔和ahk檔在同一資料夾。
    • Compile有時候會出現錯誤,常見的原因包括原本的exe還在執行中(要先關閉),或是電腦中執行的程式衝到,後者就不容易解決了…
    • 理論上exe檔並沒有什麼加密的功能,原始的程式碼其實還是能復原,ahk2exe.exe加入參數能讓compile時加入密碼,保密性會比較好一些。
    • EXE檔可以附加客製化的圖示(ico檔,128*128 pixels以下),通常可以用icon編輯軟體,搭配這個網站,然後用這個把icon加進exe檔。

Script結構

  • 通常最開頭會用#include來引用前人的智慧結晶,例如同個資料夾func.ahk裡面有一些函數定義,#include func.ahk就相當於func.ahk裡面的內容複製貼上到#include這一行。
    • 也較好的方法是在ahk檔同一層或者主程式Autohotkey.exe同一層新增資料夾Lib,然後把func.ahk放進去,這樣的話可以用語法#include <func>
  • 其他#開頭的指令也都會優先處理,常用的有
    • #NoTrayIcon:程式執行時不會在螢幕右下角那區出現小圖示,所以TrayTip這個指令也會無效。
    • #Persistent:如果script沒有hotkey、hotstring、GUI,程式執行完就會自動結束,加了這指令,程式不會直接結束變成idle狀態。
    • #SingleInstance:如果程式執行中,又再滑鼠點兩下同一個exe檔,會出現message box問是否取代原本執行中的程式,有這個指令則可以讓message box不出現,參數force、ignore、off分別對應「新的取代舊的」、「繼續執行舊的,不執行新的」、「新的執行新的,舊的執行舊的」。
  • Hotkey、hotstring、function定義的block可以放在script裡任何地方皆有作用,但放的地方不對可能讓其他非hotkey/hotstring的script沒有執行到(下面會說明),建議把同類型的放在一起,而且都放在script底端的位置。
    • SciTE中,在某個label或function名稱按滑鼠中鍵或Shift + Enter,可以直接跳到label或function定義的地方;或者在空白處按,會出現查詢框。
  • 想像script中把hotkey、hotstring、function定義的block都拿掉後,留下的script(auto-execution section)會從最上面開始執行,直到遇到return、exit或是hotkey/hotstring
    • 如果#include裡的檔案有空閒的return(不是hotkey、hotstring、function內的),那自己的script就等於不會執行到。
    • 如果是先用gosub跳到subroutine,subroutine的return會回到剛才gosub的那行,script不會停下來。

Threads

  • 理論上同一個process中可以有一個以上的thread(執行緒),每個執行緒可以各自執行自己的任務,但也有相對應的缺點。
  • Autohotkey_L只有單一執行緒,在auto-execution section執行中跳出message box、input box,程式就相當於被暫停,或者執行中遇到一個耗費時間的loop(甚至根本是無窮迴圈),那程式就沒辦法做其他事。
  • 事實上Autohotkey_L會模擬多執行緒,有一些block會以新的thread來執行,包括hotkey/hotstring、GUI events、SetTimer引發的subroutine、menu引發的subroutine。所以說如果程式卡在loop或是message box,hotkey還是能被trigger,SetTimer反覆執行的subroutine還是繼續。
  • 有些外掛可以更模擬多執行緒,例如WorkerThread(事實上是藉由重覆執行exe檔)。只有Autohotkey_H才能使用真正的執行緒。

語法速成

var = abc
    • abc這個字串儲存到var變數。
var = %var2%
    • var2這個變數代表的值取出,然後儲存到var變數。
if a = 2
{
    …
}
    • 比對變數a的值是否等於2,大括號不能和if在同一行。
MsgBox test
    • 跳出message box,內容是test。
InputBox,OutputVar,%title%
    • 出現input box,標題為變數title的值,注意OutputVar這個參數是一個變數的名稱,通常不用%,除非要用的變數的名稱是存在某一個變數。
  • Non-expression:
var := "abc"
    • abc這個字串儲存到var變數,要用運算元 := 而且字串前後要加雙引號。
var := var2
    • var2這個變數代表的值取出,然後儲存到var變數。
if (a = b) {
    …
}
    • 比對變數a的值是否等於變數b的值,整個條件式要有小括號圍起來才視為expression,大括號可以和if在同一行。
MsgBox % test
    • %後面加空格,會視為expression。
MouseClick, L, % x, % y, 1
    • %後面加空格,作用的範圍只有那一個參數。
  • Autohotkey官方版的array純粹是單純的變數,只不過變數名稱最後一個字元是數字,autohotkey_L支援object(物件)的array,使用起來比較有效率。主要有幾個重點:
    • 一般的array以 [ ] 括起來,例如arr := [ 5, 4, "3" , "abc" ],index從1開始遞增,所以arr[2]的值是4,而arr[4] := "bcd"會蓋過本來的"abc"。
    • Associative array有點像dictionary,指定一個key對應一個value,例如 arr := { 1: "a", k: v },以大括號括起來,key和value間以冒號隔開,key的部分是non-expression,預設視為字串,value的部分是expression,arr["k"]儲存的是變數v的值。

1 則留言:

  1. 學長,能不能做出一個一目了然的checkbox or下拉式選單
    讓使用者就算一開始不熟悉 (或腦袋不清楚時)
    也能直觀點選,避免錯誤

    就像angioroom耗材的那張表之類的?

    回覆刪除