##title##

顯示具有 軟體 | Autohotkey 標籤的文章。 顯示所有文章
顯示具有 軟體 | Autohotkey 標籤的文章。 顯示所有文章

2020年5月20日

Autohotkey:依序產生變數,以及依序取出變數

可以透過:=左邊也是變數的方式來組合變數,例如透過loop的方式,把行列的值拿來拼成變數,像是%1_1%,%1_2%,%2_1%,%2_2%。

但要用依序讀取則需要特殊寫法,在最前面加一個%。

範例如下:


F1::
Loop, Read, %A_ScriptDir%\test.txt
{
LineNumber := A_Index ;先令Loop, Read得到的A_Index(此處為行數)為變數LineNumber
Loop, parse, A_LoopReadLine, CSV ;以CVS格式切每行內容(用逗號切)
 {
 if A_Index = 1 ;意思是擷取每行第1個(在此為時間)
 %LineNumber%_%A_Index% := A_LoopField
 if A_Index = 2 ;意思是擷取每行第2個(在此為內容)
 %LineNumber%_%A_Index% := A_LoopField
 }
}
front = 1
loop, 2
{
back = 1
loop, 2
 {
 msgbox, % %front%_%back% ;組合變數的方式在最前面加一個%
 back := back + 1
 }
front := front + 1
}
return


2020年5月13日

Autohotkey:以GUI輸入文字作為變數

嘗試把一個檔案自動化檢查MD5,並加上註記寫入txt檔作為紀錄,但記錄時需要打字,所以研究了一下如何以GUI輸入文字作為變數。


; ==============================GUI全域設定==============================
GuiCloseOK:
GuiControlGet, MyEdit ;輸入內容存為變數MyEdit
Gui, Destroy
return
GuiCloseCancel:
MyEdit:=""
Gui, Destroy
return
; ==============================全域設定結束==============================

::/test::
Gui, Color, White
Gui, Add, Edit, x22 y19 w240 h120 vMyEdit, 異動了甚麼? ;GUI內文,輸入內容寫入MyEdit
Gui, Add, Button, x22 y179 w100 h30 gGuiCloseOk, Ok ;GUI點OK觸發gGuiCloseOk
Gui, Show, w286 h231, log ;GUI標題
WinGetPos,,, Width, Height, log ;取得視窗座標
WinMove, log,, (A_ScreenWidth/2)-(Width/2), (A_ScreenHeight/2)-(Height/2) ;調整視窗座標
WinWaitClose, log
Gui, Destroy ;關閉GUI
StringReplace, MyEdit, MyEdit, `r`n, , All ; 移除MyEdit中所有的 CR+LF
Sleep, 5000 ;卸載後無法馬上解析檔案,停留5秒
; 以HashMyFiles.exe將目標檔案輸出MD5至txt,排除SHA1、CRC32、SHA256、SHA512、SHA384
Run "%A_ScriptDir%\..\Tools\hashmyfiles-x64\HashMyFiles.exe" /SHA1 0 /CRC32 0 /SHA256 0 /SHA512 0 /SHA384 0 /SaveDirect /file %DropboxDIR%\%file% /scomma %DropboxDIR%\temp.txt
SetTimer, fileMD5check, -10000 ;10秒後執行fileMD5check
return

fileMD5check:
Loop, Read,  %DropboxDIR%\temp.txt
{
LineNumber := A_Index ;先令Loop, Read得到的A_Index(此處為行數)為變數LineNumber
Loop, parse, A_LoopReadLine, CSV ;以CVS格式切每行內容(用逗號切)
 {
 if A_Index = 1 ;意思是擷取每行第1個(在此為檔名)
 FileAppend, %A_YYYY%/%A_MM%/%A_DD% %A_Hour%:%A_Min%:%A_Sec%@%A_ComputerName%`,%A_LoopField%`,,  %DropboxDIR%\md5.txt ;時間、電腦名稱、檔名寫入文字文件
 if A_Index = 2 ;意思是擷取每行第2個(在此為MD5)
 FileAppend, %A_LoopField%`,%MyEdit%`n, %DropboxDIR%\md5.txt ;MD5、輸入的文字寫入文字文件
 }
FileDelete,  %DropboxDIR%\temp.txt
Gui, +AlwaysOnTop +Disabled -SysMenu +Owner  ; +Owner 避免顯示任務欄按鈕.
Gui, Color, White
Gui, Add, Text,, file MD5 hash value checksum done!`r`nMD5 is %A_LoopField%`r`n(2秒後自動關閉)
Gui, Show, NoActivate, MD5 Hash  ; NoActivate 讓當前活動窗口繼續保持活動狀態.
Sleep, 2000
Gui, Destroy ;關閉GUI
Return

參考資料:

2018年12月7日

Autohotkey:日期轉換加上星期,例如將11/23→11/23(五)

因為常常需要key日期然後加上星期,所以寫了這個很懶惰的東西。

感謝PTT的LPH66大大協助優化腳本。



F1:: ;win+shift+w,將所選日期轉換添加星期,以當年計算 ex:11/23→11/23(五)
OldClip = %Clipboard% ;把目前的剪貼簿內容先存起來
sleep, 200
Send, ^c
sleep, 200
Loop, Parse, Clipboard, /,
{
 if A_Index <= 1 ;第1個循環存入v_month
 v_month = %A_LoopField%
 if A_Index <= 2 ;第2個循環存入v_day
 v_day = %A_LoopField%
}
if v_month < 10 ;小於10加0
v_month = 0%v_month%
if v_day < 10 ;小於10加0
v_day = 0%v_day%
if A_MM > 11 ;如果當前月份大於11(也就是12月)
 {
 if v_month < 6 ;如果要輸入的月份小於6(也就是1~5月)
  {
  v_year := A_YYYY+1
  }
 else ;如果要輸入的月份大於等於6(也就是6~12月)
  {
  v_year := A_YYYY
  }
 }
else ;當前月份小於等於11(也就是1~12月)
 {
 v_year := A_YYYY
 }
FormatTime, TimeString,%v_year%%v_month%%v_day%, WDay
TimeString := TimeString-1
V_CWday := SubStr("日一二三四五六", TimeString+1, 1) ;從字串開始向右複製不超過長度1的子字符串至V_CWday
sleep, 200
Clipboard = %Clipboard%(%V_CWday%)
sleep, 200
Send, ^v
Clipboard = %OldClip% ;恢復先前剪貼簿內容
return



其實還可以再優化一下,例如判斷是年底的最後一個月的時候如果輸入的月份小於6月以前,就用明年搜尋星期。有時間再調整吧。


2018/12/26補充:已調整為月底會改為隔年。邏輯是如果當前月份大於11(也就是12月),且要輸入的月份小於6(也就是1~5月),則用隔年來計算。

2018年3月22日

Autohotkey:有UI介面的自動化外掛

寫了一個公司系統的自動化外掛,突破了幾個功能。


  1. 實現用Chrome讀取條顏色判斷時間
  2. 用Chrome搜尋文字功能來定位座標
  3. UI介面,文字顯示進度與花費時間
  4. 計算預期完成時間
  5. 圖像化進度條顯示進度
  6. 自動輸出可節省的動作和時間純文字日誌


雖然有些功能是該工具介面限定,但有些概念還是共通,在此紀錄一下。
F12::
V_PluginName = 權限管理外掛
V_Version = v6.3
V_Game = AAA, BBB ;遊戲
V_Name = Aaron, Claire, Jacky ; 名字
V_Function = 功能1, 功能2 ; 功能名稱
V_StartTime = %A_Now% ;紀錄開始時間
CoordMode ,Pixel, Screen ;設置座標模式相對於桌面 (整個屏幕)
CoordMode ,Mouse, Screen ;設置滑鼠座標模式相對於桌面 (整個屏幕)
BlockInput ,Mouse
WinWait, 9sPlay - Google Chrome, 
IfWinNotActive, 9sPlay - Google Chrome, , WinActivate, 9sPlay - Google Chrome, 
WinWaitActive, 9sPlay - Google Chrome, 
Loop, Parse, V_Game, `, ;用 "," 解析 V_Game 字串並計算切割後的字串數量
 {
 V_GameNum =%A_Index%
 }
Loop, Parse, V_Name, `, ;用 "," 解析 V_Name 字串並計算切割後的字串數量
 {
 V_NameNum =%A_Index%
 }
Loop, Parse, V_Function, `, ;用 "," 解析 V_Function 字串並計算切割後的字串數量
 {
 V_FunctionNum =%A_Index%
 }
V_ActionNum := V_GameNum*(V_NameNum+V_FunctionNum) ;計算動作數量
Gui, Color, White ;GUI顏色設定為白色
Gui, Add, Text, W600, 新增項目:%V_Game%`r`n`r`n人員:%V_Name%`r`n`r`n功能:%V_Function%`r`n ;新增本次工作內容文字
Gui, Add, Progress, vV_MyProgress w600 ;新增進度條至變量 V_MyProgress (在字母 V 後指定一個變量名, 此變量將為全局變量)
Gui, Add, Text, vV_MyText W600 Right  ;新增文字至變量 V_MyText (在字母 V 後指定一個變量名, 此變量將為全局變量)
Gui +Resize +MaxSize640x480 +AlwaysOnTop -SysMenu ;GUI設定尺寸、保持最上層、去掉系統選單
Gui, Show, X-900 Y300 NoActivate, %V_PluginName% %V_Version% ;NoActivate 讓當前活動窗口繼續保持活動狀態
Loop, Parse, V_Game, `, ;用 "," 解析 V_Game 字串並執行本次工作內容
 {
 V_CurrentTime = %A_Now% ;紀錄當前時間
 EnvSub, V_CurrentTime, %V_StartTime%, S ;以秒計算總共花了多少時間,並更新至 V_CurrentTime
 V_EstimateTime := (V_CurrentTime//(A_Index)-1)*V_GameNum ;預測時間公式:(當前時間 V_CurrentTime//第 A_Index 個項目-1)*V_GameNum. (//)表示為向下捨除
 V_ProgressPercentage := (A_Index/V_GameNum)*100 ;進度百分比公式:(A_Index 當前進度數/V_GameNum 總遊戲數)*100
 GuiControl,, V_MyProgress, %V_ProgressPercentage% ;更新進度條
  if A_Index <= 1
  {
  GuiControl,, V_MyText, 目前執行到第%A_Index%/%V_GameNum%個項目"%A_LoopField%",已使用時間計算中,預期時間計算中 ;更新進度文字至變量 V_MyText
  Gosub, L_AutoAction ;開權限主要動作
  }
 else
  {
  GuiControl,, V_MyText, 目前執行到第%A_Index%/%V_GameNum%個項目"%A_LoopField%",已使用%V_CurrentTime%秒,預期使用%V_EstimateTime%秒 ;更新進度文字
  Gosub, L_AutoAction ;開權限主要動作
  }
 }
V_CurrentTime = %A_Now% ;紀錄結束時間
EnvSub, V_CurrentTime, %V_StartTime%, S ;計算總共花了多少時間
MsgBox, 262144, %V_PluginName% %V_Version%, 新增項目:%V_Game%`r`n`r`n人員:%V_Name%`r`n`r`n功能:%V_Function%`r`n`r`n太棒了!你又節省了%V_CurrentTime%秒!
Gui,Destroy
FileAppend, %A_YYYY%/%A_MM%/%A_DD% %A_Hour%:%A_Min%:%A_Sec%`, %V_Version% save action`,%V_ActionNum% `, and time(second)`, %V_CurrentTime%`n, %A_ScriptDir%\9SplayBackgroundPluginLog.txt ;輸出日誌
Run, %A_ScriptDir%\9SplayBackgroundPluginLog.txt ;開啟日誌
Return

L_SaveFind1: ;搜尋字串後尋找搜尋色塊
OldClip = %Clipboard% ;把目前的剪貼簿內容先存起來
Clipboard = %A_LoopField% ;將字串替換至剪貼簿
Sleep, 300
send, ^f ;搜尋字串
Sleep, 300
send, ^v ;貼上複製內容
Sleep, 700
PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -746, -897, -36, 300, 0x3296FF, 3, Fast ;尋找搜尋色塊
Return

L_SaveFind2: ;點擊座標修正後的勾選框
Sleep, 300
mousemove,  %V_NewColorCoordinateX%, %V_NewColorCoordinateY%
Mouseclick, Left, %V_NewColorCoordinateX%, %V_NewColorCoordinateY% ;點擊座標修正後的勾選框
Sleep, 300
Clipboard = %OldClip% ;恢復先前剪貼簿內容
Return

L_AutoAction: ;開權限主要動作
Mouseclick, Left,  -924,  -871, , 1 ;點項目選單
Sleep, 300
Send, %A_LoopField%{ENTER}
Sleep, 700
Loop ;判斷讀取條是否還在
 {
 PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -999, 710, -989, 715, 0xFFFFFF, 3, Fast ;搜尋白色底色
 if ErrorLevel ;如果讀取條還在
  {
  Sleep, 300
  }
 else
  {
  Loop, Parse, V_Name, `, ;用 "," 解析 V_Name 字串後搜尋,並點擊座標修正後的勾選框
   {
   Gosub L_SaveFind1
   V_NewColorCoordinateX := V_ColorCoordinateX-62 ;名字座標修正
   V_NewColorCoordinateY := V_ColorCoordinateY+5 ;名字座標修正
   Gosub L_SaveFind2
   }
  Loop, Parse, V_Function, `, ;用 "," 解析 V_Function 字字串後搜尋,並點擊座標修正後的勾選框
   {
   Gosub L_SaveFind1
   V_NewColorCoordinateX := V_ColorCoordinateX-42 ;功能座標修正
   V_NewColorCoordinateY := V_ColorCoordinateY+5 ;功能座標修正
   Gosub L_SaveFind2
   }
  PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -746, -897, -36, 300, 0xDEC05B, 3, Fast ;搜尋確定更改
  V_NewColorCoordinateX := V_ColorCoordinateX+25 ;確定更改座標修正
  V_NewColorCoordinateY := V_ColorCoordinateY+10 ;確定更改座標修正
  Sleep, 300
  Mouseclick, Left, %V_NewColorCoordinateX%,%V_NewColorCoordinateY% ;點確定更改
  Break
  }
 }
Loop ;判斷修正完成蓋台還沒出現
 {
 PixelSearch, V_ColorCoordinateX, V_ColorCoordinateY, -999, 710, -989, 715, 0x7F7F7F, 3, Fast ;搜尋灰色蓋台色
 if ErrorLevel ;如果修正完成蓋台還沒出現
  {
  Sleep, 300
  }
 else
  {
  Mouseclick, Left, -924,  -855, , 3 ;把蓋台按掉
  Sleep, 1000
  Break
  }
 }
Return

2016年3月1日

Autohotkey:CoordMode,延伸螢幕座標控制

用AU3_spy看Mouse Position的On Screen座標,發現如果座標是在延伸螢幕的座標,例如:

mousemove, -100, -500

游標控制都會失敗,例如滑鼠游標會跑到延伸螢幕的左上角。

但如果是在主要螢幕就不會有這個問題了,PTT問了下,mkz6大大提供了解法。

設置:
CoordMode, Mouse, Screen


CoordMode說明
为多个命令设置坐标模式, 相对于活动窗口还是屏幕.
CoordMode, ToolTip|Pixel|Mouse|Caret|Menu [, Screen|Window|Client]
参数

Param1
ToolTip: 作用于 ToolTip.
Pixel: 作用于 PixelGetColor, PixelSearch 和 ImageSearch.
Mouse: 作用于 MouseGetPos, Click 以及 MouseMove/Click/Drag.
Caret: 作用于内置变量 A_CaretX 和 A_CaretY.
Menu: 作用于为 "Menu Show" 命令指定坐标的时候.

Param2
如果省略 Param2, 则默认为 Screen.
Screen: 坐标相对于桌面 (整个屏幕).
Relative: 坐标相对于活动窗口.
Window [v1.1.05+]: 与 Relative 效果相同, 但由于含义清晰, 因此建议使用.
Client [v1.1.05+]: 坐标相对于活动窗口的工作区, 其中不包括标题栏, 菜单栏 (如果它含有标准菜单栏的话) 和边框. Client 坐标模式较少依赖于操作系统版本和主题.

备注
如果没有使用此命令, 除了另外注明的那些外的所有命令 (例如 WinMove 和 InputBox) 都使用相对于活动窗口的坐标模式.
每个新运行的 线程 (例如 热键, 自定义菜单项 或 定时 子程序) 都会以此命令的默认设置开始. 通过在脚本的自动执行段 (脚本的顶部) 使用此命令可以改变这个默认设置.
相关
Click, MouseMove, MouseClick, MouseClickDrag, MouseGetPos, PixelGetColor, PixelSearch, ToolTip, Menu

示例
CoordMode, ToolTip, Screen ; 把 ToolTips 放置在相对于屏幕坐标的位置: CoordMode, ToolTip ; 和上面效果相同, 因为 "screen" 是默认的坐标模式.

2016年2月28日

Autohotkey:大量BT種子批量下載並改檔名腳本

這個腳本主要是為了用來解決我常有大量種子下載需求。

因為在下載種子的時候,通常我就會把我想要存成的檔名或資料夾名稱直接改為種子名稱。但是當有幾十個種子要下載的時候,我必須重複這樣的動作:
  1. 按F2。
  2. Ctrl+C複製種子檔名。
  3. Enter開啟種子。
  4. 檢視這是單一檔案或是一個資料夾。如果是資料夾的話直接貼上名稱,但如果是單一檔案就只貼上名稱到副檔名前,所以如果是手動的話這時候會比較麻煩。因為只有單一檔案這樣的種子它的路徑可能會是「C:\Download\XXXX123.avi」,就算你的設定是隱藏副檔名,你直接貼上,它下載下來的檔案會變成沒有副檔名「XXXX123」這樣的檔案。
  5. 選擇想要保留的檔案(因為有時候種子裡會有很多垃圾檔)按Enter。
  6. 回到放種子的資料夾選下一個檔案,繼續上述動作。
其他地方的自動化都還蠻好處理的,但其中最麻煩的部分是第4點,這裡用到了判斷字串、計算字串長度以及修改字串的技巧。

另外一個比較麻煩的是第6點,這裡需注意到SetTitleMatchMode的值,因為需要用到包和或用更多條件精準判斷視窗名稱的技巧。另一個是Gosub所在位置,因為很假掰的用了else,結果一開始一直不知道為什麼「Gosub, avmove」沒有辦法被啟用,結果是因為放的位置錯了。(我原本放到avcopy最後的return之前)

所以前前後後可能研究了好幾個小時吧,現在只剩不知道怎麼寫如何選擇想要保留的檔案。(如果大概知道怎麼做得大大也可以分享一下大概可以怎麼做)

但目前的做法已經解決大部分問題,還是蠻有成就感的,來分享一下作法,大家以後如果碰到類似問題可參考。

F8:: ;種子自動貼檔名:啟動
Gosub, avcopy
return

avcopy: ;種子自動貼檔名(查字串中是否有副檔名判斷為單獨檔案或是資料夾)
Send, {F2} ;編輯檔名
sleep, 500
Send, ^{C} ;複製檔名
filename = %clipboard%
Send, {Enter}{Enter} ;開啟種子
sleep, 888
Send, ^{A} ;全選路徑
sleep, 300
Send, ^{C} ;複製路徑
sleep, 300
if clipboard contains .wmv,.mp4,.avi,.mkv,.rmvb,.rm ;如果完整路徑中包含所列副檔名,則判定為只有單一檔案
{
 StringGetPos, pos, clipboard, ., R ;從最右邊開始搜尋點的位置
 StringLen, length, clipboard ;計算字串長度
 npos := length-pos ;長度減掉位置
 StringRight, fileextension, clipboard, npos  ; 把clipboard中名稱去掉檔名丟到變數fileextension
 clipboard = %filename%%fileextension% ;把檔名加上副檔名後丟到剪貼簿
 sleep, 300
 Send, ^{V} ;貼上種子檔名&副檔名內容
 Gosub, avmove
 return
}
else
{
 clipboard = %filename%
 sleep, 300
 Send, ^{V} ;貼上種子名稱
 Gosub, avmove
    return
}
Gosub, avmove
return

avmove: ;種子自動化:確認並移動到下一個種子
SetTitleMatchMode, 2 ;SetTitleMatchMode包含模式
WinWait, 增加新的Torrent ahk_class #32770
sleep, 100
WinWaitClose, 增加新的Torrent ahk_class #32770
sleep, 100
SetTitleMatchMode, 3 ;SetTitleMatchMode準確匹配模式
WinWait, Torrent ahk_class CabinetWClass, 
IfWinNotActive, Torrent ahk_class CabinetWClass, , WinActivate, Torrent ahk_class CabinetWClass, 
WinWaitActive, Torrent ahk_class CabinetWClass, 
Sleep, 100
Send, {Down}
Gosub, avcopy
return

2015年7月24日

Autohotkey:熱鍵

熱鍵


符號 說明
# Win (Windows 徽標鍵). 在 v1.0.48.01+, 對於 Windows Vista 及以上版本, 包含 Windows 鍵的熱鍵 (例如 #a) 會等待 Windows 鍵被釋放後才發送任何包含 "L" 鍵擊的文本. 這樣避免了這種熱鍵中的 Send 鎖定 PC. 這種行為適用於除 SendPlay (這裡不需要) 和 盲從模式 外的所有發送模式.
! Alt
^ Control
+ Shift
& 和符號可以用來組合任意兩個按鍵或鼠標按鈕, 讓它們成為自定義熱鍵. 請參閱 後面 瞭解詳情. 在 Windows 95/98/Me 中這樣的熱鍵會被忽略 (無法激活).
< 使用成對按鍵中左邊的那個. 例如
> 使用成對按鍵中右邊的那個. 此符號在 Windows 95/98/ME 中會被忽略.
<^>! AltGr (alternate graving). 如果您鍵盤佈局中含 AltGr 鍵而非右 Alt 鍵, 那麼這一系列符號一般可以用來表示 AltGr (需要 Windows NT/2k/XP 或更高版本). 例如:
   
  <^>!m::MsgBox You pressed AltGr+m.
  <^
   
  或者, 讓 AltGr 自己成為熱鍵, 請使用下面的熱鍵 (不像上面出現的任何熱鍵):
   
  LControl & RAlt::MsgBox You pressed AltGr itself.
   
* 通配符: 即使附加的修飾鍵被按住也能激發熱鍵. 這常與 重映射 按鍵或按鈕組合使用. 例如:
   
  *#c::Run Calc.exe  ; Win+C, Shift+Win+C, Ctrl+Win+C 等都會觸發此熱鍵.
  *ScrollLock::Run Notepad  ; 即使在按住其他鍵時按下 ScrollLock 也會觸發此熱鍵.
   
  此符號在 Windows 95/98/ME 中會被忽略.
~ 激發熱鍵時,不會屏蔽(被操作系統隱藏)熱鍵中按鍵原有的功能。在下面的兩個例子中, 用戶的鼠標按鈕點擊會被發送到活動窗口:
   
  ~RButton::MsgBox You clicked the right mouse button.
  ~RButton & C::MsgBox You pressed C while holding down the right mouse button.
   
  注意: 1) 與其他前綴符號不同, 可以在某些熱鍵的 變體 中使用顎化符前綴但其他的不使用; 2) 代替 alt-tab 的特殊熱鍵總是忽略顎化符前綴; 3) 顎化符前綴在 Windows 95/98/ME 上被忽略
$ 通常只在腳本使用 Send 命令發送包含了熱鍵自身的按鍵時才需要使用此符號, 此時可以避免觸發它自己. $ 前綴強制使用 鍵盤鉤子 來實現此熱鍵, 作為一個副作用這樣避免了 Send 命令觸發它自己. $ 前綴相當於在此熱鍵定義之前的某個位置指定了 #UseHook.
   
  [v1.1.06+]: #InputLevel 和 SendLevel 對 Send 命令是否觸發熱鍵和熱字串提供了額外的控制功能.
UP 單詞 UP 可以跟在熱鍵名後面使得在釋放按鍵時觸發熱鍵, 而不是按下時. 下面的例子把 LWin 重映射 為 LControl:
   
  *LWin::Send {LControl Down}
  *LWin Up::Send {LControl Up}
   
  "Up" 也可以用於普通熱鍵中, 例如: ^!r Up::MsgBox You pressed and released Ctrl+Alt+R. 它還可以用在 組合鍵 (例如 F1 & e Up::)
   
  限制: 1) "Up" 不能和 有些桿按鈕 一起使用; 2) "Up" 需要 Windows NT4/2000/XP 或更高版本; 且 3) 沒有普通/按下熱鍵副本的 "Up" 熱鍵會完全接管那個熱鍵以防止它的按鍵卡住. 避免這種情況的一種方法是添加 顎化符前綴 (例如 ~LControl up::)
   
  相關提示, 類似於上面的一種技術是讓熱鍵成為前綴鍵. 好處是儘管熱鍵會在按鍵鬆開時激發, 但僅在您之前按住此前綴鍵時沒有按其他任何鍵的情況下才會如此. 例如:
   
  LControl & F1::return  ; 通過把左 control 鍵放在 "&" 前面至少一次來讓它成為前綴鍵.
  LControl::MsgBox You released LControl without having used it to modify any other key.
   

2015年4月3日

Autohotkey:Key Names&轉義序列

Key Names



按鍵名稱
生成的鍵擊
{F1} - {F24}
功能鍵. 例如: {F12} 表示 F12 鍵.
{!}
!
{#}
#
{+}
+
{^}
^
{{}
{
{}}
}
{Enter}
主鍵盤上的 ENTER 鍵
{Escape} 或 {Esc}
ESCAPE
{Space}
SPACE (僅對於要發送的按鍵序列開始或末尾的空格才需要這樣表示, 而序列中間的空格是原義的)
{Tab}
TAB
{Backspace} 或 {BS}
Backspace
{Delete} 或 {Del}
Delete
{Insert} 或 {Ins}
Insert
{Up}
主鍵盤上的向上鍵
{Down}
主鍵盤上的向下鍵
{Left}
主鍵盤上的向左鍵
{Right}
主鍵盤上的向右鍵
{Home}
主鍵盤上的 Home 鍵
{End}
主鍵盤上的 End 鍵
{PgUp}
主鍵盤上的向上翻頁鍵
{PgDn}
主鍵盤上的向下翻頁鍵


{CapsLock}
CapsLock (在 NT/2k/XP 中使用 SetCapsLockState 更可靠). 發送 {CapsLock} 之前可能要求 SetStoreCapslockMode Off.
{ScrollLock}
ScrollLock (另請參閱: SetScrollLockState)
{NumLock}
NumLock (另請參閱: SetNumLockState)


{Control} 或 {Ctrl}
CONTROL (技術信息: 發送中性的虛擬按鍵代碼和左邊的掃瞄碼, 即在 vkXXscYYY 中, XX 為中性的而 YYY 為左邊的掃瞄碼)
{LControl} 或 {LCtrl}
左 CONTROL 鍵 (技術信息: 在 Win9x 中等同於 CONTROL, 但在 NT/2k/XP 中它發送左邊的虛擬按鍵而不是中性的)
{RControl} 或 {RCtrl}
右 CONTROL 鍵
{Control Down} 或 {Ctrl Down}
按住 CONTROL 鍵直到發送 {Ctrl Up}. XP/2000/NT: 要按住左邊或右邊的鍵, 請使用 {RCtrl Down} 和 {RCtrl Up}.


{Alt}
ALT (技術信息: 發送中性的虛擬按鍵和左邊的掃瞄碼)
{LAlt}
左 ALT 鍵 (技術信息: 在 Win9x 中等同於 ALT, 但在 NT/2k/XP 中它發送左邊的虛擬按鍵而不是中性的)
{RAlt}
右 ALT 鍵 (或 AltGr, 取決於鍵盤佈局)
{Alt Down}
按住 ALT 鍵直到發送 {Alt Up}. XP/2000/NT: 要按住左邊或右邊的鍵, 請使用 {RAlt Down} 和 {RAlt Up}.


{Shift}
SHIFT (技術信息: 發送中性的虛擬按鍵和左邊的掃瞄碼)
{LShift}
左 SHIFT 鍵 (技術信息: 在 Win9x 中等同於 SHIFT, 但在 NT/2k/XP 中它發送左邊的虛擬按鍵而不是中性的)
{RShift}
右 SHIFT 鍵
{Shift Down}
按住 SHIFT 鍵直到發送 {Shift Up}. XP/2000/NT: 要按住左邊或右邊的鍵, 請使用 {RShift Down} 和 {RShift Up}.


{LWin}
左 Windows 鍵
{RWin}
右 Windows 鍵
{LWin Down}
按住左 Windows 鍵直到發送 {LWin Up}
{RWin Down}
按住右 Windows 鍵直到發送 {RWin Up}


{AppsKey}
Windows Appskey (調用右鍵點擊或上下文菜單)
{Sleep}
電腦 SLEEP 鍵.
{ASC nnnnn}
發送 ALT+nnnnn 小鍵盤上的按鍵組合, 可以用來生成鍵盤上不存在的特殊字符. 要生成 ASCII 字符, 請指定一個介於 1 和 255 之間的數字. 要生成 ANSI 字符 (在大多數語言中的標準), 請指定一個介於 128 和 255 之間的數字, 但需要在數字前加上一個前導零, 例如 {Asc 0133}.
要生成 Unicode 字符, 請指定一個介於 256 和 65535 之間的數字 (不帶前導零). 但是, 有些應用程序不支持這種方法. 對於替代方法, 請參閱下面的部分.
{U+nnnn}
[AHK_L 24+]: 發送 Unicode 字符, 其中 nnnn 為不包括 0x 前綴的字符的十六進制值. 在 AutoHotkey 的 Unicode 版本中通常不需要這麼做, 因為它包含的 Send 和 ControlSend 自動支持 Unicode 文本.
如果這個字符沒有映射為一個虛擬按鍵代碼, 則使用 SendInput() 或 WM_CHAR 發送這個字符而當前的發送模式無效.
{vkXX}
{scYYY}
{vkXXscYYY}
發送一個虛擬按鍵為 XX 且掃瞄碼為 YYY 的鍵擊. 例如: Send {vkFFsc159}. 如果省略了 sc 或 vk 部分, 則會發送最適當的值.
XX 和 YYY 是十六進制值, 通常可以在主窗口的 View->Key history 菜單項找到. 另請參閱: 特殊按鍵


{Numpad0} - {Numpad9}
小鍵盤上的數字鍵 (與 Numlock 打開時輸入的一樣). 例如: {Numpad5} 為數字 5.
{NumpadDot}
小鍵盤上的點 (與 Numlock 打開時輸入的一樣).
{NumpadEnter}
小鍵盤上的 Enter 鍵
{NumpadMult}
小鍵盤上的乘
{NumpadDiv}
小鍵盤上的除
{NumpadAdd}
小鍵盤上的加
{NumpadSub}
小鍵盤上的減


{NumpadDel}
小鍵盤上的 Delete 鍵 (此鍵和後面的小鍵盤按鍵是在 Numlock 關閉時輸入的)
{NumpadIns}
小鍵盤上的 Insert 鍵
{NumpadClear}
小鍵盤上的 Clear 鍵 (通常在 Numlock 關閉時輸入 '5' 的鍵).
{NumpadUp}
小鍵盤上的向上鍵
{NumpadDown}
小鍵盤上的向下鍵
{NumpadLeft}
小鍵盤上的向左鍵
{NumpadRight}
小鍵盤上的向右鍵
{NumpadHome}
小鍵盤上的 Home 鍵
{NumpadEnd}
小鍵盤上的 End 鍵
{NumpadPgUp}
小鍵盤上的向上翻頁鍵
{NumpadPgDn}
小鍵盤上的向下翻頁鍵


{Browser_Back}
2000/XP/Vista+: 按下瀏覽器的 "後退" 按鈕
{Browser_Forward}
2000/XP/Vista+: 按下瀏覽器的 "前進" 按鈕
{Browser_Refresh}
2000/XP/Vista+: 按下瀏覽器的 "刷新" 按鈕
{Browser_Stop}
2000/XP/Vista+: 按下瀏覽器的 "停止" 按鈕
{Browser_Search}
2000/XP/Vista+: 按下瀏覽器的 "搜索" 按鈕
{Browser_Favorites}
2000/XP/Vista+: 按下瀏覽器的 "收藏" 按鈕
{Browser_Home}
2000/XP/Vista+: 啟動瀏覽器並打開主頁
{Volume_Mute}
2000/XP/Vista+: 主音量靜音/取消靜音. 通常相當於 SoundSet, +1, , mute
{Volume_Down}
2000/XP/Vista+: 減小主音量. 通常相當於 SoundSet -5
{Volume_Up}
2000/XP/Vista+: 增加主音量. 通常相當於 SoundSet +5
{Media_Next}
2000/XP/Vista+: 在媒體播放器中播放下一曲目
{Media_Prev}
2000/XP/Vista+: 在媒體播放器中播放前一曲目
{Media_Stop}
2000/XP/Vista+: 停止媒體播放器
{Media_Play_Pause}
2000/XP/Vista+: 播放/暫停媒體播放器
{Launch_Mail}
2000/XP/Vista+: 啟動電子郵件程序
{Launch_Media}
2000/XP/Vista+: 啟動媒體播放器
{Launch_App1}
2000/XP/Vista+: 啟動用戶程序 1
{Launch_App2}
2000/XP/Vista+: 啟動用戶程序 2


{PrintScreen}
Print Screen
{CtrlBreak}
Ctrl+break
{Pause}
Pause


{Click [选项]}
[v1.0.43+]
使用與 Click 命令 中相同的可用選項發送鼠標點擊. 例如, {Click} 會在鼠標光標當前位置點擊一次鼠標左鍵, 而 {Click 100, 200} 則在坐標 100, 200 處點擊 (這裡的坐標模式取決於 CoordMode). 要移動鼠標而不點擊, 請在坐標後指定 0; 例如: {Click 100, 200, 0}. 在鼠標點擊之間的延遲由 SetMouseDelay 決定 (而不是 SetKeyDelay).
{WheelDown}, {WheelUp}, {WheelLeft}, {WheelRight}, {LButton}, {RButton}, {MButton}, {XButton1}, {XButton2}
向指針當前位置發送鼠標按鈕事件 (要指定位置和其他選項, 請使用上面的 {Click}). 在鼠標點擊之間的延遲由 SetMouseDelay 決定. WheelLeft/Right 需要 v1.0.48+, 並且在 Windows Vista 之前的操作系統中沒有效果.
{Blind}
當按鍵序列中首個項目為 {Blind} 時, 如果 Alt/Control/Shift/Win 在發送開始時為按下的狀態則不鬆開. 例如, 熱鍵 +s::Send {Blind}abc 將發送 ABC 而不是 abc, 因為用戶按住了 Shift 鍵.
{Blind} 還會忽略 SetStoreCapslockMode; 即不會改變 Capslock 的狀態. 最後, {Blind} 會忽略發送的鍵擊中的額外控制功能; 這樣的鍵擊中可以避免後面的情況: 1) 發送 LWin/RWin 鍵擊時出現開始菜單; 2) 發送 Alt 鍵擊時激活菜單欄.
在 按鍵的重映射 內部使用了 Blind 模式. 例如, 重映射 a::b 會發生這樣的情況: 1) 輸入 "a" 時會映射為 "b"; 2) 輸入大寫字母 A 時映射為大寫字母 B; 並且 3) 按下 Control-A 時映射為按了 Control-B.
SendRaw 和 ControlSendRaw 不支持 {Blind}. 此外, SendPlay 也不完全支持這種模式, 尤其是在處理修飾鍵 (Control, Alt, Shift 和 Win) 時.
{Raw}
[v1.0.43+]
準確按照原樣發送鍵擊, 而不把 {Enter} 轉換成 ENTER 鍵擊, 把 ^c 轉換成 Control-C, 等等. {Raw} 可以不放在按鍵序列的開始處, 在按鍵序列中出現時, 它會影響它後面的剩餘部分.



轉義序列



輸入這些字符
得到這些字符
`,
, (原義的逗號). 注意: 在命令最後一個參數中的逗號不需要轉義, 因為程序知道把它們作為原義處理. 對於 MsgBox 所有參數同樣如此, 因為它會智能的處理逗號.
`%
% (原義的百分號)
``
` (原義的重音符; 即兩個連續的轉義符產生單個原義字符)
`;
 ; (原義的分號). 注意: 僅 在分號的左邊有空格或 tab 才需要. 如果沒有, 那麼它可以被正常識別而不需要轉義.
`::
:: (原義的雙冒號). 在 v1.0.40+, 不再需要對它們進行轉義.
`n
新行 (換行/LF)
`r
回車 (CR)
`b
退格
`t
tab (最典型的水平移位)
`v
垂直 tab -- 對應的 Ascii 值為 11. 在一些應用程序中可以通過鍵入 Control+K 讓它顯示出來.
`a
警告 (鈴) -- 對應的 Ascii 值為 7. 在一些應用程序中可以通過鍵入 Control+G 讓它顯示出來.
`f
進紙 -- 對應的 Ascii 值為 12. 在一些應用程序中可以通過鍵入 Control+L 讓它顯示出來.
Send
以默認 (非原始) 模式使用 Send 命令 或 熱字串 時, 像 {}^!+# 這些字符具有特殊含義. 因此, 要使用它們的原義字符, 必須把它們包圍在大括號中. 例如: Send {^}{!}{{}
""
在 表達式 中, 原義字符串內的兩個連續的引號被解析為單個原義的引號. 例如: Var := "The color ""red"" was found."