AutoHotkey
ラベルの代わりに関数を使う
サーチ…
備考
AutoHotkeyはバージョン1.1.20までラベルに大きく依存していました。ラベルへの依存は非常に重大な欠点を持っていました。主なものは、通常、グローバルスコープで実行されるラベルであり、ラベル内で定義された変数はすべてグローバルに使用可能であることを意味します。これは、変数が自分のものに干渉しないようにしなくても、他の人のライブラリを使うことができないということを認識するまでは素晴らしいと思います。
必要でないときにグローバルスコープで作業することは、単に悪い習慣です。
バージョン1.1.20では、label-nameをパラメータとして受け付けるすべてのAutoHotkeyコマンドは、代わりにfunction-nameを受け入れるようになりました。
SetTimerでの関数の使用を示す非常に基本的な例です。
;Sends the keystroke for the letter "a" every 3 seconds.
#Persistent
SetTimer, SendLetterA, 3000
return
SendLetterA() {
Send, a
}
SetTimerの高度な使い方:異なるパラメータで同じ関数を呼び出す
これはラベルでは不可能だったはずの例です。同じラベルを同時に複数回実行し、それらの中で定義されている変数に依存する場合、それらは非常に干渉して予期しない動作を引き起こす可能性があります。
関数でそれを行う方法は次のとおりです:
; This script will switch between showing "Hello 1" and "Hello 2"
#Persistent
DisplayMessage_Hello1 := Func("DisplayMessage").bind("Hello 1")
SetTimer, %DisplayMessage_Hello1%, 2000
Sleep, 1000
DisplayMessage_Hello2 := Func("DisplayMessage").bind("Hello 2")
SetTimer, %DisplayMessage_Hello2%, 2000
DisplayMessage(messageToDisplay) {
TrayTip ; remove other traytips
TrayTip, Message to display:, %messageToDisplay%
}
ここでそれをしない (ラベル付きで)方法は次のとおりです。
;This script will never display the message "Hello 1". It will always show "Hello 2".
#Persistent
messageToDisplay := "Hello 1"
SetTimer, DisplayMessage, 2000
Sleep, 1000
messageToDisplay := "Hello 2"
SetTimer, DisplayMessage, 2000
DisplayMessage:
TrayTip ; remove other traytips
TrayTip, Message to display:, %messageToDisplay%
Return
ラベルの代わりに関数を持つGui
ラベルの代わりに関数を使用してGuisを作成する方法の例
Gui, Add, Button, gCtrlEvent vButton1, Button 1
Gui, Add, Button, gCtrlEvent vButton2, Button 2
Gui, Add, Button, gGoButton, Go Button
Gui, Add, Edit, vEditField, Example text
Gui, Show,, Functions instead of labels
CtrlEvent(CtrlHwnd:=0, GuiEvent:="", EventInfo:="", ErrLvl:="") {
GuiControlGet, controlName, Name, %CtrlHwnd%
MsgBox, %controlName% has been clicked!
}
GoButton(CtrlHwnd:=0, GuiEvent:="", EventInfo:="", ErrLvl:="") {
GuiControlGet, EditField
MsgBox, Go has been clicked! The content of the edit field is "%EditField%"!
}
GuiClose(hWnd) {
WinGetTitle, windowTitle, ahk_id %hWnd%
MsgBox, The Gui with title "%windowTitle%" has been closed!
ExitApp
}
ラベルの代わりに機能を持つホットキー
ホットキーでの関数の使用例:
Hotkey, a, MyFunction ; Calls MyFunction() when a is pressed
MyFunction() {
MsgBox You pressed %A_ThisHotkey%.
}
または:
a::MyFunction()
MyFunction() {
MsgBox You pressed %A_ThisHotkey%.
}
機能付きトレーメニューアクション
#Persistent
Menu, Tray, NoStandard ; remove default tray menu entries
Menu, Tray, Add, MyDefaultAction, OnDefaultTrayAction ; add a new tray menu entry
Menu, Tray, Add, Exit, Exit ; add another tray menu entry
Menu, Tray, Default, MyDefaultAction ;When doubleclicking the tray icon, run the tray menu entry called "MyDefaultAction".
OnDefaultTrayAction() {
MsgBox, You double clicked the tray icon of this script or you clicked the MyDefaultAction entry!
}
Exit() {
MsgBox, You clicked the Exit entry! The script will close itself now.
ExitApp
}
関数とラベルの一般的な例
関数と関数の使用の基本的な使い方をラベル+ gosubを使って説明します。
この例では、2つの数値を加算して変数に格納する簡単な機能を実装します。
関数の場合:
c := Add(3, 2) ; function call
MsgBox, Result: %c%
Add(a, b) { ; This is a function. Put it wherever you want, it doesn't matter.
; the a and b inside of this function are set by the function call above
Return a+b ; the function will return the result of the expression "a+b"
}
ラベル付き(しないでください):
a := 3
b := 2
GoSub, Add ; execute the label "Add" then jump back to the next line here
MsgBox, Result: %c%
Return ; without this, the label would be executed again for no reason.
Add: ; This is a label. Please put them at the bottom of your script and use "Return" in a line above.
c := a+b
Return
機能/ラベル付きのOnClipboardChange
次のコードは、公式なAutoHotkeyのドキュメントから引用したものです。
機能の実装:
#Persistent
OnClipboardChange("ClipChanged")
return
ClipChanged(Type) {
ToolTip Clipboard data type: %Type%
Sleep 1000
ToolTip ; Turn off the tip.
}
ラベル実装:
#Persistent
return
OnClipboardChange:
ToolTip Clipboard data type: %A_EventInfo%
Sleep 1000
ToolTip ; Turn off the tip.
return
同じイベントコールバック関数を使用して、複数のリストビューを持つより複雑なGuiの例
このスクリプトは、同じイベントコールバック関数内の異なるコントロールから複雑なGUIイベントを受け取る方法を示しています。これに2つのListViewコントロールを使用します。
これらのListViewコントロールのいずれかでアクションが検出されるたびに、何が起こったのかを正確に記述し、同じGUIのエディットコントロールにログインさせる必要があります。
Gui, Add, ListView, gListCtrlEvent vMyFirstListView AltSubmit -ReadOnly R10 w310, ColumnTitle1|ColumnTitle2|ColumnTitle3
Gui, Add, ListView, gListCtrlEvent vMySecondListView AltSubmit -ReadOnly R10 w310, ColumnTitle1|ColumnTitle2|ColumnTitle3
Gui, Add, Text, w310, Action Log
Gui, Add, Edit, vLog R7 w310,
Gui, Show,, Functions instead of labels
; Create example entries for the first ListView
Gui, ListView, MyFirstListView
Loop, 10 {
LV_Add("", "Column-1 | Row-" A_Index , "Column-2 | Row-" A_Index, "Column-3 | Row-" A_Index)
}
LV_ModifyCol()
; Create example entries for the second ListView
Gui, ListView, MySecondListView
Loop, 10 {
LV_Add("", "Column-1 | Row-" A_Index , "Column-2 | Row-" A_Index, "Column-3 | Row-" A_Index)
}
LV_ModifyCol()
ListCtrlEvent(ctrlHwnd:=0, guiEvent:="", eventInfo:="", errLvl:="") {
GuiControlGet, ctrlName, Name, %CtrlHwnd%
whatHappened := "Action detected!`n"
whatHappened .= "Control handle: " ctrlHwnd "`n"
whatHappened .= "Control name: " ctrlName "`n"
If (guiEvent = "DoubleClick") {
whatHappened .= "`nThe user has double-clicked within the control."
whatHappened .= "`n> Focused row number: " eventInfo
} Else If (guiEvent = "R") {
whatHappened .= "`nThe user has double-right-clicked within the control."
whatHappened .= "`n> Focused row number: " eventInfo
} Else If (guiEvent = "ColClick") {
whatHappened .= "`nThe user has clicked a column header."
whatHappened .= "`n> Column number: " eventInfo
} Else If (guiEvent = "D") {
whatHappened .= "`nThe user has attempted to start dragging a row or icon."
whatHappened .= "`n> Focused row number: " eventInfo
} Else If (guiEvent = "d") {
whatHappened .= "`nThe user has attempted to start right-click-dragging a row or icon."
whatHappened .= "`n> Focused row number: " eventInfo
} Else If (guiEvent = "e") {
whatHappened .= "`nThe user has finished editing the first field of a row."
whatHappened .= "`n> Row number: " eventInfo
} Else If (guiEvent = "Normal") {
whatHappened .= "`nThe user has left-clicked a row."
whatHappened .= "`n> Focused row number: " eventInfo
} Else If (guiEvent = "RightClick") {
whatHappened .= "`nThe user has right-clicked a row."
whatHappened .= "`n> Focused row number: " eventInfo
} Else If (guiEvent = "A") {
whatHappened .= "`nA row has been activated."
whatHappened .= "`n> Row number: " eventInfo
} Else If (guiEvent = "C") {
whatHappened .= "`nThe ListView has released mouse capture."
} Else If (guiEvent = "E") {
whatHappened .= "`nThe user has begun editing the first field of a row."
whatHappened .= "`n> Row number: " eventInfo
} Else If (guiEvent = "F") {
whatHappened .= "`nThe ListView has received keyboard focus."
} Else If (guiEvent = "f") {
whatHappened .= "`nThe ListView has lost keyboard focus."
} Else If (guiEvent = "I") {
whatHappened .= "`nItem changed. (A row has changed by becoming selected/deselected, checked/unchecked, etc.)"
whatHappened .= "`n> Row number: " eventInfo
} Else If (guiEvent = "K") {
whatHappened .= "`nThe user has pressed a key while the ListView has focus."
whatHappened .= "`n> Key pressed: " GetKeyName(Format("vk{:x}", eventInfo))
} Else If (guiEvent = "M") {
whatHappened .= "`nItem changed. (A row has changed by becoming selected/deselected, checked/unchecked, etc.)"
whatHappened .= "`n> Row number: " eventInfo
} Else If (guiEvent = "S") {
whatHappened .= "`nMarquee. The user has started to drag a selection-rectangle around a group of rows or icons."
} Else If (guiEvent = "s") {
whatHappened .= "`nThe user has finished scrolling the ListView."
}
GuiControlGet, Log
GuiControl,, Log, % whatHappened "`n---------------------`n" Log
}
GuiClose(hWnd) {
WinGetTitle, windowTitle, ahk_id %hWnd%
MsgBox, The Gui with title "%windowTitle%" is going to be closed! This script will exit afterwards!
ExitApp
}