AutoHotkey
레이블 대신 함수 사용
수색…
비고
AutoHotkey는 버전 1.1.20까지 레이블에 크게 의존했습니다. 라벨에 대한 의존은 매우 심각한 단점을 가지고있었습니다. 주요 레이블은 대개 전역 범위에서 실행되며 레이블 내에 정의 된 모든 변수가 전역 적으로 사용 가능함을 의미합니다. 예를 들어 변수가 자신의 코드를 방해하지 않고 다른 사람들의 라이브러리를 사용할 수 없다는 것을 깨닫기 전까지는 큰 소리로 들립니다.
필요하지 않을 때 글로벌 범위에서 작업하는 것은 나쁜 습관 일뿐입니다.
따라서 1.1.20 버전에서 label-name을 매개 변수로 사용하는 모든 AutoHotkey 명령은 함수 이름을 대신 받아들입니다.
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
}
함수 대 라벨의 일반적인 예
label + gosub을 사용하여 함수를 사용하는 기본 사용법을 보여 드리겠습니다.
이 예제에서는 두 개의 숫자를 추가하고 변수에 저장하는 간단한 기능을 구현합니다.
기능 :
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
동일한 이벤트 콜백 함수를 사용하여 여러 listviews가있는 더 복잡한 Gui 예제
이 스크립트는 동일한 이벤트 콜백 함수의 다른 컨트롤에서 복잡한 GUI 이벤트를 수신하는 방법을 보여줍니다. 우리는 두 개의 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
}