AutoHotkey

Version v1.1.22.07

http://ahkscript.org

©2003-2014 Chris Mallett, portions ©AutoIt Team and the AHK community

한글판 johjnsonj 151111

Software License: GNU General Public License

중요한 고지 사항

AutoHotkey 1.0과 AutoHotkey 1.1 사이의 근본적인 차이 때문에 (특히 유니코드와 x64 실행파일에서), AutoHotkey 1.0으로 작성된 스크립트는 AutoHotkey 1.1 위에서 예상대로 작동하지 않을 수 있습니다. 알려진 호환성 문제와 해결책에 관한 더 자세한 정보는 다음 링크를 참조하십시오:

  • 스크립트 호환성 - 유니코드 vs ANSI, DllCall, NumPut/Get, 기타 변경사항들
  • 스크립트 파일의 코드 페이지 - 스크립트는 UTF-8로 저장하십시오!

빠른 참조

기본:

  • 초보자를 위한 자습서
  • 오토핫키를 지원하는 텍스트 편집기
  • 자주 묻는 질문
  • 스크립트
    • 명령어
    • 변수와 표현식
    • 함수
    • 객체
    • 상호대화 디버깅

키보드와 마우스:

  • 핫키 (마우스, 조이스틱 그리고 키보드 단축키)
  • 핫스트링과 자동 교체
  • 키와 버튼 리맵하기
  • 키, 마우스 버튼 그리고 조이스틱 콘트롤 목록

기타:

  • DllCall
  • RegEx 간편 참조서
  • AutoHotkey_L (AutoHotkey 1.1) 특징

감사의 말

조나단 베네트(Jonathan Bennett)에게 특히 감사드립니다. 그는 넓은 마음으로 AutoIt v2를 1999년에 자유 소프트웨어로 배포해 주셨습니다. 그 덕분에 필자는 영감을 받았고 본인은 물론 세상의 모든 사람들은 시간을 절약하게 되었습니다. 게다가, 오토핫키의 개선 사항들을 AutoIt v2 명령어 세트에 적용해 주셨고, 뿐만 아니라 Window Spy 그리고 예전 스크립트 컴파일러를 AutoIt v3 소스 코드로부터 직접 적용해 주셧습니다. 그래서 존과 그의 AutoIt 저자들에게도 감사의 말씀을 전하는 바입니다.

마지막으로, AutoHotkey는 오늘날 이 분들이 없었다면 존재하지 못했을 것입니다.

~ Chris Mallett(크리스 멀릿)


Changes & New Features

변경 사항 & 새로운 특징

현재 오토핫키 개발 분기에 (이른바 AutoHotkey_L에) 도입된 변경사항과 새로운 특징을 아래에 나열합니다.

예전 변경 사항은 변경 사항 보관소를 참조하십시오.

1.1.22.07 - September 27, 2015

Fixed Gui control w-1 and h-1 options failing when DPI is 150+% and the Gui has not applied -DPIScale.

Fixed ~key up hotkeys to not perform an automatic Send {key down}. This was occurring only if the hotkey was turned on after the key was pressed down.

1.1.22.06 - September 13, 2015

Fixed Input and hotstrings to catch Unicode/non-key character events.

Fixed auto-sizing of Edit controls to include the last line if blank.

Fixed handling of out-of-memory in ComObj functions.

Fixed ComObjArray to ignore excess parameters rather than crashing (only applies to dynamic calls).

Fixed GuiControl to append--not prepend--tabs, as documented.

Fixed XP64 support.

1.1.22.05 - September 10, 2015

Fixed icons which have non-numeric IDs loading with sub-optimal quality.

Fixed Gui Destroy not releasing function objects which were set by the +g option.

Fixed Gui Show to avoid attempting to force-activate a child GUI.

Fixed failure to set Caps/Num/ScrollLock state while the key is down.

Fixed Gui Color causing incorrect text color (usually black).

Changed Gui Show to improve the odds of GuiSize executing immediately.

For developers:

  • Modified project config to support more VC++ versions.
  • Fixed various build warnings on VC++ 2015.
  • 64-bit binaries are now built with VC++ 2015. 32-bit binaries still use VC++ 2010.

1.1.22.04 - August 19, 2015

Fixed ObjRawSet() to return nothing.

Added Windows 10 supportedOS tag to the exe manifest (avoids some issues with the Program Compatibility Assistant and similar).

Added detection of syntax errors after ")" in a function declaration.

1.1.22.03 - July 12, 2015

Fixed A_EndChar returning a truncated value for Unicode end chars.

Small implementation changes:

  • Changed A_Language to use GetSystemDefaultUILanguage().
  • Refactored Window Spy/help file launching from tray menu to improve code re-use.
  • Optimized Gui/Menu/Hotkey/Hotstring/OnClipboard message handling (minor).

1.1.22.02 - May 27, 2015

Fixed TreeView to not raise * events for unknown notifications.

Fixed crashing/bad behaviour when a timer deletes itself.

Fixed RWin-up being masked in some rare cases where LWin-up wouldn't have been.

1.1.22.01 - May 24, 2015

Fixed Text/Edit/Button control sizing to compensate for character overhang.

Fixed registry commands to allow : in the SubKey when combined with RootKey.

Fixed hotkey prioritization to take modifiers into consideration.

Refactored else/try/catch/finally handling to support hotkey::try cmd.

Added a workaround for the script's dialogs acting as though Ctrl or Shift is pressed after they are blocked by the keyboard hook.

1.1.22.00 - May 1, 2015

Added SetErrorMode(SEM_FAILCRITICALERRORS) on program startup to suppress system-level error messages such as "There is no disk in the drive". Calling Drive or DriveGet no longer affects the process' error mode.

Changed MonthCal controls to have tab-stop by default on Vista or later.

Improved ComObjConnect to use IProvideClassInfo when available.

Fixed some issues with method/property definitions following an end brace on the same line.

Fixed Text/Link control auto-sizing to compensate for the +Border (WS_BORDER) style.

Fixed Break N when Loop is used directly below If/Else/Try/Catch.

1.1.21.03 - April 12, 2015

Fixed detection of naming conflicts between properties and methods.

1.1.21.02 - April 4, 2015

Fixed OnMessage(msg, fnobj, 0) to do nothing if fnobj wasn't previously registered.

1.1.21.01 - April 3, 2015

Fixed StrReplace() to allow ReplaceText to be omitted.

Fixed class variables to allow non-ASCII names.

1.1.21.00 - March 28, 2015

Added Loop, Reg, RootKey[\Key, Mode].

Added Loop, Files, FilePattern [, Mode].

Changed InputVar parameters to allow % expression (except with If commands).

Revised Object methods:

  • Added Object.InsertAt(), Object.Push() and ObjRawSet().
  • Added Object.Delete(), Object.RemoveAt() and Object.Pop().
  • Added Object.Length().

Added Ord() and updated Chr() to support supplementary chars (>0xFFFF).

Added StrReplace().

Removed the obsolete and undocumented 5-parameter mode of RegRead, which was exclusively for AutoIt v2 compatibility (the extra parameter was unused).

Changed RegRead, RegWrite and RegDelete so that the RootKey and SubKey parameters can optionally be combined.

1.1.20.03 - March 21, 2015

Fixed MouseGetPos (OutputVarControl), GuiContextMenu and GuiDropFiles (A_GuiControl) to not ignore disabled controls [broken by v1.1.20.00].

1.1.20.02 - March 11, 2015

Fixed add-first mode of OnMessage.

Fixed A_OSVersion for unrecognized OSes on x64 builds.

Fixed ExitApp to unpause the script before releasing objects in case a __delete meta-function is called.

Trivial optimizations and code maintenance.

1.1.20.01 - March 10, 2015

Reverted the changes made in v1.1.20.00 to saving and restoring of ErrorLevel on thread interrupt, due to unintended consequences.

  • ErrorLevel is not reset or cleared when a new thread starts. Instead, it retains the value it had in the interrupted thread, as in v1.1.19 and older.
  • If ErrorLevel contains an object and the thread is interrupted, the object is replaced with an empty string when the thread resumes, as in v1.1.19 and older.
  • If ErrorLevel contains a string longer than 127 characters, it is truncated when the thread resumes, as in v1.1.19 and older.

Re-fixed timers sometimes causing ErrorLevel to be formatted as hex.

Fixed class methods to retain a counted reference to the class.

1.1.20.00 - March 8, 2015

New features:

Enhanced Hotkey, Menu, SetTimer, Gui events and Gui control events to accept a function instead of a label, if no label is found.

Enhanced Hotkey, Menu, SetTimer and Gui control events to accept a function object. Added a Delete sub-command for SetTimer to allow the object to be released.

Enhanced OnMessage() to allow any number of functions or function objects to monitor a single message.

Added OnExit() and OnClipboardChange(), which accept a function name or object.

Added capability to point hotkey labels at a function definition.

Added U/L/T modifiers to perform case conversion with Format().

Added the E option to the Input command, for handling end keys by character instead of keycode.

Added ** (stderr) support to FileAppend.

Added ObjBindMethod(obj, method, args*) and Func.Bind(args*).

Changes:

Changed the default behavior when the main script file is not found:

  • If no script was specified and the default script files are not found, show the new Welcome page in the help file.
  • If a script was specified or the help file is missing (or is named differently to the executable), just show an error message.

Changed WinActivate to restore the window if already active but minimized.

Changed WinActivate to look for a visible window to activate if DetectHiddenWindows is off and the active window is hidden, instead of doing nothing.

Changed the method used by A_CaretX/A_CaretY to retrieve the caret position.

  • Returns blank in more cases where the real caret position can't be determined, instead of returning the top-left of the active window.
  • Less likely to cause side-effects.
  • Works in console windows.

Changed A_OSVersion to use RtlGetVersion(), so that it can detect Windows 10 and hopefully future versions.

Changed A_OSVersion to return a version number of the form "major.minor.build" if it doesn't have a name for the OS.

Changed objects to support x[,y], x.y[,z] and x[](y).

  • User-defined objects can utilize this by specifying default values for parameters of properties and meta-functions. For __Call, the first parameter is omitted, as in x.__Call(,y).
  • COM objects invoke DISPID_VALUE if the member name is omitted. For example, x[] retrieves x's default property and fn[]() can be used to call JScript functions.

Several under-the-hood changes to fix bugs, reduce code size or improve performance, including:

  • Changes to preparsing of #if and static var initializers.
  • Changes to preparsing of { blocks }.

Bug-fixes:

Fixed VK to keyname conversions for keys 'A' to 'Z' to respect layout.

  • Applies to: GetKeyName, Hotkey control, A_PriorKey, KeyHistory and Input EndKey ErrorLevel (except where Shift key is required).
  • All other keys, including those that produce non-ASCII letters, were already translated according to AutoHotkey's current keyboard layout.

Fixed FileAppend to * (stdout) to respect the encoding parameter instead of always outputting ANSI text.

Fixed auto-sizing of GUIs with only one scrollbar.

Fixed Exception(m, n) crashing when n is too far out of bounds.

Fixed GuiContextMenu to set A_GuiEvent correctly on x64.

Fixed FileGetSize sometimes giving an indeterminate result if the file doesn't exist or can't be opened.

Fixed thread interrupts to save and restore ErrorLevel more fully [reverted in v1.1.20.01 due to unintended consequences].

Fixed ControlClick Pos mode to ignore disabled controls.

Fixed odd behaviour when Gui +MaxSize is smaller than +MinSize.

Fixed GuiControl/Get requiring a Gui name when given a control HWND.

Fixed meta-functions interfering with the line number reported by Exception().

1.1.19.03 - February 11, 2015

Improved remapping to allow scXXX::Y when the current keyboard layout does not map scXXX to a VK code. However, Y must still exist on the current keyboard layout.

Fixed break n to work correctly when until is present, instead of terminating the thread.

Fixed ControlGetFocus disrupting the user's ability to double-click (thanks HotKeyIt).

Fixed ListView to not call the control's g-label for unsupported (and previously unknown) notifications such as LVN_GETEMPTYMARKUP.

Fixed #Include *i <X> to exit the program as intended if X has a syntax error.

Fixed for var in expression sometimes crashing the program when expression calls a script function.

1.1.19.02 - January 25, 2015

Removed the 16-color icons which were used on Win9x/Win2k.

Removed the separate tray icon resources.

Improved selection of icon size when loading icons from DLL/EXE files.

  • In short, prefer to downscale rather than upscale. This is especially helpful on systems with 125% or 150% DPI, where the system icon sizes are 20/40 or 24/48 instead of 16/32. If all of these sizes are present in the icon resource, this change makes no difference.

Fixed some issues with hotkey validation at load time.

  • Hotkeys which are never valid, like foo::, are now always treated as errors instead of giving a misleading warning about keyboard layout.
  • Hotkeys like ^!ä:: which are inactive because of the current keyboard layout are now allowed to have a same-line action, and the label is registered correctly (e.g. as "^!ä" and not as "^!ä:"). If the /iLib command line switch is used, the warning is suppressed.
  • Remappings which are inactive because of the current keyboard layout now show two warnings instead of an unrecoverable error.
  • If a Wheel hotkey is used as a prefix key, there is only one error message instead of two, and it respects /ErrorStdOut.

Fixed /iLib switch to write the file even if there's a syntax error.

Fixed return/break/continue/goto in try..finally.

1.1.19.01 - January 5, 2015

Fixed Hotkey command crashing the program when trying to create new variants of existing hotkeys (broken by v1.1.19.00).

Made some minor optimizations to the Hotkey command and A_TimeIdle, relating to removal of Win9x support.

1.1.19.00 - January 4, 2015

Added a name for Func.Call(). Func.() still works but is deprecated.

Fixed some issues with X.Y and X.Y(Z) in VBScript/JScript/C#:

  • If X.__Call contained a function name, it was being returned instead of called.
  • When X.Y(Z) returned a value, Z was ignored. Now it acts like X.Y[Z] when X.Y is not a function.

Fixed the Hotkey command ignoring the ~ (pass-through) prefix if Label was omitted.

Fixed the Hotkey command ignoring the $ (use-hook) prefix if the hotkey variant was already created without $.

Fixed %Fn%() syntax to work with JavaScript Function objects.

Fixed EXE manifest to disable UAC installer detection heuristics (broken by v1.1.17).

Improved the way threads are represented on the debugger's call stack.

  • The type of thread is shown instead of the label name, which is still available in the next stack entry. For hotkeys, the hotkey is shown instead.
  • The line number of the sub or function that the thread called is shown instead of the line the script was at before starting the thread.

1.1.18.00 - December 30, 2014

Improved IDispatch implementation for AutoHotkey objects:

  • X.Y in VBScript and C# now returns X.Y if it is NOT a Func object; previously, it attempted to call X.Y() regardless of type.
  • X(Y) in VBScript, JScript and C# now returns X[Y] unless X is a Func object, in which case it is called as before.
  • X[Y] in C# now returns X[Y] if X is NOT a Func object; previously, it attempted to call X[Y]() regardless of type.
  • X.Y() in C# now returns X.Y if it is NOT a Func object, due to ambiguity in the C# dispatch implementation.
  • Unhandled exceptions are now converted to IDispatch exceptions.

Added support for creating new properties in JavaScript/IE DOM objects.

Fixed FileAppend, %VarContainingClipboardAll%, File causing crashes.

1.1.17.01 - December 28, 2014

Fixed COM event handlers not receiving the final object parameter.

1.1.17.00 - December 27, 2014

New features:

Added Format().

FileOpen() can now be used to read from stdin or write to stdout or stderr by passing "*" or "**" as the filename. AutoHotkey.exe * can be used to execute script text piped from another process instead of read from file. For an example, see ExecScript().

Added support for passing AutoHotkey objects to COM APIs as IDispatch.

Added support for VT_BYREF in ComObject wrappers. Use obj[] to access the referenced value.

Bug-fixes:

Fixed blue-screening on XP SP2.

Fixed owned ComObjArrays to be returned by value, not by pointer. That is, a copy of the array is returned instead of a pointer to an array which is about to be deleted.

Changed the URL in the sample script which is created when you first run AutoHotkey.

Fixed sc15D to map to vk5D/AppsKey (Send, GetKeyName, etc.).

Fixed Edit controls to not treat AltGr+A as Ctrl+A.

Fixed static class vars to not act as a target for labels which immediately precede the class.

1.1.16.05 - September 28, 2014

Fixed x.y/[]/{} sometimes falsely being flagged as variadic.

1.1.16.04 - September 16, 2014

Fixed a crash which occurred when overwriting a non-writable property.

Fixed a crash which occurred when a RegExMatch object is created with uncaptured subpatterns during a regex callout.

1.1.16.03 - September 11, 2014

Fixed some bad behaviour in Abs() and Mod() caused by a broken bug-fix in v1.1.16.01.

1.1.16.02 - September 11, 2014

Fixed parser to allow #include inside a class (broken by a6ea27f).

Fixed Clipboard returning binary CF_HDROP data in some instances.

Improved accuracy of FileGetSize on files which are still open.

Improved for-loop compatibility with COM objects.

1.1.16.01 - September 10, 2014

Added syntax for defining dynamic properties in classes.

Added x+m and y+m options for Gui control positioning.

Added the #InputLevel of each hotkey to ListHotkeys (when non-zero).

Optimized RegExMatch with the O (object) option; capturing part of a long string is much faster than before in some cases.

Fixed objects to check for new methods after __Call completes (consistent with __Set and __Get).

Fixed some undefined behaviour occurring after VarSetCapacity fails.

Fixed FileRead to correctly report an error with files over 4GB, instead of truncating even when it wasn't requested.

Fixed FileRead *c to null-terminate correctly when byte length is odd.

Fixed some ClipboardAll issues and changed behaviour:

  • #ClipboardTimeout is ignored for GetClipboardData(), since it never actually worked and it caused problems. This fixes timeouts and lost data when a file is on the clipboard (any file on Windows 8, or any file in a zip file or similar).
  • Zero-length clipboard items are allocated 1 byte upon restoring to the clipboard, since setting a zero-length item seems to always fail.
  • The presence of MSDEVColumnSelect/MSDEVLineSelect is now preserved when set by Scintilla, though any data set by VS is discarded.
  • When writing ClipboardAll directly to file, it now prefers Unicode (other usages of ClipboardAll have had this behaviour since v1.1.08).
  • ClipboardAll and FileRead *c on Unicode builds now round length up when odd. This increases the reported StrLen by 1, potentially avoiding truncation of the last byte.

Fixed A_EventInfo for TreeView items with negative screen coords.

Fixed a possible ListView/TreeView message filtering issue.

Fixed A_LineFile/A_LineNumber in #If expressions.

Fixed #If to add itself to ListLines (though as "If").

Fixed Abs(["-"]*) and similar crashing the program.

Fixed } funcdef(){ globally and }} ending a method/property/class.

1.1.15.04 - August 12, 2014

Fixed a performance issue with &var_containing_long_string_of_digits.

Fixed built-in variables corrupting memory when an object is assigned.

Fixed parser to disallow continue where appropriate even if the current function is defined inside a Loop.

Fixed File.Encoding := x "-RAW" breaking encoding/decoding of non-ASCII characters. The -RAW suffix is now ignored.

1.1.15.03 - August 2, 2014

Fixed meta-functions to exit the thread correctly after using Exit or Throw.

Fixed FileInstall to use A_WorkingDir when Dest is relative in a non-compiled script.

1.1.15.02 - July 7, 2014

Fixed debugging negative integer keys in objects.

1.1.15.01 - June 30, 2014

Changed built-in error and warning dialogs to be always-on-top.

Fixed Until not breaking out of recursive file/registry loops.

1.1.15.00 - May 4, 2014

Added A_OSVersion value WIN_8.1.

Changed the Hotkey command to apply/remove passthrough behavior on existing hotkey variants depending on whether the tilde (~) prefix is present.

Changed exe manifest to allow GetVersion/GetVersionEx to detect Windows 8.1.

1.1.14.04 - April 25, 2014

Fixed DllCall() crashing the script when Function is pure integer 0.

Fixed IsFunc("ComObj(") to return false instead of throwing an exception.

Fixed ControlClick to send XButton1/XButton2 correctly.

1.1.14.03 - February 14, 2014

Fixed a memory leak in new X when X.__Init aborts the thread.

Fixed breakpoints shifting onto class var initializers when they are interspersed with method definitions.

1.1.14.02 - January 30, 2014

Fixed x:: and x up:: both firing on key-up if the state of the modifier keys prevented x from firing on key-down. The intended behaviour as of v1.1.14 is for both hotkeys to fire on key-up if x is also used in a custom combination like x & y::.

1.1.14.01 - January 15, 2014

Fixed Try without Catch/Finally crashing if no exception was thrown.

1.1.14.00 - January 15, 2014

Added Finally statement for performing cleanup after try/catch. [fincs]

Changed behaviour of ~ prefix with custom combos to be more intuitive.

Fixed x & y:: to fire both x:: and x up:: when x is released.

Fixed ImageSearch to set ErrorLevel=2, not 0, when a GDI call fails.

Fixed EnvGet crashing the program when the var exceeds 32767 chars.

Fixed a minor error-handling bug with StatusBarWait's ErrorLevel.

Fixed a cause of heap corruption with FileRead *c on ANSI builds.

Fixed passing of local vars in recursive calls to variadic functions.

Fixed script failing to load if the first line is an expression in parentheses.

Fixed PixelSearch Fast mode to set OutputVarX/Y only on success.

1.1.13.01 - October 11, 2013

Fixed variadic function calls with named values for required parameters.

1.1.13.00 - August 27, 2013

Ported StrSplit() from v2 alpha.

1.1.12.00 - August 14, 2013

Optional parameters can be omitted by writing two consecutive commas, as in InStr(a, b,, 2). Unlike previous versions, this now works for objects (including COM objects) and built-in functions. [a,,b] can be used to create a sparse array.

Object properties can now be set using variadic syntax, as in x[y*]:=z, where y contains an array of keys/indices or parameters.

1.1.11.02 - July 28, 2013

Fixed GuiControl/Get to accept the ClassNN of a ComboBox's child Edit. Specifying the HWND of a ComboBox's child Edit was already supported as a means of identifying the ComboBox.

1.1.11.01 - June 25, 2013

Fixed InputBox default width/height (broken by v1.1.11.00 - commit 7373cc6443).

Fixed DllCall arg type validation to handle SYM_OBJECT safely, and to respect #Warn UseUnset (when var name is not a valid type).

Changed VarSetCapacity(var) to never warn about uninitialized vars.

1.1.11.00 - June 21, 2013

Added support for %A_LineFile% in #Include.

Reduced the file size of AutoHotkeySC.bin by reducing the resolution of the (rarely used) filetype icon.

Fixed class X extends Y to allow Y to be defined after X.

Developed by fincs: AutoHotkey is now DPI-aware. The Gui commands automatically compensate when DPI is not 96. See Gui -DPIScale.

1.1.10.01 - May 17, 2013

Improved RegRead to support REG_BINARY values larger than 64K.

Improved RegWrite to support REG_BINARY/REG_MULTI_SZ values larger than 64K.

Fixed Process Close (and possibly other things) on Windows XP.

1.1.10.00 - May 11, 2013

Added basic support for custom Gui control types.

Revised SoundSet, SoundGet and 'WaveVolume commands to better support Windows Vista and later.

Fixed Run "<file>" <args> to not pass the space as part of the args.

Fixed some issues with reading from console input (CONIN$).

1.1.09.04 - March 14, 2013

Fixed Gui menu accelerator keys not working when the Gui itself (not a control) has focus.

1.1.09.03 - February 9, 2013

Fixed two bugs which affected certain assignments where the target variable contains an unflushed binary number but has zero capacity.

Fixed GuiControl and GuiControlGet acting on the wrong control when given a HWND which does not belong to the current Gui. Instead, the condition is treated as an error.

Fixed OnMessage functions to set A_Gui and A_GuiControl correctly when the target Gui is a child window.

1.1.09.02 - December 24, 2012

Fixed MsgBox to show an error message when given invalid Options, instead of silently exiting the thread.

Fixed syntax errors in class var initializers causing the program to crash without the proper error message.

1.1.09.01 - December 15, 2012

Fixed AND/OR following a multi-statement comma, like ((x, y) and z).

Fixed RegExReplace to support duplicate subpattern names correctly.

Fixed Object.Remove() not freeing string keys.

Fixed base.Invoke() to not depend on dynamic variable resolution.

1.1.09.00 - November 7, 2012

Breaking changes:

Removed .aut file compatibility and #AllowSameLineComments.

Removed undocumented AutoIt v2 commands.

Backward-compatible changes:

Allow optional parameters to be declared with := instead of =, for consistency with variable declarations and expressions.

Allow non-ASCII characters in unquoted keys ({key: x} and obj.key).

Changed name in version info from "AutoHotkey_L" to "AutoHotkey".

Bug-fixes:

Fixed instability caused by warning dialogs appearing part-way through evaluation of a command's args.

Fixed PixelSearch Fast mode treating "not found" as an error.

Fixed ahk_exe to allow other ahk_ criteria after it.

Fixed else continue 2 and similar requiring braces around the loop.

Fixed RegRead indicating failure after successfully reading binary data.

Fixed File.Length to compensate for or flush any buffered data.

Fixed Gui sizing to account for scrollbars when present.

Debugger:

Added support for asynchronous commands.

Improved handling of breakpoints on lines like else foo() or { bar() so that the debugger will actually break when appropriate.

Optimized code size, fixed several bugs and made the debugger generally more robust.

1.1.08.01 - August 3, 2012

Debugger: Fixed max_depth being either half the intended limit or unlimited.

1.1.08.00 - July 14, 2012

Breaking changes:

Changed the default script codepage to ANSI, as the previous behaviour was a common source of confusion. UTF-8 files must now have a byte order mark (BOM) to be recognized correctly. Notepad adds a BOM to any file saved as UTF-8.

Changed return x to preserve formatting of numeric strings; it is now equivalent to return (x).

Changed Gui, Name: New to set the new GUI as the default.

Other changes:

Changed ClipboardAll to prefer CF_UNICODETEXT over other text formats.

Changed Gui Show to allow floating-point numbers.

Changed A_OSVersion to return WIN_8 on Windows 8.

Changed AutoHotkey.exe file description to include "ANSI/Unicode 32/64-bit".

Changed the parser to allow lines like new MyObject() with no assignment.

Upgraded PCRE to 8.30.

Improved wording of some warnings and added a pointer to the documentation at the bottom of the warning dialog.

Improvements to the debugger:

  • Added basic support for inspecting Func, ComObject and RegExMatchObject objects.
  • Fixed the "attach debugger" message being ignored in some situations. See commit 83f0a0e.

New features:

Added support for the PCRE construct (*MARK:NAME) via RegExMatchObject.Mark.

Added support for classvar.x := y assignments in class definitions (after declaring classvar).

Added A_Is64bitOS.

Added SetRegView and A_RegView.

Fixes:

Fixed Func.() to merely skip the function call if mandatory parameters were omitted instead of causing the thread to silently exit.

Fixed Object.Remove() not releasing object keys.

Fixed key-down/key-up hotkey pairs to suppress input correctly when only one hotkey in the pair is enabled.

Fixed #Include <Lib> to not affect the working directory used by subsequent #include directives.

Fixed objaddref() acting like ObjRelease() when called with a lower-case 'a'.

Fixed A_AhkPath in 32-bit compiled scripts to detect 64-bit AutoHotkey installations and vice versa.

Fixed TreeView controls with -Background option rendering incorrectly on older OSes.

Fixed error messages shown during execution of While/Until to identify the appropriate line.

1.1.07.03 - March 25, 2012

Fixed Ctrl/Alt/Shift key-down hotkey breaking any corresponding key-up hotkey defined before it.

Fixed key-down hotkeys to always use the hook if defined after a key-up hotkey of the same key. If the key-down hotkey used the "reg" method, the hook would block the key-down event and trigger only the key-up hotkey.

Fixed load-time checks interpreting expressions with no derefs as raw text. For example, gosub % "foo" resolved to "foo": at load-time. Similarly, % "" was seen as invalid in various cases even if an empty string should be allowed.

1.1.07.02 - March 22, 2012

Fixed a rare crash which can occur when GetClipboardData() fails.

Fixed ComObjArray() to return an empty string on failure instead of an arbitrary integer.

Fixed Object.Remove(i, "") affecting integer keys when !Object.HasKey(i).

1.1.07.01 - March 2, 2012

Fixed FileRead to ignore #MaxMem when reading UTF-16 on Unicode builds.

Fixed dynamic function calls with built-in vars such as %A_ThisLabel%().

1.1.07.00 - February 27, 2012

Enhanced %var%() to support function references, objects imitating functions and the default __Call meta-function.

Fixed ControlGet List to work for ListViews where the script and the target process aren't both 32-bit or both 64-bit.

Fixed SendEvent with a key delay of 0; a change introduced by v1.1.05.04 caused it to be slower than intended.

Fixed Object.Remove(i) not adjusting keys if Object[i] doesn't exist.

Fixed an error in ComObjType() which may have caused unpredictable behaviour when it is called via an alternative name.

Fixed ExitApp to exit the thread if an OnExit subroutine prevents the script from terminating, instead of resuming execution after the block which contained ExitApp.

Calling a function via an object no longer acts as a barrier to exiting the thread. Consequently, if Exit is used or a runtime error occurs within a class method, the entire thread exits instead of just the function.

Calling a base-class method using base.Method() or similar inside a class definition no longer causes a UseUnset warning if the method doesn't exist. Consequently, instantiating an object which has instance variables no longer causes a warning about the internal base.__Init method if the base class has no instance variables.

1.1.06.02 - February 13, 2012

Fixed IniRead crashing when Section is omitted but Key isn't.

Fixed accuracy of FileGetSize with files which are 4GB or larger.

1.1.06.01 - February 12, 2012

Fixed MsgBox smart comma handling to require numeric Options, not Title.

1.1.06.00 - February 12, 2012

New features:

Integrated #InputLevel directive and SendLevel command by Russell Davis.

Integrated support for Link controls by ChrisS85.

Breaking changes:

Changed command parser to avoid trimming escaped characters such as `t or `  at the beginning or end of an arg.

Changed MsgBox's smart comma handling to improve flexibility and consistency.

  • % can now be used to make Options or Timeout an expression.
  • If the first arg is an expression, any unescaped comma which is not enclosed in quote marks or parentheses/brackets/braces will cause multi-arg mode to be used. These commas were formerly interpreted as multi-statement operators within the first-and-only arg (Text).
  • When Title is an expression, unescaped commas contained within the expression no longer interfere with smart comma handling.
  • If there are exactly two args and the first is empty or an integer, multi-arg mode is used. The former behaviour was to combine both into a single arg (Text).
  • Timeout can be a literal number or a single deref (and optionally part of a number; for example, %Timeout%.500). Contrary to the documentation, the former behaviour interpreted most other cases beginning with % as expressions (containing a double-deref).
  • Title can be an expression even if Text and Options are omitted.

Changed A_IsUnicode/A_IsCompiled to be defined as an empty string in ANSI versions/uncompiled scripts instead of being left undefined. This allows them to be checked without triggering #Warn warnings. Side effects include:

  • Attempting to assign directly to A_IsCompiled or A_IsUnicode always causes a load-time error. Dynamic assignments always fail, either silently or with an error dialog as appropriate. Previously assignments were allowed in uncompiled/non-Unicode scripts.
  • Attempting to take the address of A_IsCompiled or A_IsUnicode always fails.
  • A_IsCompiled and A_IsUnicode no longer appear in ListVars when referenced by a script which is not compiled/Unicode.

Changed Send and related commands to respect #MenuMaskKey when changing modifier keystates.

Other changes:

Changed GuiControl Choose to remove the ListBox/ComboBox/DDL's current selection when N=0.

Changed RegisterCallback to allow a Func object in place of a name.

Changed ListLines to show filenames (except when compiled).

Improved Run to output a process ID if possible when ShellExecuteEx is used.

Fixes:

Fixed handle leaks in RegRead.

Fixed x.y++ and similar to assign an empty string if x.y is non-numeric.

Fixed SendInput Win+L workaround causing Win key to "stick down".

Fixed Ahk2Exe auto-including the wrong file if an auto-include used #Include <Lib>.

1.1.05.06 - December 31, 2011

Fixed inc (++) and dec (--) having no effect when used on an object field containing a string.

Fixed inc (++) and dec (--) to cause a warning when used on an uninitialized variable.

1.1.05.05 - December 17, 2011

Fixed continue n misbehaving when an inner loop has no braces.

Fixed RegExMatchObject[Name] to work correctly with duplicate names.

1.1.05.04 - December 5, 2011

Fixed: Selected sub-command of ControlGet was unreliable on x64.

Fixed: CPU was maxed out while waiting if an underlying thread displayed a dialog (and possibly in other cases).

1.1.05.03 - November 30, 2011

Fixed Loop ... Until VarContainingObject.

1.1.05.02 - November 20, 2011

Fixed false detection of end-of-file when loading a compiled script in some cases.

Fixed SendInput to automatically release modifier keys when sending special characters or {U+xxxx} (which was broken by v1.1.00.01).

Fixed ComObjConnect to filter out non-dispatch interfaces instead of allowing the script to crash.

Fixed new %VarContainingClassName%().

1.1.05.01 - October 16, 2011

Fixed class declarations to allow directives such as #Include.

1.1.05.00 - October 8, 2011

Added Client coordinate mode.

Added object output mode for RegExMatch and RegEx callouts.

Added super-global declarations, which avoid the need to repeat global declarations.

Breaking change: Class declarations such as Class c now create a super-global variable instead of an ordinary global.

Added more detail to unhandled exception error dialogs.

Changed Gui +Owner to work even after the GUI is created.

Changed instance var declarations in class definitions to avoid leaving empty key-value pairs in the class object.

Changed #Include to use standard error message formatting when it fails (more detail; also respects ErrorStdOut).

Changed Throw to throw an Exception object by default when its parameter is omitted.

Changed format of runtime error messages slightly to improve consistency and code size.

Modified PCRE to use UTF-16 for input on Unicode builds, for performance.

Upgraded PCRE to 8.13.

Fixed thread not exiting as intended when an assignment in an expression fails.

Fixed #MaxMem preventing assignments to variables which don't require expansion.

Fixed inability of Try/Catch to catch COM errors.

Fixed GuiControlGet incorrectly treating parameter #2 as invalid in some cases.

Fixed input vars being resolved too soon, allowing them to be invalidated by an expression later on the same line.

Fixed RegEx callouts not causing matching to abort when an exception is thrown.

Fixed DllCall setting ErrorLevel to -4 when it should be -3.

Fixed While appearing twice in ListLines for its first iteration.

Fixed Try/Catch to allow If/Loop/For/While with no enclosing block.

Fixed enumerator object not being released when Until is used to break a For-loop.

1.1.04.01 - September 15, 2011

Fixed FileRemoveDir setting ErrorLevel incorrectly.

1.1.04.00 - September 11, 2011

This release contains a number of potentially script-breaking changes.

Added exception handling support: try/catch/throw and Exception().

Added StdOut mode for #Warn.

Added Gui +HwndVARNAME option.

Added Gui, New [, Options, Title].

Added automatic support for keyboard accelerators such as Ctrl+O in Gui menus.

Changed handling of #Include <Lib> when the /iLib command-line switch is present to resolve a problem with Ahk2Exe.

Changed GuiControl to retain the Progress control's current value when its style is changed.

Changed GuiControl and GuiControlGet to allow a HWND to be passed in the ControlID parameter.

Removed the 1GB limit from FileRead.

Improved error detection:

  • Hotkey, If, Expression, where Expression does not match an existing #If expression, is caught at load-time when possible.
  • Hotkey, IfSomething, where Something is invalid, is caught at load-time.
  • Class definitions with missing braces are detected as errors.
  • If a function call is used on the first line of a class definition, it is now correctly treated as an error.
  • GroupAdd now shows an error message when the group name is blank, instead of silently exiting the thread.
  • Removed some redundant "unset var" warnings which appeared when using the OutputDebug or StdOut warning modes.
  • If an unrecognized option is used with Gui, Gui Show, Gui New or GuiControl, an error message is shown and the thread exits unless try is used. This validation is not done at load-time due to complexity (it is common for the option parameters to contain variable references).
  • RegRead, RegWrite and RegDelete now set A_LastError to the result of the operating system's GetLastError() function.
  • +LastFoundExist is now treated as an error if it is combined with another option (+LastFound should be used in that case).

Fixed a bug affecting recursive variadic functions.

1.1.03.00 - August 28, 2011

Added support for GUI names.

Added support for identifying a GUI by its HWND.

Added +Parent%ParentGui% Gui option.

Added support for external windows as Gui owners via +Owner%HWND%.

Added Name sub-command for GuiControlGet.

Added support for ActiveX controls via the Gui command.

Fixed: Empty hotkey control returned "vk00".

Fixed: Crashes and memory leaks related to COM events/ComObjConnect.

Fixed: GuiControlGet OutputVar, Subcmd, %OutputVar% always failed.

Changed "Missing (/[/{" error messages to "Unexpected )/]/}" for greater clarity.

Changed ListLines to display While and Until lines which are executed each iteration.

Changed ~= to have higher precedence than =/!=/</>/<=/>= but lower than concat, and added it to the documentation.

1.1.02.03 - August 21, 2011

Fixed (Debugger): numchildren attribute did not include Object.Base.

1.1.02.02 - August 20, 2011

Fixed: Variable capacity was capped at 2GB on x64 builds.

Fixed: Last Found Window not set by #if WinExist(T).

1.1.02.01 - August 13, 2011

Changed A_PriorKey to exclude key-up events.

Fixed process name/path retrieval in certain cases, including:

  • Retrieving name/path of a 64-bit process from a 32-bit script.
  • Retrieving name/path of an elevated process from a non-elevated process (UAC).

1.1.02.00 - August 6, 2011

Added TV_SetImageList().

Characters which require non-standard shift states 16 and 32 now use a fallback method instead of producing the wrong keystrokes.

Revised handling of dead keys to solve problems which occur when multiple scripts with hotstrings are active.

1.1.01.00 - July 30, 2011

Added support for instance variables in class definitions, using simple assignment syntax.

Removed var keyword used in class definitions; use static instead.

Added new built-in variables: A_ScriptHwnd and A_PriorKey.

Added new built-in functions: GetKeyName(), GetKeyVK(), GetKeySC() and IsByRef().

Added new sub-command: WinGet, OutputVar, ProcessPath.

Added the capability to specify a window by process name or path: ahk_exe %Name%.exe or ahk_exe %FullPath%.

Optimized ProcessName sub-command of WinGet.

Changed SetTimer to use A_ThisLabel if Label is omitted.

Updated ComObjConnect() to support using an object in place of a function name prefix.

Improved ComObjConnect() to allow the prefix/object to be updated without first disconnecting.

Improved parsing of continuation sections to allow expressions like (x.y)[z]() without escaping "(".

Replaced the method used to store script text in 32-bit compiled scripts; now consistent with 64-bit.

Fixed detection of AltGr in the active window's keyboard layout (on Unicode builds).

Fixed SendInput applying a redundant LCtrl-up some time after AltGr-up.

1.1.00.01 - July 17, 2011

Fixed: Modifier keys weren't auto-released when sending special chars.

Fixed: Scancode/modifier-key mapping conflicts such as sc1xx vs ^sc0xx.

Fixed: $ and #UseHook had no effect if used only on the second or subsequent instance(s) of a hotkey.

Fixed: Potential crash when returning a value from a __Delete meta-function.

Fixed: "Uninitialized variable" warnings were triggered by the debugger.

Changed: base.Method() no longer triggers a default meta-function or a warning.

Changed: Gui +(Ex)Style no longer hides/shows the Gui.

Changed the debugger to report type="undefined" for uninitialized variables.

Added check to avoid incorrectly sending keystrokes for characters which actually require the "hankaku" key.

Added support for integers as class variable names.

Added "Static" keyword for declaring class variables.

1.1.00.00 - May 1, 2011

New features:

Implemented basic class definition syntax.

Implemented the new keyword for creating a derived object.

Added Func() for retrieving a reference to an existing function and improved IsFunc to recognize function references.

Added support for ++ and -- with object fields, such as x.y[z]++.

Changes:

Changed __Delete to not trigger __Call.

Changed OnClipboardChange to use AddClipboardFormatListener when available (i.e. on Windows Vista and later) to improve reliability.

Auto-concat with ( is more selective, so some invalid expressions like 12(34) will no longer work.

Fixes:

Fixed SetTimer Label, -0 to be treated as "run-once, very soon".

Fixed A_MyDocuments etc. to use SHGetFolderPath instead of undocumented registry keys.

Fixed non-empty ExcludeText causing windows with no text to be excluded.

1.0.97.02 - April 14, 2011

Fixed misinterpretation of comma as an arg delimiter when enclosed in {} in an expression.

Fixed For-loop to set A_Index only after the Expression arg is evaluated, so that the outer loop's value can be used.

Fixed default script location to be based on the directory containing the EXE (as documented), not the working directory.

Improved load-time validation to detect invalid attempts to jump out of a function with Goto.

1.0.97.01 - April 2, 2011

Fixed the 64-bit build to not truncate HWNDs or SendMessage/PostMessage params to 32 bits.

Fixed */:: being treated as an invalid hotkey (broken since L54).

Fixed the icons.

1.0.97.00 - March 28, 2011

Added {key: value} as syntax sugar for Object("key", value).

Added [x, y, z] as syntax sugar for Array(x, y, z), which is a new function equivalent to Object(1, x, 2, y, 3, z).

Added slight optimization: resolve any reference to True, False, A_PtrSize or A_IsUnicode in expressions at load-time.

Fixed hotkey parser to treat x & ^y as an error instead of ignoring ^.

1.0.96.00 - March 21, 2011

New features:

ComObjQuery: Queries a COM object for an interface or service.

ComObjFlags: Retrieves or changes flags which control a COM wrapper object's behaviour.

ComObjCreate allows non-dispatch objects to be created if an interface identifier (IID) is given.

COM arrays support for-loops and the Clone() method.

ListVars shows the inner variant type and value of each COM wrapper object, in addition to the wrapper's address.

Changes:

When a literal integer or variable containing both a numeric string and cached binary integer is assigned to a field of an object, an integer is stored instead of a string. This particularly benefits scripts calling COM methods which accept integers but not strings, or have different behaviour depending on the type of value.

NULL values are now allowed with ComObjParameter for the VT_UNKNOWN and VT_DISPATCH types.

Improved support for Common Language Runtime (.NET) objects via COM.

FileRecycle should now warn before deleting a file which is too large to recycle.

When a SafeArray created with ComObjArray is assigned to an element of another SafeArray, a separate copy is created. This prevents the script from crashing due to a second attempt at "destroying" the array. ComObjFlags allows this behaviour to be avoided.

Fixes:

Assigning to a COM array of VT_DISPATCH or VT_UNKNOWN crashed the script.

Break and Continue were tolerated outside of loops in some cases.

Standalone carriage-return (`r) was not correctly interpreted as end-of-line.

MouseMove miscalculated negative coordinates with the Input and Event send modes.

Selecting Edit This Script from the tray menu or using the Edit command crashed the script (broken by v1.0.95).

Error dialogs pointed at irrelevant lines of code in some cases.

1.0.95.00 - March 12, 2011

All file I/O has been heavily optimized.

Added #Warn to assist with debugging; initial design by ac.

By default, if name_var contains a function name, name_var.() calls the function. This can be overidden via the default base object, as before.

Run supports verbs with parameters, such as Run *RunAs %A_ScriptFullPath% /Param.

If an operator which can accept either one operand (&x) or two numeric operands (x & y) follows a quoted literal string, auto-concat occurs and the operator is applied only to the right-hand operand. This is because quoted literal strings are always considered non-numeric and are therefore not valid input for numeric operators. For example, expressions like "x" &y and "x" ++y now work.

Fixed:

  • Wildcard hotkeys were not respecting modifiers such as ^!+ in specific cases.
  • File.Pos returned garbage for non-seeking file types; now it returns -1.
  • File.AtEOF was incorrectly true in some cases.
  • COM wrapper objects left A_LastError unset in some cases.
  • Gui submenu icons did not work on Windows 2000/XP/Server 2003.
  • SplashImage clipped the image if height > width.
  • ComObjConnect did not alert when the first parameter is invalid.
  • SplashImage now uses GDI+ only when the other methods fail, for compatibility.
  • Tilde in ~x:: now affects x & y:: in the same way that ~x & z:: would, instead of having no effect.
  • A_PriorHotkey and A_TimeSincePriorHotkey now have the expected values when used with #If.
  • RegExReplace did not advance through the string correctly after a match failure if the string contained non-ASCII characters.

1.0.92.02 - January 19, 2011

Fixed a memory leak which occurred when the return value of an object invocation or built-in function was not used, such as file.ReadLine() or SubStr(x,y,z) alone on a line.

Replaced the fix from v1.0.92.01 with a better fix, which also fixes k::MsgBox(),x:=y and doesn't break if().

1.0.92.01 - January 18, 2011

Changed: FileCreateDir now sets A_LastError.

Fixed: GuiControl() or similar was sometimes misinterpreted as a command.

1.0.92.00 - January 13, 2011

Added support for compound assignments with objects, such as x.y += z.

Improved IniWrite in Unicode builds to prevent an empty line from appearing at the top of each new file.

Improved the parser to be more permissive about what can follow {/}/Else, especially when combined.

1.0.91.05 - January 1, 2011

Fixed: Cleanup code in COM method calls was freeing the wrong parameters.

Fixed (ANSI): DllCall set incorrect length for wstr parameters on output.

Fixed: Variadic function calls were unstable when param object was empty.

1.0.91.04 - December 29, 2010

Fixed (Unicode): RegExReplace omitted all text up to StartingPosition (broken by v1.0.90.00).

1.0.91.03 - December 27, 2010

Fixed: RegEx callout subpattern vars - broken by v1.0.90.00.

1.0.91.02 - December 26, 2010

COM: Added protection against NULL IDispatch/IUnknown pointers.

COM: Skip QueryInterface for IDispatch if VT_DISPATCH is passed explicitly.

Minor fix for maintainability: obj.field := var now correctly yields SYM_STRING, not SYM_OPERAND.

1.0.91.01 - December 24, 2010

Fixed: Unexpected results with File.Write(Str) after text-reading.

Fixed: UTF BOM check caused unexpected results in files without a BOM.

Fixed (ANSI): Parsing loops and File.ReadLine() treated Chr(255) as EOF.

Fixed (Unicode): RegExReplace errors where the UTF-8 and UTF-16 lengths differed.

Fixed: Disabling the last hook hotkey breaks Input.

Added: Simple optimization for RegExMatch/Replace.

1.0.91.00 - December 21, 2010

All changes in this release are COM-related.

Added: ComObjError now returns the previous setting.

Added: ComObjType(co) and ComObjValue(co).

Added: ComObjMissing().

Added: ComObjArray() and basic SAFEARRAY support.

Added: "Take ownership" parameter for ComObjParameter().

Changed: Values passed to COM functions via ComObjParameter are no longer freed in the process of calling the function.

Changed: ComObj.x() now falls back to PROPERTYGET if member 'x' is not found. This fixes for-loops for some objects.

Changed: Wrap unhandled variant types in an object rather than returning integer value.

Changed: Manage VT_UNKNOWN/VT_ARRAY lifetime automatically, by default.

1.0.90.00 - November 27, 2010

Fixed: UrlDownloadToFile in Unicode builds on Windows < 7.

Fixed: Upper-ANSI characters were sent as Alt+0 in ANSI build.

Fixed: File.Pos was incorrect after attempting to read past EOF.

Fixed: Escape sequences in #If expressions and static initializers.

Fixed: ClipboardAll sometimes crashed the script with certain formats.

Fixed: Transform HTML calculated length incorrectly for &#NNN; entities.

Fixed: VarSetCapacity now correctly ignores #MaxMem for ByRef variables.

Fixed: FileAppend,,file.txt set ErrorLevel=1 even on success.

Fixed: Match length was miscalculated for RegEx callouts with the P) option.

Integrated Sean's improvements to number handling in COM interop.

Optimized RegExReplace and RegExMatch in Unicode builds.

Revision 61 - October 3, 2010

Added: ObjClone(Object), forgotten when Object.Clone() was implemented.

Added: Support for RegEx Unicode properties in Unicode builds. Also upgraded PCRE to 8.10.

Added: Object.Remove(int, "") removes Object[int] without affecting other keys.

Changed: ComObj.xyz() is now always treated as a method-call.

Changed: Var := 123 is now left as an expression, for consistency. This makes Var := 123 and Var := (123) equivalent, whereas previously the former assigned only a string and the latter assigned both a string and a cached binary integer. In particular, this avoids some confusing type mismatch errors with COM objects.

Fixed: Dynamic variadic calls to functions with mandatory parameters.

Fixed: The final parameter of an assume-global variadic function had to be explicitly declared local.

Fixed: Static initializers interfering with setting of breakpoints.

Fixed: More pointer size-related errors with PCRE callouts on x64 builds.

Fixed: Input with 'M' option treated Ctrl-M (`r) as Ctrl-J (`n).

Fixed: Object.Remove(n) returned 0 (not "") if Object[n] didn't exist.

Revision 60 - September 24, 2010

Added: File.Encoding for changing or retrieving the codepage in use by a File object.

Added: Variadic functions and function-calls and indirect mode for callbacks.

Added: Object.Clone()

Changed: ByRef parameters no longer require the caller to supply a variable.

Changed: Obj.foo := "" now frees foo's contents as originally intended (but still doesn't remove the field).

Changed: OnMessage functions now tolerate optional and ByRef parameters.

Changed: RegisterCallback now enables execute access on callbacks in 32-bit builds (already did in 64-bit builds).

Changed: RegisterCallback now treats explicit ParamCount="" as omitted.

Fixed: For-loop was treating non-expression "0" as true for scripted enumerators.

Fixed: ComEvent (ComObjConnect) not working on the ANSI build.

Fixed: ComEvent (ComObjConnect) not correctly backing up/restoring local vars when calling a function which is already running.

Fixed: Buffer overflow in A_EndChar when there is no end char.

Fixed: Func->mNextFunc not inititialized to NULL (used only by LowLevel scripts).

Debugger: Added the capability to retrieve an object's contents (with a supported debugger client).

Debugger: Fixed a few bugs.

Revision 59 - September 12, 2010

Fixed: #If expression should now evaluate each expression at most once per keypress in all cases.

Changed: SplashImage uses common image-loading routines; now supports PNG and similar, but results may differ from before for icon files.

Added: For x,y in z.

Added: Loop .. Until expression, usable with any Loop or For-loop.

Added: Named loops; continue outer_loop, break 2, etc.

Debugger: Encode stdout and stderr packets as UTF-8.

Debugger: Allow user to Abort, Retry or Ignore when the initial connection fails.

Debugger: Allow attaching a debugger client by sending the script a registered window message.

Debugger: Allow detaching debugger client by sending the "detach" DBGp command.

Revision 58 - September 5, 2010

Added: static var := expression.

Revision 57 - September 4, 2010

Fixed Str*, WStr* and AStr* DllCall return types on x64.

Added functionality to InStr to bring it in line with StringGetPos:

  • If StartingPos is negative, the search is conducted right-to-left beginning at that offset from the end.
  • An additional parameter is available to specify which occurrence of the string to find.

Added #include <LibName> for explicitly including a script from a function library folder.

Added functionality to IniRead and IniWrite allowing an entire section to be read or written.

Added functionality to IniRead allowing a list of section names to be retrieved.

Added support for custom verbs to Run/RunWait: Run *verb file.

Made improvements to the way Run/RunWait extracts the action and its parameters from the Target parameter.

Changed NumGet/NumPut to allow Offset to be omitted entirely since Type is always non-numeric.

Removed the restriction that a label can't point to the end of a block.

Revision 56 - August 29, 2010

Added support for x64 compiled scripts. Requires Ahk2Exe_L and x64 AutoHotkeySC.bin.

Fixed: Deref operator (*addr) rejected addresses outside 32-bit range.

Fixed: #If expression memory allocation error on x64.

Fixed: Custom hotstring end chars with code points greater than U+00FF.

Fixed: Special characters being sent out of sequence by SendInput/Play.

Fixed: */ being discarded in continuation sections (see L54).

Revision 55 - August 19, 2010

Fixed: GroupActivate not setting ErrorLevel=1 if no Label was specified.

Fixed: Tab controls in x64 build.

Fixed: String-copy mode of StrPut when length is omitted; broken by L53.

Fixed: Data-alignment issues in x64 builds.

Changed: Set A_LastError for more File* commands to assist debugging.

Includes FileAppend, FileRead, FileReadLine, FileDelete, FileCopy, FileMove, FileGetAttrib/Time/Size/Version and FileSetAttrib/Time.

Excludes FileCopyDir, FileRecycle, FileMoveDir, FileRemoveDir, FileRecycleEmpty, FileCreateDir and FileInstall as the APIs used do not consistently set or return a Win32 error code.

Revision 54 - August 15, 2010

Fixed: RunAs in Unicode build. [jackieku]

Fixed: RegisterCallback in x64 build. [fincs]

Fixed: Executables failing to run on Win2k and WinXP prior to SP2. Win2k requires SP4 and updates (probably KB 816542). XP not tested.

Fixed: Dialogs such as MsgBox became unresponsive when interrupted by another script thread. Message filter/workaround added in L45 had to be removed. [Bug report]

Fixed: Multi-byte characters in default ANSI codepage; this was also causing a memory leak. [Bug report]

Fixed: ComObject now allows purely numeric property/method names. [Bug report]

Enhanced usability and capabilities of FileOpen/File object.

  • FileOpen's Flags parameter accepts a human-readable string of flags.
  • FileOpen's "update" mode has been renamed "read/write" and now creates the file if it didn't already exist.
  • FileOpen sets A_LastError as appropriate.
  • File := FileOpen(handle,"h") wraps an existing file handle in an object.
  • File.Seek(n) defaults to SEEK_END when n is negative.
  • File.Pos (or File.Position) can be used in place of Tell and Seek.
  • File.Pos, File.Length, File.AtEOF and File.__Handle can be used without empty parentheses().
  • File.Length can be set, as in File.Length:=n.
  • File.ReadNum() and File.WriteNum(n) read or write a number, where Num is a NumGet-compatible type name.
  • File.WriteLine(s) is equivalent to File.Write(s "`n"), for symmetry with File.ReadLine().
  • File.Read() reads and returns the remainder of the file when used without parameters.
  • File object now returns "" for unrecognized methods and invalid syntax rather than the numeric address of "".

Changed: GroupAdd's Label parameter now applies to the whole group. [Discussion]

Changed: GroupActivate sets ErrorLevel on success/failure. (Same thread as above.)

Changed: */ at the beginning of a line is ignored if there was no /*. [Discussion]

Removed ToCodePage and FromCodePage subcommands of Transform.

Revision 53 - August 8, 2010

Merged AutoHotkey64 - COM support and x64 compatibility.

x64 (changes since AutoHotkey64):

  • Fixed floating-point return values and exception handling for DllCall.
  • Fixed RegEx callouts.
  • Re-enabled GetProcAddress optimisation for DllCall.
  • NumPut and NumGet default to "Int64" in x64 builds.

COM (changes since AutoHotkey64):

  • Allow ComObjParameter to wrap 64-bit values in 32-bit builds.
  • Implemented more standard ref counting conventions in ComObjActive.
  • Prevent extraneous AddRef for new ComObjects in certain cases.
  • Don't treat pdispVal==NULL return value from Invoke as an error.
  • Fail more predictably when given wrong type of object.
  • Require explicit second param in ComObjType, don't assume "IID".
  • Free local vars after ComEvent calls a function.
  • Remove pVarResult param from ComEvent; use return value instead.
  • Pass the original wrapper ComObject in each ComEvent call.
  • Add context to ComError dialog; let the buttons make more sense.

Implemented common syntax validation code for enumerators. Enum[] and Enum.Next() are now supported with or without parameters. Enum[]:=val and similar obscure forms which worked in AutoHotkey_COM/AutoHotkey64 are not allowed.

"Ptr" type is still signed (unlike AutoHotkey64), for maximum flexibility and consistency.

Other changes:

Added: Object.HasKey(key).

Added: Object(obj) increments obj's reference count and returns its address.

Added: ObjAddRef() and ObjRelease().

Fixed: A_ThisHotkey now has the expected value when used with #If.

Fixed: RunAs in Unicode build (fixed by jackieku).

Changed: Default script codepage for ANSI builds is now CP0 (ANSI).

Changed: x.y[] is now equivalent to (x.y)[] rather than x["y"].

Changed: Built-in methods can now be called with or without the underscore prefix (e.g. obj.MaxIndex() or obj._MaxIndex()).

Revision 52 (again) - July 10, 2010

Added support for built-in and environment variables in double-derefs.

Improved support for multi-byte characters in certain codepages (previously only 932, 936, 949, 950 and 1361 were supported).

Fixed: StrPut failed for codepages which don't support WC_NO_BEST_FIT_CHARS, such as UTF-7.

Fixed: Double-deref as object - literal%var%.literal.

Fixed: StrPut("", Encoding) null-terminated an invalid address.

Revision 52 - June 12, 2010

Fixed: ObjRemove's Key parameter is now optional, as with Object._Remove.

Fixed: Files were improperly locked while reading, unlike in older versions.

Fixed: Uppercase Hex format caused negative integers to become unsigned.

Fixed: RegExMatch was corrupting output array items when specific conditions were met. See bug report.

Revision 51 - April 11, 2010

Changed: Use <EXENAME>.ahk instead of AutoHotkey.ini or AutoHotkey.ahk.

Changed: Default to UTF-8 for script files; override with /CPnnn.

Fixed: Unpause when the script exits so that object __Delete meta-functions can run.

Revision 50 - March 27, 2010

Improved flexibility of Object._Insert.

  • Object._Insert(x) - inserts x at _MaxIndex()="" ? 1 : _MaxIndex() + 1.
  • Object._Insert(i,x,y,z) - inserts x,y,z at i,i+1,i+2.

Improved flexibility of Object._Remove.

  • Object._Remove(k) - removes and returns the value associated with k.
  • Object._Remove() - removes and returns the value at _MaxIndex().

Added file share mode flags to FileOpen [by jackieku].

Fixed: 'P' option of RegExMatch incorrectly output 1 for subpatterns which did not match anything.

Fixed: Object._SetCapacity(key,n) was not null-terminating in some cases.

Fixed: StatusBarGetText returned only half of the text in Unicode builds.

Revision 49 - March 14, 2010

Added obj._NewEnum().

Added ObjMethod(obj) for each built-in obj._Method().

Changed: ObjSet/Get/Call can no longer be called/overridden by script.

Fixed: Potential crash caused by VK_PACKET check added in L48.

Fixed: Character codes in VK_PACKET events were potentially misinterpreted as scancodes.

Fixed: ExcludeText was ineffective after the first matching control.

Revision 48 - February 21, 2010

Fixed: Standalone obj.() was not recognized as a valid expression.

ControlSend now uses WM_CHAR to support characters which have no associated keycode. For instance, this applies to "…" (en-US), "∞" in a Unicode build and {U+221e} in either build.

KeyHistory now shows the full 16-bit character code for VK_PACKET (VK=E7) events. Send may indirectly cause these to be generated for Unicode characters.

Revision 47 - February 13, 2010

Fixed (Unicode): ControlGet,List with ListView controls.

Revision 46 - February 11, 2010

Added A_FileEncoding, which returns the current default file encoding.

Added StrPut and extended StrGet with additional features.

Revision 45 - February 8, 2010

Added _GetAddress; _SetCapacity/_GetCapacity may now operate on a given field. [more info]

Added workaround for WM_PAINT infinite loop often caused by subclassing.

Allow obj.() as a means to call the default method of an object; equivalent to obj[""]().

Dev: Added solution and project files for MSBuild 4.0 & VS2010. [more info]

Fixed (Unicode): 'Running' column in ListHotkeys.

Revision 44 - February 7, 2010

Fixed: Attempting to set "nothing" crashed the script. For instance, x[]:=z.

Fixed (Unicode): Unable to find default script (Documents\AutoHotkey.ahk).

Fixed (Unicode): A_Desktop, A_ProgramFiles and several other built-in variables which read their value from the registry caused strings to be incorrectly terminated.

Fixed (ANSI): Characters in the range 0x80-0xFF couldn't be found by InStr or StringReplace.

Changed (ANSI): Treat ToCodePage/FromCodePage like other unsupported/invalid subcommands.

Revision 43 - January 29, 2010

Fixed: obj.Func() resulting in a random integer when it should be an empty string.

Revision 42 - January 28, 2010

Merged with AutoHotkeyU.

Numerous bug-fixes and improvements, some relating to the merge.

Revision 41 - December 20, 2009

Fixed: Floating-point numbers were equivalent to an empty string when used as keys in objects. They are now converted to numeric strings in the current float format, as originally intended.

Revision 40 - December 13, 2009

Changed meta-functions and multi-param behaviour to improve flexibility. Meta-functions are now invoked *before* searching for an appropriate field in each base object; however, values in x.base will override meta-functions defined in x.base.base. Chaining meta-functions (inheritence) is now possible by avoiding "Return"

Improved Default Base functionality to be more consistent with real objects.

Changed (Debugger): While stepping through code, skip all braces except those which end a function.

Changed (Debugger): When stepping onto the hidden "Exit" at end of the script, consider it to be *below* the last physical line to avoid confusion.

Revision 39 - December 2, 2009

Fixed (Debugger): Error in Base64 decoding used by property_set.

Revision 38 - November 17, 2009

Added: #MenuMaskKey directive to change which key is used to mask Alt/Win keyup events. See this thread for background information.

Changed: If x[1,2]:=3 creates an object for x[1], it's base is no longer automatically set to x.base. See the documentation for a method of controlling this behaviour.

Revision 37 - November 7, 2009

Added: Support for obj[method_name](params) object-call syntax.

Revision 36 - November 4, 2009

Changed: If x.y or similar is immediately followed by an open-bracket ([), the right-most identifier preceding the bracket is treated as the first parameter of the operation. For instance, a.b.c[d] is equivalent to ObjGet(a.b,"c",d) and x.y[z]:=v is equivalent to ObjSet(x,"y",z,v). Previously each sub-expression preceding a bracket was evaluated separately.

Changed: If a method-call such as x.y() is followed immediately by an assignment, the parentheses are treated as brackets. For instance, x.y(z):=v is now equivalent to ObjSet(x,"y",z,v).

Fixed: If(expr) and While(expr) with no delimiting space or comma.

Revision 35 - October 25, 2009

Fixed: Standalone expressions beginning with two or more "dots", such as x.y.z(). (Broken by L34.) Note that '(' or '[' or ':=' is still required.

Revision 34 - October 24, 2009

Changed: Setting a value within an object to an empty string now stores the empty string rather than removing the key-value pair from the object. _Remove can still be used to completely remove key-value pairs.

Changed: Command names must be terminated with a space, tab or comma. The following characters no longer bypass this requirement: <>:+-*/!~&|^[]. For instance, syntax errors such as MsgBox< foo and If!foo are now caught at load-time.

Fixed: Return now properly handles expressions which result in a variable containing an object. For instance, Return x:=y, Return (x), Return x,... and similar should work now (Return x already worked).

Fixed: Multi-parameter get/set did not correctly support meta-functions for multiple objects (such as for x and x[y] in the expression x[y,z]).

Fixed: Cascading object-assignments such as the x[y]:=z in r:=x[y]:=z could not yield numbers or objects - broken by L33.

Fixed: x._Remove(y) crashed the script or removed the wrong item if x did not contain y.

Fixed: x.=y, if x.y=... and similar. May affect other expressions.

Fixed: Standalone ternary expressions no longer requires spaces. For instance, x? F(1) : F(2) is now allowed.

Debugger: On script exit, disconnect debugger *after* releasing objects to allow debugging of __Delete handlers.

Revision 33 - October 3, 2009

Fixed: Local variables were not automatically freed for functions which return objects or pure numbers.

Fixed: Two separate reference-counting errors related to ternary operator and Object().

Fixed: If a string returned by a scripted object function was assigned directly to a variable, the variable's length was set incorrectly.

Fixed: If the last operation in an expression retrieved a string from a temporary object, the object and string were freed prematurely.

Fixed: Numeric strings with special formatting were not preserved when returned from a function via a variable or passed to a recursive function.

Fixed: If the final result of an expression (other than for Return) is an object, correctly yield an empty string instead of silently aborting the thread.

Fixed: __Delete meta-functions sometimes overwrote temporary values in the deref buffer.

Added: An address retrieved via &object may be cast back into an object reference by using Object(address).

Revision 32 - September 26, 2009

Fixed: Send/PostMessage crash when less than three parameters were specified.

Revision 31 - September 26, 2009

Added: Object/array support and numerous minor changes to make this possible.

Added: Support for While(expression) with no delimiting space.

Added: Trim, LTrim, RTrim.

Added: A ~= B; equivalent to RegExMatch(A, B). May be removed in a future revision.

Fixed: An incompatibility with LowLevel.

Changed: Characters [, ] and ? are no longer valid in variable names. Consequently, ? (ternary) no longer requires a space on either side.

Changed: Optional parameters may now be omitted at any position in the parameter list of a non-dynamic function call. Since this works by automatically inserting the parameter's default value at load-time, it is not supported or allowed for dynamic function-calls.

Debugger: Various minor changes to make program flow easier to follow while stepping through code.

Optimization: If DllCall's first parameter is a literal string which identifies a function already present in memory, it is replaced with the actual address of the function.

Updated from v1.0.48.03 to v1.0.48.04.

Revision 30 - May 31, 2009

Updated from v1.0.48.02 to v1.0.48.03.

Revision 29 - May 2, 2009

All supported image formats may now be used as menu icons. Currently it is necessary to specify "actual size" when setting the icon to preserve transparency on Windows Vista and later. For example:

Menu, Icon, MenuItemName, Filename.png,, 0

Revision 28 - May 2, 2009

Improved average-case performance of dynamic function calls by implementing binary search for function name look-ups. This change also applies to other areas, such as load-time resolution of function references in expressions and run-time resolution by OnMessage, RegisterCallback, etc.

Revision 27 - April 26, 2009

Updated from v1.0.48.00 to v1.0.48.02.

Revision 26 - April 11, 2009

Fixed: Menu icons were not drawn on items which have sub-menus if owner-drawing was in use.

Fixed: Menu icons were not freed if all menu items were deleted at once.

Changed (Source): Renamed AutoHotkey.sln to AutoHotkey_L.sln to allow VS window to be identified more easily.

Revision 25 - March 30, 2009

Fixed: Send {U+xxxx} correctly sets modifier key-state as with any normal key.

Fixed: Send {U+..xx} no longer triggers hotkey SCxx.

Revision 24 - March 30, 2009

Added: Support for Send {U+xxxx}. SendInput() is used where available for proper unicode support, otherwise falls back to Alt+Numpad.

Revision 23 - March 30, 2009

Fixed: GuiControl, Enable/Disable now only resets focus if the focused control was disabled.

Revision 22 - March 26, 2009

Optimized If var [not] in/contains MatchList, especially for long lists containing shorter fields.

Revision 21 - March 16, 2009

Minor optimizations to While. [thanks Chris]

Fixed (Debugger): Revisions 19 and 20 omitted timer threads from the call stack.

Fixed (Debugger): XML-reserved characters were not escaped in most situations.

Fixed (Debugger): Incorrect command and transaction_id were used in the final response before exiting the script.

Revision 20 - February 27, 2009

Changed: If an icon cannot be loaded with the new method, fall back to the old method.

Revision 19 - February 26, 2009

Added: Gui, Font, qN option to set font quality/control anti-aliasing, where N is between 0 and 5.

Fixed: IL_Add now loads icons at the most appropriate size when multiple sizes exist.

Merged with AutoHotkey v1.0.48, introducing bug fixes, optimizations and other changes by Chris. Some AutoHotkey_L features were integrated into the mainstream release; changes to these features since previous revisions are as follows:

  • Legacy behaviour is no longer applied to While - e.g. "While %x%" is correctly interpreted as a double-deref rather than as "While x".
  • One-True-Brace style is now supported for While.
  • Static vars may now be declared and initialized in assume-static functions.
  • Passing too few parameters in a dynamic function call is no longer allowed, as it allows the function's caller to second-guess the function's designer, reduces the ability to detect script bugs at runtime, and may cause the application to crash if calling a built-in function.

Revision 18 - February 21, 2009

Fixed: Incomplete bug-fix in previous revision causing concat followed by assignment to skip the rest of the expression in some cases.

Revision 17 - February 20, 2009

Added: Menu icons via Icon and NoIcon sub-commands of the Menu command.

Changed: Negative icon numbers can now be used to indicate a resource ID within an executable.

Changed: Set default style of menus to include MNS_CHECKORBMP.

Changed: Load both small and large versions of custom tray icons to allow the correct icons to be shown in the appropriate places.

Fixed: Loading of icons from executable files at sizes other than the system small/large.

Revision 16 - February 4, 2009

Fixed: Deleting a menu item partially deleted its associated sub-menu.

Revision 15 - February 1, 2009

Fixed: SetFormat's presence in a *compiled* script was not disabling binary number write-caching. SetFormat should now work correctly in compiled scripts.

Revision 14 - February 1, 2009

Numerous bug-fixes and optimizations by Chris (pre-v1.0.48 beta).

Added: Support for regex callouts and the auto-callout option 'C'.

Changed: A_AhkVersion now includes the revision number. For instance, this is 1.0.47.07.L14.

Fixed: HWND's/window ID's were sign-extended to 64-bit. For instance, 0xb482057e became 0xffffffffb482057e.

Revision 13 - November 29, 2008

Fixed: Invalid DllCall types were treated as INT in some build environments.

Added: Workaround for GuiEscape issue when disabling focused control.

Changed version info: InternalName, ProductName and FileDescription are now "AutoHotkey_L" instead of "AutoHotkey".

Revision 12 - September 6, 2008

Fixed: Potential access violation when using property_get on a built-in variable. -- DBGP

Revision 11 - September 5, 2008

Fixed: Remove checksum from AutoHotkeySC.bin via post-build script (AutoHotkey must be installed).

Added: .L suffix to A_AhkVersion.

Added: Preliminary support for DBGp (interactive debugging).

Revision 10 - August 2, 2008

Fixed: WheelLeft/WheelRight support, which was broken in revision 9.

Revision 9 - July 29, 2008

Fixed: Allow Break/Continue in While.

Fixed: TrayTip in non-English Windows and possibly other side-effects of using Vista headers.

Revision 8 - July 27, 2008

Added: #IfTimeout directive to set the timeout for evaluation of #If expressions, in milliseconds. Default is 1000.

Added: Assume-static mode for functions. "Static" must precede any local/global variable declarations.

Added: One-true-brace support for While.

Changed: While now sets A_Index to the iteration about to begin.

Revision 7 - July 26, 2008

Added: IsFunc(FuncName) - Returns a non-zero number if FuncName exists in the script or as a built-in function.

Revision 5 - July 19, 2008

Cleaned up obsolete references to test scripts.

Added basic default test script.

Revision 4 - July 18, 2008

Added: #if (expression) - Similar to #IfWinActive, but for arbitrary expressions.

Added: WheelLeft, WheelRight - Support for WM_MOUSEHWHEEL, which was introduced with Windows Vista. (Requires Vista.)

Added: While, expression - Loop while a condition is true.

Added: A_IsPaused - True if the underlying thread is paused.

Added: A_IsCritical - True if the current thread has been marked uninterruptible by the "Critical" command.

Changed: Allow any number of parameters to be passed in dynamic function calls.

Fixed: Access Violation caused by WinGetClass and subclassed windows.

Fixed: Access Violation caused by empty dynamic function references.


Debugging Features

디버거 클라이언트

추가 디버깅 특징은 DBGp를 통하여 지원합니다. DBGp는 프로그래밍 언어와 사용자 사이의 디버거 UI 통신을 위한 공통 디버거 프로토콜입니다. 더 자세한 것은 상호대화 디버깅을 참조하십시오. 오토핫키와 호환된다고 알려진 "클라이언트"를 이 페이지에 나열 합니다.

SciTE4AutoHotkey

SciTE4AutoHotkey는 무료의, SciTE-기반의 AutoHotkey 스크립트 편집기입니다. DBGp 지원 외에도, 구문 강조, 콜팁/매개변수 정보 그리고 자동 완성, 그리고 기타 유용한 편집 특징과 스크립팅 도구를 지원합니다.

디버깅 특징은 다음과 같습니다:

  • 정지점 설정.
  • Run, Step Over/Into/Out.
  • 호출 스택 보기.
  • 전역/지역 영역에 있는 변수의 이름과 내용 보여주기.
  • 변수에 마우스를 올리면 내용을 보여줍니다.
  • 변수 내용 들여다 보기와 편집하기.
  • 객체의 구조 보기.

http://fincs.ahk4.net/scite4ahk/

XDebugClient

XDebugClient는 간단한 오픈 소스 전방 DBGp 클라이언트로서 .NET Framework 2.0에 기반하고 있습니다. XDebugClient는 원래 Xdebug로 PHP를 위해 설계되었지만, AutoHotkey와 호환되도록 맞춤 빌드를 하였습니다.

변경:

  • 디버거 엔진이 "php" 말고 다른 언어를 보고할 수 있습니다.
  • AutoHotkey 구문 강조가 추가되었습니다.
  • 디버거 엔진으로부터의 접속을 자동으로 기다립니다. 사용자가 Start Listening을 클릭하기를 기다리지 않습니다.
  • 첫 번째 널-문자에서 특성 값들을 잘라내 버립니다. 왜냐하면 오토핫키는 현재 전체 변수의 내용을 돌려주고 그리고 XDebugClient는 이진 내용을 보여줄만한 적절한 인터페이스가 없기 때문입니다.

내려받기: 이진파일; 소스 코드 (다음도 참조 SharpDevelop, Dockpanel 모듬 그리고 Advanced Treeview.)

사용법:

  • XDebugClient를 기동한다.
  • AutoHotkey /Debug를 기동한다. XDebugClient는 자동으로 스크립트 파일을 열어준다.
  • 왼쪽 여백을 클릭해 적어도 한 개의 정지점을 클릭한다.
  • Run을 Debug 메뉴에서 선택하거나, F5를 누른다.
  • 실행이 정지점에 도달하면, Debug 메뉴나 단축키를 사용하여 단계별로 디버깅을 하거나 아니면 스크립트를 재개한다.

특징:

  • 구문 강조, 소스 코드 읽기 전용 보기.
  • 정지점.
  • Run, Step Over/Into/Out.
  • 호출 스택 보기.
  • 변수 검사 - 변수 이름을 선택, 우클릭, 검사.

문제:

  • 스크립트가 실행 중인 동안 사용자 인터페이스가 사용자 입력에 응답하지 않는다.
  • 변수를 나열하거나 값을 설정하는 메커니즘을 제공하지 않는다.

Notepad++ DBGp 플러그인

Notepad++의 플러그인으로 사용할 수 있는 DBGp 클라이언트가 있습니다. PHP 용으로 디자인되었지만, AutoHotkey와도 잘 작동합니다.

내려받기: Notepad++ 플러그인 디렉토리를 참조하십시오.

사용법:

  • Notepad++을 기동한다.
  • DBGp 플러그인의 환경을 구성한다: Plugins, DBGp, Config...

    주의: 반드시 File Mapping을 구성해야 한다. 대부분의 사용자는 원격으로 디버깅하지 않는다. 그러므로 그냥 Bypass all mapping (local windows setup) 옆에 체크표식를 두면 된다.

  • 도구바나 Plugins, DBGp, Debugger를 통하여 디버거 판을 보여준다.
  • 디버그할 스크립트 파일을 연다.
  • 적어도 하나의 정지점을 설정한다.
  • AutoHotkey /Debug를 기동한다.
  • 디버거 툴바나 단축키를 사용해 디버거를 제어한다.

특징:

  • 사용자가 구문 강조를 선택
  • 정지점.
  • Run, Step Over/Into/Out, Run to cursor, Stop.
  • 지역/전역 변수 보기.
  • 사용자-지정 변수 감시.
  • 호출 스택 보기.
  • 변수에 마우스를 올리면 내용을 보여줌.
  • 사용자-구성 단축 키 - Settings, Shortcut Mapper..., Plugin commands.

문제:

  • 단일 문자 변수 이름 위에 마우스를 올려도 작동하지 않습니다. - 예를 들면, "a"에 올리면 " a" 또는 "a "를 시도합니다.
  • 텍스트 위에 올리면 그 텍스트에 무효한 문자가 들어 있어도 상관하지 않고 변수를 열람하려고 시도합니다.
  • property_get이 실패하면 Notepad++가 불안정해집니다. 이것은 위의 사실에 비추어 보면 특히 문제가 됩니다. 우회책으로써, AutoHotkey는 존재하지 않는 또는 무효한 변수를 요구받으면 에러 코드 대신에 빈 특성을 전송합니다.

스크립트-기반의 클라이언트

스크립트-기반의 DBGp 라이브러리와 예제 클라이언트는 GitHub에서 얻을 수 있습니다.

  • dbgp_console.ahk: 간단한 명령어 줄 클라이언트.
  • dbgp_test.ahk: 비동기적 디버깅 데모.
  • dbgp_listvars.ahk: 실행 중인 모든 스크립트의 값을 나열해 보여주는 예제 클라이언트.

GitHub: Lexikos / dbgp

명령 줄 클라이언트

명령 줄 클라이언트는 xdebug.org에서 얻을 수 있습니다. 그렇지만 이것은 대부분의 사용자에게 알맞지 않습니다. 왜냐하면 DBGp (프로토콜)를 깊이 이해하기를 요구하기 때문입니다.

기타

수 많은 DBGp 클라이언트가 있지만, AutoHotkey와 테스트해 보지 않았습니다. 자세한 목록은 Xdebug: 문서를 참조하십시오.


AutoHotkey_L New Features

이 문서는 AutoHotkey_L 분기에 추가된 특징을 기술합니다. 이 분기는 지금은 간단하게 "AutoHotkey 1.1"라고 부릅니다.

주의: 이 문서는 몇 년간 방치되어 왔으며 최근의 변화로 없어지거나 더 추가된 것이 있을 수 있습니다.

제어 흐름 |
Break LoopLabel | 내포 회돌이로부터 깊이에 상관없이 빠져 나옵니다.
Continue LoopLabel | 회돌이를 계속합니다. 깊이에 상관이 없습니다.
For x,y in z | 객체의 내용을 회돌이합니다.
Loop Until | 조건이 참인 동안 회돌이 합니다. 어떤 종류의 회돌이에도 적용할 수 있습니다.
Try...Catch...Finally | 구조화 된 예외 처리를 제공합니다.
Throw | 예외를 던집니다.
명령어 |
FileEncoding | 기본 인코딩을 설정합니다: FileRead, FileReadLine, Loop Read, FileAppend, 그리고 FileOpen. 다음 참조: 텍스트 인코딩
Gui | 아래의 GUI 개선을 참조하십시오.
IniRead/Write/Delete | 전체 섹션을 읽고, 쓰고, 지웁니다. 또는 모든 섹션 이름 목록을 열람합니다.
Menu, Icon | 메뉴 아이템의 아이콘을 설정하거나 제거합니다.
Run | 매개변수를 해석하도록 개선되었습니다.
SendInput {U+nnnn} | 유니코드 문자를 전송합니다. 유니코드 문자는 유니코드 빌드에서 직접적으로 사용할 수 있습니다.
SendLevel | 핫키와 핫스트링이 무시할 인위적인 키보드 이벤트와 마우스 이벤트를 제어합니다.
SetFormat, IntegerFast, h|H | 소문자나 대문자로 십육진 수의 형식을 설정합니다.
SetRegView, RegView | 레지스트리 명령어가 32-비트 스크립트에서 64-비트 레지스트리 뷰에 또는 그 반대로 접근하도록 해 줍니다.
Transform, HTML | 코드 페이지나 HTML 변환을 수행합니다.
WinGet, ..., ProcessPath | 주어진 창을 소유한 프로세스의 이름과 전체 경로를 열람합니다.
지시어 |
#If expression | #IfWinActive와 비슷하지만, 어떤 표현식에도 사용할 수 있습니다.
#IfTimeout | #If 표현식 하나를 평가하는 데 소비될 최대 시간을 설정합니다.
#MenuMaskKey | Win 이벤트나 Alt 키뗌 이벤트를 마스크하기 위해 사용될 키를 변경합니다.
#Include <Lib> | 스크립트 파일을 함수 라이브러리 폴더로부터 포함합니다.
#InputLevel | 핫스트링과 핫키가 무시할 키보드 이벤트와 마우스 이벤트를 제어합니다.
#Warn | 선택된 조건에 대하여 경고를 켜고 끕니다. 이 에러는 개발자 에러를 가리킵니다.
함수 |
ComObj... -- ComObjActive ComObjEnwrap/Unwrap ComObjParameter ComObjType | 등록된 COM 객체를 열람합니다. COM 객체를 포장하거나/풉니다. 매개변수로 건넬 값과 유형을 포장합니다. COM 객체의 유형 정보를 열람합니다.
ComObjArray | COM에 사용하기 위해 SAFEARRAY를 생성합니다.
ComObjConnect | COM 객체의 이벤트를 주어진 접두사를 가진 함수에 연결합니다.
ComObjCreate | COM 객체를 생성합니다.
ComObjError | COM 에러의 고지를 켜고 끕니다.
ComObjFlags | COM 포장 객체의 행위를 제어하는 플래그를 열람하거나 변경합니다.
ComObjGet | COM 콤포넌트가 제공하는 객체 주소를 돌려줍니다.
ComObjQuery | COM 객체에 인터페이스 또는 서비스를 질의합니다.
ComObjType | 유형 정보를 COM 객체로부터 열람합니다.
ComObjValue | COM 포장 객체에 저장된 값이나 포인터를 열람합니다.
Exception | Throw에 대하여 예외 객체를 생성합니다 (호출 스택에 제한적으로 접근을 제공합니다).
FileOpen | 객체-지향적 파일 입/출력을 제공합니다.
Func | 함수를 가리키는 참조를 열람합니다.
GetKeyName/VK/SC | 키의 가상 키 코드나 스캔 코드 또는 텍스트나 이름을 열람합니다.
InStr | 왼쪽이나 오른쪽으로부터 주어진 문자열이 나타나는지 검색합니다.
IsByRef | ByRef 매개변수에 변수가 제공되는지 결정합니다.
IsObject | 값이 객체인지 결정합니다.
StrPut / StrGet | 문자열을 메모리에 또는 메로리로부터 복사합니다. 선택적으로 코드 페이지 사이에 변환합니다.
Trim | 문자열의 처음과 끝으로부터 어떤 문자들을 걷어냅니다.
RegEx (?CNum:Func) | regex 패턴을 평가하는 동안 함수를 호출합니다.
함수 라이브러리 | 새로운 "지역 라이브러리" 그리고 #Include <LibName>.
가변 함수 | 함수는 배열을 통하여 가변 개수의 매개변수를 받을 수 있습니다.
정적 초기화자 | 정적 변수는 이제 어떤 표현식으로도 초기화할 수 있습니다.
객체 |
일반 | 일반적인 객체의 사용법과 행위.
객체 | 다른 기능으로 확장할 수 있는 연관 배열.
열거자 | 집단 안의 항목을 열거합니다.
파일 | 파일에 접근할 수 있도록 인터페이스를 제공합니다. FileOpen은 이 유형의 객체를 돌려줍니다.
함수 | 스크립트가 호출할 수 있는 사용자 정의 함수 또는 내장 함수를 가리킵니다.
ComObject | 위의 ComObj 함수를 참조하십시오.
변수 |
A_Is64bitOS | OS가 64-비트이면 1 (true)이, 32-비트이면 0 (false)이 담깁니다.
A_IsUnicode | 유니코드 빌드에서 이변수는 1 (true)이 담깁니다. ANSI 빌드는 정의되어 있지 않습니다. 그래서 그 효과상 거짓(false)입니다.
A_FileEncoding | 다양한 명령어에 대하여 기본 인코딩을 담고 있습니다; FileEncoding을 참조하십시오.
A_OSVersion | Windows 7과 Windows 8을 지원합니다; A_OSVersion을 참조하십시오.
A_PriorKey | 가장 최근에 키-누름이나 키-뗌 바로 전에 마지막으로 눌려진 키의 이름 ... (자세한 것은 여기를 참조)
A_PtrSize | 바이트 단위로 포인터의 크기가 담깁니다. 이것은 4 (32-bit) 또는 8 (64-bit)입니다.
A_RegView | SetRegView가 설정한 현재 레지스트리 뷰.
A_ScriptHwnd | 스크립트의 숨은 메인 창의 유일한 ID (HWND/핸들).
데이터유형 |
Ptr | 32-비트 빌드에서 Int와 동등하고 64-비트 빌드에서는 Int64과 동등합니다. DllCall, NumPut 그리고 NumGet이 지원합니다.
AStr, WStr | DllCall만 지원합니다; 스크립트 호환성 참조.
유니코드 |
호환성 | DllCall 등등에서 유니코드를 다루는 법
스크립트 파일 | 스크립트 파일에 유니코드 사용하기.
SendInput | SendInput에 유니코드 사용하기.
기타 |
ahk_exe | 창을 소유하고 있는 프로세스 (EXE 파일)의 경로나 이름으로 창을 식별할 수 있습니다.
디버깅 | 상호대화 디버깅 특징 (줄 단위로 실행 등등.).
에러 처리 | Try/catch/throw 그리고 A_LastError의 유용성 증가.
GUI 개선 | Gui 관련 명령어를 개선.
아이콘 지원 | 자원 식별자 지원 그리고 다양한 아이콘 크기 지원 개선.
기타 변경 | 스크립트의 호환성에 영향을 미치는 변경들.
버전 이력 | AutoHotkey_L 개정판 이력.

에러 처리

에러 처리를 위해 많은 명령어가 ErrorLevel 대신에 try/catch의 사용을 지원합니다:

try
{
    FileCopy, file1.txt, C:\folder
    FileDelete, C:\folder\old.txt
}
catch
    MsgBox 에러가 일어났습니다!

추가로, 다음 명령어는 이제 A_LastError를 설정해 디버깅을 돕습니다: FileAppend, FileRead, FileReadLine, FileDelete, FileCopy, FileMove, FileGetAttrib/Time/Size/Version, FileSetAttrib/Time, FileCreateDir, RegRead, RegWrite, RegDelete.

함수 라이브러리

%A_MyDocuments%\AutoHotkey\Lib의 사용자 라이브러리와 AutoHotkey 디렉토리의 표준 라이브러리 말고도, %A_ScriptDir%\Lib에 위치하는 "지역 라이브러리"로부터 함수를 자동 삽입할 수 있습니다. 더 자세한 정보는 함수 라이브러리를 참조하십시오.

#Include <LibName>는 함수 라이브러리 중 하나에 위치한 라이브러리 파일을 명시적으로 포함합니다.

GUI 개선

Gui 명령와 기타 관련된 항목에 수 많은 개선이 이루어졌습니다:

  • GUI를 가리킬 때 1부터 99 사이의 숫자 대신에 이름이나 HWND를 사용할 수 있습니다.
  • Gui, New는 익명의 GUI를 새로 만듭니다.
  • 얼마든지 익명 또는 실명으로 GUI를 생성할 수 있습니다.
  • 새로운 GUI 옵션: +HwndOutputVar, +ParentGUI
  • 어떤 창이든 GUI의 소유자가 될 수 있습니다: +Owner%HWND%.
  • Gui, Font는 텍스트의 안티-앨리어싱을 제어할 수 있습니다.
  • 인터넷 익스플로러 같은 ActiveX 콘트롤을 지원합니다.
  • GuiControlGet, OutputVar, Name 은 GUI 콘트를에 연관된 변수의 이름을 얻습니다.
  • Gui 메뉴에 사용될 때 Ctrl+O와 같은 키보드 가속키를 자동으로 지원합니다.
  • 글꼴 품질은 Font 부-명령어로 제어합니다.

정적 변수

정적 변수는 이제 어떤 표현식으로도 초기화할 수 있습니다. 예를 들어:

Sleep 500
MsgBox % Time() "ms since the script started."
Time() {
    static Tick := A_TickCount
    return A_TickCount - Tick
}

텍스트 인코딩

FileRead, FileReadLine, Loop Read 그리고 FileAppend는 윈도우즈가 지원하는 텍스트 인코딩을 대부분 지원합니다. 단, 시스템의 기본 ANSI 코드 페이지는 지원하지 않습니다. FileEncoding을 사용하면 기본 인코딩을 설정할 수 있습니다. 다음과 같이 FileRead와 FileAppend를 오버라이드 합니다:

FileRead, OutputVar, *Pnnn Filename
FileAppend [, Text, Filename, Encoding]

nnn는 숫치 코드 페이지 식별자가 되어야 하며, Encoding은 FileEncoding과 같은 형식을 따라야 합니다.

다음도 참조하십시오: 스크립트 호환성

가변 함수 그리고 가변 함수-호출

가변 함수는 배열을 통하여 가변 개수의 인자를 받을 수 있습니다. 반면에, 가변 함수-호출을 사용하면 가변 개수의 매개변수를 함수에 건넬 수 있습니다.

아이콘 지원 개선

비정상적인 크기

크기에 상관없이 운영체제가 지원하는 아이콘 자원이면 얼마든지 실행파일로부터 추출할 수 있습니다. 아이콘 그룹에 여러 크기의 아이콘 자원이 존재하면, 가장 적절한 크기가 사용됩니다. 17 이전 버전에서는 임의의 아이콘 자원을 운영체제가 선택해 주었고, 시스템 크기의 아이콘으로 확대되었다가, 다시 요청한 크기로 변경되었습니다.

자원 식별자

음수의 아이콘 번호를 사용하면 실행 파일 안에서 그룹 아이콘을 식별할 수 있습니다. 예를 들어, 다음은 트레이 아이콘을 ahk 파일이 사용할 기본 아이콘으로 설정합니다:

Menu, Tray, Icon, %A_AhkPath%, -160


Archived Changes

변경 기록 보관소

이 문서는 크리스 멀릿(Chris Mallett)이 주도한 원래의 오토핫키 개발 분기의 변경 이력을 담고 있습니다.

새로운 변경 기록은 변경 사항 & 새로운 특징을 참고하십시오.

1.0.48.05 - September 25, 2009

Fixed crash of SendMessage and PostMessage when wParam or lParam is omitted (broken by 1.0.48.04). [thanks Lexikos]

1.0.48.04 - September 25, 2009

Fixed StringSplit to work properly inside functions of compiled scripts (broken by 1.0.35.01). [thanks engunneer & Lexikos]

Fixed SendPlay not to wait for the release of the Windows key prior to sending an "L" keystroke (broken by 1.0.48.01). [thanks Lexikos]

Fixed A_EndChar to be valid when the B0 option is present, and to be empty when there is no ending character (broken by 1.0.44.09). [thanks Al2000]

Fixed FormatTime to yield a valid time of day even when the specified month is out-of-range (broken by 1.0.48.00). [thanks silveredge78]

Fixed FileCreateDir to support a leading backslash even when it is the only backslash; e.g. \dir. [thanks jaco0646]

Fixed GuiControl/GuiControlGet/Gui/SendMessage to work reliably even when they trigger a callback or OnMessage function. [thanks Lexikos]

Fixed RegExMatch() not to produce too few replacements when an empty-string match is followed by a non-empty-string match.

Changed While() to be recognized as a loop rather than a function. [thanks Crash&Burn]

Improved UrlDownloadToFile to support FTP and Gopher. [thanks Lexikos]

Improved the stdout/asterisk mode of FileAppend to write immediately rather than lazily to standard output. [thanks Lexikos]

Added full support for if % expression. [thanks kenomby]

1.0.48.03 - May 3, 2009

Fixed ListLines On not to erase the most recent log entry in the line history. [thanks Lexikos]

Fixed ListView to respond properly to mouse dragging when timers are running. [thanks Solar]

Fixed key-up hotkeys so that if one is created while its key is being held down, the release of the key doesn't trigger the wrong hotkey. [thanks Peter & engunneer]

1.0.48.02 - April 19, 2009

Changed and fixed Gosub and GroupActivate so that when a function calls an external/public subroutine, that subroutine will treat all dynamic variables as globals, and will have outside-of-function GUI behavior. [thanks kenomby & Lexikos]

Improved performance of True/False/A_EventInfo in expressions by treating them as integers vs. strings.

1.0.48.01 - April 15, 2009

Changed: For Windows Vista and later, hotkeys that include the Windows key (e.g. #a) will wait for LWin and RWin to be released before sending any text containing an "L" keystroke. This prevents such a hotkey from locking the PC. This behavior applies to all sending modes except SendPlay (which doesn't need it) and blind mode.

Fixed A_LoopFileExt to be blank for any filename having no extension but a period in its pathname. [thanks Yek-Toho-Tua].

Fixed the assignment of integers that are 19 or 20 characters long to work as they did prior to v1.0.48. [thanks Laszlo & Lexikos]

Fixed function definitions to work properly inside a block. [thanks rmarko]

Improved performance of A_Index in expressions by treating it as an integer rather than a string.

Improved performance of if var [not] in/contains. [developed by Lexikos]

Improved ListLines with an option to turn line-logging Off or On. [thanks kenomby & ruespe]

1.0.48 - February 25, 2009

Compatibility: The change most likely to affect backward compatibility is that floating point numbers stored in variables now have higher precision. Scripts that rely on tiny differences in precision would either need to be reviewed and updated, or have their compatibility improved by using SetFormat Float (e.g. SetFormat, Float, 0.6) anywhere in the script. SetFormat Float disables the higher precision, but gives up some of the new, faster floating point performance.

Performance: The main theme of this release is faster performance. Almost all scripts should run faster -- especially those that make heavy use of expressions and integer math/comparisons (which may run up to three times as fast). To achieve the full benefit, a script either should avoid using SetFormat or should use SetFormat's fast mode.

Performance improvements

Expressions and function calls are compiled more heavily, making them much faster (especially complex integer expressions, including those with commas).

Binary numbers are cached for variables to avoid conversions to/from strings. This makes numerical operations involving variables much faster.

Literal integers in expressions and math/comparison commands are replaced with binary integers, which makes them faster; e.g. X+5 and if x > 5.

LOOPs, IFs, and ELSEs that have blocks (braces) are faster due to skipping the opening '{'. A side-effect is that the '{' is omitted from ListLines.

Thread-creation performance is improved, which should help rapid-fire threads in OnMessage(), RegisterCallback(), and GUI events.

Changes that might affect existing scripts (other than higher-precision floating point described at the top)

When SetFormat, Integer, Hex is in effect, assigning a literal decimal integer to a variable also converts it to hex. Usually this is only a display issue.

For OnMessage() performance, the message number and HWND arrive as standard numbers rather than appearing unconditionally as hex. Usually this is only a display issue.

To achieve various improvements in performance, scripts now use slightly more memory (proportionate to the number of variables and expressions).

Changed and fixed if var is time and other uses of YYYYMMDDHHMISS date-time stamps to recognize that months outside the range 1-12 are invalid. [thanks Nick]

Changed and improved dynamic function calling to allow passing more parameters than defined by a function, in which case the parameters are evaluated but discarded. [developed by Lexikos]

Other improvements

Added function IsFunc(), which indicates whether a function may be called dynamically. [developed by Lexikos]

Added the while-loop, which repeats its commands until its expression evaluates to false. [developed by Lexikos]

Added an assume-static mode for functions. [developed by Lexikos]

Added built-in variables A_IsPaused and A_IsCritical. [developed by Lexikos]

Improved NumPut() to support UInt64 like DllCall(). [thanks Sean]

Improved mouse wheel support by adding WheelLeft and WheelRight as hotkeys and supporting them in Send, Click, and related commands. However, WheelLeft/Right has no effect on operating systems older than Windows Vista. [developed by Lexikos]

Upgraded compiled script compressor from UPX 3.00 to 3.03.

Fixes

Fixed inability to use MsgBox's timeout parameter when the "Text" parameter had an expression containing commas.

Fixed Menu, Delete, Item-that's-a-submenu not to disrupt the associated submenu. [thanks animeaime & Lexikos]

Fixed the GUI Hotkey control to return usable hotkey names even for dead keys (e.g. "^" instead of Zircumflex). [thanks DerRaphael]

Fixed RegDelete so that it won't delete an entire root key when SubKey is blank. [thanks Icarus]

Fixed registry loops to support subkey names longer than 259 (rare). In prior versions, such subkeys would either be skipped or cause a crash. [thanks Krzysztof Sliwinski & Eggi]

Fixed FileSelectFolder by providing an option to make it compatible with BartPE/WinPE. [thanks markreflex]

Fixed window/control IDs (HWNDs), which in rare cases wrongly started with 0xFFFFFFFF instead of just 0x. [thanks Micahs]

Fixed inability of Send commands to use the Down/Up modifiers with the "}" character. [thanks neovars]

1.0.47.06 - March 9, 2008

Fixed crash when a function was called concurrently with an optional ByRef parameter omitted by one thread but not omitted by the other. [thanks DeathByNukes]

Fixed Menu, Tray, MainWindow to enable the menu items in the main window's View menu. [thanks Lexikos]

Added dynamic function calling. [developed by Lexikos]

1.0.47.05 - November 21, 2007

Fixed the Sort command: 1) fixed the "function" option not to misbehave when it's the last option in the list; 2) fixed the "unique" option so that when the delimiter is CRLF, the last item can be detected as a duplicate even when it doesn't end in CRLF; 3) fixed the "unique" option not to append a trailing delimiter when the last item is a duplicate. [thanks Roland]

Fixed RegExMatch() and RegExReplace() to yield correct results even when Haystack and OutputVar are both the same variable. [thanks Superfraggle]

Fixed inability to pass a parameter that is "a variable to which ClipboardAll has been assigned". [thanks Joy2DWorld & Lexikos]

Updated RegEx/PCRE from 7.0 to 7.4. For a summary of the major changes, see www.pcre.org/news.txt. For full details of every change and fix, see www.pcre.org/changelog.txt.

Added GUI control "Tab2" that fixes rare redrawing problems in the original "Tab" control (e.g. activating a GUI window by clicking on a control's scrollbar). The original Tab control is retained for backward compatibility because "Tab2" puts its tab control after its contained controls in the tab-key navigation order. [thanks Xander]

1.0.47.04 - August 28, 2007

Fixed key-up hotkeys like a up:: not to block the pressing of the "a" key unless the hotkey's #IfWin criteria are met. [thanks Roland]

Fixed Round(Var, NegativeNumber), which in rare cases was off by 1. [thanks Icarus]

Fixed crash of scripts that end in a syntax error consisting of an orphaned IF-statement (broken by 1.0.47.00). [thanks msgbox of the German forum]

Eliminated the "GetClipboardData" error dialog. Instead, an empty string is retrieved when the data cannot be accessed within the #ClipboardTimeout period. [thanks ManaUser & Sean]

Changed GUI checkboxes and radio buttons to default to "no word-wrap" when no width, height, or CR/LF characters are specified. This solves display issues under certain unusual DPI settings. [thanks Boskoop]

1.0.47.03 - August 1, 2007

Fixed expressions to allow literal negative hexadecimal numbers that end in "E"; e.g. fn(-0xe). [thanks Laszlo]

Fixed block syntax to allow a function-call immediately to the right of a '}'. [thanks Roland]

1.0.47.02 - July 19, 2007

Fixed the Number option of Edit controls to properly display a balloon tip when the user types something other than a digit. [thanks tfcahm]

Fixed WM_TIMER not to be blocked unless it's posted to the script's main window. [thanks tfcahm]

Fixed wildcard hotkeys not to acquire tilde behavior when the same hotkey exists in the script with a tilde. [thanks Lexikos]

Fixed declaration initializers not to retain whitespace at the end of literal numbers. Also, they now allow spaces between a closing quote and the next comma. [thanks Hardeep]

1.0.47.01 - July 8, 2007

Fixed RunAs not to crash or misbehave when a domain is specified. [thanks Markus Frohnmaier]

Changed relational operators to yield integers even when the inputs are floating point; e.g. 1.0 < 2.0 yields 1 vs. 1.0. [thanks Lexikos]

1.0.47 - June 19, 2007

Added support for function libraries, which allow a script to call a function in an external file without having to use #Include.

Added RegisterCallback(), which creates a machine-code address that when called, redirects the call to a function in the script. [developed by Jonathan Rennison (JGR)]

Added NumGet() and NumPut(), which retrieve/store binary numbers with much greater speed than Extract/InsertInteger.

Improved Sort with an option to do custom sorting according to the criteria in a callback function. [thanks Laszlo]

Improved OnMessage() with an option to allow more than one simultaneous thread. [thanks JGR]

Improved Critical with an option to change the message-check interval, which may improve reliability for some usages. [thanks Majkinetor and JGR]

Changed Critical to put SetBatchLines -1 into effect.

Changed the error messages produced by #ErrorStdOut to contain a space before the colon. [thanks Toralf]

Fixed OnMessage() functions that return one of their own local variables to return the number in that variable, not 0.

Fixed potential crashing of built-in variables that access the registry (e.g. A_AppData, A_Desktop, A_MyDocuments, A_ProgramFiles). [thanks Tekl]

1.0.46.17 - May 31, 2007

Fixed A_UserName (broken by 1.0.46.16).

1.0.46.16 - May 30, 2007

Fixed Gui, Tab, TabName when used after a previous Gui Tab. [thanks Toralf]

Improved SetTimer to treat negative periods as "run only once". [thanks Majkinetor]

Added GuiControlGet Hwnd, which is a more modular/dynamic way to retrieve a control's HWND. [thanks Majkinetor]

Added built-in variables A_ThisLabel and A_ThisFunc, which contain the names of the currently-executing label/function. [thanks Titan & Majkinetor]

1.0.46.15 - May 9, 2007

Fixed GuiControl, GuiControlGet, and Gui ListView/TreeView to support static variables and ByRefs that point to globals/statics. [thanks Peter]

Fixed FileInstall causing the Random command to become non-random in compiled scripts. [thanks Velocity]

Reduced the size of compiled scripts by about 16 KB due to UPX 3.0. [thanks to atnbueno for discovering the optimal command-line switches]

1.0.46.14 - May 2, 2007

Added the "require administrator" flag to the installer to avoid a warning dialog on Windows Vista. [thanks Roussi Nikolov]

1.0.46.13 - May 1, 2007

Fixed hotkeys like *x to fire even when x is also a hotkey that is prevented from firing due to #IfWin. [thanks Joy2DWorld & Engunneer]

Improved optional parameters to accept quoted/literal strings as default values.

Improved ByRef parameters with the ability to be optional (i.e. they may accept default values). [thanks Corrupt]

1.0.46.12 - April 24, 2007

Fixed inability to recognize a literal scientific notation number that begins with 0, such as 0.15e+1. [thanks Laszlo]

1.0.46.11 - April 23, 2007

Fixed inability to have a function-call as the first item in certain comma-separated expressions. [thanks Majkinetor]

Fixed WinTitles like ahk_id %ControlHwnd% in ControlGet's FindString/Choice/List, and Control's Add/Delete/Choose. [thanks Freighter & PhiLho]

Improved floating point support to recognize scientific notation; e.g. 1.2e-5 (the decimal point is mandatory). Also improved "SetFormat Float" with an option to output in scientific notation. [thanks Laszlo]

1.0.46.10 - March 22, 2007

Fixed StringSplit inside assume-local functions so that it creates a local array even when OutputArray0 exists as a global but not a local. [thanks KZ]

Improved ListView's item-changed notification ("I") to indicate via ErrorLevel whether the item has been selected/deselected, focused/unfocused, and/or checked/unchecked. [thanks foom]

Added an additional layer of protection to compiled scripts. It is recommended that scripts containing sensitive data or source code be recompiled with the /NoDecompile switch.

1.0.46.09 - March 4, 2007

Fixed := deep inside expressions when used to assign the result of a recursive function to a local variable (broken by 1.0.46.06). [thanks Laszlo]

Fixed inability to pass certain ternary expressions to ByRef parameters. [thanks Titan]

Fixed GuiControlGet, OutputVar, Pos so that it doesn't make the OutputVar blank. [thanks PhiLho]

Changed and fixed continuation sections so that the "Comment" option doesn't force the LTrim option into effect. [thanks Titan]

Changed the Terminal Server Awareness flag back to "disabled" on AutoHotkey.exe and compiled scripts. This improves flexibility and backward compatibility (see discussion at forum).

1.0.46.08 - February 7, 2007

Fixed unreliability of ComSpec and environment variables on Windows 9x (broken by v1.0.46.07). [thanks Loriss]

Changed: When AutoHotkey.exe is launched without a script specified, it will now run (or prompt you to create) the file AutoHotkey.ahk in the My Documents folder. The only exception is when AutoHotkey.ini exists in the working directory, in which case it uses the old behavior of executing that file.

Improved DllCall to support an integer in place of the function name, which is interpreted as the address of the function to call. [thanks Sean]

1.0.46.07 - January 23, 2007

Fixed crash of illegally-named dynamic variables on the left of an equal-sign assignment (broken by v1.0.45). [thanks PhiLho]

Fixed FileMoveDir's "Option 2" to work properly even when the directory is being both renamed and moved. [thanks bugmenot]

Fixed inability to pass a variable ByRef if that same expression changed it from empty to non-empty (when #NoEnv is absent). [thanks Joy2DWorld]

Changed DllCall's A_LastError to reflect only changes made by the script, not by AutoHotkey itself. [thanks Azerty]

1.0.46.06 - January 16, 2007

Applied minor fixes and improvements to regular expressions by upgrading from PCRE 6.7 to 7.0. One of the most notable improvements is the `a option, which recognizes any type of newline (namely `r, `n, or `r`n). Similarly, the \R escape sequence means "any single newline of any type". See also: Full PCRE changelog

Changed and fixed all Control commands and StatusBarWait to obey SetTitleMatchMode RegEx as documented.

Changed RegExReplace() to return the original/unaltered string rather than "" when an error occurs.

Changed: Enabled the Terminal Server Awareness flag on AutoHotkey.exe and compiled scripts.

Improved performance when assigning large strings returned from user-defined functions. [thanks Laszlo]

1.0.46.05 - January 4, 2007

Fixed the Input command to allow named end keys like {F9} to work even when the shift key is being held down (broken by v1.0.45). [thanks Halweg]

Fixed inability of "Gui Show" to focus the GUI window when the tray menu is used both to reload the script and to show the GUI window. [thanks Rnon]

Fixed inability to pass some types of assignments (:=) to a ByRef parameter. [thanks Laszlo]

1.0.46.04 - January 2, 2007

Fixed inability to pass the result of an assignment (:=) to a ByRef parameter. [thanks Titan]

1.0.46.03 - December 18, 2006

Fixed ListView's floating point sorting to produce the correct ordering. [thanks oldbrother/Goyyah/Laszlo]

1.0.46.02 - December 17, 2006

Fixed environment variables to work properly as input variables in various commands such as StringLen and StringReplace (broken by 1.0.44.14). [thanks Camarade_Tux]

1.0.46.01 - December 15, 2006

NOTE: Although this release has been extensively tested, several low-level enhancements were made. If you have any mission-critical scripts, it is recommended that you retest them and/or wait a few weeks for any bugs to get fixed.

Fixed comma-separated declaration initializers such as local x = 1, y = 2 to work even when immediately below an if/else/loop statement.

Fixed comma-separated expressions so when the leftmost item is an assignment, it will occur before the others rather than after. [thanks Laszlo]

Changed and fixed function-calls so that any changes they make to dynamic variable names, environment variables, and built-in variables (such as Clipboard) are always visible to subsequent parts of the expression that called them.

Changed: When a multi-statement comma is followed immediately by a variable and an equal sign, that equal sign is automatically treated as a := assignment. For example, all of the following are assignments: x:=1, y=2, a=b=c.

Changed comma-separated expressions to produce the following effects: 1) the leftmost /= operator becomes true divide rather than EnvDiv; 2) blank values are not treated as zero in math expressions (thus they yield blank results).

Improved the performance of expressions by 5 to 20% (depending on type).

Improved the new assignment operators such as .= to support the Clipboard variable (even in comma-separated expressions).

Improved the .= operator so that it doesn't require a space to its left.

Improved GUI controls to accept static variables as their associated variables (formerly only globals were allowed).

Added option HwndOutputVar to Gui Add, which stores a control's HWND in OutputVar. [thanks Corrupt & Toralf]

1.0.46 - November 29, 2006

NOTE: Although this release has been extensively tested and is not expected to break any existing scripts, several low-level enhancements were made. If you have any mission-critical scripts, it is recommended that you retest them and/or wait a few weeks for any bugs to get fixed.

Added function SubStr(), which retrieves the specified number of characters at the specified position in a string.

Added assignment operators //=, .=, |=, &=, ^=, >>=, and <<=, which can be used anywhere in expressions. For example, Var .= "abc" appends the string "abc" to Var's current contents.

Added full support in expressions for the operators :=, ++, --, +=, -=, *=, and /= (formerly, they could be used only as the leftmost operator on a line). All assignment operators (especially ++ and --) behave in a C-like way when their result is used by some other operator.

Added the ternary operator (?:), which is a shorthand replacement for the if-else statement. For example, var := x>y ? 2 : 3 assigns the value 2 if x is greater than y; otherwise it assigns 3.

Added support for comma-separated expressions, which allow a single line to contain multiple assignments, function calls, and other expressions. [thanks PhiLho & Titan]

Improved variable declarations to support initialization on the same line. Note: A static variable's initialization occurs only once, before the script begins executing.

Improved line continuation to support all expression operators. For example, a line that starts with "?" or "+" is automatically appended to the line above it.

Improved performance of operators "." and ".=" to be as fast as the percent-sign method of appending a string.

Improved expressions to allow more types of consecutive unary operators such as !!Var. [thanks Laszlo]

Changed Critical to check messages less often (20 vs. 10ms), which improves the reliability of frequently-called OnMessage functions. [thanks Majkinetor]

Changed: A variable named simply "?" is no longer valid in expressions due to the new ternary operator.

Fixed hotkeys to support ::: (colon as a hotkey) and : & x (colon as a hotkey prefix).

Fixed the installer to remove psapi.dll from the AutoHotkey folder (except on Windows NT4). This avoids a conflict with Internet Explorer 7. [thanks to all who reported it]

1.0.45.04 - November 15, 2006

Fixed crash on Windows 9x when a script doesn't actually run (e.g. due to syntax error) (broken by v1.0.45). [thanks rogerg]

Changed Control Style|ExStyle to report ErrorLevel 0 vs. 1 when the requested style change wasn't necessary because it was already in effect.

Improved #Include to support %A_AppData% and %A_AppDataCommon%. [thanks Tekl]

1.0.45.03 - November 12, 2006

Fixed file-pattern loops not to crash when recursing into paths longer than 259 characters. In addition, such paths and files are now ignored (skipped over) by file-pattern loops, FileSetAttrib, and FileSetTime. [thanks PhilR]

Fixed functions that call themselves and assign the result to one of their own locals (broken by v1.0.45). [thanks bjennings]

Fixed crash of scripts containing regular expressions that have compile errors. [thanks PhiLho]

Fixed GuiControl not to convert checkboxes into 3-state unless requested. [thanks JBensimon]

Changed UrlDownloadToFile to announce a user-agent of "AutoHotkey" to the server rather than a blank string. [thanks jaco0646]

Improved continuation sections to support semicolon comments inside the section via the option-word Comments.

1.0.45.02 - November 8, 2006

Fixed StringUpper and StringLower to work when OutputVar is the clipboard (broken by v1.0.45). [thanks songsoverruins]

Fixed the hotkeys ~Alt, ~Control, and ~Shift to fire upon press-down rather than release (broken by v1.0.44).
Background: Without the tilde, Alt/Control/Shift fire upon release to avoid taking over both the left and right key. But a specific left/right hotkey like LAlt or RShift fires upon press-down.

1.0.45.01 - November 7, 2006

Fixed FileReadLine and FileSelectFile not to crash or misbehave when other threads interrupt them (broken by v1.0.45). [thanks toralf]

Fixed RegExMatch() so that when there's no match, named subpatterns are properly set to "" in the output array. [thanks PhiLho]

Fixed RegExMatch()'s "J" option to properly write duplicate named subpatterns to the output array. [thanks PhiLho]

Changed SetWorkingDir and #Include DirName to succeed even for a root directory such as C: that lacks a backslash.

Improved DllCall() to display a warning dialog if the called function writes to a variable of zero capacity.

1.0.45 - November 4, 2006

NOTE: Although this release has been extensively tested and is not expected to break any existing scripts, several low-level performance enhancements were made. If you have any mission-critical scripts, it is recommended that you retest them and/or wait a few weeks for any bugs to get fixed.

Added support for regular expressions via RegExMatch(), RegExReplace(), and SetTitleMatchMode RegEx. [thanks Philip Hazel & PhiLho]

Improved performance and memory utilization of StringReplace.

Improved performance of the := operator for expressions and functions involving long strings.

Improved ControlClick with a new option "NA" that avoids activating the target window (this mode also improves reliability in some cases). In addition, it's been documented that SetControlDelay -1 can improve the reliability of ControlClick in some cases. [thanks nnesori]

Changed GUI buttons to default to "no word-wrap" when no width, height, or CR/LF characters were specified. This may solve button display issues under some desktop themes.

Fixed "Transform HTML" for the following characters: &`n><

Fixed misinterpretation of lines starting with "if not is" such as "if not IsDone".

Fixed inability of "Gui Show" to move a window vertically downward to where its bottommost row of pixels is now.

Fixed inability to use GroupActivate as the only line beneath an IF or ELSE.

Fixed inability of the Input command to differentiate between end-keys enclosed in braces and their (un)shifted counterparts; e.g. '{' vs. '['. [thanks Laszlo]

Visit www.autohotkey.com/changelog/ for even older changes.


Script Compatibility

스크립트의 호환성

AutoHotkey 1.0으로 작성된 스크립트는 대부분 AutoHotkey 1.1 위에서 아무 변경없이 실행됩니다. 그러나 몇 가지 기능은 두 버전 사이의 어떨 수 없는 차이점 때문에 제대로 작동하지 않을 수 있습니다. 가장 문제가 되는 차이점은 DllCall 같은 고급 기능에만 영향을 미치기 때문에, 대부분의 사용자는 신경쓸 필요가 없습니다.

AutoHotkey 1.1은 "AutoHotkey_L"이라고도 알려져 있는데, 반면에 AutoHotkey 1.0은 역으로 "AutoHotkey Basic"이라는 라벨이 붙었습니다. AutoHotkey_L의 예전 버전 중에는 1.0.* 버전 번호를 사용합니다. 그래서 명확하게 하기 위해, 이 문서는 오토핫키의 두 분기를 버전 번호가 아니라 이름으로 지칭합니다.

주의: 가장 흔한 문제는 유니코드 텍스트를 지원하도록 변경한 때문인데, 이는 그냥 ANSI 버전의 AutoHotkey_L를 사용하면 피할 수 있습니다.

기본

큰 충격:

  • 구문 에러를 더 이상 용납하지 않습니다
  • FileRead가 부패한 이진 데이터를 돌려줄 수 있습니다
  • 변수 이름과 함수 이름에 [, ] 또는 ?를 허용하지 않습니다

중간 충격:

  • Transform Unicode 명령어는 유니코드 버전에서 사용할 수 없습니다
  • AutoHotkey.ini 대신에 AutoHotkey.ahk가 기동합니다
  • SetFormat, Integer, H는 대소문자를 구분합니다
  • A_LastError는 더 많은 명령어에 의하여 변경됩니다
  • MsgBox가 쉼표를 더 일관성이 있게 처리합니다
  • Gui +Owner는 추가 스타일을 오버라이드합니다
  • GUI에 DPI 스케일링이 기본적으로 켜집니다
  • SoundSet과 SoundGet은 비스타 이후에 더 잘 작동합니다
  • ~틸드는 맞춤 수식 키의 작동에 영향을 미칩니다
  • x & y::는 x를 뗄 때 x::와 x up::을 모두 촉발시킵니다

작은 충격:

  • var가 type이면 기본적으로 시스템 로케일을 무시합니다
  • GroupActivate는 ErrorLevel을 설정하고 GroupAdd의 Label은 다르게 작동합니다
  • Run과 RunWait는 Target을 다르게 이해합니다
  • Control-Z는 파일끝으로 번역되지 않습니다
  • 호환성 모드가 혼란을 야기할 수 있습니다
  • A_IsCompiled는 언제나 읽기 전용입니다
  • 선두와 후미의 `t 연속열은 더 이상 폐기되지 않습니다

고급

  • Unicode vs ANSI
    • VarSetCapacity
    • DllCall
    • NumPut / NumGet
  • 포인터 크기

기본

구문 에러

AutoHotkey Basic에서 용인되었던 어떤 구문 에러는 이제 더 이상 AutoHotkey_L에서 용납하지 않습니다. 그런 에러는 대부분 식별하기만 하면 쉽게 교정할 수 있습니다. 다음 에러는 스크립트를 AutoHotkey_L에서 기동하자 마자 즉시 탐지됩니다. 교정해야 스크립트를 실행할 수 있습니다:

  • 명령어와 매개변수 사이에 스페이스나 탭 또는 쉼표가 필요합니다. 예를 들어, MsgBox< foo 그리고 If!foo는 용납되지 않습니다.
  • Hotkey, IfSomething에서 Something이 무효이며, 허용되지 않습니다.

다른 어떤 구문 에러는 스크립트가 실행 중일 때 탐지됩니다. 에러 메시지를 먼저 보여준 다음에 현재 쓰레드를 종료합니다:

  • 흔한 에러: 인식할 수 없는 또는 형식이 나쁜 Gui, Gui Show 또는 GuiControl 옵션.
  • 그룹 이름이 비어 있는 GroupAdd. 이전에는 쓰레드가 조용히 종료했습니다.
  • Gui 옵션 +LastFoundExist는 다른 옵션과 조합하면 안됩니다. 왜냐하면 그렇게 하면 +LastFound와 똑같이 행동하기 때문입니다.

어떤 구문 에러는 현재 탐지되지 않지만, AutoHotkey_L에 문제를 일으킵니다:

  • (과의 자동-결합(Auto-concat)은 더 선별적이 되었습니다. 그래서 12(34)와 같이 무효한 표현식은 더 이상 작동하지 않습니다.

FileRead

FileRead는 보통의 경우 코드 페이지 사이에 텍스트를 변환합니다. 그러므로 부패한 이진 데이터를 출력할 가능성이 있습니다. 이를 피하려면 *c 옵션을 추가하거나 대신에 FileOpen을 사용하십시오.

변수 이름과 함수 이름

[, ] 그리고 ?는 표현식에 사용이 예약되어 있습니다. 그래서 더 이상 변수 이름으로 유효하지 않습니다. 결론적으로, ?는 (삼진 연산에 사용됨) 더 이상 양쪽에 스페이스가 없어도 됩니다. 객체 구문을 참조하십시오.

에러는 자동으로 탐지될 수도 있고 아닐 수도 있습니다:

  • 스크립트가 이런 문자들을 표현식에서 변수 이름에 사용하면, 일반적으로 그 스크립트는 에러 메시지를 보여주지 않고 실행되지만, 문자를 변수의 이름의 일부가 아니라 연산자로 이해하기 때문에 잘못된 행위를 하게 됩니다.
  • 이런 문자가 이중 참조(double-deref)에 사용되면 (Array%n%과 같이 n에 위의 문자중 하나가 담겨 있으면), 스크립트가 실행되다가, 이중-참조가 평가될 때 에러 메시지가 나타납니다.
  • 이 문자들이 다른 문맥에 사용되면, 예를 들어 할당의 왼편이나 명령어의 입/출력 변수의 이름 또는 %percent% 사인에 사용되면, 에러 메시지가 나타나고 스크립트는 기동하지 못합니다.

Transform

Transform 하위-명령어 중 일부는 유니코드 버전의 AutoHotkey_L에서 변경되거나 사용할 수 없습니다:

  • Transform, Unicode는 사용 불가능합니다. 유니코드 텍스트를 클립보드에 할당하려면, 보통처럼 할당하십시오. 다음 참조: StrPut/StrGet.
  • Transform, HTML는 추가 특징을 지원합니다.

기본 스크립트

AutoHotkey_L가 스크립트를 지정하지 않고 기동하면, .ini 파일 대신에 .ahk 파일이 적재됩니다. 이 파일의 이름은 현재 실행파일의 파일이름에 따라 다릅니다. 더 자세한 것은 스크립트에 명령어 줄 매개변수를 건네기를 참조하십시오.

SetFormat, Integer[Fast], H

대문자 H가 사용되면, 십육진수 A-F도 대문자가 됩니다. AutoHotkey Basic은 언제나 소문자를 사용합니다. SetFormat을 참조하십시오.

A_LastError

다음 명령어는 이제 A_LastError를 설정해 디버깅을 돕습니다: FileAppend, FileRead, FileReadLine, FileDelete, FileCopy, FileMove, FileGetAttrib/Time/Size/Version, FileSetAttrib/Time, FileCreateDir, RegRead, RegWrite, RegDelete. 이 명령어를 사용하면 A_LastError의 이전 값이 덮어 씌여집니다.

MsgBox

MsgBox의 똑똑한 쉼표 처리가 다른 모든 명령어와 일관성이 있게 그리고 유연하게 개선되었습니댜. 대부분의 경우, MsgBox는 의도한 대로 잘 작동합니다. 어떤 경우는 스크립트가 예전의 기묘한 행위에 의존하는 경우 행위에 변화가 보일 수 있습니다. 예를 들면:

; 다음은 이제 표현식 (Options) 다음에 텍스트 (Title)로 번역됩니다.
; 여러 부-표현식을 가진 단일 표현식 (Text) 으로 번역되지 않습니다 :
MsgBox % x, y
; 반괄호를 추가하면 예전의 번역을 강제할 수 있습니다:
MsgBox % (x, y)

; 다음은 이제 텍스트 "0, Title" 대신에 빈 대화상자를 보여줍니다:
MsgBox 0, Title
; 다음은 AutoHotkey_L 그리고 AutoHotkey Basic에서 모두 예상대로 행위합니다:
MsgBox 0, Title, % ""   ; 빈 대화상자를 보여줍니다.
MsgBox 0`, Title        ; 텍스트 "0, Title"을 보여줍니다.

; 다음은 이제 텍스트 ", Title" 대신에 빈 대화상자를 보여줍니다:
MsgBox,, Title

Gui +Owner

+Owner 옵션을 Gui에 적용하면 WS_CHILD 스타일이 제거되고 WS_POPUP 스타일이 설정됩니다. 이 때문에 스타일을 설정한 다음에 +Owner를 사용하여 Gui의 부모 창을 설정한 스크립트는 깨질 수 있습니다.

DPI 스케일링

DPI 스케일링은 기본적으로 스크립트 GUI에 켜집니다. 이 때문에 DPI 설정이 96 (100%)이 아니면 스크립트에 영향을 미칩니다. 이를 끄려면, Gui -DPIScale를 사용하십시오.

Windows Vista 이후의 Sound 명령어

SoundSet, SoundGet, SoundSetWaveVolume 그리고 SoundGetWaveVolume Windows Vista 이후에 개선되었습니다. 전형적인 행위의 변화로:

  • 스크립트가 그냥 스크립트 자체 대신에 전체 시스템에 영향을 미칩니다 (보통 이것이 의도하는 바입니다).
  • 장치는 번호가 다르게 매겨집니다 - 각 출력이나 입력은 별도의 장치로 간주 됩니다.

~틸드와 맞춤 조합 핫키

v1.1.14 부터, 틸드 접두 심볼은 맞춤 조합에 수식 키로 사용될 때 키가 작동하는 방식에 영향을 미칩니다.

맞춤 조합키와 Down/Up 핫키

틸드 접두 심볼이 사용되는 경우를 제외하고, 키-다운과 키-업 핫키가 맞춤 수식 키로 정의되어 있다면, 키를 뗄 때 둘 모두 촉발 됩니다. 예를 들어, x & y::이면 x를 뗄 때 x::와 x up::가 모두 촉발 됩니다. 예전에는 x::가 촉발 되지 않았습니다.

If var is type

If var is type는 시스템 로케일을 무시합니다. 단, StringCaseSense, Locale이 사용되었다면 예외입니다.

창 그룹

GroupActivate는 활성화 할 창을 발견하지 못하면 ErrorLevel에 1을 설정합니다, 그렇지 않으면 0을 설정합니다. 이전에는 ErrorLevel을 변경하지 않고 그대로 두었습니다.

GroupAdd의 Label 매개변수는 창 그룹에 전체적으로 적용됩니다. 그룹 안의 특정 창 규격 하나에만 적용되지 않습니다. 이 변경에 관한 토론이 포럼에 있습니다. 그렇지만, 이 매개변수를 사용하는 것은 추천 하지 않습니다; 대신에 GroupActivate를 호출한 후에 ErrorLevel을 점검하십시오.

Run / RunWait

AutoHotkey_L은 Run과 RunWait 명령어가 목표(Target) 매개변수를 번역하는 방식이 약간 개선되었습니다. 이 때문에 아주 희귀한 경우이기는 하지만, 예전에는 작동하지 않던 것들이 작동하게 되어 AutoHotkey Basic에서 이미 잘 작동하는 스크립트에 영향을 미칠 수 있습니다. 새로운 행위는 다음과 같습니다:

  • Target이 따옴표로 시작하면, 다음 따옴표까지 모든 것을 조치로 취급합니다. 전형적으로 실행 파일로 간주합니다.
  • 그렇지 않으면 첫 번째 부문자열이 스페이스로 끝나거나 기존의 파일이거나 또는 .exe, .bat, .com, .cmd 또는 .hta로 끝나면 조치로 간주합니다. 이 때문에 .ahk, .vbs 또는 .lnk 같은 파일 유형은 매개변수를 받을 수 있습니다. 그러면서도 이전의 버전과 같이 절대 경로가 없어도 여전히 wordpad.exe와 같이 "알려진" 실행 파일을 기동할 수 있습니다.

Control-Z

Loop Read 그리고 FileReadLine는 더 이상 문자 Control-Z (0x1A)를 파일 끝 표식으로 이해하지 않습니다. Control-Z는 모두, 파일 맨 끝에 오더라도, 그대로 적재됩니다. FileRead는 이미 이 문자를 무시합니다. 그래서 이 문제에 영향을 받지 않습니다.

호환 모드

스크립트를 실행하는 데 사용된 EXE 파일의 특성에 호환 모드가 Windows 95, 98/ME 또는 NT4로 설정되었다면, 그 스크립트는 올바르게 작동하지 못합니다. 왜냐하면 호환 모드 때문에 특정 버전의 Windows가 어플리케이션에 보고되지만, AutoHotkey_L은 이런 버전을 지원하지 않기 때문입니다. 예를 들어, 호환 모드를 Windows 95 or 98/ME에 설정하면 MsgBox %A_OSVersion%는 WIN_NT4라고 보고합니다.

A_IsCompiled

A_IsCompiled는 스크립트가 컴파일되지 않았다면 빈 문자열로 정의됩니다. 이전에는 정의되지 않은 채 그대로 두었습니다. 그 때문에 스크립트가 컴파일되지 않았음에도 A_IsCompiled := 1와 같은 할당이 유효했었습니다. 이제는 모든 경우에 읽기 전용 내장 변수로 취급됩니다.

공백 문자 피신

`t와 ` 같은 피신 공백문자는 더 이상 각 인자의 앞 뒤에서 제거되지 않습니다. 예를 들어, StringReplace s, s, `t는 이제 유효하며 모든 탭 문자를 s로부터 제거합니다.

Unicode vs ANSI

텍스트 값은 종종 문자열(string)이라고 부릅니다. 각 텍스트의 값이 문자열의 연속 또는 줄지어(string) 저장되어 있기 때문입니다. 각 문자의 숫치 문자 코드와 크기 (바이트 단위)는 어느 버전의 AutoHotkey를 사용하고 있는가에 달려 있습니다: Unicode 또는 ANSI. 이런 세부 사항은 다음과 같은 일을 하려는 스크립트에 전형적으로 중요합니다:

  • DllCall을 통하여 문자열을 외부 함수에 전달할 때.
  • PostMessage/SendMessage를 통하여 문자열을 전달 할 때.
  • NumPut/NumGet를 통하여 문자열을 조작할 때.
  • VarSetCapacity를 사용하여 특정 개수의 문자를 변수에 담을 수 있는지 확인할 때.

한 가지 형식만 염두에 두고 설계된 스크립트는 종종 엉뚱한 버전의 AutoHotkey로 실행할 때 문제에 봉착합니다. 예를 들면, 어떤 스크립트가 AutoHotkey Basic용으로 작성되었다면 ANSI 버전의 AutoHotkey_L에서는 잘 작동하지만 유니코드 버전에서는 실패합니다. 어느 버전을 사용하고 있는지 잘 모르겠다면, 다음 스크립트를 실행해 보십시오:

MsgBox % A_IsUnicode ? "Unicode" : "ANSI"

ANSI: 각 문자는 한 바이트 (8 비트)입니다. 127을 넘는 문자 코드는 시스템의 언어 설정에 따라 달라집니다.

Unicode: 각 문자는 두 바이트 (16 비트)입니다. 문자 코드는 UTF-16 형식으로 정의됩니다.

의미구조 주의: 기술적으로, 어떤 유니코드 문자는 두 개의 16-비트 코드 단위로 표현됩니다. 합쳐서 "대리 쌍(surrogate pair)"라고 부릅니다. 비슷하게, 어떤 ANSI 코드 페이지는 (보통 DBCS(Double Byte Character Sets)라고 부름) 두 바이트 문자를 담고 있습니다. 그렇지만, 실용적인 이유로, 이것들을 거의 언제나 두 개의 개별 단위로 취급합니다 (단순하게 하기 위해 그냥 "문자(characters)"라고 부릅니다).

VarSetCapacity

VarSetCapacity는 변수의 가용 능력을 바이트 단위로 설정합니다. 변수의 가용능력을 문자의 개수에 기반하여 설정하려면, 문자의 크기를 반드시 고려해야 합니다. 예를 들어:

VarSetCapacity(ansi_var,    capacity_in_chars)
VarSetCapacity(unicode_var, capacity_in_chars * 2)
VarSetCapacity(native_var,  capacity_in_chars * (A_IsUnicode ? 2 : 1))
VarSetCapacity(native_var,  t_size(capacity_in_chars))  ; 아래 참조

다음은 VarSetCapacity의 두 가지 주요 사용법입니다:

  1. 예측한 개수의 문자를 보유하도록 변수를 확장합니다. 그리하여 점진적 결합을 통해 문자열을 구성할 때 수행성능을 개선할 수 있습니다. 예를 들어, VarSetCapacity(var, 1000)는 1000 바이트를 허용합니다. 이것은 유니코드 버전의 AutoHotkey_L에서는 500 문자에 불과합니다. 이렇게 하면 수행성능에 영향을 미칠 수 있지만, 스크립트는 여전히 올바르게 작동합니다.
  2. 변수 크기를 조정해 이진 구조체를 담습니다. 구조체에 직접적으로 텍스트가 담겨 있다면, 그 텍스트의 형식을 반드시 고려해야 합니다. 형식은 구조체에 따라 다릅니다 - 어떤 경우는 유니코드 버전의 AutoHotkey_L에서도 ANSI 텍스트가 사용됩니다. 변수가 너무 작으면, 스크립트는 충돌하거나 아니면 예상하지 못한 행위를 할 수 있습니다 (구조체를 어떻게 사용하는가에 따라).

DllCall

"Str" 유형이 사용될 때, 현재 빌드의 고유 유형의 문자열이라는 뜻입니다. 어떤 함수는 특정한 형태의 문자열을 요구하거나 돌려주기 때문에, 다음의 문자열 유형을 사용할 수 있습니다:

 | 문자 크기 | C / Win32 Types | 인코딩
WStr | 16-비트 | wchar_t*, WCHAR*, LPWSTR, LPCWSTR | UTF-16
AStr | 8-비트 | char*, CHAR*, LPSTR, LPCSTR | ANSI (시스템 기본 ANSI 코드 페이지)
Str | -- | TCHAR*, LPTSTR, LPCTSTR | 유니코드 빌드의 WStr 그리고 ANSI 빌드의 AStr과 동등.

"Str" 또는 현재 빌드에 대하여 그와 동등한 유형이 매개변수로 사용되면, 그 문자열 또는 변수의 주소가 함수에 건네집니다. 그렇지 않으면 대신에 문자열의 임시 사본이 원하는 포맷으로 생성되고 건네집니다. 일반적으로, "AStr" 그리고 "WStr"은 함수가 그 매개변수에 변수를 쓸 때 사용하면 안 됩니다.

주의: "AStr" 그리고 "WStr"은 매개변수에 대하여 그리고 그 함수의 반환 값에 대하여 똑 같이 유효합니다.

일반적으로, 스크립트가 문자열을 매개변수로 받는 함수를 DllCall를 통하여 호출하면, 다음 접근법 중 하나를 취해야 합니다:

  1. 함수를 Unicode (W) 버전과 ANSI (A) 버전으로 모두 사용할 수 있으면, 현재 빌드에 대하여 적절한 버전을 호출합니다. 다음 예제에서, "DeleteFile"은 내부적으로 "DeleteFileA" 또는 "DeleteFileW"이라고 부릅니다. "DeleteFile" 자체는 실제로 존재하지 않으므로, DllCall은 자동으로 현재 빌드에 대하여 적절하게 "A" 또는 "W"를 시도합니다:
    DllCall("DeleteFile", "Ptr", &filename)
DllCall("DeleteFile", "Str", filename)

    다음 예제에서, &filename은 문자열의 주소를 정확하게 있는 그대로 건넵니다. 그래서 함수는 문자열을 "Str" 유형과 같은 형식이라고 예상해야 합니다. AutoHotkey Basic에서 "UInt"를 "Ptr" 대신에 사용할 수 있습니다. 그러나 결과 코드는 64-비트와 호환되지 않습니다.

    주의: 함수를 정확하게 지정된 대로 발견할 수 없으면, AutoHotkey_L은 어느 DLL이 지정되어 있는가에 상관 없이 "A" 또는 "W" 접두사를 덧붙입니다. 그렇지만, AutoHotkey Basic은 User32.dll, Kernel32.dll, ComCtl32.dll, 또는 Gdi32.dll에 있는 함수에 대해서만 "A" 접두사를 붙입니다.

  2. 함수가 오직 특정 유형이 문자열만 입력으로 받는다면, 그 스크립트는 적절한 문자열 유형을 사용할 수 있습니다:
    DllCall("DeleteFileA", "AStr", filename)
DllCall("DeleteFileW", "WStr", filename)
  3. 함수가 (비-고유 형식으로) 문자열을 수정해야 한다면, 스크립트는 버퍼를 위에 기술한 대로 할당하고 그의 주소를 함수에 건네야 합니다. 매개변수가 입력을 받는다면, 스크립트는 또한 입력 문자열도 적절한 형식으로 변환해야 합니다; StrPut을 사용하면 변환할 수 있습니다.

NumPut / NumGet

NumPut이나 NumGet이 문자열에 사용될 때, 주어진 유형의 문자열에 대하여 오프셋과 유형이 정확해야 합니다. 다음을 지침으로 삼으십시오:

;  8-bit/ANSI   strings:  size_of_char=1  type_of_char="Char"
; 16-bit/UTF-16 strings:  size_of_char=2  type_of_char="UShort"
nth_char := NumGet(var, (n-1)*size_of_char, type_of_char)
NumPut(nth_char, var, (n-1)*size_of_char, type_of_char)

var에 음수 형태의 문자열이 들어 있다면, 적절한 값은 A_IsUnicode에 기반하여 결정할 수 있습니다:

nth_char := NumGet(var, t_size(n-1), t_char())
NumPut(nth_char, var, t_size(n-1), t_char())

; 편리성과 명료성을 위해 함수를 정의합니다:
t_char() {
    return A_IsUnicode ? "UShort" : "Char"
}
t_size(char_count=1) {
    return A_IsUnicode ? char_count*2 : char_count
}

포인터 크기

포인터 크기는 32-비트 빌드에 대하여 4 바이트 (AutoHotkey Basic 포함) 64-비트 빌드에 대하여 8 바이트입니다. 구조체나 DllCall을 사용하는 스크립트는 두 플랫폼에서 모두 올바르게 작동하려면 이 사실을 고려할 필요가 있습니다. 영향을 받는 구체적인 영역은 다음과 같습니다:

  • 여러 포인터를 가진 구조체의 필드에 대한 오프셋 계산.
  • 여러 포인터를 가진 구조체의 크기 계산.
  • DllCall, NumPut 또는 NumGet에 사용되는 유형 이름.

크기와 오프셋 계산은 A_PtrSize을 사용하십시오. DllCall, NumPut 그리고 NumGet에는 적절하게 Ptr 유형을 사용하십시오.

필드의 오프셋은 보통 그 앞에 있는 모든 필드의 전체 크기임을 기억하십시오. 또 핸들도 (HWND와 HBITMAP 같은 유형을 포함하여) 본질적으로 포인터-유형임을 명심하십시오.

/*
  typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;    // Ptr
    HANDLE hThread;
    DWORD  dwProcessId; // UInt (4 bytes)
    DWORD  dwThreadId;
  } PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
*/
VarSetCapacity(pi, A_PtrSize*2 + 8) ; Ptr + Ptr + UInt + UInt
DllCall("CreateProcess", <omitted for brevity>, "Ptr", &pi, <omitted>)
hProcess    := NumGet(pi, 0)         ; Defaults to "Ptr".
hThread     := NumGet(pi, A_PtrSize) ;
dwProcessId := NumGet(pi, A_PtrSize*2,     "UInt")
dwProcessId := NumGet(pi, A_PtrSize*2 + 4, "UInt")


AutoHotkey FAQ

자주 묻는 질문(FAQ)

여러분의 질문이 아래 리스트에 없다면, 공동체가 운영하는 autoHotkey.net의 FAQ를 점검해 보십시오.

언어 구문

  • 언제 인용 부호를 명령어와 그의 매개변수에 사용하는가?
  • 언제 정확하게 변수 이름을 퍼센트 기호로 둘러싸는가?
  • 언제 퍼센트 사인과 쉼표를 피신시켜야 하는가?

일반적 과업

  • 어디에서 공식적인 배포본, 또는 예전 배포본을 찾을 수 있는가?
  • 왜 스크립트에서 어떤 줄들은 전혀 실행되지 않는가?
  • 왜 스크립트가 XP에는 잘 실행되는데 Vista나 Windows 7 또는 8에서 실행되지 않는가?
  • 트레이 아이콘을 통하여 스크립트를 편집할 수 없다. 에러 때문에 시작조차 하지 않기 때문이다. 다른 어떤 곳에서 스크립트를 찾을 수 있는가?
  • 어떻게 코드에서 에러를 찾아 고치는가?
  • AHK를 USB 드라이브에서 실행할 수 있는가?
  • 왜 Run 명령어가 게임이나 프로그램을 실행시키지 못하는가?
  • 어떻게 명령어 줄 연산의 출력 결과를 얻을 수 있는가?
  • 어떻게 스크립트로 다른 스크립트를 닫거나 정지하거나 또는 보류할 수 있는가?
  • 스크립트를 종료하지 않고 어떻게 반복 행위를 멈출 수 있는가?
  • 어떻게 게임을 위해 성능을 향상시킬 수 있는가? 다시 말해 CPU에 엄청난 부담이 있을 때는 어떻게 개선하는가?
  • 어떻게 오토핫키 명령어에 대하여 문맥 감지 도움말을 편집기에 사용할 수 있는가?
  • 웹 페이지가 적재를 끝냈다는 것을 어떻게 탐지할 수 있는가?
  • 날짜와 시간을 어떻게 비교 또는 조작하는가?
  • 현재 날짜와 시간을 어떻게 전송할 수 있는가?
  • 어떻게 텍스트를 활성되지 않은 창 또는 보이지 않는 창에 보낼 수 있는가?
  • 왜 핫스트링, Send 그리고 MouseClick이 어떤 게임에서는 작동하지 않는가?
  • Winamp를 어떻게 제어하는가? 활성화되지 않을 경우에도 제어하고 싶다
  • 어떻게 MsgBox의 버튼 이름을 바꿀 수 있는가?
  • 어떻게 기본 편집기를 바꿀 수 있는가? 문맥 메뉴나 트레이 아이콘을 통하여 접근하고 싶다
  • 어떻게 변수에 연관된 GUI의 내용들을 저장할 수 있는가?
  • 어떻게 AHK로 그릴 수 있는가?
  • 창이 나타나거나, 닫히거나 또는 [비]활성화될때 어떻게 행위를 촉발시킬 수 있는가?
  • 바이러스 백신 프로그램이 AHK를 맬웨어로 진단했다. 정말로 바이러스가 들어있는가?

핫키, 핫스트링, 그리고 리맵핑

  • 컴퓨터가 시작할 때마다 어떻게 핫키와 핫스트링을 자동으로 작동하게 만드는가?
  • 마우스 버튼을 핫키처럼 작동시키는데 어려움을 겪고 있다. 무슨 조언이 있는가?
  • 어떻게 탭과 스페이스를 핫키로 정의할 수 있는가?
  • 어떻게 키나 마우스 버튼을 리맵해서 다른 키처럼 만들 수 있는가?
  • 어떻게 키나 버튼을 두 번 눌렀는지 탐지하는가?
  • 어떻게 핫키나 핫스트링을 어떤 프로그램에는 배제되도록 만들 수 있는가? 다른 말로 해서, 특정한 창이 활성화될 때 어떤 키는 마치 보통처럼 행위하게 만들고 싶다.
  • 어떻게 접두 키를 아무것도 하지 않는 대신에 그의 원래 기능을 수행하도록 만들 수 있는가?
  • 어떻게 내장 윈도우즈 단축 키, Win+U (유틸리티 관리자) 그리고 Win+R (실행) 같은 키들을, 바꾸거나 불능으로 만들 수 있는가?
  • 핫스트링에 와일드카드나 정규 표현식을 사용할 수 있는가?
  • 키보드 레이아웃에 없는 핫키를 사용할 수 있는가?
  • 나의 키패드는 특수한 000 키를 가지고 있다. 그것도 핫키로 바꿀 수 있는가?

언어 구문

언제 인용 표식을 명령어와 그의 매개변수에 사용하는가?

두겹 따옴표 (")는 표현식 안에서만 특별한 의미가 있습니다. 다른 곳에서는 문자 그대로 마치 정상 문자처럼 취급됩니다. 그렇지만, 스크립트가 프로그램을 기동시키거나 문서를 열때, 운영 체제는 보통 겹따옴표가 명령어-줄 매개변수에 둘러져 있기를 요구합니다. 다음 예제처럼, 안에 공백이 있으면 말입니다: Run, Notepad.exe "C:\My Documents\Address List.txt".

정확하게 언제 변수 이름을 퍼센트 기호로 둘러싸는가?

변수 이름은 언제나 퍼센트 기호로 둘러쌉니다. 단, 아래의 볼드체로 보여준 것은 제외합니다:

1) 입력 변수나 출력 변수인 매개변수에: StringLen, OutputVar, InputVar
2) 할당의 왼쪽에: Var = 123abc
3) 전통적인 (비-표현식) if-서술문의 왼쪽에: If Var1 < %Var2%
4) 표현식의 모든 곳에. 예를 들어:

If (Var1 <> Var2)
    Var1 := Var2 + 100

언제 퍼센트 기호와 숨표를 피신시켜야 하는가?

문자 그대로의 퍼센트 기호는 반드시 피신시켜야 합니다. 앞에다 액센트/백틱을 붙이면 됩니다. 예를 들어: MsgBox 현재 백분률은 25`% 입니다. 문자 그대로의 쉼표도 반드시 피신시켜야 합니다 (`,). 단, MsgBox 또는 명령어의 마지막 매개변수로 사용될 때는 제외합니다 (이 경우 액센트는 허용되지만 필수는 아닙니다).

쉼표나 퍼센트 기호가 표현식 안에서 따옴표로 둘러 싸이면, 액센트는 허용되지만 필수는 아닙니다. 예를 들어: Var := "15%".

일반적인 과업

공식 빌드 또는 예전 배포본은 어디에서 찾을 수 있는가?

오토핫키 내려받기 페이지를 참조합니다.

왜 스크립트에서 어떤 줄은 절대로 실행되지 않는가?

어떤 줄이든 즉시 실행하고 싶다면 스크립트가 실행될 때 상단에 있어야 합니다. 그 다음에 핫키, 핫스트링, 또는 Return이 나와야 합니다. 더 자세한 것은 자동-실행 섹션을 참조하십시오.

또한, 한 줄 이상 실행하는 핫키는 그의 첫 번째 줄이 핫키 바로 아래에 나타나야 합니다. 같은 줄이 아닙니다. 예를 들어:

#space::  ; Win+Spacebar
Run Notepad
WinWaitActive Untitled - Notepad
WinMaximize
return

왜 스크립트가 XP에서는 잘 실행되는데 Vista나 Windows 7 또는 8에서는 실행되지 않는가?

운영체제를 전환하면, 다른 무언가도 역시 바뀔 가능성이 높습니다. 그 때문에 스크립트에 영향을 끼칠 수 있습니다. 예를 들면, 새 컴퓨터를 구입했다면, 예전 컴퓨터와 어떻게든 다를 겁니다. 또 새로운 버전의 오토핫키로 업그레이드했다면, 예전에는 어떤 버전이었는지 알아보고 변경 기록과 호환성 노트를 점검해 보십시오.

XP에서 비스타나 그 이후 버전의 윈도우즈로 이전하면 자주 발생하는 문제는 프로그램이 "승격되어 버려서" (관리자로 실행되어 버리므로) 핫키가 막히거나 자동화되기를 거부합니다. 적어도 세가지 해결책이 있습니다:

  • AutoHotkey.exe를 수정해서 관리자 프로그램과 상호작용하도록 만듭니다. 이 방법은 약간 결점이 있습니다. 더 자세한 정보는 다음을 참조합니다: http://www.autohotkey.com/board/topic/70449-enable-interaction-with-administrative-programs/
  • 스크립트를 관리자로 실행합니다. 이 경우도 역시 프로그램에 문제를 일으킬 수 있습니다.
  • 사용자 계정 제어를 막아 버립니다 (권장하지 않습니다); Windows 8 이후는 보안 설정을 무력화할 수 있습니다. "관리자 승인 모드에서 모든 프로그램을 실행"을 설정할 수 있습니다 (역시 권장하지 않습니다).

SoundGet, SoundSet, SoundGetWaveVolume 그리고 SoundSetWaveVolume는 비스타 이전 이후 버전에 따라 다르게 행동합니다. 특히, 장치 번호가 다르고 어떤 컴포넌트는 사용할 수조차 없습니다. 행위는 오디오 드라이버에 따라 다릅니다. XP에 사용되는 드라이버라면 당연히 다를 겁니다. 사운드 카드 분석 스크립트를 사용하면 올바른 장치 번호를 찾을 수 있습니다.

트레이 아이콘을 통하여 스크립트를 편집할 수 없다. 에러 때문에 시작조차 하지 않는다. 어떻게 해야 하는가?

스크립트의 에러를 먼저 수정할 필요가 있습니다. 그 다음에 트레이 아이콘을 다시 얻을 수 있습니다. 그러나 먼저, 해당 스크립트 파일을 찾을 필요가 있습니다.

다음 디렉토리에서 AutoHotkey.ahk를 찾습니다:

  • 나의 문서 (또는 My Documents) 폴더.
  • 오토핫키를 설치한 디렉토리. 보통 C:\Program Files\AutoHotkey. 오토핫키를 설치하고 사용하고 있다면, AutoHotkey.exe가 들어 있는 디렉토리를 들여다 봅니다.

또다른 오토핫키 실행파일을 직접적으로 실행하고 있다면, 그 스크립트의 이름은 실행파일에 따라 다릅니다. 예를 들어, AutoHotkeyU32.exe를 실행하고 있다면, AutoHotkeyU32.ahk를 찾습니다. 여러분의 시스템에 따라 ".ahk" 부분이 감추어져 있을 수 있지만, 그 파일은 분명히 [H] 와 같은 아이콘이 있습니다.

보통 스크립트 파일에 우클릭해서 Edit Script를 선택하면 편집할 수 있습니다. 그렇지 않다면, 파일을 노트패드나 기타 다른 편집기로 열 수 있습니다.

AutoHotkey를 시작 메뉴로부터 기동했거나 또는 직접 AutoHotkey.exe를 (명령어 줄 매개변수 없이) 실행했다면, 위에 보여준 위치 중 하나에서 스크립트를 찾습니다. 다른 방법으로 아무데나 원하는 곳에 스크립트 파일을 만들어서 (something.ahk), 오토핫키를 실행하는 대신에 그 스크립트 파일을 실행할 수 있습니다.

또 명령어 줄 매개변수 "스크립트 파일이름" 그리고 AutoHotkey.exe의 이식성을 참조하십시오.

코드에서 에러를 어떻게 발견하고 고칠 수 있는가?

간단한 스크립트라면 스크립트 디버깅하기를 참조합니다. 변수의 내용을 보여주려면, MsgBox 또는 ToolTip을 사용합니다. 복잡한 스크립트라면 상호대화 디버깅을 참조합니다.

AHK를 USB 드라이브에서 실행할 수 있는가?

AutoHotkey.exe의 이식성을 참조하십시오. 자동-포함 함수 라이브러리를 사용한다면, AutoHotkey.exe와 Lib 폴더는 Ahk2Exe.exe보다 한 단계 높은 폴더에 위치해야 합니다 (예, \AutoHotkey.exe vs \Compiler\Ahk2Exe.exe). 또 Ahk2Exe는 설정을 다음 레지스트리 키에 저장한다는 것에도 주목하십시오: HKEY_CURRENT_USER\Software\AutoHotkey\Ahk2Exe.

왜 Run 명령어가 게임이나 프로그램을 기동시키지 못하는가?

어떤 프로그램은 자신만의 디렉토리에서 시작할 필요가 있습니다 (잘 모르겠다면, 보통 그렇게 하는 것이 가장 좋습니다). 예를 들어:

Run, %A_ProgramFiles%\Some Application\App.exe, %A_ProgramFiles%\Some Application

어떻게 명령 줄 연산의 출력 결과를 열람할 수 있는가?

테스트에 의하면 파일 캐슁 때문에, 임시 파일은 상대적으로 작은 출력에 아주 빠를 수 있습니다. 사실, 그 파일이 사용된 후 곧바로 삭제된다면, 실제로 디스크에 씌여지지 조차 않는 경우가 종종 있습니다. 예를 들어:

RunWait %comspec% /c dir > C:\My Temp File.txt
FileRead, VarToContainContents, C:\My Temp File.txt
FileDelete, C:\My Temp File.txt

임시 파일의 사용을 피하려면 (특히 출력이 클 때), Run 명령어에 예제에 보여준 바와 같이 Shell.Exec() 메쏘드의 사용을 고려해 보십시오.

어떻게 스크립트가 다른 스크립트를 닫고, 멈추며, 또는 보류하도록 만들 수 있는가?

먼저, 다음은 또다른 스크립트를 닫는 예입니다:

DetectHiddenWindows On  ; 스크립트의 숨겨진 메인 창을 탐지되도록 허용합니다.
SetTitleMatchMode 2  ; 아래 파일의 전체 경로를 지정할 필요를 회피합니다.
WinClose Script's File Name.ahk - AutoHotkey  ; 이것을 갱신하여 스크립트의 이름을 반영합니다 (대소문자 구분).

또다른 스크립트를 보류하거나 또는 정지하려면, 위에서 마지막 줄을 다음으로 교체합니다:

PostMessage, 0x111, 65305,,, Script's File Name.ahk - AutoHotkey  ; Suspend.
PostMessage, 0x111, 65306,,, Script's File Name.ahk - AutoHotkey  ; Pause.

스크립트를 끝내지 않고 어떻게 반복 행위를 멈출 수 있는가?

전체 스크립트를 키가 눌릴 때 정지하거나 재개하려면, 핫키를 Pause 명령어에 할당합니다. 다음 예제와 같이:

^!p::Pause  ; Ctrl+Alt+P를 눌러 정지합니다. 다시 누르면 재개합니다.

회돌이 안에서 반복되는 행위를 멈추려면, 다음의 작동하는 예제를 연구해 보십시오. 핫키 하나로 반복 행위를 시작하고 멈춥니다. 다른 말로 하면, 핫키를 한번 누르면 회돌이를 시작합니다. 그 핫키를 다시 누르면 회돌이를 멈춥니다.

#MaxThreadsPerHotkey 3
#z::  ; Win+Z 핫키 (이 핫키를 여러분의 기호에 맞게 변경합니다).
#MaxThreadsPerHotkey 1
if KeepWinZRunning  ; 이것은 아래의 쓰레드가 이미 아래의 회돌이를 실행중이라는 뜻입니다.
{
    KeepWinZRunning := false  ; 쓰레드의 회돌이를 멈추게 하는 신호입니다.
    return  ; 이 쓰레드를 끝냅니다. 이 아래의 코드가 실행을 재개합니다. 위의 줄에서 바뀐 곳에 주목하십시오.
}
; 그렇지 않으면:
KeepWinZRunning := true
Loop
{
    ; 다음 네 줄은 반복하고 싶은 행위입니다 (여러분의 기호에 맞게 바꿉니다):
    ToolTip, Win-Z를 다시 눌러 이것이 떨리는 것을 멈춥니다.
    Sleep 1000
    ToolTip
    Sleep 1000
    ; 그러나 아래의 나머지는 그대로 둡니다.
    if not KeepWinZRunning  ; 사용자가 Win-Z를 다시 눌러 회돌이를 멈추라고 신호를 보냈습니다.
        break  ; 이 회돌이를 빠져 나갑니다.
}
KeepWinZRunning := false  ; 이 핫키가 다음에 눌릴 때를 대비하여 재설정합니다.
return

어떻게 게임을 위해 수행성능을 향상시킬 수 있는가? CPU가 크게 부담이 될 경우 어떻게 하는가?

스크립트의 핫키, 클릭, 또는 전송이 보통 때보다 현저하게 느리다면, CPU가 엄청난 부담을 지고 있어서 그렇다면, 스크립트의 처리-우선순위를 높이면 도움이 될 수 있습니다. 이렇게 하려면, 다음 줄을 스크립트 상단 근처에 포함합니다:

Process, Priority, , High

어떻게 오토핫키 명령어를 위한 문맥 감지 도움말을 다른 편집기에서 사용할 수 있는가?

라젯(Rajat) 씨가 다음 스크립트를 만들었습니다.

웹 페이지가 적재를 끝냈는지 어떻게 아는가?

인터넷 익스플로러라면, 아마도 가장 믿을만한 방법은 DllCall과 COM을 www.autohotkey.com/forum/topic19256.html에 시연하는 것처럼 사용하는 것입니다. 관련해서 한가지 덧붙이면, 주소 바와 상태 바의 내용은 www.autohotkey.com/forum/topic19255.html에 보여주는 것처럼 열람할 수 있습니다.

예전의, 신뢰가 덜한 방법: 다음 예제에서의 테크닉은 대부분의 페이지에 대하여 MS 인터넷 익스플로러에 작동할 것입니다. 비슷한 테크닉을 다른 브라우저에서도 사용할 수 있습니다:

Run, www.yahoo.com
MouseMove, 0, 0  ; 상태 바에 마우스를 올리면 링크를 보여주지 못하게 막습니다. 대신 "Done"이 보입니다.
WinWait, Yahoo! -
WinActivate
StatusBarWait, Done, 30
if ErrorLevel
   MsgBox 대기 시간이 끝났거나 창이 닫혔습니다.
else
   MsgBox 페이지가 적재를 마쳤습니다.

날짜와 시간을 어떻게 비교하고 조작하는가?

EnvAdd 명령어는 날짜, 시간, 분, 초를 더하고 빼서 시간-문자열로 만들 수 있습니다. 형식은 YYYYMMDDHH24MISS입니다. 다음 예제는 지정된 시간에서 7일을 뺍니다: EnvAdd, VarContainingTimestamp, -7, days.

두 날짜나 시간 사이의 양을 결정하려면 EnvSub를 참조하십시오. 안에 예제가 있습니다. 또한, 내장 변수 A_Now에는 현재의 지역 시간이 담겨 있습니다. 마지막으로, 여러 내장 날짜/시간 변수가 있습니다. 뿐만 아니라 FormatTime 명령어로 맞춤 날짜/시간 문자열을 만들 수 있습니다.

현재 날짜/시간을 어떻게 전송하는가?

FormatTime 또는 날짜와 시간을 위한 내장 변수들을 사용하십시오.

어떻게 텍스트를 비활성화 상태의 창 또는 보이지 않는 창에 전송할 수 있는가?

ControlSend를 사용하십시오.

왜 핫스트링, Send, 그리고 Click이 어떤 게임에서는 효과가 없는가?

모든 게임이 AHK가 전송하는 키와 클릭 또는 픽셀 컬러를 허용하는 것은 아닙니다.

그러나 대안이 있습니다. 아래에 언급한 모든 해결책들을 시도해 보십시오. 모든 것이 실패하면, 아마도 AHK로는 게임을 작동시킬 수 없을 것입니다. 종종 게임이 GameGuard나 Hackshield 같은 핵과 치트 방지 수단을 갖추고 있는 경우가 있습니다. 그렇다면, 그 게임에는 오토핫키가 작동하지 않을 가능성이 아주 높습니다.

  • SendPlay 명령어, SendMode Play 그리고/또는 핫스트링 옵션 SP를 시도합니다.

    SendPlay, abc
    SendMode, Play
Send, abc
    :SP:btw::by the way

; or

#Hotstring SP
::btw::by the way

    주의: SendPlay는 Windows Vista 이후에 사용자 계정 제어가 켜져 있으면 전혀 효과가 없습니다. 스크립트가 관리자 권한으로 실행되더라도 마찬가지입니다.

  • SetKeyDelay를 증가시켜 봅니다. 예를 들어:

    SetKeyDelay, 0, 50
SetKeyDelay, 0, 50, Play

  • ControlSend를 시도합니다. 다른 Send 모드가 실패할 경우 성공할 가능성이 있습니다:

    ControlSend,, abc, game_title

  • 다양한 전송 방법으로 한 키의 이벤트를 누르고 떼고 시도해 봅니다:

    Send {KEY down}{KEY up}

  • 한 키의 이벤트를 누르고 떼며, 그 사이에 Sleep을 넣고 시험해 봅니다:

    Send {KEY down}
Sleep 10 ; 여러가지 밀리초를 시험해 보십시오
Send {KEY Up}

어떻게 Winamp를 제어할 수 있는가? 작동하지 않을 때에도 제어하고 싶다.

Winamp 자동화하기를 참조하십시오.

어떻게 MsgBox의 버튼 이름을 바꿀 수 있는가?

다음 예제를 참조하십시오.

어떻게 기본 편집기를 바꿀 수 있는가? 문맥 메뉴나 트레이 아이콘으로 접근하고 싶다.

편집기 예제 섹션에서 기본 편집기를 바꾸는 스크립트를 보실 수 있습니다.

GUI 관련 변수의 내용을 어떻게 저장하는가?

Gui Submit을 사용합니다. 예를 들어:

Gui, Add, Text,, 텍스트를 입력하고 Submit을 누릅니다:
Gui, Add, Edit, vAssociatedVar
Gui, Add, Button,, Submit
Gui, Show
Return

ButtonSubmit:
Gui, Submit, NoHide
MsgBox, 편집 콘트롤의 내용: %AssociatedVar%
Return

AHK로 어떻게 그리는가?

틱(tic)이 집필한 GDI+ 표준 라이브러리를 참조하십시오. Gui를 사용하여 기본적인 메쏘드들을 사용할 수 있지만, 제한적입니다.

창이 열리거나, 닫히거나 또는 [비]활성화될 때 어떻게 행위를 촉발시킬 수 있는가?

WinWait, WinWaitClose 또는 WinWait[Not]Active를 사용합니다. 더 자세한 정보는 공동체가-이끄는 FAQ (윈도우즈 섹션)를 참조하십시오.

백신 프로그램이 AHK를 맬웨어라고 진단했다. 진짜 바이러스가 들어있는가?

당연히 아닙니다. 안티바이러스 프로그램은 AHK를 맬웨어로 잘못 진단할 수 있습니다. (거짓 긍정이라고 부름). 스크립트가 UPX (AHK 1.0 기본값, AHK 1.1 제거) 또는 MPRESS (AHK 1.1 선택적) 같은 압축기로 컴파일되어 실행될 때 그럴 가능성이 있습니다. 압축기는 컴파일된 스크립트의 크기를 줄일 수 있습니다. 컴파일된 실행화일을 꼭 압축해야 할 필요가 없다면, 압축기의 사용을 자제해서 안티바이러스 프로그램으로부터 거짓 경고를 받지 않는 것이 좋습니다. 여러분은 물론 잠재적인 다른 사용자를 위해서 말이지요.

핫키, 핫스트링, 그리고 리맵핑

어떻게 핫키와 핫스트링을 컴퓨터가 기동할 때 자동으로 적용되도록 만들 수 있는가?

시작 메뉴에 시작이라는 폴더가 있습니다. 스크립트에 대한 단축아이콘을 그 폴더에 넣으십시오. 그러면 그 스크립트는 컴퓨터가 시작할 때마다 자동으로 시작합니다. 단축아이콘을 만들려면:

  1. 스크립트 파일을 찾습니다. 선택한 다음 Control-C를 누릅니다.
  2. 시작 버튼을 우클릭합니다 (전형적으로 화면 좌하에 있습니다) 그리고 "Explore All Users"를 클릭합니다.
  3. 프로그램 폴더 안의 시작 폴더를 찾아 갑니다.
  4. 메뉴바에서 Edit -> Paste Shortcut을 선택합니다. 스크립트를 가리키는 단축아이콘이 이제 시작 폴더에 배치됩니다.

마우스 버튼을 핫키처럼 작동시키는데 어려움을 겪고 있다. 조언이 있는가?

왼쪽 오른쪽 마우스 버튼은 보통 할당이 가능합니다 (예를 들어, #LButton::는 Win+LeftButton 핫키입니다). 비슷하게, 가운데 버튼과 마우스 휠의 회전은 보통 할당이 가능합니다. 단, 마우스 드라이버가 버튼을 직접적으로 제어하는 경우는 제외합니다.

네 번째 버튼 (XButton1)과 다섯 번째 버튼(XButton2)은 마우스 드라이버가 클릭을 시스템에 보이도록 허용하면 할당이 가능할 수도 있습니다. 보이지 않거나 -- 또는 마우스가 버튼이 다섯개가 넘어가면 -- 마우스에 함께 따라온 소프트웨어를 조정해서 (보통 제어판이나 시작 메뉴로 접근할 수 있을 것입니다) 이런 버튼을 누를 때마다 키누름을 전송하도록 시도해 보아야 합니다. 그런 키눌림은 스크립트에서 핫키로 정의할 수 있습니다. 예를 들어, 네 번째 버튼이 Control+F1를 전송하도록 구성했다면, ^F1::를 사용하여 스크립트에 간접적으로 그 버튼을 핫키로 구성할 수 있습니다.

다섯 버튼 마우스를 가지고 있는데 네 번째 버튼과 다섯 번째 버튼은 보이지 않는다면, 마우스 드라이버를 운영체제에 포함된 기본 드라이버로 바꾸어 볼 수 있습니다. 이것은 여러분의 특별한 마우스를 위한 전용 드라이버가 있고 거기에서 제공되는 특별한 특징이 없어도 살수 있다고 가정합니다.

탭과 스페이스는 어떻게 핫키로 정의할 수 있는가?

문자가 아니라 키의 이름을 사용하십시오 (Tab 그리고 Space). 예를 들어, #Space는 Win+Space이고 ^!Tab은 Control+Alt+Tab입니다.

키나 마우스 버튼을 어떻게 리맵할 수 있는가? 마치 다른 키처럼 보이게 하고 싶다.

이 주제는 리맵핑 페이지에 기술되어 있습니다.

키나 버튼이 두 번 눌리는 것을 어떻게 탐지하는가?

다음과 같이 핫키에 내장 변수를 사용하십시오:

~Ctrl::
    if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200)
        MsgBox 두번-눌렀습니다
return

어떻게 핫키나 핫스트링을 어떤 프로그램에는 배제할 수 있는가? 다른 말로 하면, 특정 창이 활성화되어 있을 때를 제외하고 어떤 키를 그냥 보통 때처럼 작동시키고 싶다.

선호되는 방법은 #IfWinActive입니다. 예를 들어:

#IfWinActive, ahk_class Notepad
^a::MsgBox 노트패드가 활성화되어 있는 동안 Control-A를 눌렀습니다.

어떻게 접두 키를 아무것도 하지 않는 대신에 그의 원래 기능을 수행하도록 만들 수 있는가?

다음 예제를 연구해 보십시오. Numpad0를 접두 키로 만듭니다:

Numpad0 & Numpad1::MsgBox, Numpad0을 누르고 있는 동안 Numpad1을 눌렀습니다.

이제, 위와 같이 핫키를 기동하는데 사용되지 않을 경우 Numpad0가 실제 Numpad0 키눌림을 전송하도록 만들려면, 다음 핫키를 추가합니다:

 $Numpad0::Send, {Numpad0}

$ 접두사는 무한 회돌이를 경고하는 대화상자가 나타나는 것을 막기 위해 필요합니다 (핫키가 "자기 자신을 전송"하기 때문입니다). 게다가, 위의 행위는 키에서 손을 뗄 때 일어납니다.

어떻게 Win+U (Utility Manager) 그리고 Win+R (Run) 같은 내장 윈도우즈 단축 키를 바꾸거나 불능으로 만들 수 있는가?

다음은 예제들을 참조하십시오.

핫스트링에 와일드카드나 정규 표현식을 사용할 수 있는가?

폴리테네(polyethene)가 작성한 스크립트를 사용하십시오 (예제들이 포함되어 있습니다).

키보드 레이아웃에 없는 핫키를 어떻게 사용할 수 있는가?

특수 키들을 참조하십시오.

키보드에 특별한 000 키가 있다. 이것을 핫키로 변환할 수 있는가?

그렇습니다. 다음 예제 스크립트는 000 키를 등호 키로 바꿉니다. Send, = 줄을 원하는 대로 바꾸어서 행위를 바꿀 수 있습니다.


Functions

함수

목차

  • 소개와 간단한 예제
  • 매개변수
  • 선택적 매개변수
  • 호출자에게 값을 돌려주기
  • 가변 함수
  • 지역 변수
  • 동적으로 함수를 호출하기
  • 단축 회로 불리언 평가
  • 함수 안에서 서브루틴 사용하기
  • Return, Exit, 그리고 총평
  • #Include를 사용해 여러 스크립트 사이에 함수를 공유하기
  • 함수 라이브러리: 표준 라이브러리와 사용자 라이브러리
  • 내장 함수

소개와 간단한 예제

함수는 서브루틴 (Gosub)과 비슷합니다. 단, 호출자로부터 매개변수(입력)를 받을 수 있다는 점은 다릅니다. 게다가, 함수는 선택적으로 값을 호출자에게 돌려줄 수 있습니다. 다음의 간단한 함수를 연구해 보겠습니다. 두 개의 숫자를 받고 그 합을 돌려줍니다:

Add(x, y)
{
    return x + y   ; "Return"은 표현식을 기대합니다.
}

위의 코드는 함수 정의라고 알려져 있는데 "Add" (대소문자 구분 없음)라는 이름의 함수를 생성하고 그 함수를 호출하려면 누구라도 정확하게 두 개의 매개변수 (x와 y)를 제공하도록 확립합니다. 이 함수를 호출하려면, := 연산자로 그의 결과를 변수에 할당합니다. 예를 들어:

Var := Add(2, 3)  ; 숫자 5가 Var에 저장됩니다.

또, 함수는 그의 반환 값을 저장하지 않고서도 호출할 수 있습니다:

Add(2, 3)

그러나 이 경우, 함수가 돌려주는 값은 모두 폐기됩니다; 그래서 함수가 반환 값을 돌려주는 일 외에 다른 효과를 생산하지 않는 한, 이 호출은 어떤 목적에도 기여하지 못합니다.

함수 호출은 표현식이기 때문에, 매개변수 목록의 변수 이름은 퍼센트 사인으로 둘러싸지 않아도 됩니다. 대조적으로, 기호 문자열을 겹따옴표로 둘러 싸야 합니다. 예를 들어:

if InStr(MyVar, "fox")
    MsgBox 변수 MyVar에는 단어 fox가 들어 있습니다.

마지막으로, 함수는 다른 명령어의 매개변수에서 호출할 수도 있습니다 (StringLen의 매개변수와 같이 OutputVar와 InputVar 같은 매개변수는 예외입니다). 그렇지만, 표현식을 지원하지 않는 매개변수는 다음 예제와 같이 반드시 "% " 를 접두기호로 사용해야 합니다:

MsgBox % "정답은 다음과 같습니다: " . Add(3, 2)

"% " 접두기호는 또 근본적으로 표현식을 지원하는 매개변수에도 허용됩니다. 그러나 그냥 무시됩니다.

매개변수

함수가 정의될 때, 그의 매개변수는 함수 이름 옆 괄호 안에 나열됩니다 (함수와 여는 괄호 사이에 공간이 있으면 안됩니다). 함수가 매개변수를 받지 않으면, 괄호를 빈 채로 둡니다: GetCurrentTimestamp().

ByRef 매개변수: 함수의 관점에서, 매개변수는 본질적으로 지역 변수와 똑같습니다. 그러나 다음 예제와 같이 ByRef로 정의된다면 다릅니다:

Swap(ByRef Left, ByRef Right)
{
    temp := Left
    Left := Right
    Right := temp
}

위의 예제에서, ByRef를 사용하면 각 매개변수들이 호출자로부터 들어오는 변수에 대하여 별명이 됩니다. 다른 말로, 매개변수와 호출자의 변수는 모두 메모리의 같은 내용을 가리킵니다. 이 때문에 Swap 함수는 호출자의 변수를 변경할 수 있습니다. Left의 내용을 Right으로 그리고 그 반대로 이동시킬 수 있습니다.

대조적으로, ByRef가 위의 예제에서 사용되지 않았다면, Left와 Right는 호출자 변수의 사본이 되어야 합니다. 그래서 Swap 함수는 외부적으로 아무 효과가 없을 것입니다.

return은 함수의 호출자에게 오직 하나의 값만 다시 돌려줄 수 있기 때문에, ByRef를 사용하면 추가 결과를 더 돌려줄 수 있습니다. 호출자에게 (보통 빈) 변수를 건네게 하고 거기에 함수가 값을 저장하면 됩니다.

방대한 문자열을 함수에 건넬 때, ByRef는 수행성능을 향상시키고 메모리를 그대로 유지합니다. 문자열의 사본을 만들 필요가 없기 때문입니다. 비슷하게, ByRef를 사용하여 긴 문자열을 다시 호출자에게 보내면 Return HugeString와 같이 하는 것에 비해 보통 수행성능이 더 향상됩니다.

[AHK_L 60+]: 변경가능한 변수 말고 어떤 것이 ByRef 매개변수에 건네지면, 함수는 마치 키워드 "ByRef"가 없는 것처럼 행위합니다. 예를 들어, Swap(A_Index, i)는 A_Index의 값을 i에 저장하지만, Left에 할당된 값은 Swap 함수가 반환되는 순간 폐기됩니다.

[v1.1.01+]: IsByRef() 함수를 사용하면 호출자가 주어진 ByRef 매개변수에 대하여 변수를 공급했는지 알 수 있습니다.

알려진 한계:

  • 객체의 필드는 ByRef 목적에 대하여 변수로 간주되지 않습니다. 예를 들어, foo.bar가 ByRef 매개변수에 건네지면, 마치 ByRef 키워드가 생략된 것처럼 행위합니다.
  • 클립보드, 내장 변수, 또는 환경 변수를 함수의 ByRef 매개변수에 보낼 수 없습니다. 스크립트에 #NoEnv가 존재하지 않을지라도 보낼 수 없습니다.
  • 함수가 자신을 재귀적으로 호출할 수는 있지만, 자신의 지역 변수 또는 비-ByRef 매개변수를 자기 자신 ByRef에게 건네면, 새로운 레이어의 ByRef 매개변수는 이전 레이어의 매개변수가 아니라 자기 자신의 지역 변수의 이름을 가리킬 것입니다. 그렇지만, 함수가 자기 자신에게 전역 변수, 정적 변수, 또는 ByRef 매개변수를 건넬 때 이런 문제는 일어나지 않습니다.
  • 함수-호출에서 매개변수가 변수로 결정되면 (예, Var 또는 ++Var 또는 Var*=2), 왼쪽이나 오른쪽의 다른 매개변수들은 그 변수가 함수에 건네지기 전에 변경할 수 있습니다. 예를 들어, func(Var, Var++)는 Var가 처음부터 0일 때 예상치 못하게 1과 0을 건네게 됩니다. 심지어 함수의 첫 매개변수가 ByRef가 아닐 때도 그렇습니다.. 이 행위는 반직관적이기 때문에, 미래의 배포본에서는 바뀔 가능성이 있습니다.
  • ByRef는 COM 클라이언트가 호출하는 함수에서 또는 COM 메쏘드를 호출할 때 직접적으로 지원하지 않습니다. 대신에, 스크립트는 안에 VarType과 값의 주소가 들어있는 래퍼 객체를 주고 받아야 합니다.

선택적 매개변수

함수를 정의할 때, 하나 이상의 매개변수에 선택적 표식을 할 수 있습니다. 먼저 등호 사인을 두고 (또는 v1.1.09+에서는 :=) 다음에 기본값을 두면 됩니다. 다음 함수는 Z 매개변수에 선택적 표식이 붙어 있습니다:

Add(X, Y, Z:=0) {
    return X + Y + Z
}

v1.1.09 버전부터 =와 := 둘 다 지원합니다. 표현식 할당과의 일관성과 미래 버전의 오토핫키와의 호환성을 위하여 후자를 권장합니다.

호출자가 세 개의 매개변수를 위의 함수에 건네면, Z의 기본 값은 무시됩니다. 그러나 호출자가 오직 두 개의 매개변수만 건네면, Z는 자동으로 기본값 0을 받습니다.

선택적 매개변수를 리스트 한 가운데에 따로 배치하는 것은 불가능합니다. 다른 말로 하면, 첫 번째 선택적 매개변수의 오른쪽에 나오는 모든 매개변수도 역시 선택적으로 표식이 붙어야 합니다. [AHK_L 31+]: 선택적 매개변수는 매개변수 리스트의 중앙에서는 생략할 수 있습니다. 아래와 같이 함수를 호출합니다. 동적인 함수 호출과 메쏘드 호출은 v1.1.12+이상이 필요합니다.

Func(1,, 3)
Func(X, Y:=2, Z:=0) {  ; 이 경우 Z는여전히 선택적이어야 함에 유의합니다.
    MsgBox %X%, %Y%, %Z%
}

v1.0.46.13+에서, ByRef 매개변수도 기본값을 지원합니다; 예를 들어: Func(ByRef p1 = ""). 호출자가 그런 매개변수를 빼먹을 때마다, 함수는 지역 변수를 만들어 기본 값을 담습니다; 다른 말로, 함수는 마치 키워드 "ByRef"가 존재하지 않는 것처럼 행위합니다.

매개변수의 기본 값은 다음 중 하나가 되어야 합니다: true, false, 문자 그대로의 정수, 문자 그대로의 부동 소수점 수, 또는 "fox" 또는 ""와 같이 인용부호처리되어 문자 그대로의 문자열. (그러나 1.0.46.13+이전 버전의 문자열은 오직 ""만 지원합니다).

호출자에게 값 돌려주기

소개에 기술한 바와 같이, 함수는 선택적으로 값을 호출자에게 돌려줄 수 있습니다.

Test := returnTest()
MsgBox % Test

returnTest() {
  return 123
}

함수로부터 결과를 더 많이 돌려주고 싶다면, ByRef를 사용할 수 있습니다:

returnByRef(A,B,C)
MsgBox % A "," B "," C

returnByRef(ByRef val1, ByRef val2, ByRef val3)
{
  val1 := "A"
  val2 := 100
  val3 := 1.1
  return
}

[v1.0.97+]: 객체와 배열을 사용하면 여러 값들 심지어 이름 붙은 값들도 돌려줄 수 있습니다:

Test1 := returnArray1()
MsgBox % Test1[1] "," Test1[2]

Test2 := returnArray2()
MsgBox % Test2[1] "," Test2[2]

Test3 := returnObject()
MsgBox % Test3.id "," Test3.val

returnArray1() {
  Test := [123,"ABC"]
  return Test
}

returnArray2() {
  x := 456
  y := "EFG"
  return [x, y]
}

returnObject() {
  Test := {id: 789, val: "HIJ"}
  return Test
}

가변 함수 [AHK_L 60+]

함수를 정의할 때, 별표를 마지막 매개변수 뒤에 쓰면 그 함수를 가변함수로 만들 수 있습니다. 가변 개수의 매개변수를 받을 수 있습니다:

Join(sep, params*) {
    for index,param in params
        str .= param . sep
    return SubStr(str, 1, -StrLen(sep))
}
MsgBox % Join("`n", "one", "two", "three")

가변 함수를 호출할 때, 넘치는 매개변수는 함수의 마지막 매개변수에 저장되어 있는 객체를 통하여 접근할 수 있습니다. 넘친 첫 번째 매개변수는 params[1]에 있고, 두 번째는 params[2]에 등등에 있습니다. 다른 표준 객체처럼params.MaxIndex()를 사용하면 숫치상 가장 높은 인덱스를 알 수 있습니다 (이 경우 매개변수의 개수입니다). 그렇지만, 매개변수가 없다면, MaxIndex는 빈 문자열을 돌려줍니다.

주의:

  • "가변" 매개변수는 오직 형식 매개변수 리스트의 끝에만 나타날 수 있습니다.
  • RegEx 콜아웃은 가변적일 수 없습니다; "가변" 매개변수는 받지만, 빈 채로 둡니다.
  • 역호출은 넘친 매개변수들을 베열이 아니라 주소로 건넵니다.

가변 함수 호출

가변 함수가 가변 개수의 매개변수를 받아들일 수 있는 반면, 매개변수 배열을 어떤 함수에도 건넬 수 있습니다. 같은 구문을 함수-호출에 적용하면 됩니다:

substrings := ["one", "two", "three"]
MsgBox % Join("`n", substrings*)

주의:

  • 소스 배열 안에서 매개변수의 번호는 1부터 시작합니다.
  • 선택적 매개변수는 그 배열에서 완전히 생략해도 됩니다.
  • 매개변수 배열은 사용자-정의 함수를 호출할 때 이름붙은 항목을 담을 수 있습니다; 다른 경우는, 이름붙은 항목을 지원하지 않습니다.
  • 목표 함수도 가변적일 수 있습니다. 이 경우 이름붙은 항목은 상응하는 형식 매개변수가 없더라도 복사됩니다.
  • 이 구문은 또 메쏘드를 호출하거나 객체의 특성을 열람할 때 사용할 수 있습니다; 예를 들어, Object.Property[Params*]. v1.1.12+에서는 특성을 설정하는 데에도 사용할 수 있습니다.

알려진 한계:

  • 제일 오른쪽 매개변수만 이런식으로 확장할 수 있습니다. 예를 들어, Func(x, y*)는 지원하지만 Func(x*, y)는 지원하지 않습니다.
  • 별표(*)와 매개변수 리스트를 끝내는 심볼 사이에 공백문자말고 다른 문자는 허용하지 않습니다.

지역 변수와 전역 변수

지역 변수

함수 안에서 만들어지고 접근되는 모든 변수들은 기본적으로 지역적입니다 (슈퍼-전역 변수 그리고 Clipboard, ErrorLevel, A_TimeIdle와 같은 내장 변수는 제외합니다). 각 지역 변수의 내용은 함수 안에 든 줄에서만 보입니다. 결과적으로, 지역 변수는 전역 변수와 이름이 같을 수 있습니다. 그리고 서로 다른 내용을 가질 수 있습니다. 마지막으로, 모든 지역 변수는 함수가 호출될 때마다 빈 채로 시작합니다.

전역 변수

함수 안에서 기존의 전역 변수를 참조하려면 (또는 새로 만들려면), 변수를 global로 선언한 다음 사용합니다. 예를 들어:

LogToFile(TextToLog)
{
    global LogFileName  ; 이 전역 변수는 이 함수 바깥 어딘가에 미리 값이 주어져 있습니다.
    FileAppend, %TextToLog%`n, %LogFileName%
}

전역-간주 모드: 함수가 방대한 개수의 전역 변수를 만들거나 접근할 필요가 있다면, 그의 모든 변수를 전역적으로 간주하도록 정의할 수 있습니다 (매개변수는 제외). 첫 줄을 단어 "global"로 만들거나 지역 변수의 선언으로 만들면 됩니다. 예를 들어:

SetDefaults()
{
    global  ; 함수의 첫 줄이 "local MyVar"와 같은 것으로 시작하면 이 단어는 생략해도 됩니다.
    MyGlobal := 33  ; 33을 전역 변수에 할당합니다. 필요하면 먼저 변수를 만듭니다.
    local x, y:=0, z  ; 지역 변수는 이 모드로 선언해야 합니다. 그렇지 않으면 전역적으로 간주됩니다.
}

전역-간주 모드를 함수에 사용하면 예를 들어 값을 Array%A_Index%에 할당하는 회돌이와 같이 전역 배열을 만들 수 있습니다.

슈퍼-전역 변수 [v1.1.05+]: 전역 선언이 함수 밖에 나타나면, 기본으로 모든 함수에 영향을 미칩니다. 그래서 각 함수마다 해당 변수를 다시 선언할 필요가 없습니다. 그렇지만, 함수 매개변수나 지역 변수에 같은 이름이 선언되어 있다면, 전역 변수보다 우선 순위가 놓습니다. class 키워드로 만든 변수도 수퍼-전역 변수입니다.

정적 변수

정적 변수는 언제나 묵시적으로 지역적이지만, 지연 변수와는 다른 점이 있습니다. 호출 사이에 값을 기억합니다. 예를 들어:

LogToFile(TextToLog)
{
    static LoggedLines = 0
    LoggedLines += 1  ; 완전히 지역적으로 유지관리합니다 (그의 값은 호출 사이에 기억됩니다).
    global LogFileName
    FileAppend, %LoggedLines%: %TextToLog%`n, %LogFileName%
}

정적 초기화자: 1.0.46 이전 버전에서, 모든 정적 변수는 빈 채로 시작했습니다; 그래서 처음으로 사용되는 변수인지 탐지하는 유일한 방법은 그것이 비어있는지 점검하는 것이었습니다. v1.0.46+에서, 정적 변수는 "" 말고 다른 것으로 초기화할 수 있습니다. 먼저 :=이나 =를 두고 바로 이어 다음 중 하나가 오면 됩니다: true, false, 기호 그대로의 숫자, 기호 그대로의 부동 소수점 수, 또는 "fox"과 같이 기호 그대로/ 인용부호 처리된 문자열. 예를 들면: static X:=0, Y:="fox". 각 정적 변수는 (스크립트가 실행을 시작하기 전에) 오직 한 번만 초기화됩니다.

[AHK_L 58+]: Static var := expression을 지원합니다. 그런 모든 표현식은 나타나는 순서대로 스크립트의 자동-실행 섹션 바로 앞에서 평가됩니다.

정적-간주 모드 [v1.0.48+]: 함수는 그의 모든 변수가 정적이라고 간주하도록 정의할 수 있습니다 (그의 매개변수는 제외). 첫 줄을 "static"이라는 단어로 만들면 됩니다. 예를 들어:

GetFromStaticArray(WhichItemNumber)
{
    static
    static FirstCallToUs := true  ; 정적 선언의 초기화자는 여전히 (기동시에) 한 번만 실행됩니다.
    if FirstCallToUs  ; 첫 번째 호출 동안 정적 배열을 만듭니다. 그러나 그 다음 호출에는 만들지 않습니다.
    {
        FirstCallToUs := false
        Loop 10
            StaticArray%A_Index% := "Value #" . A_Index
    }
    return StaticArray%WhichItemNumber%
}

정적-간주 모드에서, 정적이면 안되는 변수는 반드시 local 또는 global로 선언해야 합니다.

지역 변수와 전역 변수에 관하여 더 자세히

많은 변수들을 한 줄에 선언할 수 있습니다. 다음 예제와 같이 쉼표로 가르면 됩니다:

global LogFileName, MaxRetries := 5
static TotalAttempts = 0, PrevResult

v1.0.46+에서, 전역 변수나 지역 변수는 선언과 동시에 같은 줄에서 초기화할 수 있습니다. :=이나 = 다음에 표현식을 두면 됩니다 (= 연산자는 선언에서 :=와 똑같이 행위합니다). 정적 초기화자와 다르게, 지역 변수와 전역 변수의 초기화자는 함수가 호출될 때마다 매번 실행됩니다. 그러나 오직 실행 흐름이 실제로 거기에 다다를 때에만 초기화합니다. 다른 말로, local x = 0과 같은 줄은 다음과 같이 두 개의 서술문으로 작성한 것과 효과가 같습니다: local x 다음에 x = 0.

local, global, 그리고 static같은 단어는 스크립트가 기동하자 마자 즉시 처리되기 때문에, 변수는 IF 서술문을 수단으로 하여 조건적으로 선언할 수 없습니다. 다른 말로 하면, IF 또는 ELSE 블록안에서 선언하면 해당 선언과 그 함수의 닫는 괄호 사이에 있는 모든 줄들에 예상치 못한 효과를 미칩니다. 또 주목할 것은 global Array%i%와 같이 동적으로 변수를 선언하는 것은 현재 가능하지 않다는 것입니다.

(StringSplit 같은) 의사-배열을 생성하는 명령어에 대하여, 전역-간주 모드가 영향이 없거나 또는 의사-배열의 첫 번째 원소가 지역 변수로 선언되어 있다면, 결과 의사-배열의 각 변수는 지역 변수입니다. (그 함수의 매개변수 중 하나가 건네질지라도 마찬가지입니다 -- 그 매개변수가 ByRef일지라도 -- 왜냐하면 매개변수는 지역 변수와 비슷하기 때문입니다). 역으로, 첫 원소가 global로 선언되었다면, 전역 배열이 생성됩니다. 그렇지만, 아래의 흔한 혼란의 근원이 이 경우에도 적용되니다. StringSplit의 첫 원소는 ArrayName0입니다. WinGet List와 같이 다른 배열-생성 명령어에 대하여, 첫 번째 원소는 ArrayName입니다 (즉, 숫자가 없습니다).

함수 안에서, Array%i%와 같은 동적 변수 참조는 해당 이름의 변수가 존재하지 않는 한, 언제나 지역 변수로 결정됩니다. 만약 존재하면 전역 변수가 사용됩니다. 아예 존재하지 않으면 새로 생성될 필요가 있습니다. 지역 변수로 생성됩니다. 단, 전역-간주 모드가 켜 있다면 전역 변수로 생성됩니다. 결과적으로, 함수는 (Array%i% := A_Index과 같은 수단을 사용하여) 수동으로 전역 배열을 만들 수 있습니다. 물론 전역-간주 함수로 선언되어 있어야 합니다.

흔한 혼란의 근원: 변수를 동적으로 참조했는데 존재하지 않으면 스크립트가 기동하는 순간 그 변수가 생성됩니다. 예를 들어, 함수 밖에서 사용될 때, MsgBox %Array1%는 스크립트가 기동하는 순간 Array1을 전역변수로 생성합니다. 반대로, 함수 안에서 사용될 때, MsgBox %Array1%는 스크립트가 기동하는 순간 (전역-간주 모드가 아닌 한), Array와 Array0이 전역 변수로 선언되어 있다고 할지라도, Array1을 지역 변수중 하나로 생성합니다.

동적으로 함수 호출하기

v1.0.47.06+에서, 함수는 (내장 함수도 역시) 퍼센트 사인을 통하여 동적으로 호출할 수 있습니다. 예를 들어, %Var%(x, "fox")는 이름이 Var 안에 들어 있는 함수를 호출합니다. 비슷하게, Func%A_Index%()는 A_Index의 현재 값에 따라서 Func1() 또는 Func2(), 등등을 호출합니다.

v1.1.07.00+에서, %Var%()의 Var는 함수 이름, 함수 참조 또는 함수를 흉내낸 객체를 담을 수 있습니다. 해당 함수가 존재하지 않으면, 기본 베이스 객체의 __Call 메타-함수가 대신에 요청됩니다.

아래의 이유 중 하나 때문에 함수를 호출할 수 없다면, 그 호출을 담고 있는 표현식의 평가가 조용히 그리고 너무 빨리 끝나므로, 일관성 없는 결과를 도출할 수 있습니다:

  • 존재하지 않는 함수를 호출합니다. 이것은 If IsFunc(VarContainingFuncName)를 사용하면 피할 수 있습니다. 내장 함수를 제외하고, 호출된 함수의 정의는 반드시 명시적으로 스크립트에 존재해야 합니다. 비-동적으로 라이브러리 함수를 호출하거나 #Include와 같은 수단을 사용합니다.
  • 너무 매개변수를 적게 건넵니다. 이것은 IsFunc()의 반환 값을 점검하면 피할 수 있습니다 (반환값은 필수 매개변수의 개수에 1을 더한 값입니다). 주의: v1.0.48+에서, 매개변수를 너무 많이 건네도 받아 들입니다; 넘친 매개변수를 각각 평가한 다음 (함수에 대한 모든 호출을 포함하여) 폐기합니다.

마지막으로, 함수를 동적으로 호출하면 정상 호출보다 약간 더 느립니다. 왜냐하면 정상 호출은 스크립트가 실행을 하기 전에 결정(검색 완료)되기 때문입니다.

단축-회로 불리언 평가

AND, OR, 그리고 삼진 연산자가 표현식 안에 사용될 때, 단축 회로 평가로 수행성을 개선합니다 (함수 호출이 존재하는가 여부에 상관없이). 단축 회로 평가는 최종 결과에 영향을 미칠 수 없는 부분을 평가하지 않습니다. 개념을 보여주기 위해, 다음 예제를 연구해 보겠습니다:

if (ColorName <> "" AND not FindColor(ColorName))
    MsgBox %ColorName%을 발견할 수 없습니다.

위의 예제에서, FindColor() 함수는 ColorName 변수가 비어있지 않는 한, 절대 호출되지 않습니다. 이 때문에 AND의 왼쪽이 false가 되고, 그의 오른쪽 만으로는 true라는 최종 결과를 생산할 가능성이 전혀 없기 때문입니다.

이 행위 때문에, 그 함수가 AND나 OR의 오른쪽에 호출되더라도, 함수가 생산하는 부작용이 (전역 변수의 내용을 변경하는 것과 같은) 절대로 일어나지 않을 것이라는 사실을 깨닫는 것이 중요합니다.

또 주목할 것은 단축-회로 평가가 내포된 AND와 OR에 단계적으로 적용된다는 것입니다. 예를 들어, 다음 표현식에서, ColorName이 비어 있으면 오직 왼쪽의 평가만 일어납니다. 왜냐하면 왼쪽 만으로 최종 정답을 확실하게 결정하기에 충분하기 때문입니다:

if (ColorName = "" OR FindColor(ColorName, Region1) OR FindColor(ColorName, Region2))
    break   ; 더 이상 검색 것이 없습니다. 일치한 것이 없습니다.

위의 예제에서 보여주는 바와 같이, 비싼 (시간이-드는) 함수라면 일반적으로 AND나 OR의 오른쪽에서 호출해야 수행성능이 개선됩니다. 이 테크닉을 사용하면 또 그의 매개변수 중 하나에 부적절한 값이, 예를 들어 빈 문자열이 건네질 때, 함수가 호출되지 못하도록 만들 수 있습니다.

v1.0.46+에서, 삼진 조건 연산자 (?:)도 단축 평가를 합니다. 필요 없는 분기는 평가하지 않습니다.

함수 안에서 서브루틴 사용하기

함수에 다른 함수의 정의는 담을 수 없지만, 서브루틴은 담을 수 있습니다. 다른 서브루틴과 마찬가지로 Gosub로 기동하고 Return으로 반환됩니다 (이 경우 Return은 Gosub에 속하지 함수에 속하지 않습니다).

알려진 한계: 현재, 각 서브루틴의 이름(라벨)은 전체 스크립트 안에서 유일하게 식별할 수 있어야 합니다. 프로그램은 라벨이 중복되어 있으면 기동할 때 여러분에게 고지할 것입니다.

함수가 Gosub를 사용해 (함수의 괄호 밖에 존재하는) 공개 서브루틴으로 점프해 가면, 바깥의 모든 변수는 전역 변수이고 서브루틴이 돌아올 때까지 함수 자신의 지역 변수에는 접근할 수 없습니다. 그렇지만, A_ThisFunc는 여전히 함수의 이름을 담고 있을 것입니다.

Goto로는 함수 안에서 밖으로 점프해 갈 수 없지만, 함수는 외부/공개 서브루틴으로 Gosub할 수 있으며 거기부터 Goto를 사용하면 됩니다.

Goto의 사용은 일반적으로 권장하지 않지만, 함수 안에서 또다른 위치로 점프하는데 사용할 수 있습니다. 이렇게 하면 복잡한 함수를 간략하게 만드는 데 도움이 될 수 있습니다. 반환 지점이 수 없이 많고, 그 모두가 돌아오기 전에 깨끗하게 청소해야 할 경우 유용합니다.

함수는 외부적으로-호출되는 서브루틴을 담을 수 있습니다. 예를 들어 타이머, GUI g-labels, 그리고 메뉴 항목이 그것입니다. 일반적으로 별도의 파일에 싸 넣고 #Include와 함께 사용합니다. 이렇게 하면 스크립트의 자동-실행 섹션 때문에 서로 간섭하는 일을 막을 수 있습니다. 그렇지만, 다음 한계가 적용됩니다:

  • 함수가 정상적으로 호출되었다면 그런 서브루틴은 정적 변수와 전역 변수만 사용해야 합니다 (지역 변수 불가). 왜냐하면 함수-호출 쓰레드를 가로 챈 (또는 그 반대로) 서브루틴 쓰레드가 가로채어진 스레드에 보이는 지역 변수들의 값을 바꿀 가능성이 높기 때문입니다. 게다가, 언제라도 함수는 그의 호출자에게 돌아갑니다. 그의 모든 지역 변수는 비워져 메모리를 풀어줍니다.
  • 그런 서브루틴은 GUI 제어 변수로 오직 전역 변수만 사용해야 합니다 (정적 변수 불가).
  • 함수에 서브루틴 쓰레드가 진입하면, 그 쓰레드가 만든 동적 변수를 참조하면 전역 변수로 간주됩니다 (배열을 만든 명령어 포함).

Return, Exit, 그리고 총평

다음 실행 흐름이 함수 안에서 Return을 만나기 전에 먼저 닫는 괄호에 도달하면, 그 함수는 끝나고 빈 값을 호출자에게 돌려줍니다 (빈 문자열). 빈 값은 또 함수가 명시적으로 Return의 매개변수를 생략할 때에도 반환됩니다.

함수가 Exit 명령어를 사용하여 현재 쓰레드를 종료하면, 그의 호출자는 반환 값을 전혀 받지 못합니다. 예를 들어, 다음 서술문 Var := Add(2, 3)는 가Add() 종료하면 Var를 그대로 둘 것입니다. 함수가 실행시간 에러를 일으켜도 같은 일이 일어납니다. 예를 들어 (UseErrorLevel가 켜져 있지 않을 때) 존재하지 않는 파일을 실행하면 같은 일이 일어납니다.

함수는 기억하기 쉬운 값을 추가로 건네기 위한 목적으로 ErrorLevel의 값을 변경할 수 있습니다.

함수를 하나 이상이 빈 값으로 호출하려면 (빈 문자열), 다음 예제와 같이 빈 따옴표 쌍을 사용합니다: FindColor(ColorName, "").

함수를 호출하면 새로운 쓰레드가 시작하므로, 함수가 SendMode와 SetTitleMatchMode와 같은 설정에 가한 변경은 모두 그의 호출자에게도 영향을 미칠 것입니다.

함수의 호출자는 거기에 존재하지 않은 값 또는 배열을 건넬 수 있습니다. 함수가 상응하는 매개변수를 ByRef라고 기대할 경우에 유용합니다. 예를 들어, GetNextLine(BlankArray%i%)를 호출하면 자동으로 BlankArray%i% 변수가 생성됩니다 (호출자가 함수 안에 있는가 그리고 그 함수에 전역-간주 모드가 켜져 있는가에 따라 지역 변수 또는 전역 변수로 생성됩니다).

함수 안에서 사용될 때, ListVars는 함수의 지역 변수들을 그의 내용과 함께 보여줍니다. 이는 스크립트를 디버깅할 때 도움이 됩니다.

스타일과 이름짓기 관례

복잡한 함수는 특별한 변수에 구별되는 접두사를 부여하면 더 읽기 쉽고 관리하기 좋다는 사실을 눈치채셨을 것입니다. 예를 들어, 함수의 매개변수 리스트에서 각 매개변수의 이름을 앞에 "p" 또는 "p_"를 두어 지으면 한 눈에 그의 특수한 본성을 쉽게 구별할 수 있습니다. 특히 함수에 수 십개의 지역 변수가 들어 있는데 전부 주의를 기울여 신경을 써야할 때 유용합니다. 비슷하게, 접두사 "r"이나 "r_"은 ByRef 매개변수에 사용하면 좋고, "s"나 "s_"는 정적 변수에 사용할 수 있습니다.

One True Brace (OTB) 스타일을 선택적으로 함수를 정의하는 데 사용할 수 있습니다. 예를 들어:

Add(x, y) {
    return x + y
}

#Include를 사용하여 여러 스크립트 사이에 함수 공유하기

#Include 지시어를 사용하면 (스크립트의 상단에도 가능) 함수를 외부 파일로부터 적재할 수 있습니다.

설명: 스크립트의 실행 흐름이 함수 정의를 만다면, (순간적으로) 그것을 건너 뛰고 함수의 닫는 괄호 다음 줄부터 실행을 재개합니다. 결과적으로 실행은 위쪽에 있는 함수로 들어갈 수 없으며, 스크립트 최상단에 하나 이상의 함수가 존재하더라도 자동-실행 섹션에 영향을 미치지 않습니다.

함수 라이브러리: 표준 라이브러리와 사용자 라이브러리 [v1.0.47+]

스크립트는 외부 파일에 있는 함수를 호출할 수 있습니다. #Include를 사용할 필요가 없습니다. 그러려면 함수와 같은 이름의 파일이 다음 라이브러리 디렉토리 중 하나에 존재해야 합니다:

%A_ScriptDir%\Lib\  ; 지역 라이브러리 - 필수 AHK_L 42+.
%A_MyDocuments%\AutoHotkey\Lib\  ; 사용자 라이브러리.
path-to-the-currently-running-AutoHotkey.exe\Lib\  ; 표준 라이브러리.

예를 들어, 스크립트가 존재하지 않는 함수 MyFunc()를 호출하면, 프로그램은 사용자 라이브러리에서 "MyFunc.ahk"라른 이름의 파일을 찾습니다. 발견하지 못하면, 표준 라이브러리에서 찾습니다. 여전히 발견하지 못하면 그리고 함수의 이름에 밑줄이 포함되어 있다면 (예, MyPrefix_MyFunc), 프로그램은 두 라이브러리를 모두 뒤져 MyPrefix.ahk라는 이름의 파일을 찾고 있다면 그것을 적재합니다. 이렇게 하면 MyPrefix.ahk에 함수 MyPrefix_MyFunc를 다음을 수있고 이름이 MyPrefix_로 시작하는 기타 함수들을 담을 수 있습니다.

[AHK_L 42+]: 지역 라이브러리가 지원됩니다. 먼저 지역 라이브러리를 검색한 다음에 사용자 라이브러리와 표준 라이브러리를 차례로 검색합니다.

MyFunc()와 같이 직접 호출 해야만 라이브러리가 자동-포함됩니다. 함수가 예를 들어 타이머나 구이 이벤트 같이, 동적 또는 간접적으로 호출될 때만, 명시적으로 라이브러리를 스크립트에 포함시켜야 합니다. 예를 들어: #Include <MyFunc>

라이브러리 파일은 일반적으로 그의 파일 이름으로 오직 하나의 함수만 담고 있지만, 사적으로 자신만 호출할 함수나 서브루틴을 담을 수도 있습니다. 그렇지만, 그런 함수는 이름이 구별되어야 합니다. 왜냐하면 그것들은 전역 이름공간 안에 여전히 존재할 것이기 때문입니다; 즉, 그것들은 스크립트 어디에서나 호출될 수 있습니다.

라이브러리 파일이 #Include를 사용하면, #Include를 위한 작업 디렉토리는 그 라이브러리 파일의 디렉토리입니다. 이를 이용하면 해당 함수와 관련 함수들이 들어 있는 더 큰 라이브러리 파일로 방향전환을 할 수 있습니다.

스크립트 컴파일러 (ahk2exe)도 라이브러리 함수를 지원합니다. 그렇지만, AutoHotkey.exe 사본이 위의 컴파일러 디렉토리에 존재해야 합니다 (보통 그럴 것입니다). AutoHotkey.exe가 없어도, 컴파일러는 여전히 작동하지만, 라이브러리 함수는 자동으로 포함되지 않습니다.

라이브러리로부터 포함된 함수들은 다른 함수와 똑같이 수행됩니다. 왜냐하면 스크립트가 실행되기 전에 미리-적재되기 때문입니다.

내장 함수

내장 함수의 매개변수 리스트 끝에 선택적인 매개변수는 완전히 생략해도 좋습니다. 예를 들어, WinExist("Untitled - Notepad")는 유효합니다. 왜냐하면 그의 다른 세 매개변수가 빈 것으로 간주되기 때문입니다.

내장 함수는 스크립트가 자신의 함수를 같은 이름으로 정의하면 오버라이드됩니다. 예를 들어, 스크립트는 자신만의 맞춤 WinExist() 함수를 가질 수 있습니다. 표준 함수 대신에 이 함수가 호출됩니다. 그렇지만, 그렇게 되면 스크립트는 원래 함수를 호출할 방법이 없어져 버립니다.

DLL 파일에 거주하는 외부 함수는 DllCall()으로 호출합니다.

자주-사용되는 함수

FileExist(FilePattern): FilePattern이 존재하지 않으면 빈 값을 (빈 문자열) 돌려줍니다 (FilePattern은 절대 경로가 지정되지 않으면 A_WorkingDir에 있다고 간주합니다). 그렇지 않으면, 부합하는 첫 파일이나 폴더의 속성 문자열을 돌려 줍니다 ("RASHNDOCT"의 하위집합). (있기 힘든 경우이지만) 파일에 아무 속성도 없으면, "X"가 반환됩니다. FilePattern는 파일이나 폴더의 정확한 이름일 수 있지만, 와일드카드(* 또는 ?)를 포함할 수도 있습니다. 빈 문자열은 "false"라고 간주되므로, 함수의 반환 값은 언제나 어림-불리언 값으로 사용할 수 있습니다. 예를 들어, 서술문 if FileExist("C:\My File.txt")는 파일이 존재하면 참이되고 그렇지 않으면 거짓이 됩니다. 비슷하게, 서술문 if InStr(FileExist("C:\My Folder"), "D")는 파일이 존재하고 그리고 디렉토이일 경우에만 참이 됩니다. 다음은 상응하는 명령어입니다: IfExist 그리고 FileGetAttrib.

GetKeyState(KeyName [, "P" or "T"]): GetKeyState 명령어와 다르게 -- 누르면 D 그리고 떼면 U를 돌려주는데 비해 -- 이 함수는 키가 눌려 있으면 참(1) 뗀 상태이면 거짓(0)을 돌려줍니다. KeyName이 유효하지 않으면, 빈 문자열이 반환됩니다. 다른 반환 값과 사용법에 관한 정보는 GetKeyState를 참조하십시오.

InStr(Haystack, Needle [, CaseSensitive = false, StartingPos = 1, Occurrence = 1]): Haystack 문자열에서 Needle이 나타난 위치를 돌려줍니다. StringGetPos와 다르게, 위치 1이 첫 번째 문자입니다; 왜냐하면 0은 "false"와 동의어이기 때문에, 직관적으로 "발견하지 못함"의 뜻이 됩니다. 매개변수 CaseSensitive를 생략하거나 거짓이면, 대소문자를 구분하지 않고 검색합니다 (대소문자의 구별은 StringCaseSense에 따릅니다); 그렇지 않으면, 대소문자가 정확하게 일치해야 합니다. StartingPos를 생략하면, 1이 기본값이 됩니다 (Haystack의 시작). 그렇지 않고, 2를 지정하면 Haystack의 두 번째 문자부터 시작하고, 3이면 세 번째 문자부터 등등 시작합니다. StartingPos가 Haystack의 길이를 넘어서면, 0이 반환됩니다. StartingPos가 0이거나 음수이면, 끝에서부터 해당 오프셋에서 시작하여 역방향으로 (오른쪽에서 왼쪽으로) 검색이 수행됩니다. StartingPos의 값에 관계 없이, 반환 위치는 언제나 Haystack의 첫 문자에 상대적입니다. 예를 들어, "123abc789"에서 "abc" 의 위치는 언제나 4입니다. Occurrence에 2을 지정하면 두 번째 부합한 위치를 돌려주고, 3은 세 번째 부합 등등의 위치를 돌려줍니다. 관련 항목: RegExMatch(), IfInString, 그리고 StringGetPos.

RegExMatch(Haystack, NeedleRegEx [, UnquotedOutputVar = "", StartingPos = 1]): 문자열 안에서 패턴 (정규 표현식)에 부합하는 것들을 찾습니다. 자세한 것은 RegExMatch()를 참조하십시오.

RegExReplace(Haystack, NeedleRegEx [, Replacement = "", OutputVarCount = "", Limit = -1, StartingPos = 1]): 문자열 안에서 패턴 (정규 표현식)에 부합하는 것들을 교체합니다. 자세한 것은 RegExReplace()를 참조합니다.

SubStr(String, StartingPos [, Length]) [v1.0.46+]: 부분문자열을 String으로부터 복사합니다. StartingPos에서 시작해서 오른쪽으로 진행해서 최대 Length개의 문자를 포함합니다 (Length를 생략하면, 기본 값은 "모든 문자"입니다). StartingPos에 1을 지정하면 첫 번째 문자에서, 2을 지정하면 2번째 문자부터 시작합니다. 등등. ( StartingPos가 String의 길이를 넘어서면, 빈 문자열이 반환됩니다). StartingPos가 1보다 작으면, 문자열 끝으로부터의 오프셋으로 간주됩니다. 예를 들어, 0은 가장 마지막 문자를 추출하고, -1이면 그 문자열의 마지막 문자로부터 1만큼 왼쪽으로 떨어져 있다고 간주됩니다. (그러나 StartingPos가 문자열의 왼쪽 끝을 넘어서 시도하면, 첫 문자부터 추출을 시작합니다). Length는 열람할 최대 문자 개수입니다 (문자열의 나머지 부분이 너무 짧으면 최대 개수보다 적게 열람됩니다). 음의 길이(Length)를 지정하면 반환된 문자열의 끝으로부터 문자를 그 개수 만큼 생략합니다 (모든 또는 너무 많은 문자를 생략하면 빈 문자열이 반환됩니다). 관련 항목: RegExMatch(), StringMid, StringLeft/Right, StringTrimLeft/Right.

StrLen(String): 문자열 String의 길이를 돌려줍니다. 자세한 것은 StrLen()을 참조합니다.

StrSplit(String [, Delimiters, OmitChars]) [v1.1.13+]: 지정된 가름자를 사용하여 문자열을 부분문자열 배열로 분할합니다. 자세한 것은 StrSplit()을 참조합니다.

WinActive([WinTitle, WinText, ExcludeTitle, ExcludeText]): 지정된 기준에 부합하는 활성 창의 Unique ID (HWND)를 돌려줍니다. 자세한 것은 WinActive()를 참조하십시오.

WinExist([WinTitle, WinText, ExcludeTitle, ExcludeText]): 첫 번째로 부합하는 창의 Unique ID (HWND)를 돌려줍니다. 자세한 것은 WinExist()를 참조하십시오.

기타 함수

Asc(String): String에서 첫 바이트 또는 UTF-16 코드 유닛의 숫치 값을 돌려줍니다. 또는 String이 비어 있으면 0을 돌려줍니다. 반환 값은 범위가 0부터 255까지입니다 (ANSI) 또는 0부터 0xFFFF까지입니다 (Unicode). 자세한 것은 Unicode vs ANSI를 참조합니다. 유니코드 보충 문자를 허용하려면, 대신에 Ord(String)를 사용하십시오.

Chr(Number): Number가 나타내는 문자 코드에 상응하는 문자를 돌려줍니다 (보통 문자 하나). 127보다 큰 문자 코드의 의미는 사용 중인 문자열 인코딩에 달려 있습니다. 문자 인코딩은 이제 사용중인 실행 파일이 Unicode 또는 ANSI인가에 따라 달라집니다. 유니코가 지원되면, Number는 0부터 0x10FFFF 사이의 유니코드 문자 코드입니다 ([v1.1.21]이전이라면 0xFFFF); 그렇지 않고 ANSI 문자 코드는 범위가 0부터 255 사이입니다. Number가 유효한 문자 코드 범위에 있지 않으면, 빈 문자열이 반환됩니다. 흔한 문자 코드로는 9 (탭), 10 (라인피드), 13 (캐리지 리턴), 32 (스페이스), 48-57 (숫자 0-9), 65-90 (대문자 A-Z), 그리고 97-122 (소문자 a-z)가 있습니다.

DllCall(): 예를 들어 표준 윈도우즈 API 함수 같이, DLL 안 함수를 호출합니다. 자세한 것은 DllCall()을 참조합니다.

FileOpen(): 객체-지향적 파일 I/O를 제공합니다. 자세한 것은 FileOpen()를 참조합니다.

Func(FunctionName) [v1.1.00+]: (예를 들어 #Include로 포함하거나 또는 라이브러리 함수를 고정 호출하여) FunctionName이 명시적으로 스크립트에 존재하지 않으면, Func()는 0을 돌려줍니다. 그렇지 않으면 그 함수를 가리키는 참조 주소를 반환합니다. 함수를 호출하거나 매개변수의 최대 최소 갯수 같은 정보를 열람하는 데 사용할 수 있습니다.

GetKeyName(Key), GetKeyVK(Key), GetKeySC(Key) [v1.1.01+]: 한 키의 스캔 코드나 가상 코드 또는 이름/텍스트를 열람합니다. Key는 "vkA2"나 "sc01D"와 같이 VK 코드나 SC 코드일 수 있습니다. 키 이름이거나 아니면 둘을 조합한 것일 수 있습니다. 예를 들어 GetKeyName("vk1B")와 GetKeyName("Esc") 모두 "Escape"를 돌려주는 반면에, GetKeyVK("Esc")는 27을 돌려줍니다. VK 코드와 SC 코드는 십육진수임에 유의하십시오. 십진수를 적절한 포맷으로 변환하려면, Format("vk{:x}", vk_code)이나 Format("sc{:x}", sc_code)를 사용합니다.

IsByRef(Var) [v1.1.01+]: Var가 ByRef 매개변수이고 호출자가 변수를 공급했으면 1을 돌려줍니다; 또는 Var가 다른 종류의 변수이면 0을 돌려줍니다.

IsFunc(FunctionName) [v1.0.48+]: (예를 들어 #Include로 포함하거나 또는 라이브러리 함수를 고정 호출하여) FunctionName이 스크립트에 명시적으로 존재하지 않으면, IsFunc()는 0을 돌려줍니다. 그렇지 않으면 매개변수의 최소 개수에 1을 더해 돌려줍니다 (예, 매개변수를 요구하지 않는 함수는 1, 매개변수를 1 오구하는 함수는 2, 등등). 예를 들어, if IsFunc("MyFunc")와 if IsFunc(VarContainingFunctionName)는 함수가 존재하면 참입니다. 그렇지 않으면 거짓입니다. v1.1.00+에서, FunctionName는 이름이 아니라 함수 참조일 수 있습니다. 다음 참조: 동적인 함수-호출, A_ThisFunc

IsLabel(LabelName): LabelName이 스크립트에 서브루틴, 핫키, 또는 핫스트링으로 존재하면 0이 아닌 값을 돌려줍니다 (LabelName 뒤에 쌍점은 포함하지 않습니다). 예를 들어, 서술문 if IsLabel(VarContainingLabelName)는 라벨이 존재하면 참입니다. 그렇지 않으면 거짓입니다. 예를 들어 Gosub, 핫키, 메뉴, 그리고 Gui와 같이 명령어에 동적 라벨을 지정할 때 실행시간 에러를 피하는 데 유용합니다. 다음도 참조하십시오: 라벨.

IsObject() [AHK_L 31+]: 값이 객체인지 결정합니다. 다음 참조: Objects.

ListView 그리고 TreeView functions: 자세한 것은 ListView 페이지와 TreeView 페이지를 참조하십시오.

NumGet(VarOrAddress [, Offset = 0][, Type = "UPtr"]): 지정된 주소+오프셋에 저장된 이진 숫자를 열람합니다. 자세한 것은 NumGet을 참조합니다.

NumPut(Number, VarOrAddress [, Offset = 0][, Type = "UPtr"]): 지정된 주소-오프셋에 이진 형식으로 숫자를 저장합니다. 자세한 것은 NumPut을 참조합니다.

OnMessage(MsgNumber [, "FunctionName"]): 메시지/이벤트를 관제합니다. 자세한 것은 OnMessage()를 참조합니다.

Ord(String) [v1.1.21+]: String에서 첫 번째 문자의 서수 값을 돌려줍니다 (숫치 문자 코드). String이 유니코드 보충 문자로 시작하면, Ord(String)은 그에 상응하는 유니코드 문자 코드를 돌려줍니다 (0x10000부터 0x10FFFF 사이의 값). 그렇지 않으면 Asc(String)과 같은 값을 돌려줍니다.

StrGet(Address [, Length] [, Encoding = None ] ) [AHK_L 46+]: 메모리 주소로부터 문자열을 복사합니다. 선택적으로 코드 페이지에 따라 변환합니다. 자세한 것은 StrGet()을 참조합니다.

StrPut(String, Address [, Length] [, Encoding = None ] ) [AHK_L 46+]: 메모리 주소에 문자열을 복사합니다. 선택적으로 코드 페이지에 따라 변환합니다. 자세한 것은 StrPut()을 참조합니다.

RegisterCallback(): 머신-코드 주소를 생성합니다. 호출될 때 이 주소를 이용하여 스크립트 안의 함수로 호출을 방향전환 합니다. 자세한 것은 RegisterCallback()을 참조합니다.

Trim() [AHK_L 31+]: 문자열의 앞/뒤에서 문자를 걷어냅니다. 자세한 것은 Trim()을 참조합니다.

VarSetCapacity(UnquotedVarName [, RequestedCapacity, FillByte]): 변수의 가용 능력을 확대하거나 그의 메모리를 해제합니다. 자세한 것은 VarSetCapacity()를 참조합니다.

일반 수학

주의: 수학 함수는 들어오는 매개변수가 숫자가 아니면 일반적으로 빈 문자열을 돌려줍니다.

Abs(Number): Number의 절대값을 돌려줍니다. 반환값의 유형은 Number와 같습니다 (정수면 정수, 부동 소수점 수이면 부동 소수점 수).

Ceil(Number): Number를 가장 가까운 정수로 올림해 돌려줍니다 (.00 꼬리 없음). 예를 들어, Ceil(1.2)는 2이고 Ceil(-1.2)는 -1입니다.

Exp(N): e (대략 2.71828182845905)를 N승하여 돌려줍니다. N은 음수일 수 있고 소수점이 포함될 수 있습니다. e가 아닌 다른 숫자를 제곱하려면 ** 연산자를 사용하십시오.

Floor(Number): Number를 가장 가까운 정수로 내림해 돌려줍니다(.00 꼬리 없음). 예를 들어, Floor(1.2)는 1이고 Floor(-1.2)는 -2입니다.

Log(Number): Number의 상용로그를 돌려줍니다 (밑수 10). 결과는 부동 소수점 수로 포맷됩니다. Number가 음수이면, 빈 문자열이 반환됩니다.

Ln(Number): Number의 자연로그를 반환합니다 (밑수 e). 결과는 부동 소수점 수로 포맷됩니다. Number가 음수이면, 빈 문자열이 반환됩니다.

Mod(Dividend, Divisor): 나머지 연산(Modulo)입니다. 피젯수를 젯수로 나눈 나머지를 돌려줍니다. 결과의 부호는 언제나 첫 매개변수의 부호와 같습니다. 예를 들어, mod(5, 3)과 mod(5, -3) 모두 2를 산출하지만, mod(-5, 3)과 mod(-5, -3)는 -2를 산출합니다. 두 입력 중 하나라도 부동 소수점 수이면, 그 결과도 부동 소수점 수입니다. 예를 들어, mod(5.0, 3)은 2.0이고 mod(5, 3.5)은 1.5입니다. 두 번째 매개변수가 0이면, 함수는 빈 결과 (빈 문자열)을 돌려줍니다.

Round(Number [, N]): N을 생략하거나, 0이면, Number는 가장 가까운 정수로 반올림됩니다. N이 양수이면, Number 는 N 십진 자리에서 반올림됩니다. N이 음수이면, Number는 십진 소수점의 왼쪽으로 N 자리에서 반올림됩니다. 예를 들어, Round(345, -1)는 350이고 Round(345, -2)는 300 입니다. Transform Round와 다르게 , 1 보다 작거나 N을 생략하면 그 결과는 .000 꼬리가 없습니다. v1.0.44.01+에서, N의 값이 0보다 크면 SetFormat에 의존하지 않고 정확하게 N 자리의 십진수를 보여줍니다. 이를 피하려면, Round()의 반환 값에 다른 수학 연산을 수행하십시오; 예를 들어: Round(3.333, 1)+0.

Sqrt(Number): Number의 평방근을 돌려줍니다. 그 결과는 부동 소수점 수로 포맷됩니다. Number가 음수이면, 빈 문자열을 돌려줍니다.

삼각함수

Sin(Number) | Cos(Number) | Tan(Number): Number의 사인|코사인|탄젠트 삼각함수를 돌려줍니다. Number는 라디안으로 표현해야 합니다.

ASin(Number): 라디안 단위로 아크사인을 돌려줍니다 (Number는 그의 사인값입니다) Number가 -1 보다 작거나 1 보다 크면, 빈 결과 (빈 문자열)을 돌려줍니다.

ACos(Number): 라디안 단위로 아크코사인을 올려줍니다 ( Number는 그의 코사인 값입니다). Number가 -1보다 작거나 1보다 크면, 빈 결과 (빈 문자열)을 산출합니다.

ATan(Number): 라디안 단위로 아크탄젠트를 돌려줍니다 (Number는 그의 탄젠트 값입니다).

주의: 라디안을 디그리로 변환하려면, 180/pi (대략 57.29578)를 곱합니다. 디그리를 라디안으로 변환하려면 pi/180 (대략 0.01745329252)를 곱합니다. pi의 값 (대략 3.141592653589793)은 1 아크탄젠트의 4 배입니다.

기타 함수

폴리에테네(Polyethene)의 명령어 함수: OutputVar가 있는 AutoHotkey 명령어에 호출 가능한 함수를 제공합니다. 이 라이브러리는 #Include를 통하여 스크립트에 포함할 수 있습니다.


Advanced Hotkey Features - Mouse and Keyboard Shortcuts

고급 핫키 특징

키보드에서 손쉽게 닿을 수 있는 키 인데도 어떤 키는 거의 사용되지 않습니다. 이런 키들에 유용한 일들을 시킵시다! 예를 들어, 오른쪽 ALT 키를 거의 사용하지 않습니다. 여러분이 자주 하는 일을 그 키에 시키십시오:

RAlt::
MsgBox 오른쪽 ALT 키를 누르셨습니다.
return

심지어 오른쪽 알트 키의 고유 기능을 잃지 않고서도 위의 일을 할 수 있습니다. 오른쪽-ALT 키를 다른 핫키에 "접두키"로 할당하면 됩니다. 아래의 예제에서 오른쪽-ALT 키는 접두키가 됩니다. 다른 모든 키들을 정상처럼 작동하도록 변경합니다. 그러나 또다른 키를 변경하는데 사용하지 않고 오른쪽-Alt 키를 누르고 뗀다면, 그의 핫키 행위가 즉시 효과를 발휘합니다:

RAlt & j::AltTab

수식자로 CTRL, ALT, SHIFT, 그리고 WIN만 사용할 수 있는 것은 아닙니다. 무엇이든 두개의 키 또는 마우스 버튼을 조합하여 맞춤 핫키를 만들 수 있습니다 예를 들어: Numpad0를 누른 채로 Numpad1을 눌러 핫키를 기동시킵니다 (구문: Numpad0 & Numpad1::); CapsLock을 누른 채로 또다른 키를 누르거나, 또는 마우스 버튼을 클릭합니다 (구문: CapsLock & RButton::). 이 경우, CapsLock 키의 상태 (on 또는 off)는 핫키를 기동하는 데 사용되더라도 바뀌지 않습니다. 자세한 것은 키를 마음대로 조립하기를 참조하십시오.

Alt-Tab을 완전하게 대체하도록 마우스 휠 (또는 기타 키)을 변환합니다. 휠을 클릭해 메뉴를 보여거나 감춥니다. 그리고 휠을 돌려서 메뉴를 항해합니다. 휠은 Alt-Tab 메뉴가 보이지 않을 때 여전히 정상 작동합니다. 다음은 그 구문입니다:

MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

키보드 키를 마우스 버튼이 되도록 만듭니다, 또는 키나 마우스 버튼을 누르고 있는 동안 어떤 행위가 계속해서 반복되도록 만듭니다. 예제는 리맵핑 페이지를 참조하십시오.

핫키가 문맥을 감지하도록 만듭니다: 작업 중인 창의 유형에 적절하게 가장-쉽게-닿을-수-있는 핫키가 행위를 수행하게 합니다. 다음 예제에서, 오른쪽 콘트롤 키는 활성 창이 노트패드인가 아니면 계산기인가에 따라 다르게 행위를 수행합니다:

#IfWinActive ahk_class Notepad
RControl::WinMenuSelectItem, , , File, Save  ; 현재 파일을 노트패드에 저장합니다.

#IfWinActive Calculator
RControl::Send, ^c!{tab}^v  ; 계산기의 내용을 이전의 활성 창 안으로 복사합니다.

자세한 것은 #IfWinActive를 참조하십시오.

핫-스트링: 타자하면서 확장될 약어를 정의합니다. 특별한 훈련이나 경험이 전혀 필요 없습니다. 예를 들어, 다음 줄이 들어 있는 스크립트는 타자하는 곳에서 ceo, cfo, 그리고 btw를 확장합니다:

::ceo::Chief Executive Officer
::cfo::Chief Financial Officer
::btw::by the way

(보다 자세한 것은 여기를 참조합니다)

게이머라면 특별히 관심을 가질 만한 기능들:

  • 손가락에 고통을 덜어줍니다. 실제로 어느 키든 핫키로 사용하면 됩니다. 여기에는 단일 기호문자, 화살표 키, 넘패드 키, 심지어 키 수식자 자체도 포함됩니다 (CTRL/ALT/WIN/SHIFT).
  • 마우스 핫키를 만듭니다. 여기에는 마우스 휠 버튼(MButton) 그리고 휠의 위/아래 또는 좌/우 회전을 포함합니다 (WheelUp, WheelDown, WheelLeft, 그리고 WheelRight). 또 키보드 키를 마우스 버튼과 조합해 사용할 수 있습니다. 예를 들어, 오른쪽-콘트롤-버튼은 ^RButton::으로 표현됩니다.
  • "무사-통과" 핫키를 만듭니다. 예를 들어, 클릭 자체가 게임에 정상적으로 전송되는 동안에도 왼쪽 마우스 버튼은 핫키 행위를 촉발시킬 수 있습니다. (구문: ~LButton::).
  • PixelSearch, PixelGetColor, 그리고 ImageSearch와 같은 명령어를 사용하여 게임을 자동화합니다.
  • 키보드 갈고리를 선택적으로 사용하여 핫키를 구현합니다. 게임이 CPU를 덜 사용하는 동안 다른 핫키 방법보다 더 반응이 좋습니다. 키보드 갈고리는 또 게임의 한계를 극복할 수 있습니다. 어느 키든 얼마든지 게임 행위에 "맵"할 수 있습니다.

더 자세한 정보는 핫키를 참조하십시오.


Hotkeys (Mouse, Joystick and Keyboard Shortcuts)

핫키 (마우스, 조이스틱 그리고 키보드 단축키)

목차

  • 소개와 간단한 예제
  • 핫키 접두 심볼 테이블 (수식자)
  • 문맥-감지 핫키
  • 맞춤 조합과 기타 특징
  • 마우스 휠 핫키
  • 핫키 팁 그리고 논평
  • Alt-Tab 핫키
  • 함수 핫키

소개와 간단한 예제

핫키는 종종 단축키라고 지칭됩니다. 쉽게 한 행위를 촉발시킬 수 있기 때문입니다 (예를 들어 프로그램이나 키보드 매크로를 기동합니다). 다음 예제에서, 핫키 Win+N은 노트패드를 기동하도록 구성됩니다. 파운드 사인[#]은 Windows 키를 나타냅니다. 이것은 수식키(modifier)로 알려져 있습니다:

#n::
Run Notepad
return

위의 마지막 줄에서 return은 핫키를 끝내는 기능을 합니다. 그렇지만, 핫키가 오직 한 줄만 실행할 필요가 있다면, 이 줄은 겹-쌍점의 오른쪽에 나열할 수 있습니다. 다시 말해, return문이 묵시적으로 있습니다:

#n::Run Notepad

핫키에 하나 이상의 수식자를 사용하려면, 그것들을 연속적으로 나열합니다 (순서는 문제가 안됩니다). 다음 예제는 ^!s를 사용하여 Control+Alt+S를 나타냅니다:

^!s::
Send Sincerely,{enter}John Smith  ; 이 줄은 키눌림을 활성 (가장 앞쪽) 창에 보냅니다.
return

다음 수식키 심볼을 사용하여 핫키를 정의할 수 있습니다:

심볼 설명
# Win (윈도우즈 로고 키). v1.0.48.01+에서, 윈도우즈 비스타 이후에, 윈도우즈 키가 포함된 (예, #a) 핫키는 윈도우즈 키를 뗄 때까지 기다리다가 비로서 "L" 키눌림을 담고 있는 텍스트를 전송합니다. 이 덕분에 그런 핫키 안에서 Send를 사용하더라도 PC가 잠기지 않습니다. 이 행위는 SendPlay (필요하지 않으므로) 그리고 맹목 모드를 제외하고 모든 전송 모드에 적용됩니다.
! Alt
^ Control
+ Shift
& 앰퍼센트를 두 개의 키 사이 또는 마우스 버튼에 사용하면 그들을 조합해 맞춤 핫키를 만들 수 있습니다. 자세한 것은 아래를 참조합니다.
< 한 쌍중에 왼쪽 키를 사용합니다. 예를 들어 <!a는 !a와 같습니다. 왼쪽 Alt 키만 행위를 촉발시킨다는 점만 다릅니다.
> 한 쌍중에 오른쪽 키를 사용합니다.
<^>!

AltGr (alternate graving). 키보드 레이아웃에 오른쪽-Alt 말고 AltGr 키가 있다면, 이 일련의 심볼은 보통 AltGr을 나타내는 데 사용할 수 있습니다. 예를 들어:

<^>!m::MsgBox AltGr+m을 눌렀습니다.
<^<!m::MsgBox LeftControl+LeftAlt+m을 눌렀습니다.

다른 방법으로, AltGr 자체를 핫키로 만들려면, 다음 핫키를 사용하십시오 (위에 보여준 것과 같은 핫키가 필요 없습니다):

LControl & RAlt::MsgBox AltGr 자체를 눌렀습니다.
*

와일드카드: 추가 수식자가 눌려 있더라도 핫키를 촉발시킵니다. 이것은 종종 키나 버튼의 리맵핑과 함께 사용됩니다. 예를 들어:

*#c::Run Calc.exe  ; Win+C, Shift+Win+C, Ctrl+Win+C, 등등은 모두 이 핫키를 촉발시킵니다.
*ScrollLock::Run Notepad  ; ScrollLock을 누르면 이 핫키는 수식 키가 눌려 있더라도 촉발됩니다.
~

핫키가 촉발되면, 그 키의 고유 기능은 불능이 됩니다 (시스템에 보이지 않습니다). 아래의 두 예제에서 , 사용자가 마우스 버튼을 클릭하면 활성 창으로 전송됩니다:

~RButton::MsgBox 오른쪽 마우스 버튼을 클릭했습니다.
~RButton & C::MsgBox 오른쪽 마우스 버튼을 누를 채로 C를 눌렀습니다.

다른 접두 심볼과 다르게, 틸드 접두 심볼은 어떤 핫키의 변형에는 나타나는 것이 허용됩니다. 그렇지만, 꺼지지 않았거나 보류된 맞춤 조합 핫키의 접두 키에 틸드가 적용되면, 모든 키조합에 대하여 그 접두 키의 행위에 영향을 미칩니다.

알트-탭을 대체하는 특수한 핫키는 언제나 틸드 접두 심볼을 무시합니다.

[v1.1.14+]: 틸드 접두 심볼이 그 자신도 핫키로 사용되는 맞춤 수식 키에 적용되면 (접두 키), 그 핫키는 키를 뗄 때까지 기다리는 대신에 키가 눌릴 때 촉발됩니다. 예를 들어, 위의 ~RButton 핫키는 버튼이 눌리자 마자 촉발됩니다. v1.1.14 이전이라면 (틸드 접두 심볼이 없으므로), 버튼을 떼자마자 촉발되었습니다. 그러나 RButton & C 조합이 활성화되어 있지 않을 경우에만 촉발되었습니다.

틸드 접두 심볼이 맞춤 조합 핫키에만 적용되고 비-맞춤 핫키에는 적용되지 않으면, 그 핫키의 고유 기능이 여전히 막혀 있습니다. 예를 들어, 아래의 스크립트에서 AppsKey를 누르면 ToolTip을 보여주고 문맥 메뉴는 촉발시키지 않습니다:

AppsKey::ToolTip 창을 순회하려면 < 또는 >을 누릅니다.
AppsKey Up::ToolTip
~AppsKey & <::Send !+{Esc}
~AppsKey & >::Send !{Esc}
$

이것은 주로 스크립트가 Send 명령어를 사용하여, 핫키 자체를 구성하는 키들을 전송할 경우에만 필요합니다. 그렇지 않으면 핫키 자체가 촉발될 가능성이 있습니다. $ 접두 심볼은 강제로 키보드 갈고리가 이 핫키를 구현하는데 사용되도록 만듭니다. 그 부작용으로 Send 명령어는 그 핫키를 촉발시키지 못합니다. $ 접두 심볼은 이 핫키가 정의된 위쪽 어딘가에 #UseHook을 지정하는 것과 동등합니다.

$ 접두 심볼은 마우스 핫키에는 아무 효과가 없습니다. 왜냐하면 마우스 핫키는 언제나 마우스 갈고리를 사용하기 때문입니다. 또 이미 키보드 갈고리를 요구하는 핫키에도 아무 효과가 없습니다. 여기에는 tilde (~) 또는 wildcard (*) 수식자를 가진 모든 핫키, 키-뗌 핫키와 맞춤 조합 핫키가 포함됩니다.

[v1.1.06+]: #InputLevel과 SendLevel를 사용하면 Send 명령어로 촉발될 핫키와 핫스트링을 제어할 수 있습니다.
UP

단어 UP이 핫키의 이름 다음에 오면 그 핫키는 누를 때가 아니라 뗄 때 촉발됩니다. 다음 예제는 LWin이 LControl이 되도록 리맵합니다:

*LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}

"Up"은 다음 예제와 같이 보통의 핫키와 함께 사용할 수도 있습니다: ^!r Up::MsgBox Ctrl+Alt+R을 누르고 뗐습니다.. 또 핫키 조합과도 작동합니다 (예, F1 & e Up::)

한계: 1) "Up"은 조이스틱 버튼과 작동하지 않습니다; 그리고 2) 보통의/누름 짝이 없이 "Up" 핫키 하나만 사용하면 그 키를 완전히 점령합니다. 그 키는 누를 수 없습니다. 이를 피하는 한 가지 방법은 틸드 접두 심볼을 추가하는 것입니다 (예, ~LControl up::)

관련해서 한 마디 하자면, 위와 비슷한 테크닉은 핫키를 접두 키로 만드는 것입니다. 핫키를 뗄 때 촉발되지만, 다른 키를 누르지 않는 한, 누르고 있는 동안에만 촉발된다는 장점이 있습니다. 예를 들어:

LControl & F1::return  ; 왼쪽 콘트롤 키를 접두 키로 만듭니다.  "&" 앞에 한 번만 사용하면 됩니다.
LControl::MsgBox 다른 키를 수정하는 데 사용하지 않고 LControl를 뗐습니다.

(키보드 키와 마우스/조이스틱 버튼의 완전한 목록은 키 목록을 참조하십시오)

다중 핫키를 수직으로 쌓으면 같은 행위를 수행하게 할수 있습니다. 예를 들어:

^Numpad0::
^Numpad1::
MsgBox Control+Numpad0이나 Control+Numpad1를 누르면 이 메시지가 화면에 보입니다.
return

키 또는 키-조합을 전체 시스템에 대하여 불능화할 수 있습니다. 아무것도 하지 않도록 만들면 됩니다. 다음 예제는 오른쪽 윈도우즈 키를 불능으로 만듭니다:

RWin::return

문맥-감지 핫키

#IfWinActive/Exist와 #If 지시어를 사용하면 특정 조건에 따라 핫키가 다른 행위를 수행하게 (또는 전혀 못하게) 만들 수 있습니다. 예를 들어:

#IfWinActive, ahk_class Notepad
^a::MsgBox 노트패드가 활성상태인 동안 Ctrl-A를 눌렀습니다. 다른 창에 Ctrl-A를 누르면 Ctrl-A 키눌림이 그 창으로 전송됩니다.
#c::MsgBox 노트패드가 활성상태인 동안 Win-C를 눌렀습니다.

#IfWinActive
#c::MsgBox 노트패드가 아닌 다른 창이 활성 상태인 동안 Win-C를 눌렀습니다.

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}     ; 태스크바 위에서 휠을 돌립니다: 볼륨을 높이거나/내립니다.
WheelDown::Send {Volume_Down} ;

맞춤 조합과 기타 특징

두 키 사이에 " & "을 사용하여 맞춤 조합을 정의할 수 있습니다 (조이스틱 버튼 제외). 아래의 예에서, Numpad0를 누른 채로 두 번째 키를 누르면 핫키가 촉발됩니다:

Numpad0 & Numpad1::MsgBox Numpad0를 누른 채로 Numpad1을 눌렀습니다.
Numpad0 & Numpad2::Run Notepad

위의 예제에서 Numpad0는 접두 키가 됩니다; 그러나 또 이 때문에 자체만 눌리면 그의 원래/고유 기능을 잃어버립니다. 이를 피하기 위해, 스크립트는 Numpad0가 새 행위를 수행하도록 구성할 수 있습니다. 예를 들어 다음과 같이:

Numpad0::WinMaximize A   ; 활성/전경 창을 최대화합니다.
Numpad0::Send {Numpad0}  ; Numpad0를 떼면 Numpad0 키눌림을 생산하도록 만듭니다. 아래의 주석을 참조하십시오.

위의 맞춤 핫키가 하나라도 존재하면 Numpad0을 뗄 때 지시한 행위가 수행됩니다. 그러나 오직 Numpad0가 눌려 있는 동안 다른 키를 누르지 않을 경우에만 그렇습니다. v1.1.14+에서, 이 행위를 피할 수 있습니다. 틸드 접두 심볼을 두 핫키중 하나에 적용하면 됩니다.

Numlock, Capslock, 그리고 Scrolllock: 이런 키들은 강제로 언제나 켜거나("AlwaysOn") 언제나 끌("AlwaysOff")수 있습니다. 예를 들어: SetNumlockState AlwaysOn.

익스플로러의 핫키 오버라이딩하기: Win-E (#e) 그리고 Win-R (#r) 같은 윈도우즈 내장 핫키는 개별적으로 오버라이드할 수 있습니다. 그냥 스크립트에서 거기에 행위를 할당하기만 하면 됩니다. 자세한 것은 오버라이드 페이지를 참조하십시오.

Alt-Tab 대안: 핫키는 알트-탭 대신에 다른 수단을 제공할 수 있습니다. 예를 들어, 다음의 두 핫키로 오른 손으로 알트-탭을 수행할 수 있습니다:

RControl & RShift::AltTab  ; 오른쪽 콘트롤 키를 누른 채로 오른쪽-쉬프트를 반복적으로 눌러 앞으로 이동합니다.
RControl & Enter::ShiftAltTab  ; 오른쪽 콘트롤 키를 뗄 필요도 없이, 엔터를 눌러 반대방향으로 이동합니다.

더 자세한 것은 Alt-Tab을 참조하십시오.

마우스 휠 핫키

마우스 휠을 돌릴 때 촉발되는 핫키는 WheelDown과 WheelUp이라는 키 이름을 통하여 지원합니다. WheelLeft와 WheelRight도 역시 v1.0.48+에서 지원하지만, 윈도우즈 비스타 보다 오래된 버전에서는 아무 효과가 없습니다. 다음은 마우스 휠 핫키의 몇 가지 예입니다:

MButton & WheelDown::MsgBox 가운데 버튼을 누르고 있는 동안 마우스 휠을 돌렸습니다.
^!WheelUp::MsgBox Control+Alt를 누르고 있는 동안 휠을 위로 돌렸습니다.

v1.0.43.03+에서, 내장 변수 A_EventInfo에는 휠을 회전한 양이 담깁니다. 전형적으로 1이지만, A_EventInfo는 다음과 같은 상황에서 1 보다 더 클 수 있습니다:

  • 마우스 하드웨어가 1 눈금보다 더 적게 거리를 보고할 경우, A_EventInfo에는 0이 담깁니다;
  • 휠을 빠르게 돌릴 경우 (마우스의 종류에 따라), A_EventInfo는 1보다 큰 값이 담깁니다. 다음과 같은 핫키가 마우스를 분석하는데 도움이 될 수 있습니다: ~WheelDown::ToolTip %A_EventInfo%.

마우스 휠에 아주 유용한 핫키로 창의 텍스트를 스크롤하는 대안 모드와 관련되어 있습니다. 예를 들어, 왼쪽 콘트롤 키를 누른 채 휠을 돌릴 때 다음 핫키 쌍은 세로가 아니라 가로로 스크롤 합니다:

~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

마지막으로, 마우스 휠 핫키는 오직 누름-이벤트만 발생시키므로 (뗌-이벤트 없음), 키-뗌 핫키로 사용할 수 없습니다.

핫키 팁 그리고 논평

각 넘패드 키마다 Numlock의 상태에 따라 두개의 다른 핫키 서브루틴을 기동시킬 수 있습니다. 대안적으로, 넘패드 키는 같은 서브루틴을 Numlock의 상태에 상관없이 기동시킬 수 있습니다. 예를 들어:

NumpadEnd::
Numpad1::
MsgBox, 이 핫키는 Numlock의 상태와 관계없이 기동됩니다.
return

틸드 (~) 연산자가 접두 키와 함께 한 번이라도 사용되면, 모든 조합에 대하여 그 접두 키의 행위가 바뀝니다. 예를 들어, 아래의 두 핫키 모두, 두 정의 중에 하나만 틸드가 포함되어 있음에도 불구하고 활성 창은 모두 오른쪽 클릭을 받습니다:

~RButton & LButton::MsgBox 우버튼을 누르고 있는 동안 왼버튼을 눌렀습니다.
RButton & WheelUp::MsgBox 우버튼을 누르고 있는 동안 휠을 위로 돌렸습니다.

Suspend 명령어는 임시로 모든 핫키를 불능화할 수 있습니다. 단, 여러분이 직접 면제한 핫키는 예외입니다. 더 선택의 범위를 넓히려면, #IfWinActive/Exist를 사용하십시오.

Hotkey 명령어를 수단으로 하여, 스크립트가 실행중인 동안 핫키를 동적으로 생성할 수 있습니다. Hotkey 명령어는 또 스크립트에 이미 존재하는 핫키들을 개별적으로 수정하거나 불능으로 만들거나 활성화할 수 있습니다..

조이스틱 핫키는 현재 ^ (Control)과 # (Win) 같은 수식 접두 심볼을 지원하지 않습니다. 그렇지만, GetKeyState를 사용하면 다음 예제에 보여주는 바와 같이 그 효과를 흉내낼 수 있습니다:

Joy2::
if not GetKeyState("Control")  ; 왼쪽 콘트롤키 오른쪽 콘트롤 키 눌 다 눌려 있지 않습니다.
    return  ; 즉, 아무것도 하지 않습니다.
MsgBox 콘트롤 키를 누르고 있는 동안 첫 번째 조이스틱의 두 번째 버튼을 눌렀습니다.
return

핫키가 계속 진행하기 위해 자신의 수식 키가 떼어지기를 기다려야할 경우가 있습니다. 다음 예제를 살펴 보겠습니다:

^!s::Send {Delete}

Control-Alt-S를 누르면 시스템이 마치 Control-Alt-Delete를 누른 것처럼 행동합니다 (시스템이 Ctrl-Alt-Delete를 공격적으로 탐지하기 때문입니다). 이를 돌아가려면 KeyWait를 사용하여 키를 떼기를 기다립니다; 예를 들어:

^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

#z::와 같은 핫키 라벨이 "Invalid Hotkey"와 같은 에러를 야기하는 경우, 시스템의 키보드 레이아웃/언어에 지정된 문자가 있을 수 있습니다 (이 경우는 "Z"). 키보드 레이아웃에 존재하지 않는 다른 문자를 사용하십시오.

핫키 라벨을 Gosub이나 Goto의 목표로 삼을 수 있습니다. 예를 들어: Gosub ^!s.

핫키의 흔한 사용 사례 하나는 예를 들어 일련의 키눌림이나 마우스 클릭 같이 반복 행위를 시작하고 멈추는 것입니다. 이를 보여주는 예는 다음 FAQ 주제를 참조하십시오.

마지막으로, 각 스크립트는 멀티-쓰레드와 비슷합니다. 덕분에 이전의 핫키 서브루틴이 여전히 실행중이더라도 새 핫키를 기동시킬 수 있습니다. 예를 들어, 현재 핫키에 의하여 MsgBox가 화면에 보여지고 있더라도 새 핫키를 기동시킬 수 있습니다.

Alt-Tab 핫키

각 Alt-Tab 핫키는 반드시 두 개의 키 조합이어야 합니다. 전형적으로 앰퍼센드(&) 심볼을 통하여 조합합니다. 다음 예제에서 오른쪽 Alt 키를 누른 채로 J 또는 K를 눌러 알트-탭 메뉴를 항해합니다:

RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab과 ShiftAltTab은 두 개의 특수한 명령어입니다. 같은 줄에 핫키로 사용될 때만 인지됩니다. 다음은 완전한 목록입니다:

AltTab: 알트-탭 메뉴가 보이면, 그 안에서 앞으로 이동합니다. 그렇지 않으면, 메뉴를 보여줍니다 (핫키가 두개의 키가 "&"로 조합되었을 경우에만 보여주고; 그렇지 않으면, 아무것도 하지 않습니다).

ShiftAltTab: 위와 같지만 메뉴에서 역방향으로 이동합니다.

AltTabAndMenu: 알트-탭 메뉴가 보이면, 메뉴 안에서 앞으로 이동하고, 그렇지 않으면 메뉴를 화면에 보여줍니다.

AltTabMenuDismiss: 알트-탭 메뉴를 닫습니다.

위의 예를 시연하기 위하여, 마우스 휠이 알트-탭을 완전해 대체하도록 만들 수 있습니다. 다음 핫키가 효과를 발휘하면, 가운데 버튼을 클릭해 메뉴를 보여주고 휠을 돌려서 그 안을 항해합니다:

MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

선택된 창을 활성화할 필요 없이 핫키가-요청한 알트-탭 메뉴를 취소하려면, 다음과 같은 핫키를 사용합니다. 다음 조건에 따라 약간 조정이 필요할 수 있습니다: 1) 알트-탭 메뉴가 처음에 어떤 수단으로 화면에 보이게 榮쩝? 그리고 2) 스크립트에 키보드 갈고리가 설치되어 있는지 여부.

LCtrl & CapsLock::AltTab
!MButton::  ; 가운데 마우스 버튼. ! 접두 심볼 때문에 Alt 키가 눌려 있는 동안 촉발됩니다 (알트-탭 메뉴가 보이면 촉발됩니다).
IfWinExist ahk_class #32771  ; 알트-탭 메뉴가 화면에 보인다는 사실을 알려줍니다.
    Send !{Escape}{Alt up}
return

현재, 모든 특수 알트-탭 행위는 위의 예제와 같이 직접적으로 핫키에 할당해야 합니다 (즉, 명령어처럼 사용할 수 없습니다). #IfWin 또는 #If에 영향을 받지 않기 때문입니다.

맞춤 알트-탭 행위는 핫키를 통해서도 만들 수 있습니다. 다음 예제에서, F1을 누르면 메뉴를 화면에 보여주고 그 안에서 앞으로 이동합니다. 다음 F2를 누르면 선택된 창을 활성화합니다 (또는 Escape를 누르면 취소됩니다):

*F1::Send {Alt down}{tab} ; 이 경우 별표가 필요합니다.
!F2::Send {Alt up}  ; Alt 키를 뗍니다. 그러면 선택된 창이 활성화됩니다.
~*Escape::
IfWinExist ahk_class #32771
    Send {Escape}{Alt up}  ; 선택된 창을 활성화하지 않고 메뉴를 취소합니다.
return

함수 핫키 [v1.1.20+]

하나 이상의 핫키를 함수에 할당할 수 있습니다. 다음 예제와 같이 그냥 핫키 라벨 바로 뒤에 정의하면 됩니다:

; Ctrl+Shift+O는 현재 폴더를 탐색기에 엽니다.
; Ctrl+Shift+E는 현재 파일이 선택된 폴더를 엽니다.
; SciTE와 Notepad++를 지원합니다.
^+o::
^+e::
    editor_open_folder() {
        WinGetTitle, path, A
        if RegExMatch(path, "\*?\K(.*)\\[^\\]+(?= [-*] )", path)
            if (FileExist(path) && A_ThisHotkey = "^+e")
                Run explorer.exe /select`,"%path%"
            else
                Run explorer.exe "%path1%"
    }

핫키 라벨이나 라벨 그리고 그 함수 사이에는 공백문자, 주석 또는 지시어만 있어야 합니다. 이런 식으로 정의된 핫키에 라벨은 생성되지 않습니다; 그렇지만, 자동-실행 섹션은 함수에 할당되어 있더라도 첫 번째 핫키에서 끝납니다.

함수를 사용하면 얻는 큰 혜택은 지역 변수를 사용할 수 있다는 것입니다. 다른 목적으로 같은 변수를 두 개 이상의 핫키에서 사용할 때 충돌을 피할 수 있습니다. 또한 자체-문서화 핫키를 권장합니다. 위의 코드에서 함수 이름 자체가 핫키를 설명하고 있습니다.

핫키 명령어를 사용해도 함수나 함수 객체를 핫키에 할당할 수 있습니다.


Hotstrings and Auto-replace (similar to AutoText and AutoCorrect)

핫스트링 그리고 자동-교체

소개와 간단한 예제

핫스트링은 주로 타자하는 동안 약어를 확대하는 데 사용되지만 (자동-교체), 스크립트 행위를 기동시키는 데에도 사용할 수 있습니다. 이런 관점에서 핫키와 비슷합니다. 전형적으로 하나 이상의 문자로 (즉, 문자열로) 구성된다는 점이 다를 뿐입니다.

핫스트링을 정의하려면, 다음 예제와 같이 촉발 약어를 한 쌍의 쌍점으로 두릅니다:

::btw::by the way

위의 예제에서, 약어 btw는 타자되는 동안 자동으로 "by the way"로 교체됩니다 (그렇지만, 기본적으로 btw를 타자한 후에 스페이스, 마침표, 또는 엔터 같은 종료 문자를 타자해야 합니다).

위의 "by the way" 예제는 자동-교체 핫스트링이라고 합니다. 왜냐하면 타자된 텍스트가 자동으로 지워지고 두 번째 쌍점 쌍 뒤에 지정된 문자열로 교체되기 때문입니다. 대조적으로, 핫스트링은 다음 예제와 같이 맞춤 행위를 수행하도록 정의할 수도 있습니다. 명령어가 반드시 핫스트링 아래에 나타나야 함에 유의하십시오:

::btw::
MsgBox "btw"를 타자했습니다.
return

:*:]d::  ; 이 핫스트링은 아래의 명령어를 통하여 "]d"를 현재 날짜와 시간으로 교체합니다.
FormatTime, CurrentDateTime,, M/d/yyyy h:mm tt  ; 대략 다음과 같이 보일 것입니다: 9/1/2005 3:53 PM
SendInput %CurrentDateTime%
return

위의 두 예제가 자동-교체 핫스트링이 아님에도 불구하고, 여러분이 타자한 약어는 기본으로 지워집니다. 자동으로 백스페이스로 지우는 것인데, 이 행위는 b0 옵션으로 끌 수 있습니다.

종료 문자

별표 옵션이 효과를 발휘하지 않는 한, 핫스트링의 약어 뒤에 종료 문자를 타자해야 행위를 촉발시킬 수 있습니다. 종료 문자는 처음에 다음으로 구성됩니다: -()[]{}':;"/\,.?!`n `t ( `n은 엔터이고, `t는 탭, 그리고 `n과 `t 사이에 평범한 스페이스가 있음에 주목하십시오). 이 문자 세트는 다음 예제와 같이 편집해 바꿀 수 있습니다. 이렇게 하면 모든 핫스트링에 대하여 새로운 종료 문자가 설정됩니다. 그 아래에 있는 핫트링에만 영향을 미치는 것이 아닙니다:

#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t

옵션

핫스트링의 기본 행위는 두 가지 방법으로 바꿀 수 있습니다:

  1. #Hotstring 지시어로 바꿀 수 있습니다. 이 지시어 아래쪽에 있는 모든 핫스트링에 물리적으로 영향을 미칩니다. 다음 예제는 C와 R 옵션 효과를 줍니다: #Hotstring c r.
  2. 핫스트링의 첫 번째 쌍점 쌍 사이에 옵션을 배치하는 방법이 있습니다. 다음 예제는 핫스트링 하나에만 C와 * 옵션이 효과가 있습니다:
    :c*:j@::john@somedomain.com ; 대소문자를 구분합니다. 그리고 "종료 문자가 필요하지 않습니다"..

아래의 리스트는 각 옵션을 기술합니다. 위의 방법을 사용하는 하나 이상의 옵션을 지정하면, 스페이스를 선택적으로 그 사이에 포함할 수 있습니다.

* (별표): 핫스트링을 촉발시키는 데 종료 문자 (예, 스페이스, 마침표, 또는 엔터)는 필요하지 않습니다. 예를 들어:

:*:j@::jsmith@somedomain.com

위의 예제는 @ 문자를 타자하는 순간 그의 교체 문자열을 전송합니다. #Hotstring 지시어를 사용할 때, *0을 사용하면 이 옵션을 끌 수 있습니다.

? (물음표): 핫스트링이 다른 단어 안에 있어도 촉발됩니다; 즉, 바로 앞에 타자된 문자가 알파벳이나 숫자일 때 촉발됩니다. 예를 들어, :?:al::airline이 핫스트링이라면, "practical "을 타자하면 "practicairline "으로 교체됩니다. ?0을 사용하면 이 옵션을 끌 수 있습니다.

B0 (B 다음에 0): 여러분이 타자한 약어를 지우기 위해 자동 백스페이스 지우기가 일어나지 않습니다. 그냥 B만 사용하면 백스페이싱이 바로 이전에 꺼진 곳 다음부터 켜집니다. 스크립트도 스스로 백스페이싱을 할 수 있습니다. {bs 5}와 같이 하면 5 개의 백스페이스를 전송합니다. 비슷하게, 왼쪽-화살표 키는 {left 5}와 같이 전송합니다. 예를 들어, 다음 핫스트링은 "<em></em>"을 생산하고 캐럿을 5 자리 왼쪽으로 이동시킵니다 (그래서 태그 사이에 있게 됩니다):

:*b0:<em>::</em>{left 5}

C: 대소문자를 구분합니다: 약어를 타자할 때, 스크립트에 정의된 대소문자에 정확하게 일치해야 합니다. C0을 사용하면 대소문자 구분을 끕니다.

C1: 타자된 대소문자를 따르지 않습니다. 이 옵션을 사용하면 자동-교체 핫스트링을 대소문자를 구분하도록 만들 수 있고 실제로 타자한 문자의 대소문자 규격을 따르지 않도록 만들 수 있습니다. 대소문자 규격을 준수하는 핫스트링은 (이것이 기본값) 여러분이 약어를 모두 대문자로 타자했다면 교체 텍스트도 역시 모두 대문자로 생산합니다. 첫 번째 문자만 대문자로 타자했다면, 교체의 첫 문자도 역시 대문자가 됩니다. 다른 방식으로 대소문자를 타자하면, 교체 문자열 역시 정확하게 정의된 대로 전송됩니다. #Hotstring 지시어를 사용할 때, C0을 사용하면 이 옵션을 끌 수 있습니다. 핫스트링이 다시 대소문자를 준수하도록 만듭니다.

Kn: 키-지연 시간: 이 옵션은 자주 사용되지 않습니다. 자동-백스페이싱이나 자동-교체에 의하여 생산된 키눌림 사이에 지연 시간을 설정합니다. 새 지연 시간을 n에 지정합니다; 예를 들어, k10으로 지정하면 10ms 지연되고 k-1이면 지연이 없습니다. 이 옵션의 정확한 행위는 어떤 전송 모드가 작동 중인가에 따라 달라집니다:

  • SI (SendInput): 이 모드에서는 지연이 불가능하기 때문에 키-지연이 무시됩니다. 예외는 SendInput을 사용할 수 없을 때인데, 이 경우 핫스트링은 (키-지연을 준수하는) 아래의 SendPlay 모드로 돌아갑니다.
  • SP (SendPlay): 지연 길이 0이 기본값입니다. 이 값은 SendPlay에서는 -1과 같습니다 (지연 없음). 이 모드에서, 지연은 실제로 키눌림 사이의 지연이 아니라 PressDuration입니다.
  • SE (SendEvent): 지연 길이 0이 기본값입니다. 대부분의 목적에 0을 권장합니다. (내부적으로 Sleep 0을 수행하기 때문에) 빠르면서도 여전히 다른 프로세스와 잘 협력합니다. k-1을 지정하면 전혀 지연이 없습니다. CPU가 자주 쉰다면 자동 교체를 더 빠르게 만드는 데 유용합니다. -1로 설정할 때, 스크립트의 프로세스-우선순위는 얼마나 빠르게 키눌림을 전송할 수 있는가에 중요한 요소가 됩니다. 스크립트의 우선순위를 높이려면, Process, Priority,, High를 사용하십시오.

O: 자동 교체가 생산될 때 자동-교체 핫스트링의 종료 문자를 생략합니다. 이것은 여전히 종료 문자를 요구함으로써 핫스트링을 명료하게 유지하기를 원하지만, 실제로는 종료 문자가 화면에 나타나지 않기를 바랄 때 유용합니다. 예를 들어, :o:ar::aristocrat이 핫스트링이라면, "ar"를 타자한 다음 스페이스바를 타자하면 뒤에 스페이스 없이 "aristocrat"으로 교체됩니다. 이렇게 하면 백스페이스를 누를 필요 없이 단어를 복수형이나 소유형으로 만들 수 있습니다. O0 (문자 O 다음에 숫자 0)을 사용하면 이 옵션을 끌 수 있습니다.

Pn: 핫스트링의 우선순위 (예, P1). 자주 사용되지 않는 이 옵션은 자동-교체 핫스트링에 아무 효과가 없습니다.

R: 교체 텍스트를 날 상태로 전송합니다; 즉, {Enter}를 ENTER 키눌림, ^c를 Control-C, 등등으로 변환하지 않고 보이는 그대로 전송합니다. 이 옵션은 계속 섹션을 가진 핫스트링에 자동으로 효과를 발휘합니다. R0으로 이 옵션을 끌 수 있습니다.

SI 또는 SP 또는 SE [v1.0.43+]: 자동-교체 핫스트링이 키눌림을 전송하는 데 사용할 방법을 설정합니다. 이 옵션들은 서로 배타적입니다: 오직 한 번에 하나씩만 효과가 있습니다. 다음은 각 옵션을 기술합니다:

  • SI는 SendInput의 약자입니다. 전형적으로 다른 모드보다 월등한 속도와 신뢰성이 있습니다. 또다른 장점은 아래의 SendPlay와 같이 SendInput은 핫스트링의 텍스트 자동-교체가 일어나는 동안 타자되는 모든 것들을 대기시킵니다. 이 덕분에 키눌림이 교체 문자열 여기 저기로 흩어지지 않습니다. SendInput을 사용할 수 없으면, 핫스트링은 자동으로 대신에 SendPlay를 사용합니다.
  • SP는 SendPlay의 약자입니다. 핫스트링을 더 넓은 범위의 게임에 작동시킬 수 있습니다.
  • SE는 SendEvent의 약자입니다. 1.0.43 이전 버전에서는 이 값이 기본입니다.

위의 옵션 중 어느 것도 사용되지 않으면, 기본 모드는 v1.0.43 이후의 SendInput입니다. 그렇지만, SI 옵션과 다르게, SendInput을 사용할 수 없을 때 SendPlay 대신에 SendEvent을 사용합니다.

Z: 자주 사용되지 않는 이 옵션은 핫스트링이 촉발된 다음 핫스트링 인식자를 재설정합니다. 다른 말로, 스크립트는 이전에 타자한 모든 것들을 다 잊어 버리고 완전히 새로운 문자열을 기다리기 시작합니다. 이렇게 하면 원하지 않는 핫스트링의 촉발을 막을 수 있습니다. 예시를 위해, 다음 핫스트링을 연구해 봅시다:

:b0*?:11::
SendInput xx
return

위 예제는 Z 옵션이 없기 때문에, 111을 타자하면 (연속으로 1 세 개) 핫스트링이 두 번 촉발됩니다. 왜냐하면 가운데 1이 첫 촉발의 마지막 문자이고 또한 두 번째 촉발의 첫 문자이기 때문입니다. 기호 Z를 b0 앞에 추가하면, 1을 세 개 대신에 네 개를 타자해야 핫스트링이 두 번 촉발됩니다. Z0을 사용하면 이 옵션을 끌 수 있습니다.

기다란 교체

기다란 텍스트 교체를 생산하는 핫스트링은 계속 섹션을 사용하면 더 읽기 좋게 더 관리하기 쉽게 만들 수 있습니다. 예를 들어:

::text1::
(
상단과 하단의 반괄호 사이에 있는 텍스트는 무엇이든 문자 그대로 취급됩니다
여기에는 쉼표와 퍼센트 사인도 예외가 아닙니다.
기본값으로, 하드 캐리지 리턴(엔터)이 앞 줄과 이 줄 사이에 있어도 역시 유지됩니다.
    기본 값으로, 이 줄의 왼쪽 들여쓰기 (탭)도 유지됩니다.

이 기본 행위를 바꾸는 방법은 계속 섹션을 참조하십시오.
)

계속 섹션이 있으면 핫스트링도 역시 날 모드가 기본값이 됩니다. 이 특별한 기본값을 오버라이드하는 유일한 방법은 계속 섹션을 가진 각 핫스트링 안에 r0 옵션을 지정하는 것입니다 (예, :r0:text1::).

문맥-감지 핫스트링

#IfWinActive/Exist 지시어를 사용하면 선택된 핫스트링이 문맥을 감지하게 만들 수 있습니다. 문맥 감지 핫스트링은 활성창의 유형에 따라 다르게 교체하거나, 다르게 행위하거나, 또는 아무것도 하지 않습니다. 예를 들어:

#IfWinActive ahk_class Notepad
::btw::이 교체 텍스트는 노트패드에만 나타납니다.
#IfWinActive
::btw::이 교체 텍스트는 노트패드가 아닌 창에 나타납니다.

AutoCorrect

다음 스크립트는 핫스트링을 사용해 대략 4700 정도의 영어 철자 오류를 바로바로 교정합니다. Win+H 핫키가 포함되어 있어서 쉽게 더 많은 철자를 추가할 수 있습니다:

내려받기: AutoCorrect.ahk (127 KB)

저자: Jim Biancolo and Wikipedia's Lists of Common Misspellings

논평

%MyVar%와 같은 변수 참조는 현재 자동 교체 텍스트 안에서 지원하지 않습니다. 이를 해결하기 위해, auto-replace 같은 핫스트링을 만들지 마십시오. 대신에, 약어 바로 아래에 SendInput 명령어를 사용하고, 뒤이어서 단어 Return만 있는 줄을 배치하십시오.

교체한 뒤에 따로 더 스페이스나 탭을 전송하려면, 스페이스나 탭을 교체 뒤에 포함하고 마지막 문자를 액센트/백틱(`)으로 만드십시오. 예를 들어:

:*:btw::By the way `

좌/우 버튼을 클릭하면 핫스트링 인식자가 리셋됩니다. 다른 말로, 스크립트는 이전에 타자된 것들을 모두 잊어 버리고 전적으로 새로운 핫스트링을 기다립니다 (이것이 마음에 들지 않으면, , 다음 줄 #Hotstring NoMouse를 스크립트에 지정하십시오). 이 "마우스 클릭에 리셋" 행위가 기본값입니다. 왜냐하면 각 클릭은 전형적으로 텍스트 삽입 위치를 이동시키거나 (캐럿) 키보드 초점을 새로운 콘트롤/필드로 설정하기 때문입니다. 그런 경우, 보통 다음이 바람직합니다:

  1. 물음표 옵션이 없더라도 핫스트링을 촉발시킵니다;
  2. 마우스를 클릭한 후에 타자한 것이 우발적으로 이전에 타자한 것과 더불어 유효한 약어를 형성할 때 촉발을 막습니다

내장 변수 A_EndChar에 종료 문자가 들어 있습니다. 타자하면 가장 최근의 자동-교체되지-않은 핫스링이 촉발됩니다. (* 옵션 때문에) 종료 문자가 필요하지 않으면, 비어 있습니다. A_EndChar는 Send 명령어를 사용하는 핫스트링을 만들 때 유용합니다. 또는 그의 행위가 타자된 종료 문자에 따라 바뀌어야 하는 핫스트링을 만들 때 유용합니다. 종료 문자 자체를 보내려면, SendRaw %A_EndChar%를 사용합니다 (SendRaw가 사용된 이유는 !{}와 같은 문자들이 보통의 Send 명령어로는 올바르게 전송되지 않기 때문입니다).

쉼표, 퍼센트 사인, 그리고 단일-쌍점은 핫스트링 정의 안에서 피신 시킬 필요가 없지만, 왼쪽에 스페이스나 탭이 있는 백틱과 쌍점은 피신시켜야 합니다. 완전한 목록은 피신 연속열을 참조하십시오.

{Enter}와 같은 Send 명령어의 특수 문자들은 (날 옵션이 사용되지 않는 한) 텍스트 자동-교체에 지원되지만, 핫스트링 약어 자체는 이를 사용하지 않습니다. 대신에, `n를 ENTER 키에 그리고 `t를 (또는 문자 그대로의 탭문자) TAB에 지정하십시오 (완전한 목록은 피신 연속열을 참조하십시오). 예를 들어, 다음 핫스트링 :*:ab`t::은 "ab"를 타자하고 바로 탭이 따라오면 촉발됩니다.

스페이스와 탭은 핫스트링 정의 안에서 문자 그대로 취급됩니다. 예를 들어, 다음은 두 개의 다른 결과를 생산합니다: ::btw::by the way 그리고 ::btw:: by the way.

핫스트링 약어는 40 문자를 넘을 수 없습니다. 이 길이를 초과하면 프로그램은 경고할 것입니다. 대조적으로, 핫스트링 교체 텍스트의 길이는 전송 모드가 기본값인 SendInput일 때 대략 5000 문자로 제한됩니다. 제한을 16,383 문자로 증가시키려면 다른 전송 모드중 하나로 전환하면 됩니다. 게다가, 핫스트링의 몸체에 SendPlay %MyVariable%를 사용하면 무제한 텍스트도 전송할 수 있습니다.

핫스트링이 정의된 순서에 따라 서로 간에 우선 순위가 결정됩니다. 다른 말로, 하나 이상의 핫스트링이 여러분이 타자한 것에 부합하면, 제일 먼저 나열된 것만 효과를 발휘합니다. 관련 주제: 문맥-감지 핫스트링.

여러분이 타자한 백스페이스는 모두 핫스트링의 감지를 위한 목적에 고려됩니다. 그렇지만, 화살표 키, PageUp, PageDown, Home, 그리고 End 키를 사용하여 편집기 안을 항해하면 핫스트링 인식 처리가 리셋됩니다. 다른 말로, 전적으로 새로운 핫스트링을 기다리기 시작합니다.

핫스트링은 활성 창이 키눌림을 무시할 때에도 타자될 수 있습니다. 다른 말로, 핫스트링은 촉발 약어가 전혀 보이지 않을지라도 여전히 촉발됩니다. 게다가, 여전히 백스페이스 키를 눌러 최근에 타자된 키눌림을 언두할 수 있습니다 (그 효과가 보이지 않을지라도 말입니다).

핫스트링 라벨에 Gosub는 Goto를 적용할 수 있습니다. 첫 번째 쌍점 쌍을 (다른 옵션 심볼을 포함하여) 그이 이름 앞에 포함하면 됩니다. 예를 들어: Gosub ::xyz. 그렇지만, 한-줄 (자동-교체) 핫스트링에는 점프해봐야 아무 것도 하지 않습니다. 기껏해야 return을 실행하는 것으로 끝납니다.

핫스트링은 관제가 되지 않고 보이지 않는 Input 명령어 동안에는 촉발되지 않지만, 보이는 Input은 핫스트링을 촉발시킬 수 있습니다.

기본값으로, 핫스트링은 AutoHotkey 스크립트가 생산하는 키눌림에는 촉발되지 않습니다. 그래서 핫스트링끼리 서로 촉발하는 무한 회돌이에 빠질 가능성을 피합니다. v1.1.06 이후 버전에서 이 행위는 #InputLevel과 SendLevel로 통제할 수 있습니다. 그렇지만, 자동-교체 핫스트링은 언제나 레벨 0으로 전송되고 그러므로 갈고리 핫키나 핫스트링을 촉발하지 않습니다.

어떤 목적에는 핫스트링보다 Input 명령어가 더 유연합니다. 예를 들어, 활성 창에 키눌림을 감출 수 있습니다 (게임 같은 경우). 또 Escape와 같이 문자가-아닌 종료 키를 지원합니다.

핫스트링을 담고 있는 스크립트는 키보드 갈고리를 자동으로 사용합니다.

핫스트링은 다음과 같은 방식으로 핫키와 동일하게 행위합니다:

  • Suspend 명령어에 영향을 받습니다.
  • #MaxThreads와 #MaxThreadsPerHotkey를 준수합니다 (#MaxThreadsBuffer는 제외).
  • 핫스트링을 담고 있는 스크립트는 자동으로 영속적이 됩니다.
  • 자동-교체-아닌 핫스트링은 기동될 때 새로 쓰레드를 생성합니다. 게다가, A_ThisHotkey와 같은 내장 핫키 변수를 갱신합니다.

알려진 한계: 자바 어플리케이션 같은 어떤 시스템에서는 핫스트링이 사용자가 (데드 키를 통하여) 방언 문자를 타자하지 못하도록 방해합니다. 이를 해결하려면, Suspend를 임시로 켤 수 있습니다 (모든 핫스트링이 꺼집니다).

핫스트링 도움 함수

안드레아스 보루타(Andreas Borutta)가 다음 스크립트를 제시했습니다. 핫스트링을 많이 사용한다면 아주 유용할 것입니다. Win+H (또는 또다른 핫키)를 누르면, 현재 선택된 텍스트가 핫스트링으로 변환됩니다. 예를 들어, 워드 프로세서에서 "by the way"를 선택했다면, Win+H를 누르면 여러분에게 그의 약자를 요구할 것입니다 (예, btw) 그리고 그 새 핫스트링을 스크립트에 추가합니다. 다음 스크립트를 재적재하여 그 핫스트링을 활성화합니다.

#h::  ; Win+H 핫키
; 현재 선택된 텍스트를 얻는다. "ControlGet Selected" 대신에
; 클립보드를 사용한다. 왜냐하면 대부분의 편집기에 작동하기 때문이다.
; (즉 워드 프로세서). 현재 클립보드 내용을 저장한다. 나중에 복구해 사용한다
; 평범한 텍스트만 처리하지만,
; 아무것도 처리하지 못하는 것보다는 낫다:
AutoTrim Off  ; 클립보드에 선두와 후미 공백을 그대로 유지한다.
ClipboardOld = %ClipboardAll%
Clipboard =  ; 탐지를 작동시키려면 빈 채로 시작해야 한다.
Send ^c
ClipWait 1
if ErrorLevel  ; ClipWait 시간 종료.
    return
; "날로-전송" 핫스트링에 사용하기 위해 CRLF와 LF를 `n로 교체한다:
; 다른 문자들에 대해서도 똑 같이 교체한다. 그렇지 않으면
; 날 모드에서 문제를 일으킬 수 있다:
StringReplace, Hotstring, Clipboard, ``, ````, All  ; 아래의 다른 것들과의 간섭을 피하기 위해 이걸 먼저 교체한다.
StringReplace, Hotstring, Hotstring, `r`n, ``r, All  ; MS Word, 등등에서 `r을 사용하는 것이 `n보다 더 잘 작동한다 .
StringReplace, Hotstring, Hotstring, `n, ``r, All
StringReplace, Hotstring, Hotstring, %A_Tab%, ``t, All
StringReplace, Hotstring, Hotstring, `;, ```;, All
Clipboard = %ClipboardOld%  ; 클립보드의 이전 내용을 복구한다.
; 이렇게 하면 InputBox의 캐럿이 사용자에게 더 편리한 위치로 이동한다:
SetTimer, MoveCaret, 10
; InputBox를 보여주고, 기본 핫스트링을 제공한다:
InputBox, Hotstring, New Hotstring, 지시한 삽입 지점에 약어를 타자하십시오. 원한다면 교체 텍스트도 편집할 수 있습니다.`n`n예제: :R:btw`::by the way,,,,,,,, :R:`::%Hotstring%
if ErrorLevel  ; 사용자가 Cancel을 눌렀다.
    return
IfInString, Hotstring, :R`:::
{
    MsgBox 약어를 제공하지 않았습니다. 핫스트링이 추가되지 않았습니다.
    return
}
; 그렇지 않으면, 핫스트링을 추가하고 스크립트를 재적재한다:
FileAppend, `n%Hotstring%, %A_ScriptFullPath%  ; 파일이 끝에 빈 줄에 없는 경우 앞에 `n을 배치한다.
Reload
Sleep 200 ; 성공하면, 재적재 때문에 이 실체는 Sleep하는 동안 닫힌다. 그래서 아래의 줄은 절대로 도달하지 못한다.
MsgBox, 4,, 방금 추가된 핫스트링은 모양이 올바르지 않습니다. 스크립트를 열어 편집하시겠습니까? 나쁜 핫트링의 위치는 스크립트 하단에 있습니다.
IfMsgBox, Yes, Edit
return

MoveCaret:
IfWinNotActive, New Hotstring
    return
; 그렇지 않으면, InputBox의 삽입 위치를 사용자가 약어를 타자할 곳으로 이동한다.
Send {Home}{Right 3}
SetTimer, MoveCaret, Off
return


List of Keys and Mouse/Joystick Buttons for Hotkeys and Macros

키, 마우스 버튼, 그리고 조이스틱 콘트롤 목록

마우스

일반 |
LButton | 왼쪽 마우스 버튼
RButton | 오른쪽 마우스 버튼
MButton | 중간 또는 휠 마우스 버튼
고급 |
XButton1 | 4번째 마우스 버튼, 전형적으로 Browser_Back과 같은 기능을 수행합니다.
XButton2 | 5번째 마우스 버튼, 전형적으로 Browser_Forward와 같은 기능을 수행합니다.
휠 |
WheelDown | 휠을 아래로 돌립니다 (가까워지게).
WheelUp | 휠을 위로 돌립니다 (멀어지게).
WheelLeft WheelRight | [v1.0.48+]: 좌우로 스크롤합니다. 윈도우즈 비스타 이상을 요구합니다. 두 번째 휠을 가진 또는 휠을 좌우로 돌릴 수 있는 마우스와 함께 (모두는 아님) 이것을 핫키로 사용할 수 있습니다. 어떤 경우, 대신에 마우스와 함께 따라오는 드라이버를 사용해야만 이 특징을 제어할 수 있습니다. 특정 마우스와 상관없이, Send와 Click을 사용하여 프로그램에서 지원하기만 하면 수평으로 스크롤할 수 있습니다.

키보드

주의: 기호와 숫자 키의 이름은 기호나 숫자 키와 같습니다. 예를 들어. : b는 "b" 키이고 5는 "5" 키입니다.

일반
CapsLock | 캡스 락
Space | 스페이스 바
Tab | 탭 키
Enter (또는 Return) | 엔터 키
Escape (또는 Esc) | Esc 키
Backspace (또는 BS) | 백스페이스
커서 콘트롤
ScrollLock | 스크롤 락
Delete (또는 Del) | 삭제 키
Insert (또는 Ins) | 삽입 키
Home | 홈 키
End | 엔드 키
PgUp | 페이지 업 키
PgDn | 페이지 다운 키
Up | 위 화살표 키
Down | 아래 화살표 키
Left | 왼쪽 화살표 키
Right | 오른쪽 화살표 키
숫자패드
NumLock ON
NumLock OFF
Numpad0
NumpadIns 0 / 삽입 키
Numpad1
NumpadEnd 1 / 엔드 키
Numpad2
NumpadDown 2 / 아래 화살표 키
Numpad3
NumpadPgDn 3 / 페이지 다운 키
Numpad4
NumpadLeft 4 / 왼쪽 화살표 키
Numpad5
NumpadClear 5 / 보통 아무일도 안함
Numpad6
NumpadRight 6 / 오른쪽 화살표 키
Numpad7
NumpadHome 7 / 홈 키
Numpad8
NumpadUp 8 / 위 화살표 키
Numpad9
NumpadPgUp 9 / 페이지 업 키
NumpadDot
NumpadDel 소수 점 / 삭제 키
NumpadDiv
NumpadDiv 나누기
NumpadMult
NumpadMult 곱하기
NumpadAdd
NumpadAdd 더하기
NumpadSub
NumpadSub 빼기
NumpadEnter
NumpadEnter 엔터 키
기능키
F1 - F24 | 대부분의 키보드 상단에 있는 12 개 이상의 기능키.
수식키
LWin | 왼쪽 윈도우즈 로고 키. <# 핫키 접두 심볼에 상응합니다.
RWin 오른쪽 윈도우즈 로고 키. ># 핫키 접두 심볼에 상응합니다.
주의: Control/Alt/Shift와 다르게, 범용의/중립적 "Win" 키는 없습니다. OS가 지원하지 않습니다. 그렇지만, # 수식키를 가진 핫키는 어느쪽 Win 키로도 촉발됩니다.
Control (or Ctrl) | 콘트롤 키. 핫키처럼 (Control::) 틸드 접두 심볼이 붙지 않은 한, 뗄 때 촉발됩니다. ^ 핫키 접두 심볼에 상응합니다.
Alt | 알트 키. 핫키처럼 (Alt::) 틸드 접두 심볼이 붙지 않는 한, 뗄 때 촉발됩니다. ! 핫키 접두 심볼에 상응합니다.
Shift | 쉬프트 키. 핫키처럼 (Shift::) 틸드 접두 심볼이 붙지 않는 한, 뗄 때 촉발됩니다. + 핫키 접두 심볼에 상응합니다.
LControl (or LCtrl) | 왼쪽 콘트롤 키. <^ 핫키 접두 심볼에 상응합니다.
RControl (or RCtrl) | 오른쪽 콘트롤 키. >^ 핫키 접두 심볼에 상응합니다.
LShift | 왼쪽 쉬프트 키. <+ 핫키 접두 심볼에 상응합니다.
RShift | 오른쪽 쉬프트 키. >+ 핫키 접두 심볼에 상응합니다.
LAlt | 왼쪽 Alt 키. <! 핫키 접두 심볼에 상응합니다.
RAlt 오른쪽 알트 키. >! 핫키 접두 심볼에 상응합니다.
주의: 키보드 레이아웃에 RAlt 대신 AltGr이 있다면, 그것을 핫키로 사용할 수 있습니다. 다음에 기술하는 바와 같이 <^>!처럼 접두 심볼 처리를 해 주면 됩니다. 게다가, LControl & RAlt::은 AltGr 자체를 핫키로 만들어 줍니다.
멀티미디어
Browser_Back | 뒤로
Browser_Forward | 앞으로
Browser_Refresh | 갱신
Browser_Stop | 멈춤
Browser_Search | 검색
Browser_Favorites | 즐겨찾기
Browser_Home | 홈페이지
Volume_Mute | 음소거
Volume_Down | 소리 줄이기
Volume_Up | 소리 높이기
Media_Next | 다음 트랙
Media_Prev | 이전 트랙
Media_Stop | 중지
Media_Play_Pause | 연주/정지
Launch_Mail | 기본 이메일 프로그램 기동
Launch_Media | 기본 미디어 플레이어 기동
Launch_App1 | 내 컴퓨터 기동
Launch_App2 | 계산기 기동
주의: 위에 나열된 각 키에 할당된 기능은 윈도우즈의 레지스트리를 변경하면 오버라이드할 수 있습니다. 다음 테이블은 대부분의 윈도우즈 버전에서 각 키의 기본 기능을 보여줍니다.
특수
AppsKey | 메뉴 키. 이 키는 우클릭 문맥 메뉴를 요청합니다.
PrintScreen | 화면 인쇄
CtrlBreak
Pause | 정지 키
Break | Break key. Pause와 동일하기 때문에, 핫키에서 ^CtrlBreak를 사용하십시오. ^Pause이나 ^Break는 사용하지 마십시오.
Help | 도움 키. 이 키는 보통 대부분의 키보드에 존재하지 않습니다. 보통 F1과 같지 않습니다.
Sleep | 수면 키. 어떤 키보드에서 수면 키는 잘 작동하지 않을 수 있습니다.
SCnnn | nnn에 키의 스캔 코드를 지정합니다. 위에 언급하지 않은 비정상 키들을 인식합니다. 자세한 것은 특수 키를 참조하십시오.
VKnn nn에 키의 십육진 가상 키 코드를 지정합니다. 자주 사용되지 않는 이 방법은 어떤 유형의 핫키가 키보드 갈고리를 요구하는 것을 방해할 수도 있습니다. 예를 들어, 다음 핫키들은 키보드 갈고리를 사용하지 않지만, 부작용으로서 Home 또는 NumpadHome을 누르면 촉발됩니다:
^VK24::MsgBox Control 키를 누른 채로 Home 또는 NumpadHome를 눌렀습니다.
알려진 한계: VK 핫키가 키보드 갈고리를 사용하도록 강제되어 있으면, *VK24이나 ~VK24와 같이, 두 키가 아니라 둘 중에 하나의 키에만 촉발됩니다 (예, NumpadHome에 촉발되면 Home은 촉발되지 않음). VKnn 메쏘드에 관한 더 자세한 정보는 특수 키를 참조합니다.

Joystick

Joy1 through Joy32: 조이스틱의 버튼. 다음 테스트 스크립트를 사용하면 여러분이 보유한 조이스틱의 버튼 개수를 알 수 있습니다. ^ (control) 그리고 + (shift) 같은 핫키 접두 심볼은 지원하지 않습니다 (그렇지만 GetKeyState을 대안으로 사용할 수 있습니다). 조이스틱 버튼을 누른다고 해서 언제나 활성창으로 "뚫고 들어가는" 것은 아니라는 사실을 주의하십시오. 그 창이 조이스틱 버튼 누름을 탐지하도록 설계되어 있다면 침투하지 못할 수 있습니다.

다음 조이스틱 콘트롤 이름은 핫키로 사용할 수 없지만, GetKeyState와 함께 사용할 수 있습니다:
JoyX, JoyY, and JoyZ: 조이스틱의 X (수평), Y (수직), 그리고 Z (고도/깊이) 축.
JoyR: 조이스틱의 러더 또는 4 번째 축.
JoyU and JoyV: 조이스틱의 5번째 6 번째 축.
JoyPOV: The point-of-view (hat) control.
JoyName: 조이스틱 또는 조이스틱 드라이버의 이름.
JoyButtons: 조이스틱이 지원하는 버튼의 개수 (언제나 정확한 것은 아님).
JoyAxes: 조이스틱이 지원하는 축의 개수.
JoyInfo: 다음 기호로 구성되는 문자열을 제공합니다. 조이스틱이 갖춘 능력을 알려줍니다: Z (Z 축), R (R 축), U (U 축), V (V 축), P (POV 콘트롤), D (POV 콘트롤은 이산적으로 설정됩니다), C (POV 콘트롤은 연속적으로 설정됩니다). 예제 문자열: ZRUVPD

다중 조이스틱: 컴퓨터에 여러 조이스틱이 있고 첫 번째 마우스 말고도 다른 조이스틱을 사용하고 싶다면, 조이스틱 번호를 (최대 16) 컨트롤 이름 앞에 붙이십시오. 예를 들어, 2joy1은 두 번째 조이스틱의 첫 번째 버튼입니다.

주의: 스크립트에게 조이스틱을 인식시키지 못하고 있다면, 어떤 보고에 의하면 조이스틱 번호를 1말고 다른 번호를 지정할 필요가 있다고 합니다. 오직 하나의 조이스틱만 있다고 할지라도 말입니다. 어떻게 이런 상황이 일어나는지 그리고 그것이 정상인 것인지는 잘 모르지만, 조이스틱 테스트 스크립트에서 조이스틱 번호를 가지고 실험해 보면 이 방법이 여러분의 시스템에 적용이 될지 알 수 있을 것입니다.

다음도 참조하십시오:
조이스틱 리맵핑: 조이스틱으로 키눌림과 마우스 클릭을 전송하는 방법.
Joystick-To-Mouse 스크립트: 조이스틱을 마우스로 사용하기.

손에 든 리모콘

손에 든 리모콘으로부터의 신호에 반응합니다. WinLIRC 클라이언트 스크립트를 사용하십시오.

특수 키

키보드나 마우스에 위에 나열된 키가 없더라도, 핫키로 사용할 수 있습니다. 다음 단계를 따르십시오:

  1. 적어도 하나의 스크립트는 키보드 갈고리를 사용하여 실행 중임을 확인합니다. 스크립트에 키보드 갈고리가 설치되어 있는지 확인하려면 메인 창을 열고 메뉴바에서 "View->Key history"를 선택해 보면 됩니다.
  2. 스크립트의 트레이 아이콘을 더블클릭하여 메인 창을 엽니다.
  3. 키보드에서 "미스테리 키"중 하나를 누릅니다.
  4. 메뉴 항목 "View->Key history"를 선택합니다.
  5. 페이지 아래로 감아 내립니다. 아래 어딘가에 누른 키에 대한 키-누름 그리고 키-뗌 이벤트가 있을 겁니다. 주의: 어떤 키는 이벤트를 발생시키지 않습니다 그리하여 여기에서 보이지 않습니다. 이럴 경우라면 직접적으로 그 특정한 키를 핫키로 만들 수 없습니다. 왜냐하면 키보드 드라이버나 하드웨어가 너무 아래 레벨에서 처리하고 있어서 오토핫키가 접근할 수 없기 때문입니다. 가능한 해결책은, 더 아래를 보십시오.
  6. 키를 탐지할 수 있으면, 리스트의 두 번째 컬럼에 세 자리 십육진 값을 적습니다 (예, 159).
  7. 이 키를 핫키로 정의하려면, 다음 예를 따르십시오:
    SC159:: ; 159를 키 값으로 교체하십시오.
MsgBox, %A_ThisHotKey% was pressed.
return

역 방향: 다른 키를 "미지의 키"가 되도록 리맵하려면, 다음 예제를 따르십시오:

; 159를 위에서 발견한 값과 교체합니다. (필요하면) FF를 가상 키로 교체합니다.
; 가상 키 코드는 Key History 화면의 첫 컬럼에서 발견할 수 있습니다.
#c::Send {vkFFsc159}

또다른 해결책: 키나 마우스 버튼을 Key History 화면에서 탐지할 수 없으면, 다음 중 하나를 시도해 보면 도움이 될 것입니다:

  1. 마우스나 키보드에 함께 따라오는 소프트웨어의 환경을 재구성하면 (종종 제어판이나 시작 메뉴를 통하여 접근할 수 있습니다) "미지의 키"가 다른 키눌림을 전송하도록 만들 수 있습니다. 그런 키눌림은 이제 스크립트에서 핫키로 정의할 수 있습니다. 예를 들어, 미지의 키가 Control+F1을 전송하도록 구성했다면, 스크립트에서 ^F1::을 사용해 간접적으로 그 키를 핫키로 만들 수 있습니다.

  2. DllCall: 휴먼 인터페이스 장치 지원을 시도해 봅니다. 또 RawInput*와 같은 키워드로 포럼을 검색해 보실 수도 있습니다.

  3. 다음은 마지막 의존책입니다. 일반적으로 절망적일 경우에만 시도하십시오. 성공의 가능성이 매우 낮고 원하지 않는 부작용을 야기해 다시 돌이킬 수 없을 수도 있기 때문입니다:
    키보드나 마우스에 따라오는 소프트웨어를 제거합니다. 또는 드라이버를 보다 표준적인 드라이버 예를 들어 OS에 내장된 드라이버로 교체합니다. 성공한 한다면 여러분의 전용 드라이버가 제공하는 특징이 없더라도 살아갈 수 있다는 확신을 가질 수 있습니다.


License

GNU 일반 공중 이용허락

[ 영어 | 한국어 ]

  • GPL 위반이라고 생각되는 상황을 보았을 때 해야 할 일
  • GPL 번역문
  • GPL에 대한 빈번한 질문들

This is an unofficial translation of the GNU General Public License into Korean. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL -- only the original English text of the GNU GPL does that. However, I hope that this translation will help Korean speakers understand the GNU GPL better.

이 문서는 자유 소프트웨어 재단(Free Software Foundation)의 GNU General Public License 2판을 한국어로 옮긴 것입니다. 이 문서는 GNU GPL이 가진 호혜적인 자유와 공유의 정신을 보다 많은 사람에게 알리기 위해 만든 것이지만, 자유 소프트웨어 재단의 공식 문서로 취급되어서는 안 됩니다. 왜냐하면 원문이 의도하는 내용이 왜곡되지 않으면서 법적으로 유효하기 위해서는 양국의 현행 법률과 언어의 적합성 여부에 대한 검토 작업이 필요하지만, 이 작업에는 큰 비용이 요구되며 자유 소프트웨어 재단은 그렇게 하지 않기로 결정했기 때문입니다. 또한 공식 번역문으로 인정된 경우라도 다른 언어로의 번역에 따른 위험 부담은 여전히 남게 됩니다. 따라서 자유 소프트웨어 재단은 오역이나 해석상의 난점으로 인해 발생할지 모를 혼란과 분쟁의 가능성을 미리 방지하고 문서가 담고 있는 내용과 취지를 보다 많은 사람에게 알리려는 상반된 목적을, 한국어 번역문을 공식적으로 승인하지 않는 방법으로 양립시키고 있습니다.

자유 소프트웨어 재단은 어떠한 언어에 대해서도 공식 번역을 인정하지 않으며 그렇게 할 계획 또한 없습니다. 자유 소프트웨어 재단은 GNU GPL을 실무에 적용할 경우 오직 영문판에 의해서만 올바른 법적 효력이 발생함을 분명히 하고 있습니다. 이 번역문은 법률 검토와 문서간의 동일성 여부에 관한 검증을 거치지 않았으며, 이로 인해 발생할지 모를 법률문제에 대해 어떠한 보증도 제공하지 않습니다. 따라서 GNU GPL을 상업 목적으로 사용하려고 할 경우에는 법률 전문가의 자문을 직접 구해야 합니다. 그러나 대부분의 사람에게는 이 번역문이 전달하려는 내용과 취지를 이해하는 것만으로 충분할 것입니다. GNU GPL을 올바르게 이해했는지 확인할 수 있는 GPL 퀴즈도 좋은 참고가 될 수 있습니다.

GPL에 대한 실제 사례들을 모은 참고할 만한 자료의 하나로 GPL 해설이 있습니다.

한국어 번역: 1998년 6월 18일 송창훈 <chsong@gnu.org>

목 차

  • GNU 일반 공중 이용허락
    • 전 문(前文)
    • 복제와 개작 및 배포에 관한 조건과 규정
    • 새로운 프로그램에 GPL을 적용하는 방법

GNU 일반 공중 이용허락

2판, 1991년 6월

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

누구든지 본 이용허락을 있는 그대로 복제하고 배포할 수 있습니다. 그러나 본문에 대한 수정은 허용되지 않습니다.

전문

소프트웨어에 적용되는 대부분의 이용허락(license)은 소프트웨어에 대한 수정과 공유의 자유를 제한하는 것을 그 목적으로 합니다. 그러나 GNU 일반 공중 이용허락(이하, ‘GPL’이라고 칭합니다)은 자유 소프트웨어에 대한 수정과 공유의 자유를 모든 사용자에게 보장하기 위해 성립된 것입니다. 자유 소프트웨어 재단이 제공하는 대부분의 소프트웨어에는 GPL이 적용되며, 몇몇 소프트웨어에는 별도의 이용허락인 GNU 약소 일반 공중 이용허락(GNU Lesser General Public License, 이하 ‘LGPL’이라고 칭합니다)을 대신 적용하기도 합니다. 자유 소프트웨어란 이를 사용하려는 모든 사람에게 동일한 자유와 권리를 함께 보장하는 소프트웨어를 말하며 프로그램 저작자의 의사에 따라 어떠한 종류의 프로그램에도 GPL을 적용할 수 있습니다. 여러분이 만든 프로그램에도 GPL을 적용할 수 있습니다.

자유 소프트웨어를 언급할 때 사용하는 `자유'라는 단어는 무료를 의미하는 금전적인 측면의 자유가 아닌 구속되지 않는다는 관점에서의 자유를 말하며, GPL은 자유 소프트웨어를 이용한 복제, 개작, 배포, 수익 사업 등 가능한 모든 형태의 자유를 실질적으로 보장합니다. 여기에는 원시 코드(소스 코드)의 전부 또는 일부를 원용해서 프로그램을 개선하거나 새로운 프로그램을 창작할 수 있는 자유가 포함되며, 자신에게 허락된 자유와 권리를 보다 명확하게 인식할 수 있도록 하기 위한 규정도 포함되어 있습니다.

GPL은 GPL 안에 소프트웨어 피이용허락자(licensee)의 권리를 제한하는 조항과 단서를 별도로 추가하지 못하게 함으로써 사용자의 자유와 권리를 실제로 보장합니다. 자유 소프트웨어의 개작과 배포에 관계하는 사람은 이러한 무조건적인 규정을 준수해야만 합니다.

예를 들어 GPL 프로그램을 배포할 경우에는 프로그램의 유료 판매나 무료 배포와 관계없이 자신이 그 프로그램에 대해 가질 수 있었던 모든 권리를, 프로그램을 받게 될 사람에게 그대로 허락해 주어야 합니다. 이 때는 프로그램의 원시 코드를 함께 제공하거나 원시 코드를 구할 수 있는 방법을 확실히 알려주어야 하고 이 모든 사항을 사용자가 분명히 알 수 있도록 해야 합니다.

자유 소프트웨어 재단은 다음 두 단계를 통해 사용자의 권리를 보호합니다. (1) 소프트웨어에 저작권을 설정합니다. (2) 실정법에 따라 유효한 법적 효력을 갖는 GPL을 통해 소프트웨어를 복제하거나 개작 및 배포할 수 있는 권리를 사용자에게 부여합니다.

자유 소프트웨어를 사용하는 사람은 반복적인 재배포 과정에서 소프트웨어 자체에 수정과 변형이 일어날 수 있으며, 이는 최초의 저작자가 만든 소프트웨어가 가진 문제가 아닐 수 있다는 개연성을 인식하고 있어야 합니다. 우리는 개작과 재배포 과정에서 다른 사람 때문에 발생한 문제로 인해 프로그램 원저작자의 명성이 훼손되는 것을 원치 않습니다. GPL에 자유 소프트웨어에 대한 어떠한 형태의 보증도 규정하지 않는 이유는 이러한 점이 고려되었기 때문이며, 이는 프로그램 원저작자와 자유 소프트웨어 재단의 자유로운 활동을 보장하는 현실적인 수단이기도 합니다.

특허 제도는 자유 소프트웨어의 발전을 위협하는 요소일 수밖에 없습니다. 자유 프로그램을 재배포하는 사람이 개별 특허를 취득하면, 결과적으로 그 프로그램이 사유 소프트웨어(proprietary software)가 될 가능성이 있습니다. 자유 소프트웨어 재단은 이러한 문제에 대처하기 위해 어떠한 특허도 그 사용 권리를 모든 사람(이하, `공중(公衆, general public)'이라고 칭합니다)에게 자유롭게 허용하는 경우에 한해서만 자유 소프트웨어와 함께 사용할 수 있다는 것을 명확히 밝힙니다.

복제(copying)와 개작(modification) 및 배포(distribution)에 관한 구체적인 조건과 규정은 다음과 같습니다.

복제와 개작 및 배포에 관한 조건과 규정

제0조. 본 이용허락은 저작권자가 GNU GPL에 따라 배포한다는 사항을 명시한 모든 컴퓨터 프로그램 저작물에 동일하게 적용됩니다. 컴퓨터 프로그램 저작물(이하, `프로그램'이라고 칭합니다)이란 특정한 결과를 얻기 위해 컴퓨터 등의 정보 처리 능력을 갖춘 장치(이하, `컴퓨터'라고 칭합니다) 안에서 직접 또는 간접으로 사용되는 일련의 지시 및 명령으로 표현된 창작물을 의미하며, `2차적 프로그램'이란 프로그램의 이용허락 또는 저작권법의 규정에 따라 프로그램의 전부 또는 상당 부분을 원용하거나 다른 프로그래밍 언어로의 번역을 포함할 수 있는 개작 과정을 통해 창작된 새로운 프로그램과 이와 관련된 저작물을 의미합니다(이후로 다른 프로그래밍 언어로의 번역은 별다른 제한 없이 개작의 범위에 포함되는 것으로 간주됩니다). `피이용허락자'란 GPL의 규정에 따라 프로그램을 이용허락 받은 사람을 의미하고, `원프로그램'이란 프로그램을 개작하거나 2차적 프로그램을 만드는 데 사용한 최초의 프로그램을 의미합니다.

본 이용허락은 프로그램에 대한 복제와 개작 그리고 배포 행위에만 적용됩니다. 따라서 프로그램을 실행하는 행위에 대한 제한은 없습니다. 프로그램의 결과물(output)에는, 그 결과물이 프로그램의 실행을 통해 생성된 것인지 아닌지에 상관없이, 결과의 내용이 원프로그램에서 파생된 2차적 프로그램을 구성했을 때에 한해 본 이용허락의 규정을 적용합니다. 2차적 프로그램의 구성 여부는 2차적 프로그램 안에서의 원프로그램의 역할을 토대로 판단합니다.

제1조. 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실을 각 복제물에 명시하는 한, 피이용허락자는 프로그램의 원시 코드를 자신이 받은 상태 그대로 어떠한 매체로든 복제하고 배포할 수 있습니다. 복제와 배포가 이루어질 때는 본 이용허락과 프로그램에 대한 보증이 제공되지 않는다는 사실에 관한 모든 내용을 그대로 유지해야 하며, 영문판 GPL을 함께 제공해야 합니다.

배포자는 복제물을 물리적으로 인도하는 데 소요된 비용을 청구할 수 있으며, 선택 사항으로 독자적인 유료 보증을 설정할 수 있습니다.

제2조. 피이용허락자는 자신이 받은 프로그램의 전부나 일부를 개작할 수 있으며, 이를 통해 2차적 프로그램을 창작할 수 있습니다. 개작한 프로그램이나 창작한 2차적 프로그램은 다음 사항을 모두 만족시키는 조건에 한해서, 제1조의 규정에 따라 또다시 복제되고 배포될 수 있습니다.

1항. 파일을 개작할 때는 파일을 개작한 사실과 그 날짜를 파일 안에 명시해야 합니다.

2항. 배포하거나 공표하려는 저작물의 전부 또는 일부가 이용허락 받은 프로그램에서 파생된 것이라면, 저작물 전체에 대한 사용 권리를 본 이용허락의 규정에 따라 공중에게 무상으로 허용해야 합니다.

3항. 개작한 프로그램의 일반적인 실행 형태가 대화형 구조로 명령어를 전달받는 방식인 경우에는 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실(별도의 보증을 설정한 경우라면 해당 내용)과 이용허락 받은 프로그램을 본 규정에 따라 재배포할 수 있다는 사실 그리고 GPL 사본을 참고할 수 있는 방법이 함께 포함된 문구가 프로그램이 대화형 구조로 평이하게 실행된 직후에 화면 또는 지면으로 출력되도록 해야 합니다(예외 규정: 프로그램이 대화형 구조를 갖고 있어도 통상적인 실행 환경에서 전술한 사항을 출력하지 않는 형태였을 경우에는 이를 개작한 프로그램 또한 관련 사항을 출력하지 않아도 무방합니다).

위 조항들은 개작된 프로그램 전체에 적용됩니다. 만약 개작된 프로그램에 포함된 특정 부분이 원프로그램에서 파생된 것이 아닌 별도의 독자적 저작물로 인정될 만한 상당한 이유가 있을 때는, 해당 저작물의 개별적인 배포에는 본 이용허락 규정이 적용되지 않습니다. 그러나 그 저작물이 2차적 프로그램의 일부로서 함께 배포된다면 개별적인 저작권과 배포 기준에 상관없이 저작물 모두에 본 이용허락이 적용되어야 하며, 전체 저작물에 대한 사용 권리는 공중에게 무상으로 이용허락 됩니다.

이러한 규정은 개별적인 저작물에 대한 저작자의 권리를 침해하거나 인정하지 않으려는 것이 아니라, 원프로그램에서 파생된 2차적 프로그램이나 수집 저작물의 배포를 일관적으로 규제하기 위한 것입니다.

원프로그램이나 원프로그램에서 파생된 2차적 프로그램을 이들에게서 파생되지 않은 다른 저작물과 함께 단순히 저장하거나 배포할 목적으로 동일한 매체에 모아 놓은 수집물의 경우, 원프로그램에서 파생되지 않은 다른 저작물에는 본 이용허락 규정이 적용되지 않습니다..

제3조. 피이용허락자는 다음 중 하나의 항목을 만족하는 조건일 때에 한해서 제1조와 제2조의 규정에 따라 프로그램(또는 제2조에서 언급한 2차적 프로그램)을 목적 코드(object code)나 실행물(executable form)의 형태로 복제하고 배포할 수 있습니다.

1항. 목적 코드나 실행물에 상응하는, 컴퓨터가 인식할 수 있는 완전한 원시 코드를 함께 제공해야 합니다. 원시 코드는 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 전달을 위해 일반적으로 사용하는 매체로 제공되어야 합니다.

2항. 배포에 필요한 최소한의 비용만을 받고 목적 코드나 실행물에 상응하는 완전한 원시 코드를 배포하겠다는, 최소한 3년간 유효한 약정서를 함께 제공해야 합니다. 이 약정서는 약정서를 가진 어떤 사람에 대해서도 유효해야 합니다. 원시 코드는 컴퓨터가 인식할 수 있는 형태여야 하고, 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 전달을 위해 일반적으로 사용하는 매체로 제공되어야 합니다.

3항. 목적 코드나 실행물에 상응하는 원시 코드를 배포하겠다는, 자신이 받은 정보를 함께 제공해야 합니다(3항은 위 2항에 따라 프로그램의 목적 코드나 실행물과 함께 원시 코드를 배포하겠다는 약정을 받았고, 동시에 비상업적인 배포를 할 경우에 한해서만 허용됩니다).

저작물에 대한 원시 코드란 해당 저작물을 개작하기에 적절한 형식을 의미합니다. 실행물에 대한 완전한 원시 코드란 실행물에 포함된 모든 모듈의 원시 코드와 이와 관련된 인터페이스 정의 파일 모두, 그리고 실행물의 컴파일과 설치를 제어하는데 사용된 스크립트 전부를 의미합니다. 그러나 특별한 예외의 하나로서 실행물이 실행될 운영체제의 주요 부분(컴파일러나 커널 등)과 함께 (원시 코드나 바이너리의 형태로) 일반적으로 배포되는 구성 요소들은 이러한 구성 요소 자체가 실행물에 수반되지 않는 한 원시 코드의 배포 대상에서 제외되어도 무방합니다.

목적 코드나 실행물을 지정한 장소에서 복제할 수 있게 하는 방식으로 배포할 경우, 동일한 장소에서 원시 코드를 복제할 수 있는 동등한 접근 방법을 제공한다면 원시 코드를 목적 코드와 함께 복제되도록 설정하지 않았더라도 원시 코드를 배포하는 것으로 간주됩니다.

제4조. 본 이용허락에 의해 명시적으로 이루어지지 않는 한, 프로그램에 대한 복제, 개작, 2차적 이용허락 설정과 배포는 성립되지 않습니다. 이와 관련된 어떠한 행위도 무효이며 본 이용허락이 보장한 권리는 자동으로 소멸됩니다. 그러나 본 이용허락의 규정에 따라 프로그램의 복제물이나 권리를 받았던 제3자는 본 이용허락의 규정을 준수하는 한, 배포자의 권리 소멸과 관계없이 사용상의 권리를 계속 유지할 수 있습니다.

제5조. 본 이용허락은 서명이나 날인을 수반하는 형식을 갖지 않기 때문에 피이용허락자가 본 이용허락의 내용을 반드시 받아들여야 할 필요는 없습니다. 그러나 프로그램이나 프로그램에 기반한 2차적 프로그램의 개작 및 배포를 허락하는 것은 본 이용허락에 의해서만 가능합니다. 만약 본 이용허락에 동의하지 않을 경우에는 이러한 행위가 법적으로 금지됩니다. 따라서 프로그램(또는 프로그램에 기반한 2차적 프로그램)을 개작하거나 배포하는 행위는 그에 따른 본 이용허락의 내용에 동의한다는 것을 의미하며, 복제와 개작 및 배포에 관한 본 이용허락의 조건과 규정을 모두 받아들이겠다는 의미로 간주됩니다.

제6조. 피이용허락자에 의해 프로그램(또는 프로그램에 기반한 2차적 프로그램)이 반복적으로 재배포될 경우, 각 단계에서의 피이용허락자는 본 이용허락의 규정에 따른 프로그램의 복제와 개작 및 배포에 대한 권리를 최초의 이용허락자에게 받은 것으로 자동으로 간주됩니다. 프로그램(또는 프로그램에 기반한 2차적 프로그램)을 배포할 때는 피이용허락자의 권리 행사를 제한할 수 있는 어떠한 사항도 추가할 수 없습니다. 그러나 재배포가 일어날 시점에서 제3의 피이용허락자에게 본 이용허락을 준수하도록 강제할 책임이 피이용허락자에게 부과되지는 않습니다.

제7조. 법원의 판결이나 특허권 침해 주장 또는 특허 문제에 국한되지 않은 그 밖의 이유로 본 이용허락 규정과 배치되는 사항이 발생하더라도, 배치된 사항이 선행하거나 본 이용허락의 조건과 규정이 면제되는 것은 아닙니다. 따라서 법원의 명령이나 합의 등에 의해 본 이용허락에 위배되는 사항이 발생하더라도 양측 모두를 만족시킬 수 없다면 프로그램은 배포될 수 없습니다. 예를 들어 직접 또는 간접적인 방법으로 프로그램 복제물을 이용허락 받은 임의의 제3자에게 특정한 특허 관련 허가가 해당 프로그램을 무상으로 재배포할 수 있게 허용하지 않는다면, 그러한 허가와 본 이용허락을 동시에 만족시키면서 프로그램을 배포할 수 있는 방법은 없습니다.

본 조항은 특정한 상황에서 본 조항의 일부가 유효하지 않거나 적용될 수 없을 경우에도 본 조항의 나머지 부분을 유효하게 할 의도로 만들어졌습니다. 따라서 그 외의 상황에서는 본 조항을 전체적으로 적용하면 됩니다.

본 조항의 목적은 특허나 저작권 침해 등의 행위를 조장하거나 해당 권리를 인정하지 않으려는 것이 아니라, GPL을 통해 구현한 자유 소프트웨어 배포 체계를 통합적으로 보호하기 위한 것입니다. 많은 사람이 배포 체계에 신뢰 있는 지원을 계속해 줌으로써 소프트웨어의 다양한 분야에 많은 공헌을 해 주었습니다. 소프트웨어를 어떤 배포 체계로 배포할 것인가를 결정하는 것은 전적으로 저작자와 기증자의 의지에 달린 것이지, 일반 사용자가 강요할 수 있는 것이 아닙니다.

본 조항은 본 이용허락의 다른 조항에서 무엇을 중요하게 고려해야 하는지를 명확히 해줍니다.

제8조. 특허나 저작권을 설정한 인터페이스 때문에 특정 국가에서 프로그램의 배포와 사용이 함께 또는 개별적으로 제한된 경우, 본 이용허락을 프로그램에 적용한 최초 저작권자는 문제가 발생하지 않는 국가에 한해 프로그램을 배포한다는 배포 상의 지역적 제한 조건을 명시적으로 설정할 수 있습니다. 이 경우 그러한 사항은 본 이용허락의 일부로 간주됩니다.

제9조. 자유 소프트웨어 재단은 때때로 본 이용허락의 개정판이나 신판을 공표할 수 있습니다. 새롭게 공표할 판은 당면한 문제나 현안을 처리하는 데 필요한 세부 내용에 차이가 있을 수 있지만, 그 근본정신은 변하지 않을 것입니다.

각각의 판은 판 번호를 사용해 구별합니다. 특정한 판 번호와 그 이후 판을 따른다는 사항을 명시한 프로그램에는 해당 판이나 그 이후에 발행된 어떤 판을 선택해 적용해도 무방하고, 판 번호를 명시하지 않은 경우에는 자유 소프트웨어 재단이 공표한 어떠한 판 번호의 판을 적용해도 무방합니다.

제10조. 프로그램의 일부를 본 이용허락과 배포 기준이 다른 자유 프로그램과 함께 결합하고자 할 경우에는 해당 프로그램의 저작자에게 서면 승인을 받아야 합니다. 자유 소프트웨어 재단이 저작권을 가진 소프트웨어의 경우에는 자유 소프트웨어 재단의 승인을 얻어야 합니다. 우리는 이러한 요청을 수락하기 위해 때때로 예외 기준을 만들기도 합니다. 자유 소프트웨어 재단은 일반적으로 자유 소프트웨어의 2차적 저작물을 모두 자유로운 상태로 유지하려는 목적과 소프트웨어의 공유와 재활용을 증진하려는 두 가지 목적을 기준으로 승인 여부를 결정할 것입니다.

보증의 결여 (제11조, 제12조)

제11조. 본 이용허락을 따르는 프로그램은 무상으로 양도되기 때문에 관련 법률이 허용하는 한도 안에서 어떠한 형태의 보증도 제공하지 않습니다. 프로그램 저작권자와 배포자가 공동 또는 개별적으로 별도의 보증을 서면으로 제공한 경우를 제외하면, 특정한 목적에 대한 프로그램의 적합성이나 상업성 여부에 대한 보증을 포함한 어떠한 형태의 보증도 명시적이나 묵시적으로 설정되지 않은 `있는 그대로의' 상태로 이 프로그램을 배포합니다. 프로그램과 프로그램의 실행에 따라 발생할 수 있는 모든 위험은 피이용허락자에게 인수되며 이에 따른 보수 및 복구를 위한 제반 경비 또한 피이용허락자가 모두 부담해야 합니다.

제12조. 저작권자나 배포자가 프로그램의 손상 가능성을 사전에 알고 있었더라도 발생한 손실이 관련 법규에 의해 보호되거나 이에 대한 별도의 서면 보증을 설정한 경우가 아니라면, 저작권자나 프로그램을 원래의 상태 또는 개작한 상태로 제공한 배포자는 프로그램의 사용 또는 프로그램이 작동하지 않아 발생한 손실이나 프로그램 자체의 손실에 대해 책임지지 않습니다. 이러한 면책 조건은 사용자나 제3자가 프로그램을 조작함으로써 발생한 손실이나 다른 소프트웨어와 프로그램을 함께 동작시켜 발생한 데이터의 상실 및 부정확한 산출 결과에만 국한되는 것이 아닙니다. 발생한 손실의 일반성이나 특수성뿐 아니라 원인의 우발성 및 필연성도 전혀 고려되지 않습니다.

복제와 개작 및 배포에 관한 조건과 규정의 끝.

새로운 프로그램에 GPL을 적용하는 방법

새로운 프로그램을 개발하고 그 프로그램이 많은 사람에게 최대한 유용하게 사용되기를 원한다면, 본 이용허락에 따라 누구나 자유롭게 개작하고 재배포할 수 있는 자유 소프트웨어로 만드는 것이 최선의 방법입니다.

프로그램을 자유 소프트웨어로 만들기 위해서는 다음 사항을 프로그램에 추가하면 됩니다. 프로그램에 대한 보증을 제공하지 않는다는 사실을 가장 효과적으로 전달할 수 있는 방법은 원시 코드 파일의 시작 부분에 이러한 사항을 추가하는 것입니다. 각각의 파일에는 최소한 저작권을 명시한 행과 본 이용허락의 전체 내용을 참고할 수 있는 위치 정보를 명시해야 합니다.

프로그램의 이름과 용도를 한 줄 정도로 설명합니다.
Copyright (C) 20yy년 <프로그램 저작자 이름>

이 프로그램은 자유 소프트웨어입니다. 소프트웨어 피이용허락자는 자유 소프트웨어 재단이 공표한 GNU GPL 2판 또는 그 이후 판을 임의로 선택해, 그 규정에 따라 프로그램을 개작하거나 재배포할 수 있습니다.

이 프로그램은 유용하게 사용되리라는 희망으로 배포되지만, 특정한 목적에 맞는 적합성 여부나 판매용으로 사용할 수 있다는 묵시적인 보증을 포함한 어떠한 형태의 보증도 제공하지 않습니다. 보다 자세한 사항은 GNU GPL을 참고하시기 바랍니다.

GNU GPL은 이 프로그램과 함께 제공됩니다. 만약 이 문서가 누락되어 있다면 자유 소프트웨어 재단으로 문의하시기 바랍니다(자유 소프트웨어 재단: Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA).

또한 사용자가 프로그램을 배포한 사람에게 전자메일과 서면으로 연락할 수 있는 정보를 추가해야 합니다.

프로그램이 명령어 입력 방식에 의한 대화형 구조를 택하고 있다면, 프로그램을 대화형 방식으로 실행했을 때 다음 주의 사항이 출력되어야 합니다.

Gnomovision version 69, Copyright (C) 20yy년 <프로그램 저작자 이름>

Gnomovision 프로그램은 제품에 대한 어떠한 형태의 보증도 제공하지 않습니다. 보다 자세한 사항은 `show w' 명령을 실행해 참고할 수 있습니다. 이 프로그램은 자유 소프트웨어입니다. 이 프로그램은 배포 규정을 만족시키는 조건 아래 자유롭게 재배포될 수 있습니다. 배포 규정은 `show c' 명령을 통해 참고할 수 있습니다.

`show w'와 `show c'는 GPL의 해당 부분을 출력하기 위한 가상의 명령어입니다. 따라서 `show w'나 `show c'가 아닌 다른 형태를 사용해도 무방하며, 마우스 클릭이나 메뉴 방식과 같은 프로그램에 적합한 다른 형식을 취해도 괜찮습니다.

만약 프로그램 저작자가 학교나 기업과 같은 단체나 기관에 고용되어 있다면 프로그램의 자유로운 배포를 위해 고용주나 해당 기관장으로부터 프로그램에 대한 저작권 포기 각서를 받아야 합니다. 예를 들어 다음과 같은 형식이 될 수 있습니다(아래 문구를 실제로 사용할 경우에는 예로 든 이름들을 실제 이름으로 대체하면 됩니다).

본사는 제임스 해커가 만든 (컴파일러에서 패스를 생성하는) `Gnomovision' 프로그램에 관련된 모든 저작권을 포기합니다.

1989년 4월 1일
Yoyodye, Inc., 부사장: Ty Coon
서명: Ty Coon의 서명

GNU GPL은 자유 소프트웨어를 독점 소프트웨어와 함께 결합하는 것을 허용하지 않습니다. 만약 작성된 프로그램이 서브루틴 라이브러리일 경우에는 독점 소프트웨어가 해당 라이브러리를 링크할 수 있도록 허용하는 것이 보다 효과적으로 활용될 수 있는 방법이라고 생각할 수 있습니다. 그런 경우에는 본 이용허락 대신 GNU LGPL을 사용함으로써 소기의 목적을 충족시킬 수 있습니다.

Software License

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS


Objects

객체

오토핫키에서 객체(object)는 추상 데이터 유형으로서 세 가지 기본 기능을 제공합니다:

  • GET 값을 얻는다.
  • SET 값을 설정한다.
  • CALL 메쏘드를 호출한다 (다시 말해, 메쏘드란 대상 객체를 가지고 일을 하는 함수입니다).

객체 참조는 특정 객체를 가리키는 포인터 또는 핸들("handle")입니다. 문자열과 숫자처럼, 객체 참조는 변수에 저장하고 함수로부터 반환하며 객체 안에 저장할 수 있습니다. x := y 처럼 참조를 한 변수에서 다른 변수로 복사하고 나면, 두 변수 모두 같은 객체를 가리킵니다.

IsObject를 사용하면 값이 객체인지 판별할 수 있습니다:

Result := IsObject(expression)

객체의 종류는 다음과 같습니다:

  • Object - 스크립트 가능한 연관배열.
  • File - 파일 입/출력에 인터페이스를 제공합니다.
  • Function 객체 - Func, BoundFunc 또는 사용자-정의.
  • ComObject - IDispatch 인터페이스를 포장합니다 (COM 또는 "자동화" 객체).

목차

  • 기본 사용법 - 단순 배열, 연관 배열, 객체, 객체 풀어주기, 논평
  • 확장 사용법 - 함수 참조, 배열의 배열, 함수 배열
  • 맞춤 객체 - 프로토타입, 클래스, 구성과 파괴, 메타-함수
  • 기본 베이스 객체 - 자동 변수 초기화, 의사-특성, 디버깅
  • 구현 - 참조횟수-세기, 객체를 가리키는 포인터

기본 사용법

단순한 배열

배열을 만듭니다:

Array := [Item1, Item2, ..., ItemN]
Array := Array(Item1, Item2, ..., ItemN)

항목을 열람합니다:

Value := Array[Index]

항목을 할당합니다:

Array[Index] := Value

주어진 인덱스에 항목(들)을 삽입합니다:

Array.InsertAt(Index, Value, Value2, ...)

항목(들)을 추가합니다:

Array.Push(Value, Value2, ...)

항목을 제거합니다:

RemovedValue := Array.RemoveAt(Index)

마지막 항목을 제거합니다:

RemovedValue := Array.Pop()

배열이 비어 있지 않으면, MinIndex와 MaxIndex/Length는 배열에서 현재 사용중인 가장 낮은 인덱스와 가장 높은 인덱스를 돌려줍니다. 가장 낮은 인덱스는 거의 대부분 1이므로, MaxIndex는 보통 항목의 개수를 돌려줍니다. 그렇지만, 정수 키가 없다면, MaxIndex는 빈 문자열을 돌려줍니다. 반면에 Length는 0을 돌려줍니다. 배열의 내용은 인덱스 또는 For-loop로 회돌이할 수 있습니다. 예를 들어:

array := ["one", "two", "three"]

; 1부터 배열의 끝까지 반복합니다:
Loop % array.Length()
    MsgBox % array[A_Index]

; 배열의 내용을 열거합니다:
For index, value in array
    MsgBox % "Item " index " is '" value "'"

연관 배열

연관 배열은 유일한 키 집단과 유일한 값 집단을 포함하는 객체입니다. 각 키는 각 값에 연관되어 있습니다. 키는 문자열이나 정수또는 객체가 될 수 있는 반면, 값은 어떤 유형도 될 수 있습니다. 연관 배열을 다음과 같이 만들 수 있습니다:

Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ}
Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ)

{key:value} 표기법을 사용하면, 오직 단어 문자로만 구성된 키에는 인용부호를 생략해도 됩니다. 어떤 표현식도 키로 사용할 수는 있지만, 변수를 키로 사용하려면, 반드시 괄호로 둘러싸야 합니다. 예를 들어, {(KeyVar): Value}과 {GetKey(): Value}는 모두 유효합니다.

항목을 열람합니다:

Value := Array[Key]

항목을 할당합니다:

Array[Key] := Value

항목을 제거합니다:

RemovedValue := Array.Delete(Key)

항목을 열거합니다:

array := {ten: 10, twenty: 20, thirty: 30}
For key, value in array
    MsgBox %key% = %value%

연관 배열은 중간 중간 비워서 만들 수 있습니다 - 즉, {1:"a",1000:"b"}는 오직 두 개의 키-값 쌍만 들어 있습니다. 1000개가 아닙니다.

AutoHotkey v1.x에서 단순 배열과 연관 배열은 같은 것입니다. 그렇지만 []를 단순 배열로 간주하는 것이 그의 목적을 명확하게 보여주는 데 도움이 되고, 미래 버전의 오토핫키에 스크립트가 작동할 가능성을 높여줍니다. 앞으로는 단순 배열과 연관 배열 사이에 차이가 있을 수 있습니다.

객체

특성을 열람합니다:

Value := Object.Property

특성을 설정합니다:

Object.Property := Value

메쏘드를 호출합니다:

ReturnValue := Object.Method(Parameters)

계산한 메쏘드 이름으로 메쏘드를 호출합니다:

ReturnValue := Object[MethodName](Parameters)

COM 객체의 특성과 사용자-정의 객체는 매개변수를 받을 수 있습니다:

Value := Object.Property[Parameters]
Object.Property[Parameters] := Value

관련 항목: Object, File Object, Func Object, COM object

알려진 한계:

  • 현재 x.y[z]()는 x["y", z]()으로 간주되는데, 이는 지원하지 않습니다. 임시 해결책으로, (x.y)[z]()는 먼저 x.y를 평가한 다음, 그 결과를 메쏘드 호출의 목표로 사용합니다. x.y[z].Call()에는 이 한계가 없다는 것을 주목하십시오. 왜냐하면 (x.y[z]).Call()과 똑같이 평가되기 때문입니다.

객체 풀어주기

스크립트는 명시적으로 객체를 풀어주지 않습니다. 객체를 가리키는 마지막 참조가 사라지면, 그 객체는 자동으로 해제됩니다. 변수에 저장된 참조는 그 변수가 다른 값에 할당되면 자동으로 해제됩니다. 예를 들어:

obj := {}  ; 객체를 생성합니다.
obj := ""  ; 마지막 참조를 해제합니다. 그러므로 객체가 해방됩니다.

비슷하게, 또다른 객체의 필드에 저장된 참조점은 그 필드가 또다른 값에 할당되거나 그 객체로부터 제거될 때 자동으로 풀어집니다. 이것은 배열에도 적용됩니다. 배열은 실제로 객체입니다.

arr := [{}]  ; 객체를 담고 있는 배열을 생성합니다.
arr[1] := {}  ; 두 번째 객체를 생성합니다. 묵시적으로 첫 객체를 풀어주고 있습니다.
arr.Remove(1)  ; 두 번째 객체를 제거하고 풀어줍니다.

한 객체를 가리키는 모든 참조가 해제되어야 비로서 그 객체가 해방될 수 있습니다. 그래서 순환 참조가 있는 객체는 자동으로 풀어지지 않습니다. 예를 들면, x.child가 y를 가리키고 y.parent가 x를 가리킨다면, x와 y를 소거하는 것만으로는 충분하지 않습니다. 왜냐하면 부모 객체에 여전히 자손을 가리키는 참조가 들어있고 그 반대도 마찬가지이기 때문입니다. 이 문제를 해결하려면, 순환 참조를 제거해야 합니다.

x := {}, y := {}             ; 객체를 두 개 생성합니다.
x.child := y, y.parent := x  ; 순환 참조를 생성합니다.

y.parent := ""               ; 순환 참조를 먼저 제거해야 객체가 해방될 수 있습니다.
x := "", y := ""             ; 위의 줄이 없다면, 이 줄로는 객체를 풀어줄 수 없습니다.

더 자세한 내용과 고급 사용법은 참조 횟수 세기를 보십시오.

논평

구문

모든 유형의 객체는 배열 구문(각괄호)과 객체 구문 (점)을 지원합니다.

게다가, 객체 참조는 표현식에 사용할 수 있습니다:

  • 객체 참조를 = == != <>중의 하나를 사용하여 다른 값과 비교할 때, 두 값 모두 같은 객체를 가리키는 참조점일 경우에만 같다고 간주됩니다.
  • if obj, !obj 또는 obj ? x : y에서와 같이 불리언 값이 요구될 때, 객체는 언제나 참(true)으로 간주됩니다.
  • 객체의 주소는 & 주소 연산자를 사용하여 열람할 수 있습니다. 생성 시점부터 마지막 참조가 해제될 때까지 그 객체를 유일하게 식별합니다.

객체가 예상치 못한 문맥에서 사용중이면, 그 객체는 빈 문자열로 취급됩니다. 예를 들어, MsgBox %object% 는 빈 MsgBox를 보여주고 object + 1는 빈 문자열을 산출합니다. 이 행위는 바뀔 수 있으므로 여기에 의존하면 안됩니다.

메쏘드-호출 다음에 곧바로 할당 연산자가 오면, 매개변수로 특성을 할당하는 것과 동등합니다. 예를 들어, 다음은 서로 동등합니다:

obj.item(x) := y
obj.item[x] := y

x.y += 1와 --arr[1]같은 복합 서술문을 지원합니다.

[v1.1.20+]: 특성을 설정하거나 획득할 때 매개변수를 생략할 수 있습니다. 예를 들어, x[,2]. 스크립트는 이를 이용하여 특성과 메타-함수의 매개변수에 기본 값들을 정의할 수 있습니다. 메쏘드 이름도 x[](a)처럼 완전히 생략 가능합니다. 스크립트는 이를 이용하여 __Call 메타-함수의 매개변수에 기본 값을 정의할 수 있습니다. 왜냐하면 그렇지 않으면 값이 제공되지 않기 때문입니다. 이것은 x.(a)와 다르며, x[""](a)과 동등한 것에 주목하십시오. COM 객체를 호출할 때 특성이나 메쏘드 이름이 생략되면, 그의 "기본 멤버"가 호출됩니다.

키

[], {} 또는 new 연산자로 생성된 객체에 어느 값을 사용할 수 있는지는 약간 제한이 있습니다 :

  • 정수 키는 고유의 부호있는 정수 유형으로 저장됩니다. 오토핫키 32-비트 버전은 -2147483648 부터 2147483647까지 범위의 정수키를 지원합니다. 오토핫키는 64-비트 정수를 지원합니다. 그러나 오직 오토핫키 64-비트 버전만 객체에 완전한 범위의 정수를 키로 지원합니다.
  • 위에 언급한 결과로, 정수 값의 문자열 형식은 유지되지 않습니다. 예를 들어, x[0x10], x[16] 그리고 x[00016]는 동등합니다. 이것은 또 십진 소수점이 없는 숫치 문자열에도 적용됩니다.
  • 인용부호 붙은 기호 문자열은 v1.x에서 순수하게 비-숫자로 간주됩니다. 그래서 x[1]과x["1"]는 동등하지 않습니다. 게다가, 인용부호 붙은 기호 문자열은 ( "0x" x에서 처럼) 또다른 값과 결합합니다. 그 결과는 순수하게 비-숫자로 취급됩니다. 그렇지만, 이것은 변수에 적용되지 않습니다. 그래서 x[1]와 x[y:="1"]는 동등합니다. 이 문제는 v2에서 해결될 것입니다. 그래서 스크립트는 인용부호 붙은 숫치 기호를 키로 사용하는 것을 피해야 합니다.
  • 부동 소수점수는 키로 지원하지 않습니다. - 대신에 문자열로 변환됩니다. v1.x에서, 부동 소수점 기호는 원래의 형식을 유지하는 반면에 (0+1.0나 Sqrt(y)의 결과 같이) 순수한 부동 소수점 수는 강제로 현재의 부동 소수점 수 형식으로 변환됩니다. 일관성과 명료함을 위하여, 스크립트는 부동 소수점 기호를 키로 사용하지 말아야 합니다.
  • 문자열 키로서 "base"는 Insert에 사용될 때를 제외하고 특별한 의미가 있습니다.

확장 사용법

함수 참조 [v1.1.00+]

변수 func에 함수 이름이 들어 있다면, 그 함수는 두 가지 방법으로 호출할 수 있습니다: %func%() 또는 func.(). 그렇지만, 이렇게 하려면 매번 함수 이름을 결정해야 하는데, 함수가 여러번 호출된다면 효율적이지 못합니다. 수행성능을 개선하기 위해, 스크립트는 함수에 대한 참조를 열람해 그것을 저장해 나중에 사용할 수 있습니다:

Func := Func("MyFunc")

함수는 다음과 같은 구문을 사용하여 참조로 호출할 수 있습니다:

RetVal := %Func%(Params)     ; v1.1.07+을 요구합니다
RetVal := Func.Call(Params)  ; v1.1.19+을 요구합니다
RetVal := Func.(Params)      ; 권장하지 않습니다

함수 참조의 추가 특성들에 관한 정보는 Func Object를 참조하십시오.

배열의 배열

오토핫키는 "다-차원" 배열을 지원합니다. 다른 배열 안에 배열을 투명하게 저장하면 됩니다. 예를 들어, 테이블은 행의 배열로 표현할 수 있습니다. 반면에 각 행 자체는 열의 배열입니다. 그 경우, x행 y열의 내용은 아래의 방법중 하나를 사용하여 설정할 수 있습니다:

table[x][y] := content  ; A
table[x, y] := content  ; B

table[x]가 존재하지 않으면, A와 B는 두 가지 점에서 다릅니다:

  • A는 실패하는 반면 B는 자동으로 객체를 만들어 그것을 table[x] 안에 저장합니다.
  • table의 base는 메타-함수를 정의합니다. 다음과 같이 호출합니다:
    table.base.__Get(table, x)[y] := content   ; A
table.base.__Set(table, x, y, content)     ; B
    결과적으로, B는 객체가 전체적인 할당에 대하여 맞춤 행위를 정의하도록 허용합니다.

table[a, b, c, d] := value와 같은 다-차원 할당은 다음과 같이 처리됩니다:

  • 오직 하나의 키만 남아 있다면, 할당을 수행하고 반환된다. 그렇지 않으면:
  • 객체에서 목록에 있는 첫 번째 키를 찾는다.
  • 비-객체가 발견되면, 실패한다.
  • 객체가 발견되지 않으면, 하나를 만들어 저장한다.
  • 재귀적으로 하위-객체를 요청하면서, 남아 있는 키와 값을 건넨다. - 위에서 아래로 반복한다.

다음 행위는 오직 스크립트로-만든 객체에만 적용됩니다. 좀 더 전문화된 유형의 객체, COM 객체나 COM 배열은 적용되지 않습니다.

함수 배열

함수 배열은 단순히 함수 이름이나 참조를 담고 있는 배열입니다. 예를 들어:

array := [Func("FirstFunc"), Func("SecondFunc")]

; 각 함수를 호출한다, "foo"를 매개변수로 건넨다:
Loop 2
    array[A_Index].("foo")

; 각 함수를 호출한다. 묵시적으로 배열 자체를 매개변수로 건넨다:
Loop 2
    array[A_Index]()

FirstFunc(param) {
    MsgBox % A_ThisFunc ": " (IsObject(param) ? "object" : param)
}
SecondFunc(param) {
    MsgBox % A_ThisFunc ": " (IsObject(param) ? "object" : param)
}

하위-호환을 위해, array[A_Index]에 함수 참조가 아니라 함수 이름이 들어 있다면, 두 번째 형태는 배열(array)을 매개변수로 건네지 않습니다. 그렇지만, array[A_Index]가 array.base[A_Index]으로부터 상속되었다면, 배열(array)이 매개변수로 건네집니다.

맞춤 객체

스크립트로 만든 객체는 미리 정의된 구조를 가질 필요가 없습니다. 대신에, 각 객체는 특성과 메쏘드를 그의 base 객체로부터 상속받아야 합니다 (그렇지 않으면 "프로토타입" 또는 "class"라고 알려진). 특성과 메쏘드는 언제든지 객체에 추가할 수도 (제거할 수도) 있습니다. 이런 변경은 이로부터 파생된 모든 객체에 영향을 미칩니다. 보다 복잡하고 전화된 상황을 위해, 베이스 객체는 자신을 상속받은 객체들의 표준 행위를 오버라이드 할 수 있습니다. 메타-함수를 정의해 오버라이드 합니다.

Base 객체는 그냥 평범한 객체이며, 전형적으로 두 가지 방식으로 생성됩니다:

class baseObject {
    static foo := "bar"
}
; 또는
baseObject := {foo: "bar"}

객체를 또다른 객체로부터 파생시켜 생성하기 위해, 스크립트는 base 특성에 할당하거나 new 키워드를 사용할 수 있습니다:

obj1 := Object(), obj1.base := baseObject
obj2 := {base: baseObject}
obj3 := new baseObject
MsgBox % obj1.foo " " obj2.foo " " obj3.foo

언제든지 한 객체의 base를 재할당할 수 있습니다. 객체가 상속받은 모든 특성과 메쏘드를 효과적으로 교체합니다.

프로토타입

프로토타입 또는 base 객체는 다른 객체와 마찬가지로 구성하고 조작합니다. 예를 들어, 특성 하나와 메쏘드 하나를 가진 평범한 객체는 다음과 같이 구성할 수 있습니다:

; 객체를 생성한다.
thing := {}
; Store a value.
thing.foo := "bar"
; 함수 참조를 저장함으로써 메쏘드를 생성한다.
thing.test := Func("thing_test")
; 메쏘드를 호출한다.
thing.test()

thing_test(this) {
   MsgBox % this.foo
}

thing.test()가 호출되면, thing는 자동으로 매개변수 리스트의 첫번째로 삽입됩니다. 그렇지만, 하위 호환을 위해, 이런 일은 함수가 (참조가 아니라) 이름으로 (베이스 객체로부터 상속받는 것이 아니라) 직접적으로 객체에 저장될 경우에만 일어납니다. 관례적으로 함수는 객체의 유형과 메쏘드의 이름을 결합해 짓습니다.

객체는 또다른 객체가 그로부터 파생해 나가면 프로토타입(prototype) 또는 베이스(base)가 됩니다:

other := {}
other.base := thing
other.test()

이 경우, other는 foo를 상속받고 test는 thing으로부터 상속을 받습니다. 이런 상속 관계는 역동적입니다. 그래서 thing.foo가 변경되면, 그 변경이 other.foo에 반영됩니다. 스크립트가 other.foo에 할당하면, 그 값은 other에 저장됩니다. thing.foo에 변경을 더 가하더라도 other.foo에는 영향을 미치지 않습니다. other.test()가 호출되면, 그의 this 매개변수에는 thing이 아니라 other를 가리키는 참조가 들어갑니다.

클래스 [v1.1.00+]

어원으로 말하자면 "클래스"란 공통의 특성이나 속성을 가지고 있는 것들의 한 범주 또는 집합입니다. base 객체나 prototype 객체는 객체 집합에 대하여 특성과 행위를 정의하기 때문에, 클래스(class) 객체라고 부를 수도 있습니다. 편의를 위해, 베이스 객체는 아래에 보여주는 바와 같이 "class" 키워드를 사용하여 정의할 수 있습니다:

class ClassName extends BaseClassName
{
    InstanceVar := Expression
    static ClassVar := Expression

    class NestedClass
    {
        ...
    }

    Method()
    {
        ...
    }

    Property[]  ; 각괄호는 선택적이다
    {
        get {
            return ...
        }
        set {
            return ... := value
        }
    }
}

스크립트가 적재될 때, 이 코드는 객체를 하나 구성하고 그것을 전역 변수 (또는 v1.1.05+이라면 수퍼-전역 변수) ClassName에 저장합니다. v1.1.05 이전이라면, 이 클래스를 함수 안에서 참조하려면, 그 함수가 assume-global이 아닌 한, global ClassName와 같은 선언이 필요합니다. extends BaseClassName가 있으면, BaseClassName은 반드시 또다른 클래스의 완전한 이름이어야 합니다 (그러나 v1.1.11에서는 정의된 순서는 문제가 되지 않습니다). 각 클래스의 완전한 이름이 object.__Class에 저장됩니다.

이 문서 안에서 클래스("class")라는 단어는 그 자체로 보통 class 키워드로 구성된 클래스 객체를 의미합니다.

클래스 정의는 변수 선언, 메쏘드 정의, 내포 클래스 정의를 포함할 수 있습니다.

실체 변수 [v1.1.01+]

실체 변수는 클래스의 각 실체가 자신만의 클래스 사본을 가진 것입니다. 보통의 할당처럼 선언되지만, this. 접두사가 생략되어 있습니다 (클래스 몸체 안에서 직접적으로 사용될 경우에만 생략합니다):

InstanceVar := Expression

이런 선언은 클랫의 새 실체가 new 키워드로 생성될 때마다 매번 평가됩니다. 메쏘드 이름 __Init은 이런 목적을 위해 예약되어 있으며, 다른 스크립트에서 사용하면 안됩니다. __New() 메쏘드는 베이스 클래스에 정의된 선언을 포함하여 그 모든 선언이 평가된 후에 호출됩니다. 표현식은 다른 실체 변수와 메소드에 this를 통하여 접근할 수 있지만, 모든 다른 변수 참조는 전역적이라고 간주됩니다.

실체 변수에 접근하려면 (메쏘드 안에서도 마찬가지로), 언제나 목표 객체를 지정합니다; 예를 들어, this.InstanceVar.

[v1.1.08+]: 이 클래스에 x가 미리 선언되어 있다면 x.y := z와 같은 선언도 지원됩니다. 예를 들어, x := {}, x.y := 42는 x를 선언하고 또 this.x.y를 초기화합니다.

정적/클래스 변수 [v1.1.00.01+]

정적/클래스 변수는 클래스 자체에 속하지만, (하위-클래스를 포함하여) 파생 객체가 상속받을 수 있습니다. 실체 변수처럼 선언되지만, static 키워드를 사용합니다:

static ClassVar := Expression

정적 선언은 오직 자동-실행 섹션 전에 한 번만 평가됩니다. 그리고 순서대로 스크립트에 나타납니다. 각 선언은 값을 object 클래스에 저장합니다. 표현식 안의 모든 변수 참조는 전역적이라고 간주됩니다.

클래스 변수에 접근하려면, 언제나 클래스나 파생 객체를 지정합니다. 예를 들어, ClassName.ClassVar.

[v1.1.08+]: 이 클래스에 x가 미리 정의되어 있다면 static x.y := z와 같은 표현도 지원합니다. 예를 들어, static x := {}, x.y := 42는 x를 선언하고 또 ClassName.x.y를 초기화합니다.

내포 클래스

내포 클래스 정의는 클래스 객체를 또다른 전역 변수가 아니라 또다른 클래스 객체 안에 저장되도록 허용합니다. 위의 예제에서, class NestedClass는 객체를 구성하고 그것을 ClassName.NestedClass에 저장합니다. 하위-클래스는 NestedClass를 상속받거나 자신의 내포 클래스로 그것을 오버라이드할 수 있습니다 (이 경우 new this.NestedClass를 사용하여 적절한 클래스를 실체화할 수 있습니다).

class NestedClass
{
    ...
}

메쏘드

메쏘드 정의는 함수 정의와 모습이 똑 같습니다. 각 메쏘드는 숨은 매개변수로 this가 있는데, 이것은 전형적으로 클래스로부터 상속받은 객체를 가리키는 참조점을 담고 있습니다. 그렇지만, 메쏘드가 어떻게 호출되는 가에 따라 클래스 자체나 상속받은 클래스를 가리키는 참조점을 담을 수도 있습니다. 메쏘드는 이 클래스 객체에 참조로 저장됩니다.

Method()
{
    ...
}

메쏘드 안에서, 의사-키워드 base를 사용하면, 파생 클래스 안에 오버라이드된 수퍼-클래스의 메쏘드나 특성에 접근할 수 있습니다. 예를 들어, 위에 정의된 클래스에서 base.Method()는 BaseClassName에 정의된 Method 버전을 호출합니다. 메타-함수는 호출되지 않습니다; 그렇지 않으면, base.Method()는 마치 BaseClassName.Method.(this)처럼 행위합니다. 다시 말해,

  • base.Method()는 언제나 현재 메소드가 정의되어 있는 클래스의 베이스를 요청합니다. this가 전적으로 그 클래스 또는 다른 클래스의 sub-class로부터 파생되었을지라도 말입니다.
  • base.Method()는 묵시적으로 this를 첫 (숨은) 매개변수로 건넵니다.

base는 다음에 점. 또는 각괄호 []가 따라오면 특별한 의미를 가집니다. 그래서 obj := base, obj.Method()와 같은 코드는 작동하지 않습니다. 스크립트는 base의 특별한 행위를 불능으로 만들 수 있습니다. 거기에다 비어있지-않은 값을 할당하면 됩니다; 그렇지만, 이것은 권장하지 않습니다. 왜냐하면 변수 base는 꼭 비어 있어야 합니다. 스크립트가 #NoEnv를 빼먹으면 수행성능이 저하될 수 있기 때문입니다.

Properties [v1.1.16+]

특성 정의는 스크립트가 특정한 키를 설정하거나 열람할 때마다 메쏘드를 실행하도록 허용합니다.

Property[]
{
    get {
        return ...
    }
    set {
        return ... := value
    }
}

Property는 그냥 호출하는 데 사용되는 특성의 이름일 뿐입니다. 예를 들면, obj.Property는 get을 호출하는 반면에 obj.Property := value는 set을 호출합니다. get이나 set 안에서, this는 요청 중인 객체를 가리킵니다. set 안에서, value에는 할당된 값이 담깁니다.

매개변수는 특성 이름의 오른쪽에 각괄호로 둘러싸 건넬 수 있습니다. 특성을 정의할 때와 호출할 때 모두 마찬가지입니다. 각괄호를 사용하는 외에도, 특성의 매개변수는 메쏘드의 매개변수와 같은 방식으로 정의됩니다 - 선택적, ByRef 그리고 가변 매개변수를 지원합니다.

get이나 set의 반환값은 해당 특성을 요청한 하위-표현식의 결과가 됩니다. 예를 들어, val := obj.Property := 42는 set의 반환 값을 val에 저장합니다.

각 클래스는 특성의 절반만 또는 둘 다 온전하게 정의할 수 있습니다 (특성=속성). 클래스가 특성을 오버라이드 하면 base.Property를 사용하여 자신의 기본 클래스에 정의된 특성에 접근할 수 있습니다. get이나 set이 정의되어 있지 않으면, 기본 클래스가 처리할 수 있습니다. set이 정의되어 있지 않고 메타-함수나 기본 클래스에 의하여 처리되지 않은 경우, 값을 객체에 저장하면 그 특성이 불능이 되는 효과가 있습니다.

내부적으로, get과 set은 두 개의 다른 메쏘드입니다. 그래서 변수를 공유할 수 없습니다 (this에 저장한 변수는 가능합니다).

메타-함수는 객체의 메쏘드와 특성에 접근을 보다 넓게 제어합니다. 그러나 더 복잡하고 에러를 일으키는 경향이 더 높습니다.

구성과 파괴

파생 객체가 new 키워드로 생성될 때마다 [requires v1.1.00+], 그의 기반 클래스에 정의된 __New 메쏘드가 호출됩니다. 이 메쏘드는 매개변수를 받아, 그 객체를 초기화하고 new 연산자의 결과를 값을 돌려줌으로써 오버라이드할 수 있습니다. 객체가 파괴될 때, __Delete가 호출됩니다. 예를 들어:

m1 := new GMem(0, 20)
m2 := {base: GMem}.__New(0, 30)

class GMem
{
    __New(aFlags, aSize)
    {
        this.ptr := DllCall("GlobalAlloc", "uint", aFlags, "ptr", aSize, "ptr")
        if !this.ptr
            return ""
        MsgBox % "New GMem of " aSize " bytes at address " this.ptr "."
        return this  ; 'new' 연산자를 사용하면 이 줄은 생략할 수 있다.
    }

    __Delete()
    {
        MsgBox % "Delete GMem at address " this.ptr "."
        DllCall("GlobalFree", "ptr", this.ptr)
    }
}

__Delete는 "__Class"를 키로 가지는 객체에 호출되지 않습니다. 클래스 객체가 이 키를 기본값으로 가집니다.

메타-함수

메쏘드 구문:
class ClassName {
    __Get([Key, Key2, ...])
    __Set([Key, Key2, ...], Value)
    __Call(Name [, Params...])
}

함수 구문:
MyGet(this [, Key, Key2, ...])
MySet(this [, Key, Key2, ...], Value)
MyCall(this, Name [, Params...])

ClassName := { __Get: Func("MyGet"), __Set: Func("MySet"), __Call: Func("MyCall") }

메타-함수는 목표 객체 안에 키를 요청했지만 안에서 발견할 수 없을 때 일어날 행위를 정의합니다. 예를 들어, obj.key에 값이 할당되지 않았다면, __Get 메타-함수를 요청합니다. 비슷하게, obj.key := value는 __Set를 요청하고 obj.key()는 __Call를 호출합니다. 이 메타-함수들 (또는 메쏘드들)은 obj.base, obj.base.base 등등에 정의할 필요가 있습니다.

스크립트가 목표 객체 안에 존재하지 않는 키를 열람하거나 설정하거나 또는 호출하면, 베이스 객체가 다음과 같이 요청됩니다:

  • 이 베이스 객체가 적절한 메타-함수를 정의하고 있으면 그것을 호출합니다. 메타-함수가 명시적으로 반환(return)되면, (그 메타-함수가 무엇 때문에 호출되었는지와 상관없이) 그 반환 값을 연산의 결과로 사용합니다 그리고 스크립트에 제어를 반환합니다. 그렇지 않으면, 아래에 기술된 대로 계속 진행합니다.

    Set: 메타-함수가 할당을 처리하면, 그 할당 값을 반환해야 합니다. 이렇게 하면 a.x := b.y := z와 같이 할당을 연쇄적으로 할 수 있습니다. 반환 값은 z의 원래 값과 다를 수 있습니다 (예를 들어, 어느 값을 할당할 수 있는지 제한이 부과된 경우).

  • 베이스 객체의 필드에서 일치하는 키를 찾습니다.
  • [v1.1.16+]: 특성에 상응하는 키가 발견되고 거기에 get이나 set이 (적절하게) 구현되어 있다면, 그 특성을 요청하고 반환합니다. 이것이 메쏘드 호출이면, get을 요청합니다.
  • 아무 키도 발견되지 않으면, 재귀적으로 이 베이스 객체의 베이스를 요청합니다 (이 리스트의 상단에서 시작해, 차례로 각 단계마다 적용합니다). 아직 완료하지 못했다면, 키가 메타-함수에 의하여 추가된 경우 이 바탕 객체를 검색해 다시 부합하는 키를 찾습니다.

    하위 호환의 문제 때문에, 이 단계는 키가 발견 되었을지라도 set 연산에 대해서만 수행됩니다 (단, set을 구현한 특성을 정의했다면 예외입니다).

  • 여러 매개변수가 get이나 set에 주어지고 키가 발견되면, 그의 값을 점검합니다. 그 값이 객체이면, 그것을 요청하여 나머지 매개변수들을 처리합니다. 그리고 더 이상 진행하지 않습니다.
  • 키가 발견되면,
    Get: 그 값을 돌려줍니다.
    Call: 그 값이 함수 이름이거나 참조이면, 그것을 호출합니다. 대상 객체를 첫 매개변수로 건넵니다 (this).

일치하는 키를 메타-함수가 객체에 저장하지만 반환(return)하지 않으면, 그 행위는 마치 키가 처음부터 그 객체에 존재한 것과 같습니다. __Set을 사용하는 예제는 배열의 배열 서브-클래싱하기를 참조하십시오.

연산이 여전히 처리되지 않았다면, 이것이 내장 함수인지 아니면 내장 특성인지 점검하십시오:

  • Get: 기카 "base"이면, 그 객체의 base를 돌려줍니다.
  • Set: 키가 "base"이면, 그 객체의 base를 설정합니다 (또는 그 값이 객체가 아니면 제거합니다).
  • Call: 적용할 수 있으면 내장 메쏘드를 호출합니다.

여전히 연산이 처리되지 않았다면,

  • Get 그리고 Call: 빈 문자열을 돌려줍니다.
  • Set: 한 개의 키 매개변수만 주어졌다면, 그 키와 값을 목표 객체에 저장하고 할당된 값을 돌려줍니다. 여러 매개변수가 주어지면, 새 객체를 만들고 거기에 첫 번째 매개변수를 키로 사용하여 저장합니다. 그 다음, 그 새 객체를 요청해 나머지 매개변수를 처리합니다. (배열의 배열 참조.)

알려진 한계:

  • 반환값 없이 return을 사용하면 return ""과 동등합니다. 이 행위는 미래 버전에서는 바뀔 수 있습니다. 기본 행위를 오버라이딩하지 않고, 메타-함수로부터 "피신"하기 위하여 return을 사용할 가능성이 있습니다.

동적 특성

__Get과 __Set를 사용하여 값들을 특정 방식으로 계산하거나 제한할 수 있는 특성을 구현할 수 있습니다. 예를 들어, R, G, B 그리고 RGB 특성을 가지고 "Color" 객체를 구현 하는 데 사용할 수 있습니다. 여기에서 오직 RGB 값만 실제로 저장됩니다:

red  := new Color(0xff0000), red.R -= 5
cyan := new Color(0x00ffff)

MsgBox % "red: " red.R "," red.G "," red.B " = " red.RGB
MsgBox % "cyan: " cyan.R "," cyan.G "," cyan.B " = " cyan.RGB

class Color
{
    __New(aRGB)
    {
        this.RGB := aRGB
    }

    __Get(aName)
    {
        if (aName = "R")
            return (this.RGB >> 16) & 255
        if (aName = "G")
            return (this.RGB >> 8) & 255
        if (aName = "B")
            return this.RGB & 255
    }

    __Set(aName, aValue)
    {
        if aName in R,G,B
        {
            aValue &= 255

            if      (aName = "R")
                this.RGB := (aValue << 16) | (this.RGB & ~0xff0000)
            else if (aName = "G")
                this.RGB := (aValue << 8)  | (this.RGB & ~0x00ff00)
            else  ; (aName = "B")
                this.RGB :=  aValue        | (this.RGB & ~0x0000ff)

            ; 'Return'을 사용하여 새 키-값 쌍이 만들어지지 않았음을 알려야 합니다.
            ; 또한 'x := clr[name] := val'에서 무엇을 'x'에 저장할지 정의합니다:
            return aValue
        }
    }
}

함수로서의 객체

obj.func(param)와 같이 호출하면, obj.func는 함수 이름이나 객체를 담을 수 있습니다. obj.func에 객체가 들어 있다면, 그 객체는 그 메쏘드 이름 대신에 (obj.func)[obj]()처럼 obj로 요청할 수 있습니다. 대부분의 경우 obj.func[obj]는 존재하지 않습니다. 대신에 obj.func's __Call 메타-함수가 요청됩니다. 이를 이용하면 아래 예제에 보여주는 바와 같이 함수 호출의 행위를 추상적인 방식으로 바꿀 수 있습니다:

; 함수 배열을 위한 프로토타입을 생성한다.
FuncArrayType := {__Call: "FuncType_Call"}
; 함수 배열을 생성한다.
funcArray := {1: "One", 2: "Two", base: FuncArrayType}
; 배열을 메쏘드로 사용하는 객체를 생성한다.
obj := {func: funcArray}
; 메쏘드를 호출한다.
obj.func("foo", "bar")

FuncType_Call(func, obj, params*)
{
    ; 함수 리스트를 호출한다.
    Loop % ObjMaxIndex(func)
        func[A_Index](params*)
}

One(param1, param2) {
    ListVars
    Pause
}
Two(param1, param2) {
    ListVars
    Pause
}

이 테크닉을 사용하면 메타-함수처럼 행위하는 객체를 만들 수 있습니다. 예를 들어, 이전 섹션에서 다룬 특성과 비슷하게 동적 특성들을 정의할 수 있습니다. (그렇지만, 이 예제는 특성 지원으로 대체되었음을 주의하십시오.) 예를 들어:

blue := new Color(0x0000ff)
MsgBox % blue.R "," blue.G "," blue.B

class Properties
{
    __Call(aTarget, aName, aParams*)
    {
        ; 이 특성 객체에 이 절반-특성에 대한 정의가 들어 있다면, 그것을 호출합니다.
        ; this.HasKey(aName)를 사용하지 않도록 주의합니다. 이것을 사용하면 __Call 안으로 재귀가 일어납니다.
        if IsObject(aTarget) && ObjHasKey(this, aName)
            return this[aName].(aTarget, aParams*)
    }
}

class Color
{
    __New(aRGB)
    {
        this.RGB := aRGB
    }

    class __Get extends Properties
    {
        R() {
            return (this.RGB >> 16) & 255
        }
        G() {
            return (this.RGB >> 8) & 255
        }
        B() {
            return this.RGB & 255
        }
    }

    ;...
}

배열의 배열을 서브-클래싱하기

table[x, y] := content와 같이 다중-매개변수 할당 때문에 묵시적으로 새로운 객체가 생성될 때, 그 새 객체는 보통 베이스가 없고 그러므로 맞춤 메쏘드도 없고 특별한 행위도 없습니다. __Set는 아래에 보여주는 바와 같이 이런 객체들을 초기화하는 데 사용할 수 있습니다.

x := {base: {addr: Func("x_Addr"), __Set: Func("x_Setter")}}

; 값을 할당한다. 묵시적으로 x_Setter를 사용하여 하위-객체를 만든다.
x[1,2,3] := "..."

; 값을 열람하고 예제 메쏘드를 호출한다.
MsgBox % x[1,2,3] "`n" x.addr() "`n" x[1].addr() "`n" x[1,2].addr()

x_Setter(x, p1, p2, p3) {
    x[p1] := new x.base
}

x_Addr(x) {
    return &x
}

x_Setter는 네 개의 필수 매개변수가 있기 때문에, 두 개 이상의 키가 있을 경우에만 호출됩니다. 위의 할당이 일어날 때, 다음과 같은 일이 일어납니다:

  • x[1]는 존재하지 않습니다. 그래서 x_Setter(x,1,2,3)가 호출됩니다 ("..."는 건네지지 않습니다. 매개변수가 턱없이 모자라기 때문입니다).
    • x[1]는 x와 베이스가 같은 객체가 새로 할당됩니다.
    • 반환값은 없습니다 – 할당은 계속됩니다.
  • x[1][2]는 존재하지 않습니다. 그래서 x_Setter(x[1],2,3,"...")이 호출됩니다.
    • x[1][2]에 x[1]와 베이스가 같은 객체가 새로 할당됩니다.
    • 반환값은 없습니다 – 할당은 계속됩니다.
  • x[1][2][3]은 존재하지 않습니다. 그러나 x_Setter는 네 개의 매개변수를 요구하고 세 개 밖에 없으므로 (x[1][2], 3, "..."), 호출되지 않고 할당은 여느 때처럼 완료됩니다.

기본 베이스 객체

비-객체 값이 객체 구문과 함께 사용될 때, 기본 베이스 객체가 요청됩니다. 이것은 디버깅에 사용하거나 또는 문자열이나, 숫자, 그리고/또는 변수에 대하여 객체-류의 행위를 전역적으로 정의하는데 사용할 수 있습니다. 기본 베이스는 비-객체 값을 가지고 .base를 사용하여 접근이 가능합니다; 예를 들면, "".base. 기본 베이스는 "".base := Object()처럼 설정(set)할 수 없지만, 기본 베이스는 "".base.base := Object()처럼 그 자체로 베이스가 있습니다.

자동 변수 초기화

set 연산의 목표로 빈 변수가 사용될 때, 직접적으로 __Set meta-함수에 건네집니다. 그래서 새 객체를 변수에 삽입할 기회가 있습니다. 간략하게 하기 위해, 다음 예제는 다중 매개변수를 지원하지 않습니다; 물론 가변 함수를 사용하면 가능합니다.

"".base.__Set := Func("Default_Set_AutomaticVarInit")

empty_var.foo := "bar"
MsgBox % empty_var.foo

Default_Set_AutomaticVarInit(ByRef var, key, value)
{
    if (var = "")
        var := Object(key, value)
}

의사-특성

객체의 "사탕 구문"을 문자열과 숫자에 적용할 수 있습니다.

"".base.__Get := Func("Default_Get_PseudoProperty")
"".base.is    := Func("Default_is")

MsgBox % A_AhkPath.length " == " StrLen(A_AhkPath)
MsgBox % A_AhkPath.length.is("integer")

Default_Get_PseudoProperty(nonobj, key)
{
    if (key = "length")
        return StrLen(nonobj)
}

Default_is(nonobj, type)
{
    if nonobj is %type%
        return true
    return false
}

내장 함수도 역시 사용할 수 있지만, 이 경우 괄호를 빼먹으면 안됩니다. 주의하십시오:

"".base.length := Func("StrLen")
MsgBox % A_AhkPath.length() " == " StrLen(A_AhkPath)

디버깅

값을 객체처럼 취급되도록 허용하면 바람직하지 않습니다. 비-객체 값이 요청될 때마다 경고 상자가 나타날 수 있습니다:

"".base.__Get := "".base.__Set := "".base.__Call := Func("Default__Warn")

empty_var.foo := "bar"
x := (1 + 1).is("integer")

Default__Warn(nonobj, p1="", p2="", p3="", p4="")
{
    ListLines
    MsgBox 비-객체 값이 부적절하게 요청되었습니다.`n`n특히: %nonobj%
}

구현

참조횟수-세기

오토핫키는 기본적인 참조횟수-세기 매커니즘을 사용하여 한 객체가 사용하는 자원이 더 이상 참조되지 않을 때 자동으로 해제합니다. 스크립트 저자는 이 메커니즘을 명시적으로 요청하면 안됩니다. 단 객체를 가리키는 포인터가 관리되지 않아서 직접 처리할 경우는 제외합니다. 더 자세한 정보는 ObjAddRef를 참조하십시오.

; 객체의 참조 횟수를 증가시켜 "살아 있도록 유지한다":
ObjAddRef(address)
...
; 개체의 참조 횟수를 감소시켜 해제되도록 한다:
ObjRelease(address)

그렇지만, ObjAddRef는 Object(obj)를 통하여 주소를 최초로 획득할 때는 사용할 필요가 없습니다.

일반적으로 한 객체의 주소의 각 새 사본은 객체 참조로 간주해야 합니다. 단, 그 스크립트가 ObjAddRef 그리고/또는 ObjRelease를 적절하게 호출할 책임이 있는 경우는 예외입니다. 예를 들면, x := address와 같은 것을 통하여 주소가 복사될 때마다, ObjAddRef 가 호출되어 참조 횟수를 증가시켜야 합니다. 비슷하게, 스크립트가 그 객체의 주소의 특별한 사본과의 작업이 끝날 때마다, ObjRelease를 호출해야 합니다. 이렇게 하면 그의 마지막 참조가 사라질 때 확실하게 객체가 해제됩니다 - 그 전에는 해제되지 않습니다.

객체의 마지막 참조가 해제될 때 코드를 실행하려면, __Delete 메타-함수를 구현합니다.

알려진 한계:

  • 순환 참조를 먼저 깨야 객체를 풀 수 있습니다. 자세한 정보와 예는 객체 해제하기를 참조합니다.
  • 프로그램이 끝날 때 정적 변수와 전역 변수의 참조는 자동으로 해제되지만, 비-정적 지역 변수나 표현식 평가 스택에 있는 참조들을 자동으로 해제되지 않습니다. 이런 참조는 함수나 표현식이 정상으로 끝내도록 허용해야만 해제가 됩니다.

프로그램이 종료할 때 객체가 사용하는 메모리를 운영체제가 요구함에도 불구하고, 그 객체를 가리키는 모든 참조가 풀리지 않는 한, __Delete는 호출되지 않습니다. 이것은 임시 파일과 같이, 운영 체제가 자동으로 요구하지 않는 다른 자원을 풀어버리면 문제가 될 수 있기 때문입니다.

객체를 가리키는 포인터

어떤 경우는 DllCall을 통하여 객체를 외부 코드에 건넬 필요가 있습니다. 또는 그것을 이진 데이터 구조로 저장하여 나중에 열람할 필요가 있습니다. 객체의 주소는 x := &obj로 열람할 수 있습니다; 그렇지만, 변수 obj가 소거되면, 그 객체는 일찌기 해제되어 버릴 수 있습니다. 이런 일이 일어나지 않도록 확인하려면, 위에 보여준 바와 같이 ObjAddRef를 사용하거나 아래에 보여주는 바와 같이 Object() 함수를 사용합니다:

address := Object(object)

게다가, 이 함수를 사용하여 주소를 다시 참조로 변환할 수 있습니다:

object := Object(address)

어느 경우든 객체의 참조-횟수는 자동으로 증가됩니다. 그래서 객체는 너무 이르게 해제되지 않습니다.

이 함수는 예를 들어 COM 객체 래퍼나 파일 객체와 같이 Object()로 생성되지 않은 객체에도 똑 같이 적용되는 것에 주목하십시오.


AutoHotkey Scripts and Macros

스크립트

목차

  • 들어가는 말
  • 스크립의 상단 (자동-실행 섹션): 이 부분은 스크립트가 시작하면 자동으로 실행됩니다.
  • 피신 연속열: 문자 그대로의 퍼센트 기호와 쉼표를 나타내기 위해 `% 와 `, 를 사용해야 할 때.
  • 스크립트 안의 주석: 쌍반점과 /*...*/ 심볼을 사용해 스크립트에 주석을 답니다.
  • 기다란 줄을 짧은 줄들로 가르기: 이렇게 하면 스크립트의 가독성과 유지관리성이 향상됩니다.
  • 스크립트를 EXE로 만들기 (ahk2exe): .ahk 스크립트를 .exe 파일로 만들어 실행할 수 있습니다.
  • 명령어 줄 매개변수를 스크립트에 건네기: 변수 %1%, %2%, 등등에 들어오는 매개변수들이 담깁니다.
  • 스크립트 파일 코드 페이지: 비-ASCII 문자를 스크립트에 안전하게 사용할 수 있습니다.
  • 스크립트 디버깅하기: 버그가 있는 스크립트에서 결점 찾아 내는 법.
  • AutoHotkey.exe의 이식성: AutoHotkey.exe 사본만 있어도 .ahk 파일을 실행시키는 데 충분합니다.
  • 설치기 옵션: 조용하게 설치하거나 제거하는 법.

들어가는 말

각 스크립트는 평범한 텍스트 파일로서 안에 있는 줄들을 프로그램이 실행합니다 (AutoHotkey.exe). 스크립트는 또 핫키와 핫스트링 심지어 모조리 그것들로 구성되기도 합니다. 그렇지만, 핫키와 핫스링이 없다면 스크립트는 기동된 순간 그의 명령어들을 순서대로 위에서부터 아래로 수행합니다.

프로그램은 스크립트를 메모리 안으로 한 줄씩 적재합니다. 각 줄은 길이가 16,383 문자입니다. 적재하는 동안, 스크립트는 최적화되고 평가됩니다. 구문 에러는 화면에 보여지고 그 에러를 반드시 수정해야 스크립트를 실행할 수 있습니다.

스크립트의 상단 (자동-실행 섹션)

스크립트가 적재된 후, 제일 윗 줄부터 실행을 시작해 Return, Exit, 핫키/핫스트링 라벨, 또는 물리적으로 끝에 다다를 때까지 실행을 계속합니다 (순서에 상관이 없습니다). 스크립트에서 이 상단 부분을 자동-실행 섹션이라고 지칭합니다.

영속적이지 않은 그리고 hotkeys, hotstrings, OnMessage, 그리고 GUI가 없는 스크립트는 자동-실행 섹션이 완료되면 바로 끝납니다. 그렇지 않으면, 휴식 상태로 실행을 계속하면서, 핫키나 핫스트링, GUI 이벤트, 맞춤 메뉴 항목, 그리고 타이머 같은 이벤트에 반응합니다.

핫키, 핫스트링, 메뉴 항목, GUI 이벤트, 또는 타이머가 기동하는 쓰레드마다 새롭게 기본 값을 가지고 시작합니다. 다음과 같은 속성들이 자동-실행 섹션에 설정되어 있습니다. 언셋하면, (각 페이지 문서에 기재된 대로) 표준 기본 값이 적용됩니다: DetectHiddenWindows, DetectHiddenText, SetTitleMatchMode, SetBatchLines, SendMode, SetKeyDelay, SetMouseDelay, SetWinDelay, SetControlDelay, SetDefaultMouseSpeed, CoordMode, SetStoreCapslockMode, AutoTrim, SetFormat, StringCaseSense, Thread, 그리고 Critical.

자동-실행 섹션을 완료하는데 시간이 많이 걸린다면 (또는 완료되지 않는다면), 위의 설정에 대한 기본값은 100 밀리초 후에 효과를 발휘합니다. 자동-실행 섹션이 마침내 완료될 때, 기본 값은 자동-실행 섹션의 끝에서 효과가 있던 값들로 다시 갱신됩니다. 그리하여, 보통 제일 좋은 방법은 스크립트의 상단에 있는 기본 값들을 변경하는 것입니다. 여기에 핫키, 핫스트링, 타이머, 또는 맞춤 메뉴 항목이 들어 있습니다. 또 각 쓰레드마다 따로 위의 설정을 보유하고 있다는 것을 주목하십시오. 그런 설정은 변경해도 다른 쓰레드에 영향을 미치지 않습니다.

피신 연속열

오토핫키의 기본 피신 문자는 액센트/백틱(`)입니다. 영문 키보드의 좌상 모서리에 있습니다. 역사선보다 이 문자를 사용하면 파일 경로에 이중으로 역사선을 배치할 필요가 없습니다.

쉼표와 퍼센트 기호는 오토핫키에서 특별한 의미를 가지기 때문에, `,을 사용해 문자 그대로의 쉼표를 지정하고 `%를 사용해 문자 그대로의 퍼센트 기호를 지정합니다. 한 가지 예외는 MsgBox입니다. 쉼표를 피신시키지 않아도 됩니다. 또다른 예외는 명령어의 마지막 매개변수에 있는 쉼표입니다: 피신시킬 필요가 없습니다. 피신 연속열의 완전한 목록은 #EscapeChar를 참조하십시오.

어떤 특수 문자는 피신 연속열을 사용하여 만들기도 합니다. 가장 흔한 예는 `t (tab), `n (라인피드), 그리고 `r (캐리지 리턴)입니다.

팁: 명령어의 첫 번째 쉼표는 생략해도 됩니다 (첫 매개변수가 비어 있거나 :=나 =로 시작할 때, 또는 그 명령어가 계속 섹션의 상단에 홀로 있을 때는 제외합니다.). 예를 들어:

MsgBox 이것은 괜찮습니다.
MsgBox, 이 역시 괜찮습니다 (명시적으로 쉼표를 사용합니다).

스크립트 안의 주석

스크립트는 줄의 처음에 쌍반점을 두어 주석 처리할 수 있습니다. 예를 들어:

; 이 줄은 전체가 주석입니다.

주석은 명령어의 끝에 추가해도 됩니다. 이 경우 쌍반점은 적어도 하나의 공간 또는 탭이 왼쪽에 있어야 합니다. 예를 들어:

Run Notepad  ; 이것은 명령어와 같은 줄에 있는 주석입니다.

게다가, /* and */ 심볼은 전체 섹션에 주석을 붙이는데 사용할 수 있습니다. 그러나 다음 예제와 같이 줄이 시작하는 곳에 나타나야 합니다:

/*
MsgBox, 이 줄은 주석 처리되어 있습니다 (불능상태).
MsgBox, 이 줄도 마찬가지입니다.
*/

주석은 스크립트가 시작하면 무시됩니다. 그래서 수행성능이나 메모리 사용에 영향을 주지 않습니다.

기본 주석 문자 (쌍반점)은 #CommentFlag을 통하여 다른 문자나 문자열로 바꿀 수 있습니다.

긴 줄을 여러 개의 짧은 줄로 가르기

긴 줄은 작은 줄들로 쪼개어 가독성과 유지관리성을 향상시킬 수 있습니다. 이렇게 하더라도 스크립트의 실행 속도는 감소하지 않습니다. 왜냐하면 그런 줄들은 스크립트가 기동하는 순간 메모리에서 합병되기 때문입니다.

방법 #1: 줄이 "and", "or", ||, &&, 쉼표, 또는 마침표로 시작하면 자동으로 윗 줄과 합병됩니다 (v1.0.46+에서, ++와 --를 제외하고 다른 모든 표현식 연산자에도 마찬가지로 적용됩니다). 다음 예제에서, 두 번째 줄은 첫 번째 줄에 붙는데 쉼표로 시작하기 때문입니다:

FileAppend, 이것은 추가할 텍스트입니다.`n   ; 여기에 주석이 허용됩니다.
    , %A_ProgramFiles%\SomeApplication\LogFile.txt  ; 주석입니다.

비슷하게, 다음의 줄들은 하나의 줄로 합병될 것입니다. 왜냐하면 마지막 두 줄이 "and" 또는 "or"로 시작하기 때문입니다:

if (Color = "Red" or Color = "Green"  or Color = "Blue"   ; 주석.
    or Color = "Black" or Color = "Gray" or Color = "White")   ; 주석.
    and ProductIsAvailableInColor(Product, Color)   ; 주석.

삼진 연산자도 훌륭한 후보입니다:

ProductIsAvailable := (Color = "Red")
    ? false  ; 우리는 바이러스 제품이 없습니다. 그러니 걱정하지 말고 함수를 호출하십시오.
    : ProductIsAvailableInColor(Product, Color)

위의 예제에 사용된 들여쓰기는 선택적이지만, 어느 줄이 위의 어느 줄에 속하는지 보여주기 때문에 가독성이 향상됩니다. 또, "AND" 그리고 "OR" 같은 단어로 시작하는 줄들은 따로 더 스페이스를 포함할 필요가 없습니다; 오토핫키가 자동으로 추가해 줍니다. 마지막으로, 빈 줄이나 주석은 위의 예제에서 줄 사이 또는 줄 끝에 추가할 수 있습니다.

방법 #2: 엄청나게 많은 줄을 병합하려면 또는 방법 #1이 적당하지 않을 때 이 방법을 사용해야 합니다. 자동-교체 핫스트링에 이 방법이 특별히 유용하지만, 명령어 또는 표현식에도 사용할 수 있습니다. 예를 들어:

; 예제 #1:
Var =
(
1 번 줄 텍스트
2 번 줄 텍스트. 기본값으로, 라인피드(`n)가 줄 사이에 존재합니다.
)

; 예제 #2:
FileAppend,  ; 이 경우는 쉼표가 필요합니다.
(
텍스트 한 줄.
기본값으로, 이 줄과 이전 줄 사이의 하드 캐리지 리턴 (Enter)이 파일에 라인피드 (`n)로 씌여질 것입니다.
    기본값으로, 이 줄의 왼쪽에 있는 탭도 파일에 씌여질 것입니다 (스페이스에 대해서도 마찬가지입니다).
기본값으로, %Var%과 같은 변수 참조는 변수의 내용으로 결정됩니다.
), C:\My File.txt

위의 예제에서, 일련의 줄들은 한 쌍의 괄호로 상단과 하단에 경계가 있습니다. 이런 것을 계속 섹션이라고 부릅니다. 하단 줄에 닫는 괄호 다음에 FileAppend의 마지막 매개변수가 있음에 주목하십시오. 이 관례는 선택적입니다; 이와 같은 경우에 쉼표는 문자 그대로의 쉼표가 아니라 매개변수-가름자로 보이게 됩니다.

계속 섹션의 기본 행위를 오버라이드 할 수 있습니다. 계속 섹션의 여는 괄호의 오른쪽에 다음 옵션 중 하나 또는 여러개를 포함하면 됩니다. 옵션이 여럿 존재하면, 스페이스로 앞의 옵션과 각각 구별합니다. 예를 들어: ( LTrim Join| %.

Join: 어떻게 줄을 연결할지 지정합니다. 이 옵션이 생략되면, 각 줄은 마지막 줄을 제외하고 다음에 줄넘김 문자 (`n)가 따라옵니다. 단어 Join 자체만 지정하면, 줄들은 직접적으로 그 사이에 아무 문자 없이 서로 결합합니다. 그렇지 않으면 단어 Join 다음에 즉시 15개 까지의 문자가 따라와야 합니다.

예를 들어, Join`s는 마지막 줄을 제외하고 각 줄 뒤에 스페이스를 삽입합니다 -- 오로지 Join만 인식하는 특별한 피신 연속열입니다). 또다른 예는 Join`r`n인데, 이것은 줄과 줄 사이에 CR+LF를 삽입합니다. 비슷하게, Join|는 줄 사이에 파이프를 삽입합니다. 계속 섹션의 마지막 줄도 연결-문자로 끝내려면, 계속 섹션의 닫는 괄호 바로 위에 즉시 빈줄을 포함시킵니다.

알려진 한계: 문자열 Join이 쌍점으로 끝나면, 그 줄에서 마지막 옵션으로 취급하면 안됩니다. 예를 들어, (Join:은 라벨 "(Join"으로 취급되고 (LTrim Join:은 지원하지 않습니다. 그러나 (Join: C는 좋습니다.

LTrim: 각 줄의 선두에서 스페이스와 탭을 걷어냅니다. 스페이스와 탭은 주로 계속 섹션을 들여쓰기 하는 데 사용됩니다. 또, 이 옵션은 여러 계속 섹션에 대해서도 활성화할 수 있습니다. 한 줄에 #LTrim만 지정하면 됩니다. #LTrim은 위치에 영향을 받습니다: 물리적으로 그 아래에 있는 모든 계속 섹션에 영향을 미칩니다. #LTrim Off를 통하여 설정을 끌 수 있습니다.

RTrim0 (RTrim 다음에 0): 각 줄의 끝으로부터 스페이스와 탭을 걷어내지 못하게 막습니다.

Comments (또는 Comment 또는 Com 또는 C) [v1.0.45.03+]: 쌍반점 주석을 계속 섹션 안에 허용합니다 (그러나 /*..*/ 안에는 허용하지 않습니다). 그런 주석들은 (왼쪽에 있는 스페이스와 탭과 함께) 결합된 결과로부터 모조리 제거됩니다. 기호 텍스트로 취급되지 않습니다. 각 주석은 줄의 오른쪽 또는 그 자체로 새 줄에 나타날 수 있습니다.

% (퍼센트 사인): 퍼센트 사인을 변수 참조가 아니라 기호 그대로 취급합니다. 그래서 각 퍼센트 사인을 기호 그대로 만들기 위해 피신시킬 필요가 없습니다. 자동-교체 핫스트링과 같이, 이미 퍼센트 사인이 기호인 경우에 이 옵션은 필요하지 않습니다.

, (쉼표): 쉼표를 문자 그대로의 쉼표가 아니라 가름자로 취급합니다. 별로 사용되지 않는 이 옵션은 명령어 매개변수 사이의 쉼표에 대해서만 꼭 필요합니다. 왜냐하면 함수 호출에서, 쉼표의 종류는 문제가 되지 않기 때문입니다. 또 이 옵션은 실제로 매개변수 사이를 가르는 쉼표들만 변형합니다. 다른 말로 하면, 일단 명령어의 마지막 매개변수에 다다르면 (즉, 더 이상 매개변수가 없으면), 연이어 나오는 쉼표는 이 옵션에 상관 없이 문자 그대로 쉼표로 취급됩니다.

` (액센트): 각 백틱 문자를 피신 문자가 아니라 문자 그대로 취급합니다. 이것은 또 쉼표와 퍼센트 사인이 명시적으로 그리고 개별적으로 피신되지 못하도록 막습니다. 게다가, `r 그리고 `t와 같이 명시적으로 지정된 피신 연속열을 변환하지 못하도록 막습니다.

) [v1.1.01+]: 닫는 괄호가 계속 섹션의 옵션에 나타나면 (Join 옵션의 매개변수로 나타나면 제외), 그 줄은 계속 섹션의 시작이 아니라 표현식으로 재번역됩니다. 이렇게 하면 여는 괄호를 피신시킬 필요 없이 (x.y)[z]()와 같은 표현식을 작동시킬 수 있습니다.

논평

`n (줄넘김)와 `t (탭) 같은 피신 연속열은 계속 섹션 안에서 지원됩니다. 단 accent (`) 옵션이 지정되어 있는 경우는 제외합니다.

주석 옵션이 없으면, 쌍반점과 /*..*/ 주석이 계속 섹션 안에서 지원되지 않습니다. 왜냐하면 기호 텍스트로 보이기 때문입니다. 그렇지만, 주석은 계속 섹션의 상단 줄과 하단 줄에 포함될 수 있습니다. 예를 들어:

FileAppend,   ; 주석입니다.
; Comment.
( LTrim Join    ; 주석입니다.
     ; 이것은 주석이 아닙니다; 문자 그대로입니다. 윗 줄에 단어 Comments를 포함하면 주석이 됩니다.
), C:\File.txt   ; 주석입니다.

위의 결과로, 쌍반점은 계속 섹션 안에서 피신시킬 필요가 없습니다.

계속 섹션은 16,383 문자가 넘는 줄을 생산하지 못합니다 (시도하면, 프로그램은 스크립트가 기동하는 순간 경고를 보냅니다). 이를 돌아가는 한 가지 방법은 일렬로 결합해서 변수에 넣는 것입니다. 예를 들어:

Var =
(
...
)
Var = %Var%`n  ; 또다른 계속 섹션을 통하여 변수에 더 많은 텍스트를 추가합니다.
(
...
)
FileAppend, %Var%, C:\My File.txt

닫는 괄호는 연속 섹션의 끝을 나타내기 때문에, 줄을 닫는 괄호로 시작하려면, 앞에다 액센트/백틱을 배치해야 합니다: `).

계속 섹션 다음에 즉시 따라오는 줄에 또다른 계속 섹션을 여는 괄호가 담길 수 있습니다. 이렇게 하면 한 개의 줄을 구성하는 동안 위에 언급한 옵션들이 달라질 수 있습니다.

#Include를 이용하여 계속 섹션을 구성하는 방법은 지원하지 않습니다.

스크립트를 EXE (ahk2exe)로 변환하기

스크립트 컴파일러 (fincs 제공)가 프로그램에 포함되어 있습니다.

스크립트가 컴파일되면, 독립 실행화일이 됩니다; 즉, 오토핫키가 설치되어 있지 않은 머신에서도 사용할 수 있습니다 (그런 EXE 실행 파일은 아무 제한 없이 배포하거나 판매할 수 있습니다). 컴파일 과정을 통해 실행 파일이 생성됩니다. 안에 다음과 같이 포함됩니다. 오토핫키 인터프리터, 스크립트, 그리고 기타 포함된 파일, 그리고 FileInstall 명령어를 통하여 병합한 파일들.

Ahk2Exe는 다음과 같은 방식으로 사용할 수 있습니다:

  1. GUI 인터페이스: 시작 메뉴에서 "Convert .ahk to .exe" 항목을 선택합니다.
  2. 우클릭: 익스플로러 창 안에서 .ahk 파일에 우클릭하고 "Compile Script"를 선택합니다 (오토핫키를 설치할 때 스크립트 컴파일 옵션을 선택했을 경우에만 메뉴가 있습니다). 이렇게 하면 스크립트와 기본 이름이 같은 EXE 파일이 생성됩니다. 잠시 후에 같은 디렉토리에 나타납니다. 주의: EXE 파일은 위의 방법 #1에 의하여 마지막으로 사용된 것과 같은 아이콘, .bin 파일 그리고 MPRESS 설정을 사용하여 생성됩니다.
  3. 명령 줄: 컴파일러를 다음 매개변수를 가지고 명령 줄에서 실행할 수 있습니다:
    Ahk2Exe.exe /in MyScript.ahk [/out MyScript.exe] [/icon MyIcon.ico] [/bin AutoHotkeySC.bin] [/mpress 0or1]
    예를 들어:
    Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
    사용법:
    • 스페이스가 들어 있는 매개변수는 겹따옴표로 둘러싸야 합니다.
    • "out" 파일을 생략하면, EXE 파일은 스크립트와 기본 파일이름이 같습니다.

주의:

  • 컴파일링은 전형적으로 스크립트의 수행성능을 개선하지 않습니다.
  • v1.1.01 버전에서, 암호 보호와 /NoDecompile 스위치를 지원하지 않습니다.
  • mpress.exe가 오토핫키가 설치되어 있는 "Compiler" 하위폴더에 존재하면, 스크립트 실행파일을 압축하는데 사용됩니다. /mpress 0 또는 GUI 설정으로 꺼버릴 수 있습니다. 이는 또한 스크립트 소스 코드도 (주석은 제외하고) 압축합니다. 그렇지 않으면 PE 리소스 에디터를 사용하여 실행 파일로부터 소스를 추출할 수 있습니다.
  • 명령어 #NoTrayIcon 그리고 "Menu, Tray, ShowMainWindow" 는 컴파일된 스크립트의 행위에 영향을 미칩니다.
  • 맞춤 버전 정보는 (익스플로러의 파일-특성 대화상자에 나타나는데) 컴파일된 스크립트에 추가할 수 있습니다. 리소스 해커 같은 유틸을 사용하여 "AutoHotkeySC.bin". 파일을 편집하면 됩니다. 이 파일은 오토핫키가 설치된 "Compiler" 하위 폴더에 들어 있습니다. Compile_AHK II를 사용하면 이 과정을 손쉽게 처리할 수 있습니다. v1.1.01버전에서, AutoHotkeySC.bin 대신에 컴파일 스크립트를 편집할 수 있습니다.
  • 위의 방법을 사용하면 또 기존의 아이콘을 바꾸거나 모든 컴파일된 스크립트에 새로운 아이콘을 추가할 수 있습니다.
  • 스크립트가 컴파일된 형태로 실행 중이면 내장 변수 A_IsCompiled에 1이 담깁니다. 아니면 비어 있습니다.
  • 매개변수를 Ahk2Exe에 건네면, 컴파일 과정의 성패 여부를 알리는 메시지가 표준출력으로 나타납니다. 메시지가 명령어 프롬프트에 나타나지 않더라도, 출력을 파일로 방향 전환하는 것과 같은 수단을 써서 "잡을 수 있습니다" [v1.0.43+]
  • 추가로 실패할 경우, Ahk2Exe는 종료 코드에 일어난 에러의 종류를 알려줍니다. 이런 에러 코드는 GitHub (ErrorCodes.md)에서 보실 수 있습니다. [v1.1.22.03+]

컴파일러의 소스 코드와 새 버전은 GitHub에서 얻을 수 있습니다.

스크립트에 명령 줄 매개변수 건네기

스크립트는 명령줄 매개변수를 지원합니다. 형식은 다음과 같습니다:

AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]

그리고 컴파일된 스크립트라면 그 형식은 다음과 같습니다:

CompiledScript.exe [스위치] [스크립트 매개변수]

스위치: 다음 중 하나 또는 그 이상:

스위치 | 의미
/f 또는 /force | 무조건 기동합니다. 경고 대화상자를 전부 무시합니다.
/r 또는 /restart | 스크립트가 재시작 중이라고 알립니다 (이는 또한 내부적으로 Reload 명령어가 사용합니다).
/ErrorStdOut | 스크립트를 기동시키지 못하게 방해하는 구문 에러를 대화상자를 보여주는 대신에 표준에러(stderr)로 전송합니다. 자세한 것은 #ErrorStdOut를 참조하십시오. 이것을 /iLib와 조합하면 스크립트를 실행하지 않고 평가할 수 있습니다.
컴파일된 스크립트가 지원하지 않는 것:
/Debug | [AHK_L 11+]: 디버깅 클라이언트에 접속합니다. 더 자세한 것은 상호대화 디버깅을 참조합니다.
/CPn | [AHK_L 51+]: 스크립트 파일을 읽는 데 사용된 기본 코드페이지를 오버라이드 합니다. 더 자세한 정보는 스크립트 파일 코드페이지를 참조하십시오.
/iLib "OutFile"

[v1.0.47+]: AutoHotkey는 스크립트를 적재하지만 실행하지는 않습니다. 라이브러리 메커니즘을 통하여 자동으로-포함된 각 스크립트 파일에 대하여, OutFile이 지정한 파일에 두 줄이 씌여집니다. 다음과 같은 형식으로 작성됩니다. LibDir은 Lib 폴더의 완전한 경로이고 LibFile은 그 라이브러리의 파일이름입니다:

#Include LibDir\
#IncludeAgain LibDir\LibFile.ahk

출력 파일에 존재하면, 덮어씁니다. OutFile이 *이면 표준출력(stdout)에 씁니다.

스크립트에 구문에러가 있다면, 출력 파일은 비어 있을 수 있습니다. 프로세스 종료 코드를 사용하면 이 상황을 탐지할 수 있습니다; 구문에러가 있다면, 종료 코드는 2입니다. /ErrorStdOut 스위치를 사용하면 에러 메시지를 누르거나 나포할 수 있습니다.

스크립트 파일이름: 스크립트 매개변수가 없다면 생략할 수 있습니다. 생략되면 (예를 들어 오토핫키를 시작 메뉴로부터 직접 실행하면), 프로그램은 AutoHotkey.ahk를 다음 위치에서 순서대로 찾습니다:

  • AutoHotkey 실행파일이 들어 있는 디렉토리.
  • 현재 사용자의 나의 문서 폴더.

파일이름 AutoHotkey.ahk는 스크립트를 실행하는 데 사용된 실행파일의 이름에 따라 다릅니다. 예를 들어, AutoHotkey.exe를 MyScript.exe로 이름을 바꾸었다면, MyScript.ahk를 찾으려고 시도합니다. AutoHotkeyU32.exe를 매개변수 없이 실행하면 AutoHotkeyU32.ahk를 찾습니다.

주의: revision 51 이전의 버전에서는 AutoHotkey.ini를 작업 디렉토리에서 찾거나 AutoHotkey.ahk를 나의 문서에서 찾았습니다.

[v1.1.17+]: 별표(*)를 파일이름에 지정해 표준 입력(stdin)으로부터 스크립트 텍스트를 읽어 들입니다. 예를 들어, ExecScript()를 참조하십시오.

스크립트 매개변수: 스크립트에 건네고 싶은 문자열(들), 각각 스페이스로 구분됩니다. 스페이스가 포함된 매개변수는 인용부호로 둘러싸야 합니다. 기호 그대로의 인용부호는 역사선(\")을 앞에 붙여서 건넬 수 있습니다. 결과적으로, 인용부호 매개변수에 뒤따르는 역사선은 (예를 들어 "C:\My Documents\") 기호 그대로의 인용부호로 취급됩니다 (즉, 스크립트는 문자열 C:\My Documents"를 받습니다). 그런 따옴표를 제거하려면, StringReplace, 1, 1, ",, All를 사용하십시오.

스크립트는 들어오는 매개변수를 변수 %1%, %2%, 등등으로 봅니다. 게다가, %0%에는 건네어진 매개변수의 개수가 담겨 있습니다 (없으면 0). 그렇지만, 이런 변수들은 표현식 안에서 직접적으로 참조할 수 없습니다. 왜냐하면 변수가 아니라 숫자로 보이기 때문입니다. 다음 예제는 너무 매개변수가 적게 건네어지면 스크립트를 종료합니다:

if 0 < 3  ; 비-표현식 if-서술문의 왼쪽은 언제나 변수의 이름입니다.
{
    MsgBox 이 스크립트는 적어도 3 개의 매개변수가 들어오기를 요구하지만, 겨우 %0% 개를 받았습니다.
    ExitApp
}

스크립트로 건네지는 매개변수의 개수가 달라지면 (사용자가 스크립트에 파일들을 끌어 떨구는 경우), 다음 예제는 매개변수를 하나씩 추출합니다:

Loop, %0%  ; 각 매개변수에 대하여:
{
    param := %A_Index%  ; A_Index에 포함된 이름의 변수의 내용을 가져옵니다.
    MsgBox, 4,, 매개변수 번호 %A_Index%는 %param%입니다. 계속하시겠습니까?
    IfMsgBox, No
        break
}

매개변수가 파일 이름이면, 다음 예제와 같이 그 이름을 완전한/절대 경로를 포함하여 대소문자를 교정한 기다란 이름으로 변환할 수 있습니다 (파일 시스템에 저장된 것과 같은):

Loop %0%  ; 각 매개변수에 대하여 (또는 스크립트에 떨군 각 파일에 대하여):
{
    GivenPath := %A_Index%  ;  A_Index에 포함된 이름을 가진 변수의 내용을 가져옵니다.
    Loop %GivenPath%, 1
        LongPath = %A_LoopFileLongPath%
    MsgBox 대소문자를 교정한 기다란 경로의 파일이름은`n%GivenPath%`n다음과 같습니다:`n%LongPath%
}

알려진 한계: 파일을 끌어 .ahk 스크립트에 떨어트릴 때 NTFS 파일 시스템에서 8-점-3 (짧은) 이름이 꺼져 있으면 제대로 작동하지 못할 가능성이 높습니다. 한 가지 우회책은 스크립트를 컴파일한 다음 그 결과 파일을 그 결과 EXE 파일 위에 끌어 떨구는 것입니다.

스크립트 파일 코드페이지 [AHK_L 51+]

스크립트 파일에 포함되는 문자는 그 파일을 적재하는데 사용된 코드페이지에 제한됩니다.

  • 파일이 UTF-8 또는 UTF-16 (LE) 바이트 순서 표식으로 시작하면, 적절한 코드 페이지가 사용되고 /CPn 스위치는 무시됩니다.
  • /CPn 스위치가 명령어 줄에 건네지면, 코드페이지 n이 사용됩니다. 유효한 코드 페이지 식별자 번호는 MSDN을 참조하십시오.
  • 다른 경우는 모두 시스템 기본 ANSI 코드 페이지가 사용됩니다.

이 원칙은 오토핫키가 적재하는 스크립트 파일에만 적용됩니다. 스크립트 자체의 파일 I/O에는 적용되지 않는다는 것을 주의하십시오. 파일인코딩은 스크립트가 읽고 쓰는 기본 인코딩을 제어합니다. 반면에 IniRead와 IniWrite는 언제나 UTF-16 또는 ANSI를 취급합니다.

모든 텍스트가 (필요하면) 고유의 문자열 형식으로 변환되므로, 유효하지 않거나 고유의 코드페이지에 존재하지 않는 문자는 위치보유자로 교체됩니다: ANSI라면 '?'로 교체되고 Unicode는 '�'로 교체됩니다. 유니코드 빌드본은 오직 스크립트 파일에 인코딩 에러가 있을 경우 또는 파일을 적재하고 저장하는 데 사용된 코드 페이지가 일치하지 않을 경우에만 교체가 일어납니다.

RegWrite는 익스플로러로 기동된 스크립트에 대하여 기본값을 설정하는 데 사용할 수 있습니다(예, 더블클릭 실행):

; 아래의 적절한 줄에 주석을 걷어내고 모두 주석 처리해서
; 현재 빌드의 기본값으로 리셋합니다. 필요한 대로 변경합니다:
; codepage = 0        ; 시스템 기본 ANSI 코드페이지
; codepage = 65001    ; UTF-8
; codepage = 1200     ; UTF-16
; codepage = 1252     ; ANSI 라틴 1; 서구 유럽 (윈도우즈)
if (codepage != "")
    codepage := " /CP" . codepage
cmd="%A_AhkPath%"%codepage% "`%1" `%*
key=AutoHotkeyScript\Shell\Open\Command
if A_IsAdmin    ; 모든 사용자를 위해 설정합니다.
    RegWrite, REG_SZ, HKCR, %key%,, %cmd%
else            ; 현재 사용자에 대해서만 설정합니다.
    RegWrite, REG_SZ, HKCU, Software\Classes\%key%,, %cmd%

이미 오토핫키가 설치되어 있다고 가정합니다. 그렇지 않다면 결과가 불만족스러울 수도 있습니다.

스크립트 디버깅하기

ListVars와 Pause같은 명령어들은 스크립트를 디버그하는 데 도움을 줄 수 있습니다. 예를 들어, 다음의 두 줄을 주의 깊게 선택된 위치에 임시로 삽입하면, 스크립트에 "정지 점"을 만듭니다:

ListVars
Pause

스크립트가 이 두 줄을 만나면, 모든 변수의 현재 내용을 화면에 보여주므로 조사할 수 있습니다. 재개할 준비가 되면, File이나 Tray 메뉴를 통하여 재개합니다. 그러면 스크립트는 (혹 있다면) 다음 "정지 점"에 도달할 때까지 계속 진행합니다.

일반적으로 이런 "정지 점"들을 활성 창이 스크립트에 영향을 주지 않는 곳에 배치하는 것이 제일 좋습니다. 예를 들어 WinActivate 명령어 바로 다음이 좋습니다. 이렇게 하면 스크립트는 적절하게 연산을 재개할 수 있습니다.

다음 명령어들도 또한 디버깅에 유용합니다: ListLines, KeyHistory, 그리고 OutputDebug.

아주 흔한 에러로, 철자 오류나 "global" 선언을 빼먹는 경우, 경고를 켜면 탐지할 수 있습니다.

상호대화 디버깅 [AHK_L 11+]

상호대화 디버깅은 지원되는 DBGp 클라이언트로 가능합니다. 전형적으로 다음 조치가 가능합니다:

  • 줄에 정지점을 설치하고 제거합니다 - 정지점에 도달하면 실행을 정지합니다.
  • 줄 단위로 코드를 밟아갑니다 - 함수와 서브루틴 안으로 들어가고, 건너 뛰고, 나옵니다.
  • 모든 변수 또는 특정 변수를 검사합니다.
  • 실행중인 서브루틴과 함수의 스택을 봅니다.

이 기능은 컴파일된 스크립트에는 꺼져 있음에 유의하십시오.

상호대화 디버깅을 켜려면, 먼저 지원되는 디버거 클라이언트를 기동한 다음, 그 스크립트를 /Debug 명령어 줄 스위치와 함께 기동합니다.

AutoHotkey.exe /Debug[=SERVER:PORT] ...

SERVER와 PORT는 생략해도 됩니다. 예를 들어, 다음은 동등합니다:

AutoHotkey /Debug "myscript.ahk"
AutoHotkey /Debug=localhost:9000 "myscript.ahk"

[AHK_L 59+]: 디버거를 이미 실행중인 스크립트에 붙이려면, 아래와 같은 메시지를 전송하십시오:

ScriptPath = ; 여기에 스크립트의 전체 경로를 설정하십시오
DetectHiddenWindows On
ifWinExist %ScriptPath% ahk_class AutoHotkey
    ; 선택적 매개변수:
    ;   wParam  = 디버거 클라이언트의  IPv4 주소, 32-비트 정수.
    ;   lParam  = 디버거 클라이언트가 주시하고 있는 포트.
    PostMessage DllCall("RegisterWindowMessage", "str", "AHK_ATTACH_DEBUGGER")

디버거 클라이언트가 접속되면, 스크립트를 종료하지 않고도 뗄 수 있습니다. "detach" DBGp 명령어를 전송하면 됩니다.

AutoHotkey.exe의 호환성

AutoHotkey.exe 파일만 있으면 어떤 .ahk 스크립트도 실행할 수 있습니다.

[AHK_L 51+]: AutoHotkey.exe 이름을 바꾸면 기본값으로 실행되는 스크립트의 이름도 바뀝니다. 오토핫키를 설치하지 않고 컴퓨터에 사용하기 위해 스크립트를 컴파일하는 방법의 대안이 될 수 있습니다. 예를 들면, MyScript.exe는 파일이름이 주어지지 않으면 자동으로 MyScript.ahk를 실행합니다. 그러나 다른 스크립트도 역시 실행할 수 있습니다.

설치 옵션

조용하게 오토핫키는 기본 디렉토리에 설치하려면 (유/소음 모드에서 보여주는 디렉토리), 매개변수 /S를 설치기에 건네면 됩니다. 예를 들어:

AutoHotkey110800_Install.exe /S

기본 디렉토리 말고 다른 디렉토리에 설치하려면 /D 매개변수로 지정합니다 ( /S가 없을 경우, 설치기가 보여주는 기본 디렉토리가 변경됩니다). 예를 들어:

AutoHotkey110800_Install.exe /S /D=C:\Program Files\AutoHotkey

오토핫키가 벌써 설치되어 있다면, 자동으로 어느 버전의 AutoHotkey.exe인지 탐지하여 기본값으로 설정합니다. 그렇지 않으면, 기본값은 유니코 32-비트 또는 유니코드 64-비트로서 OS가 64-비트인가 아닌가에 따라 달라집니다. 기본값으로 설정된 AutoHotkey.exe 버전을 오버라이드 하려면, 다음 스위치 중 하나를 건네면 됩니다:

  • /A32 또는 /ANSI: ANSI 32-비트.
  • /U64 또는 /x64: 유니코드 64-비트 (64-비트 운영체제에서만 유효함).
  • /U32: 유니코드 32-bit.

예를 들어, 다음은 조용하게 ANSI 32-비트를 기본값으로 설정하고 설치합니다:

AutoHotkey110800_Install.exe /S /A32

조용하게 AutoHotkey를 제거하려면, /Uninstall 매개변수를 Installer.ahk에 건넵니다. 예를 들어:

"C:\Program Files\AutoHotkey\AutoHotkey.exe" "C:\Program Files\AutoHotkey\Installer.ahk" /Uninstall

AutoHotkey가 1.1.08.00 이전 버전이라면, uninst.exe /S를 사용하십시오. 예를 들어:

"C:\Program Files\AutoHotkey\uninst.exe" /S

주의: Installer.ahk는 관리자 권한으로 실행해야 제대로 작동합니다.

이후 버전은 우하 모서리에 링크가 포함되어 있어서 설치할 필요 없이 설정 파일을 추출할 수 있습니다. 이 기능이 있으면 /E 스위치를 사용해 명령 줄에서 추출할 수 있습니다. 예를 들어:

AutoHotkey110903_Install.exe /D=F:\AutoHotkey /E

조용한 설치/제거 모드에서 스크립트를 실행하면 필요한 경우 자동으로 닫힙니다. /R 스위치를 건네면 (v1.1.19.02+ 필요) 실행 중인 EXE를 이용하여 자동으로 이런 스크립트를 재적재할 수 있습니다. 명령어 줄 인자가 필요 없습니다. Installer.ahk를 사용하여 설정을 변경할 때 이 옵션은 현재 지원하지 않습니다.

스크립트 예제

유용한 스크립트는 이 페이지에서 보실 수 있습니다.


Help Settings

Specify the settings the help should be started with by default. These settings are permanent; this is, they apply for all current and future visits to this help.

Note: If you press the following button, ActiveX is used to create a config file named 'chm_config.js' in the same directory as the CHM file, with the following content:

Permission denied. Run the CHM file as administrator or create the config file manually.


AutoHotkey Beginner Tutorial

오토핫키 초보자 자습서, 작성 티드비트(tidbit)

목차

  1. 기본
    1. 오토핫키 내려받기
    2. 스크립트 만드는 법
    3. 명령어는 병합할 수 없다
    4. 기타 기본 정보
  2. 핫키 & 핫스트링
    1. 키 그리고 심볼
    2. 창 전용
    3. 파일당 여러 핫키
    4. 예제
  3. 키 눌림 전송하기
    1. 게임
  4. 프로그램 실행하기 & 웹사이트 열기
  5. 명령어 vs. 함수
    1. 코드 블록
  6. 변수
    1. 퍼센트를 사용할 때
    2. 사용자 입력 얻기
    3. 다른 예제들?
  7. 객체
    1. 객체 만들기
    2. 객체 사용하기
  8. 기타 도움이 되는 것들
    1. 신비한 []
    2. AHK 버전 알아내기
    3. 시행 착오
    4. 들여쓰기
    5. 도움 구하기
    6. 기타 링크

1 - 기본 지식

여행을 시작하기 전에, 조언을 한 마디 할까 합니다. 이 자습서에서 여러분은 꽤 많은 텍스트와 코드를 보시게 됩니다. 배우는 힘을 키우려면, 텍스트를 읽고 코드를 시험해 봅니다. 다음 그 코드를 연구해 보시기 바랍니다.
이 페이지에서 대부분의 예제를 복사해 붙여 넣을 수 있습니다.
잘 모르겠다면, 다시 읽어 보십시오.

a. 오토핫키를 내려받아 설치하기

이 문서를 하드에서 보고 있기 때문에, 아마도 이미 AutoHotkey가 설치되어 있을 것이고 섹션 b로 건너 뛰어도 됩니다.

AutoHotkey (AHK)의 사용법을 배우기에 앞서, 내려 받아야 하겠습니다. 내려 받았으면, 설치해야 겠지요. 그러나 그것은 원하는 버전이 무엇인가에 따라 달라집니다. 이 지침서에서는 설치기를 사용하겠습니다. 가장 쉽게 설치할 수 있으니까요.

텍스트 지시:

  1. AutoHotkey 홈페이지로 갑니다. http://ahkscript.org/
  2. 내려받습니다. http://ahkscript.org/download/ahk-install.exe
  3. AutoHotkey를 설치하는 동안 UNICODE 또는 ANSI 중 하나를 골라야 합니다. 짧게 말해, 아마도 UNICODE를 선택하는 편이 좋습니다. 영문자-아닌 문자와 숫자들을 지원하거든요. 설치 버튼이 나올 때까지 계속 진행합니다.
  4. 일단 끝났으면, 성공입니다! 섹션 b에서 계속합니다.

동영상 지시:
Frankie's "Install and Hello World"
http://www.autohotkey.com/forum/viewtopic.php?t=77674

b. 스크립트 만드는 법

오토핫키를 설치했으면, 뭔가 일을 시키고 싶겠지요. 오토핫키가 마법은 아닙니다. 우리 모두가 그렇기를 바라지만, 실제로는 아닙니다. 그래서 무슨 일을 하라고 지시할 필요가 있습니다. 이런 절차를 "스크립팅(Scripting)"이라고 부릅니다.

텍스트 지시:

  • 1. 데스크탑에 우클릭합니다.
  • 2. 메뉴에서 "New"를 찾습니다.
  • 3. "New" 메뉴 안에 "AutoHotkey Script"를 클릭합니다.
  • 4. 스크립트에 새 이름을 줍니다. 주의: 확장자는 .ahk로 끝나야 합니다. 예. MyScript.ahk
  • 5. 데스크탑에 새로 만들어진 파일을 찾아 우클릭합니다.
  • 6. "Edit Script"를 클릭합니다.
  • 7. 창이 열릴 겁니다. 아마도 노트패드이겠지요. 그렇다면, 성공입니다!

    이제 스크립트를 만들었으므로, 파일 안에 내용을 채워 넣어야 하겠습니다. 모든 내장 명령어와 함수 그리고 변수 목록은 section 5에서 보실 수 있습니다.

    다음은 핫키를 담고 있는 아주 간단한 스크립트입니다. 그 핫키가 눌리면 Send 명령어를 사용하여 텍스트를 타자합니다.

    ^j::
   Send, 나의 첫 번째 스크립트
Return

    나중에 더 깊이 들어가 보겠습니다. 그 때까지, 여기에서는 위의 코드를 설명합니다.
    - 첫 줄. ^j::가 바로 핫키입니다. ^는 CTRL을 의미하고, j는 기호문자 j입니다. ::의 왼쪽에 있는 것은 모두 누를 필요가 있는 키들입니다.
    - 둘째 줄. Send, My First Script는 키들을 전송하는(SEND) 법을 보여줍니다. SEND는 명령어이고, 쉼표(,) 다음에 오는 것들이 모두 타자됩니다.
    - 셋째 줄. Return. Return은 앞으로 가장 많이 접하게 되실 겁니다. 문자 그대로 코드를 멈춥니다. 아래로 더 이상 진행하지 않습니다. 이렇게 하면 스크립트에 많은 내용이 있을 때 문제를 피할 수 있습니다.

  • 8. 파일을 저장합니다.
  • 9. 데스크탑의 그 파일을 더블클릭하여 실행합니다. 노트패드를 엽니다 (무엇이든 타자해 넣을 수 있습니다). 그리고 Ctrl and J를 누릅니다.
  • 10. 멋지지요, 성공입니다! 첫 스크립트가 실행되었습니다. 가서 잠시 쉬고 돌아와 이 자습서를 계속 읽어보십시오..

비디오 지시:
Frankie's "Install and Hello World"
http://www.autohotkey.com/forum/viewtopic.php?t=77674

c. 명령어는 병합할 수 없습니다

코드를 만들 때, 여러 명령어들을 한 줄에 또는 한 명령어 안에 다른 명령어를 배치하고 싶은 유혹에 빠질 경우가 많을 것입니다. 절대 그렇게 하지 마십시오. 섹션 5에서 왜 예상한대로 작동하지 않는지 그리고 대신에 어떻게 하면 좋은지 말씀드리겠습니다.

d. 기타 기본적인 정보들

도움말 파일 찾는 법:
몇 가지 방법이 있습니다. 도움말이 기본 위치에 설치되어 있다고 가정하겠습니다..

방법 1:
  1. 시작 메뉴를 찾거나 화면에서 Start Orb를 엽니다. 보통 좌하에 있습니다.
  2. 프로그램 또는 모든 프로그램을 선택합니다.
  3. 목록에서 AutoHotkey를 찾습니다.
  4. 찾았으면 AutoHotkey 도움말 파일이 보일 겁니다. 그것을 클릭합니다.
  5. 끝입니다!
방법 2:
  1. 데스크탑으로 갑니다.
  2. 내 컴퓨터 또는 컴퓨터를 찾습니다. 그것을 엽니다.
  3. AutoHotkey가 들어있는 하드 드라이브로 갑니다. 아마도 C:\ 드라이브이겠지요.
  4. Program Files 폴더 안에서 AutoHotkey를 검색합니다.
  5. AutoHotkey.chm를 찾거나 이름이 AutoHotkey인 파일을 찾습니다. 그 위에 노란색 물음표가 있습니다.
  6. 끝입니다!

온라인 링크:
문서
명령어 리스트
함수
변수

2 - 핫키 & 핫스트링

핫키란 무엇인가? 핫키는 손길에 반응하는 키입니다. ... 농담입니다. 핫키는 사용자가 키보드를 눌러 어떤 행위를 촉발시키는 키 또는 키의 조합입니다.
핫스트링이란 무엇인가? 핫스트링은 주로 타자하는 동안 약자를 확대하는 데 사용됩니다 (자동-치환). 또 스크립트 행위를 촉발시키는 데에도 사용할 수 있습니다.

다음은 핫키입니다:

^j::
   Send, 나의 첫 번째 스크립트
Return

다음은 핫스트링입니다:

::ftw::Free the whales

두 예제 사이의 차이는 핫키가 CTRL & J를 누를 때 촉발되지만 핫스트링은 "ftw"를 타자하면 바로 "Free the whales"로 치환합니다.

"그래서, 정확하게 어떻게 핫키를 만드는가?" 좋은 질문입니다. 핫키는 한 쌍의 ::로 만들 수 있습니다. 키나 키 조합의 오른쪽에 ::이 있어야 합니다. 그리고 내용은 아래에 있어야 하고, 바로 따라서 아래에 Return이 있어야 합니다.

주의: 예외가 있지만, 그런 것들은 혼란만 가중 시킬 뿐입니다. 그래서 그런 것들은 이 자습서에서 다루지 않습니다. 적어도 지금은 아닙니다.

esc::
   MsgBox Escape!!!!
Return

핫 스트링은 한 쌍의 ::로 만듭니다. 그 사이에 텍스트 교체를 촉발하고 싶은 텍스트를 넣습니다. 반면에 타자된 텍스트를 대신할 텍스트는 두 번째 :: 쌍의 오른쪽에 배치합니다.

핫스트링은 위에 언급한 바와 같이 스크립트된 행위를 촉발할 수 있습니다. 핫키와 똑 같이 "멋지게 일을 하거라"와 같은 마법의 주문입니다.

::btw::
   MsgBox You typed "btw".
Return

알아야 할 멋진 일은 각 핫키, 핫 스트링, 라벨 그리고 아직 언급하지 않은 많은 것들마다 많은 줄의 코드를 가질 수 있다는 것입니다.

^j::
   MsgBox Wow!
   MsgBox this is
   Run, Notepad.exe
   winactivate, Untitled - Notepad
   WinWaitActive, Untitled - Notepad
   send, 7 lines{!}{enter}
   sendinput, inside the ctrl{+}j hotkey
Return

a. 키와 그의 신비한 심볼

궁금하실 겁니다. "도데체 어떻게 ^이 CTRL을 뜻한다는 걸 알 수 있지?!". 음, 좋은 질문입니다. ^와 기타 심볼이 무엇을 뜻하는지 돕기 위해, 다음 표에 모아 보았습니다:
심볼 | 설명
# | Win (윈도우즈 로고 키)
! | Alt
^ | Control
+ | Shift
& | 앰퍼센드는 두 개의 키 또는 마우스 버튼 사이에 사용되어 맞춤 핫키로 조합해 사용할 수 있습니다.

(완전한 심볼 목록은 핫키 페이지를 참조합니다)

추가로, 다음은 핫키의 왼쪽에 사용할 수 있는 모든/거의 대부분의 핫키 이름 목록입니다:
KeyList.htm

두 개의 키를 (오직 두 개까지만) 조합해 정의할 수 있습니다 (조이스틱 버튼 제외). 그 사이에 &를 사용하면 됩니다. 아래의 예제에서, Numpad0를 누른 다음 두 번째 키를 눌러서 핫키를 촉발시켜 보겠습니다:

Numpad0 & Numpad1::
   MsgBox Numpad0을 누르고 있는 동안 Numpad1를 눌렀습니다.
Return

Numpad0 & Numpad2::
    Run Notepad
Return

그러나 이제 핫스트링은 핫키가 그런 것처럼 멋진 수식키들이 있을까 궁금하실 겁니다. 물론 있습니다!
핫스트링 수식키는 첫 번째 :: 쌍 사이에 들어갑니다. 다음과 같이:

:*:ftw::Free the whales

핫키와 핫스트링 수식키에 관한 더 자세한 정보와 예제는 다음을 참조합니다:
핫키
핫스트링

b. 창 전용 핫키/핫스트링

종종 핫키나 핫스트링이 특정 창에서만 작동했으면 (또는 작동하지 말았으면) 하고 바랄 경우가 있습니다. 앞에 #를 두고 다음의 환상적인 명령어를 사용하면 됩니다.

#IfWinActive
#IfWinExist

(기술적으로 "지시어"라고 불리우는) 이 특별한 명령어들은 문맥을-감지하는 핫키와 핫스트링을 만듭니다. 그냥 창 제목을 지정하면 됩니다. 그러나 어떤 경우는 HWND나 그룹 또는 클래스를 지정하고 싶을 경우도 있습니다. 그런 것들은 좀 고급 주제이므로 다음에서 더 깊게 다룹니다: #IfWinActive.

#IfWinActive Untitled - Notepad
#space::
   MsgBox 노트패드에서 Win+Spacebar를 눌렀습니다.
Return
#IfWinActive

문맥 감지를 끄려면, #IfWin 명령어는 지정하되 그의 모든 매개변수를 빈 채로 두면 됩니다. 예를 들어:

; Notepad
#IfWinActive untitled - Notepad
!q::
   MsgBox, 노트패드에서  Alt 와 Q를 눌렀습니다.
Return
#IfWinActive

; Untitled - Notepad가 아닌 모든 창
!q::
   MsgBox, 어떤 창인지는 모르지만 Alt와 Q를 눌렀습니다.
Return

#IfWin 명령어가 꺼져 있으면 (또는 스크립트 안에서 전혀 사용되지 않으면), 모든 핫키와 핫스트링은 모든 창에 반응합니다.

#IfWin 명령어는 위치에 영향을 미칩니다: 물리적으로 이 명령어 아래에 있는 모든 핫키와 핫스트링은 모두 영향을 받습니다.

; Notepad
#IfWinActive ahk_class Notepad
#space::
   MsgBox, 노트패드에서 Win+Spacebar를 눌렀습니다.
Return
::msg::You typed msg in Notepad
#IfWinActive

; MSPaint
#IfWinActive untitled - Paint
#space::
   MsgBox, MSPaint에서 Win+Spacebar를 눌렀습니다!
Return
::msg::You typed msg in MSPaint!
#IfWinActive

더 깊은 정보과 비슷한 명령어들을 보려면, 다음을 참조합니다:
#IfWinActive

c. 파일당 다중 핫키/핫스트링

어떤 이유로 이런 생각이 드실지 모르겠습니다. 그래서, 명확하게 밝혀 둡니다: 오토핫키는 파일 하나당 얼마든지 많은 핫키와 핫스트링을 가질 수 있습니다. 1이든 3253이든 (그 이상이든) 상관없습니다.

#i::
   run, http://www.google.com/
Return

^p::
   run, notepad.exe
Return

~j::
   send, ack
Return

:*:acheiv::achiev
::achievment::achievement
::acquaintence::acquaintance
:*:adquir::acquir
::aquisition::acquisition
:*:agravat::aggravat
:*:allign::align
::ameria::America

위의 코드를 완벽하게 받아들일 수있는 다중 핫키와 다중 핫스트링입니다. 모두가 하나로 뭉뚱그려진 행복한 스크립트 파일이네요.

d. 예제

::btw::By the way                          ; EndChar를 누르면 바로 "btw"를 "By the way"로 교체합니다.
:*:btw::By the way                         ; "btw"를 "By the way"로 바꿉니다.  EndChar가 필요 없습니다.

^n::                                       ; Ctrl & n Hotkey
   run, notepad.exe                        ; Ctrl & n을 누려면 바로 notepad.exe를 실행합니다
Return                                     ; 핫키가 끝납니다. 이 아래의 코드는 실행되지 않습니다.

^b::                                       ; Ctrl & b Hotkey
   send, {ctrl down}c{ctrl up}             ; 선택된 텍스트를 복사합니다. ^c도 사용할 수 있지만, 이 방법이 더 안전합니다.
   SendInput, [b]{ctrl down}v{ctrl up}[/b] ; 선택된 텍스트를 bbcode (forum) Bold 태그 안에 싸 넣습니다.
Return                                     ; 핫키가 끝납니다. 이 아래의 코드는 실행되지 않습니다.

3 - 키 눌림 전송하기

그래서 이제 키들을 프로그램으로 전송(타자)하기로 결정합니다. Send 명령어를 사용하면 됩니다. 문자 그대로 키들을 전송합니다. 마치 키를 타자하거나 누른 것처럼 흉내 냅니다.

더 깊게 들어가기 전에, 먼저 약간의 일반적인 문제들을 다룹니다:
핫키처럼, Send에도 특수한 키가 있습니다. 아주 많습니다.
다음은 가장 많이 사용하는 심볼 네 가지입니다:

!: ALT 키를 전송합니다. 예를 들어, Send This is text!a는 "This is text" 키들을 누른 다음 ALT+a를 누른 것과 같습니다. 주의: !A 는 다른 프로그램에서는 !a와 전혀 다른 효과를 냅니다. 이것은 !A가 ALT+SHIFT+A를 누른 것인 반면 !a는 ALT+a를 누른 것이기 때문입니다. 잘 모르겠다면, 소문자를 사용하십시오.

+: SHIFT 키를 전송합니다. 예를 들어, Send +abC 는 텍스트 "AbC"를 전송하고, Send !+a는 ALT+SHIFT+a를 누릅니다.

^: CONTROL (Ctrl) 키를 전송합니다. 예를 들어, Send ^!a는 CTRL+ALT+a를 누른 것과 같고, Send ^{Home}은 CONTROL+HOME을 전송합니다. 주의: ^A는 어떤 프로그램에서 ^a와 전혀 다른 효과를 냅니다. 이것은 ^A가 CONTROL+SHIFT+A를 누른 것이고 ^a는 CONTROL+a를 누른 것이기 때문입니다. 잘 모르겠다면, 소문자를 사용하십시오.

#: WIN 키를 전송합니다 (윈도우즈 로고가 그려진 키) 그러므로 Send #e는 윈도우즈 키를 누른 다음 기호 "e"를 전송합니다.

다음 두 문단에서 전송 페이지에 관한 테이블에 관하여 언급합니다.

주의:
이 테이블은 핫키에 적용되지 않습니다. 핫키를 만들 때 CTRL 또는 ENTER (또는 기타 어떤 키이든) {} 안에 싸 넣지 못한다는 뜻입니다.

다음 예제에서 핫키에 해서는 안되는 것들을 보여줍니다:
; 핫키를 만들 때...
; 잘못됨
{LCtrl}::
   send, AutoHotkey
Return

; 올바름
LCtrl::
   send, AutoHotkey
Return

위의 거대한 테이블에 아주 많은 특수 키들이 AHK에 내장되어 있는 것을 볼 수 있습니다. 예를 들어: {enter} 그리고 {space}.
많은 사람들이 활괄호가 그냥 재미로 배치되어 있다고 생각합니다. 그러나 사실 꼭 필요합니다. 그렇게 해야 AHK가 {!}이 "느낌표"일 뿐 "Alt 키를 누르라"는 뜻이 아님을 이해합니다. 그래서 send 페이지에 있는 테이블을 꼭 암기하시고 괄호를 제 자리에 배치하십시오.

;  !가 {} 안에 있는 것에 주목하십시오. 그렇지 않으면  AHK가
;  ALT 키를 눌러 버리기 때문입니다.
send, This text has been typed{!}

; 위와 같지만,  이 번에는 ENTER 키입니다. AHK는 "enter"를 타자해 버립니다...
; ... {} 안에 싸여 있지 않다면 말입니다.
send, Multiple enter lines have enter been sent. ; 잘못됨
send, Multiple{enter}lines have{enter}been sent. ; 올바름
또다른 문제는 사람들이 send 명령어에서 모든 것들은 괄호에 싸 넣어야 한다고 생각한다는 것입니다. 그렇지 않습니다. 표에 없으면 괄호가 필요하지 않습니다. 일반적인 기호와 숫자 심지어 어떤 심볼들은 괄호에 싸 넣을 필요가 없습니다 (예를 들어 {}'s.에서 점)
또한, Send 명령어로 1 개 이상의 기호나 숫자 또는 심볼을 단 번에 보낼 수 있습니다. 그래서 1 개의 기호마다 따로따로 수 많은 Send 명령어를 사용할 필요가 없습니다.
; 위에 언급한 테이블에 없는 기호나 단어들을 따로 괄호에 싸 넣지 마십시오.
send, {a}       ; 잘못됨
send, {b}       ; 잘못됨
send, {c}       ; 잘못됨
send, {a}{b}{c} ; 잘못됨
send, {abc}     ; 잘못됨
send, abc       ; 올바름
키를 누르거나 떼려면, 키 이름을 괄호로 둘러 싸고 UP이나 DOWN을 사용합니다.
; 다음은 키 하나를 누름과 동시에 또다른 키 (또는 키들)을 누르는 방법입니다.
; 한가지 방법이 작동하지 않으면, 다른 방법을 시도해 보십시오.
send, ^s                     ; 둘 다 CTRL+s를 전송합니다.
send, {ctrl down}s{ctrl up}  ; 둘 다 CTRL+s를 전송합니다.
Send, {ctrl down}c{ctrl up}
Send, {b down}{b up}
Send, {TAB down}{TAB up}
Send, {Up down}  ; 위 화살표 키를 누릅니다.
Sleep, 1000      ; 일 초 동안 누르고 있습니다.
Send, {Up up}    ; 위 화살표 키를 뗍니다.
그러나 이제 궁금하실 겁니다. "정말 긴 send 명령어들을 어떻게 잘 읽을 수 있지?". 쉽습니다. 계속 섹션을 사용하면 됩니다. 그냥 새 줄에 반괄호를 열고, 내용을 넣고, 마지막으로 반괄호로 줄을 닫습니다. 더 자세한 정보는 계속 섹션을 참조합니다.
send,
(
첫 번째 줄
두 번째 줄
원하는 만큼 줄을 배치할 수 있습니다.
)

주의: 다양한 형태의 전송 방법이 있습니다. 각자 따로 특별한 특징이 있습니다. 이 중에 하나로 여러분의 필요를 충족하지 못하면, 또다른 종류의 전송 형태를 시도해 봅니다. 그냥 명령어 이름을 "send"에서 "sendPlay" 또는 원하는 아무것이나 시도해 봅니다.
다음은 텍스트를 전송하는 가장 흔한 방법입니다:
Send
SendRaw
SendInput
SendPlay
SendEvent
각자 어떤 일을 하는지에 관한 더 자세한 정보는 여기를 읽어 보십시오.

a. 게임

중요합니다!
많은 게임은, 특히 현대의 게임은, 속이는 것을 방지하는 기능이 있습니다. 예를 들어, 이런 종류의 게임으로는 GameGuard, Hackshield, PunkBuster, 등등이 있습니다. 게임이 속임 방지 시스템이 있고 핫키와 핫스트링 그리고 send 명령어가 작동하지 않는다면, 안타까운 일입니다.
이런 시스템을 우회하는 일은 게임사의 정책을 위반하는 것이며 그러면 여러분은 제명 당할 수 있습니다. 해결책은 대단히 복잡합니다. 어떤 게임에서는 작동의 기회를 높일 수 있는 방법이 있지만, 마법의 "당장 게임에서 작동하라" 버튼은 없습니다. 그래서 포기하기 전에 이 모든 것들을 시도해 보십시오.

DirectX와 관련된 문제도 있습니다. 문제가 있고 게임이 DirectX를 사용한다면, 아래의 방법을 시도해 보십시오. 가능하면 창(Windowed 역주: 입력 방식을 전적으로 운영체제에 맡김) 모드에서 시험해 보십시오. 그러면 DirectX 문제가 해결될 지도 모릅니다.
픽셀이나 이미지 명령어를 사용할 때, DirectX 문제가 더 많이 일어날 수도 있습니다. 어떤 색을 얻으려고 시도하는지에 상관없이 색깔이 검정색으로 바뀔 수 있습니다 (0x000000). 그것은 해결하기 어려운 또다른 문제입니다. 되도록이면 Windowed 모드에서 실행해 보십시오.

AutoHotkey를 모든 프로그램에서 작동하시키는 단 한가지 해결책은 없습니다. 시도한 모든 것이 실패한다면, 안타깝게도 AutoHotkey로는 여러분의 요구를 만족시킬 수 없는 것입니다.

FAQ 페이지에서 인용합니다:
어떤 게임은 DirectInput를 단독으로 사용합니다. 그 부작용으로, 모든 시뮬레이션 키눌림과 마우스 클릭을 무시해 버립니다. 이를 해결하려면, 다음 중 하나를 (또는 조합해서) 시도해 보십시오:
  • 다음을 통하여 SendPlay를 사용합니다. : 1) SendPlay 명령어를 사용합니다; 2) SendMode를 사용합니다; 그리고/또는 3) 핫스트링 옵션인 SP를 사용합니다.
  • SetKeyDelay의 지연시간을 늘려 봅니다. 예를 들어:
  • SetKeyDelay, 0, 50
  • SetKeyDelay, 150, 150, Play
  • ControlSend를 시도해 봅니다. 다른 Send 모드가 모두 실패하더라도 이 방법은 작동할 가능성이 있습니다.

4 - 프로그램 & 웹사이트 실행하기

Mspaint.exe, Calc.exe, script.ahk 심지어 폴더 같은 프로그램을 실행하려면, Run 명령어를 사용할 수 있습니다. 심지어 http://ahkscript.org/과 같이 URL에도 사용할 수 있습니다. 원하는 프로그램의 유형을 실행하도록 컴퓨터가 환경이 설정되어 있다면, 아주 간단합니다:
; 프로그램을 실행합니다. 주의: 대부분의 프로그램은 전체 파일 경로를 요구합니다.
Run, %A_ProgramFiles%\Some_Program\Program.exe

; 웹 사이트를 실행합니다
Run, http://ahkscript.org
명령어-줄 매개변수와 CLSID와 같은 다른 고급 특징들도 역시 있습니다.
더 알고 싶다면 이 페이지를 참조합니다.
다음에 몇 가지 예를 더 보여줍니다:
;  윈도우즈의 표준 프로그램들과 같이 전체 경로가 필요하지 않은 프로그램이 있습니다.
Run, Notepad.exe
Run, MsPaint.exe

; 내장 AHK 변수를 사용하여 "My Documents" 폴더를 엽니다.
Run, %A_MyDocuments%

; 웹 사이트를 실행합니다
Run, http://ahkscript.org
Run, http://www.google.com

더 깊은 정보와 더 많은 예제는 다음을 참조합니다:
commands/Run.htm.

5 - 명령어 vs. 함수

오토핫키는 코드를 만드는데 사용되는 크게 두 가지 유형이 있습니다:
명령어와 함수가 그것입니다

도움이 되는 링크:
모든 명령어 목록: commands/index.htm
모든 내장 함수 목록: Functions.htm#BuiltIn

명령어

그의 구문을 보면 (그의 겉 모습으로) 명령어인지 아닌지 구분할 수 있습니다. 명령어는 매개변수에 반괄호"()"를 사용하지 않지만 함수는 사용합니다. 그래서 명령어는 다음과 같이 보입니다:
Command, parameter1, parameter2, parameter3

명령어를 사용할 때, 다른 명령어를 같은 줄에 놓을 수 없습니다 (예외: ifEqual).
명령어를 다른 명령어의 매개변수 안에 놓을 수 없습니다.

Msgbox, Hello Run, Notepad.exe   ; 잘못됨
Msgbox, Hello, Run, Notepad.exe  ; 잘못됨

Msgbox, Hello      ; 올바름
Run, Notepad.exe
명령어는 또 "전통적인 구문"을 사용한다는 점에서 함수와 다릅니다. 그 의미는: 변수를 사용할 때, 그 둘레에 %를 사용할 필요가 있다는 뜻입니다. %variable%. 텍스트와 숫자는 "인용 부호" 안에 있을 필요가 없습니다: 예, This is some text. 게다가, 함수와는 다르게 매개변수 안에서 수학식을 사용할 수 없습니다.

매개변수에 수학식을 사용할 수는 있습니다. 강제로 % 기호로 표현식을 만들면 되지만, 이에 관해서는 다루지 않겠습니다.

함수

위에 언급한 바와 같이, 함수는 반괄호를 사용하기 때문에 다릅니다. 전형적인 함수의 모습은 다음과 같습니다:
Function(parameter1, parameter2, parameter3)

함수는 몇 가지 큰 차이점이 있습니다:
  1. 그 안에 수학식을 사용할 수 있습니다.
    -- SubStr(37*12, 1, 2)
    -- SubStr(A_Hour-12, 2)
  2. 변수는 퍼센트 기호로 둘러쌀 필요가 없습니다.
    -- SubStr(A_Now, 7, 2)
  3. 함수는 함수 안에 들어갈 수 있습니다.
    -- SubStr(A_AHKPath, inStr(A_AHKPath, "AutoHotkey"))
  4. 텍스트는 인용부호로 둘러싸야 합니다.
    -- SubStr("I'm scripting, awesome!", 16)
함수는 명령어와 다르게 보통 값을 돌려줍니다. 명령어는 OutputVar 매개변수가 필요하지만, 함수는 그렇지 않습니다. 변수를 함수의 값에 할당하는 가장 일반적인 방식은 다음과 같습니다:
MyVariable:=Function(Parameters)
MyVariable:=SubStr("I'm scripting, awesome!", 16)

이것만이 유일한 방법은 아닙니다. 그러나 가장 많이 사용되는 방법입니다. MyVariable 변수를 :=의 오른쪽에 있는 함수의 값으로 할당하고 있습니다 (이 경우, SubStr(...)).
함수에 관하여 더 자세한 것은 여기를 참조합니다.

짧게 말해:
; 다음은 명령어입니다
Msgbox, 이것은 텍스트입니다.
StringReplace, Output, Input, AutoHotKey, AutoHotkey, ALL
SendInput, 이거 정말 굉장하네요{!}{!}{!}

; 다음은 함수입니다
SubStr("스크립팅을 하고 있어요, 정말 죽여주네요!", 16)
FileExist(VariableContainingPath)
Output:=SubStr("스크립팅을 하고 있어요, 정말 죽여주네요!", 16)

a. 코드 블록

코드 블록은 활괄호 안에 있는 것들입니다 ({ 그리고 }). 한 그룹의 단위로 묶어 주므로 AutoHotkey는 그것을 함께 있어야 하는 하나의 커다란 가족으로 인식합니다. If 그리고 Loop와 함께 가장 많이 사용됩니다. 이것이 없다면, 블록에서 첫 줄만 호출됩니다.

다음 코드에서, 두 줄 모두 var가 5와 같은 경우에만 실행됩니다.
if (var=5)
{
   MsgBox, var equals %var%!!
   Exitapp
}

다음 코드에서, msgbox는 var가 5일 경우에만 보입니다. 코드는 var가 5가 아닐지라도 언제나 스크립트는 종료합니다.
if (var=5)
   MsgBox, var는 %var%와 같습니다!!
   Exitapp

이것은 첫 번째 줄의 코드와 연관되어 있을 경우에만 완벽하게 좋습니다. 정확하게 위와 똑같지만, 두 번째 줄은 내어 썼으므로 if와 분할되어 있음을 알 수 있습니다.
if (var=5)
   MsgBox, var는 %var%와 같습니다!!
MsgBox, 이제 if 서술문 '밖에' 있습니다. 아래에 한 줄만 있기 때문에 {}이 필요하지 않습니다.

6 - 변수

변수는 작은 포스트잇 메모지처럼 그 안에 정보를 담습니다. 텍스트나, 숫자, 그리고 함수나 명령어 심지어 수학 방정식으로부터 얻은 데이터를 저장하는 데 사용합니다. 변수가 없다면 프로그래밍 & 스크립팅은 정말 짜증나는 일이 될 것입니다.

변수는 몇 가지 방법으로 할당할 수 있습니다. 여기에서는 가장 흔한 방법을 다루겠습니다. 등호 기호(=)에 주목해 주십시오.
  1. variable=text
    가장 간단한 형태로, 전통적인 할당 방식입니다. 그냥 텍스트를 타자해 넣으면 그걸로 끝입니다.
  2. variable=%variable2%
    위와 같지만, 변수를 다른 변수 값에 할당하고 있습니다.
  3. variable:="text"
    = 앞에 있는 : 때문에 표현식 할당이라고 부릅니다. 텍스트는 "인용부호" 처리해 주어야 합니다.
  4. variable:=variable2
    표현식 모드에서 변수는 %가 필요하지 않습니다.
  5. variable:=6+8/3*2-sqrt(9)
    표현식 덕분에, 수학 계산을 할 수 있습니다!
숫자 1 & 2 를 결합해 사용할 수 있습니다. var=%var2% some text %var3%.
3, 4 & 5 도 역시 결합할 수 있습니다. var:="The value of 5+ " Variable " is: " 5+Variable

앞에 심볼이 있는 모든 등호 기호(=)는 할당 연산자라고 부릅니다. 언제나 표현식입니다. ] 그래서 := += -= .= 등등은 언제나 표현식을 사용합니다.

a. 퍼센트 기호를 사용해야 할 때

변수와 관련하여 오토핫키에서 가장 많이 제기되는 문제중 하나는 언제 퍼센트 기호 (%)를 사용하는가 하는 것입니다. 다음 설명으로 깔끔하게 혼란이 제거되기를 바랍니다.

%를 사용해야 할 때:
  1. 명령어를 사용할 때 (위 참조) 퍼센트 기호를 사용합니다.
    -- 매개변수가 OutputVar이거나 InputVar일 경우는 제외합니다.
  2. 전통적인 모드를 사용하는 변수에 변수를 할당할 때 (앞에 심볼이 없는 등호 기호).
%를 사용하면 안될 때:
  1. 매개변수가 입력변수이거나 출력 변수일 경우, 예를 들어: StringLen, OutputVar, InputVar
  2. 할당의 왼쪽에 있을 때: Var = 123abc
  3. 전통적 (비-표현식) if-서술문의 왼쪽에: If Var1 < %Var2%
  4. 표현식 안에. 예를 들어:
    If (Var1 != Var2)
   Var1 := Var2 + 100

b. 사용자 입력 얻기

종종 사용자가 값을 채워 넣어주기를 바랄 경우가 있습니다. 여러 가지 방법이 있지만, 가장 간단한 방법은 Inputbox입니다. 다음은 간단한 예입니다. 사용자에게 두 가지 질문을 하고 그 답을 가지고 무슨 일을 합니다.
InputBox, OutputVar, Question 1, 이름이 무엇입니까?
if (OutputVar="Bill")
   MsgBox, 멋진 이름이군요, %OutputVar%.

InputBox, OutputVar2, Question 2, 오토핫키를 좋아합니까?
if (OutputVar2="yes")
   MsgBox, %OutputVar2%`라고 답해 주셔서 고맙습니다. %OutputVar%! 여러분의 훌륭한 친구가 되어 드리겠습니다.
else
   MsgBox, %OutputVar%`, 정말 슬프군요.

c. 다른 예제들?

MsgBox, 4, , 계속하시겠습니까?
IfMsgBox, No
   Return                ; No이면, 코드를 멈춥니다.
MsgBox 당신은 YES를 눌렀습니다.  ; 그렇지 않으면, 사용자는 yes를 고른 것입니다.

; 퍼센트 기호를 사용해야 할 때와 하지 말아야 할 때는 보여주는 몇 가지 예들
Variable=text                      ; 변수에 텍스트를 할당합니다. '전통적인' 할당방식입니다.
VariableNumber:=6                  ; 변수에 숫자를 할당합니다. '표현식' 할당입니다.
Variable2=%Variable%               ; 변수를 또다른 변수에 할당합니다. 전통적인 할당을 사용합니다.
Variable3:=Variable                ; 변수를 또다른 변수에 할당합니다. 표현식 할당입니다.
Variable4.=Variable                ; 변수를 또다른 변수의 끝에 추가합니다. 표현식 할당입니다.
Variable5+=VariableNumber          ; 변수의 값을 또다른 변수에 추가합니다. 표현식 할당입니다.
Variable5-=VariableNumber          ; 변수의 값을 또다른 변수로부터 뺍니다. 표현식 할당입니다.
Variable6:=SubStr(Variable, 2, 2)  ; 함수 안의 변수입니다. 이것은 언제나 표현식 할당입니다.
Variable7=%Variable% Text          ; 변수를 또다른 변수에 약간의 텍스트오 함께 할당합니다. 전통적인 할당을 사용합니다.
Variable8:=Variable " Text"        ; 변수를 또다른 변수에 약간의 텍스트와 함께 할당합니다. 표현식 할당을 사용합니다.
MsgBox, %Variable%                 ; 명령어 안의 변수입니다.
StringSplit, Variable, Variable, x ; InputVar와 OutputVar를 사용하는 명령어 안의 변수입니다.
if (VariableNumber=6)              ; IF에 괄호가 있을 때마다, 그것은 표현식입니다. 그래서  %를 사용하지 않습니다.
If (Variable != VariableNumber)    ; IF에 괄호가 있을 때마다, 그것은 표현식입니다. 그래서  %를 사용하지 않습니다.
if VariableNumber=6                ; 괄호가 없으면, 그 if는 전통적입니다. 그렇지만, '오른쪽에 있는' 변수만 %가 필요합니다.
If Var1 < %Var2%                   ; 괄호가 없으면, 그 if는 전통적입니다. 그렇지만, '오른쪽에 있는' 변수만 %가 필요합니다.

7 - 객체

객체는 좀 더 효율적으로 사용하기 위해 데이터를 조직하는 방법입니다. 종종 객체는 배열이라고 지칭되기도 합니다. 그러나 모든 배열은 그냥 객체일 뿐이라는 사실을 인식하는 것이 중요합니다. 객체를 어디에 사용하려고 하는가에 따라 다르게 부르기도 하지만, 그 모든 객체는 같은 것입니다.

객체는 기본적으로 변수 집합입니다. 변수 이름은 "키"라고 알려져 있고, 그 변수의 내용은 "값"이라고 합니다.

객체를 배열 또는 인덱스 배열이라고 부른다면, 보통 모든 키가 1부터 시작해서 연속적으로 증가하는 숫자라는 뜻입니다.
객체를 연관 배열이라고 부른다면, 키가 문자열(텍스트)이거나 아니면 비-연속 숫자들이라는 뜻입니다. 종종, 그 둘은 혼용됩니다. 연속 숫자도 마찬가지입니다!

키나 값이 무엇인지는 제한이 없습니다. 심지어 다른 배열이 될 수도 있습니다!
값이 또 배열이면, 이것을 내포 배열이라고 부릅니다. 이에 관해서는 나중에 설명드리겠습니다.
객체를 사용하고 싶은 이유가 많이 있습니다. 예를 들면:
  1. 번호 리스트를 사용하고 싶습니다. 예를 들어, 장보기 목록 같은 경우이겠지요 (이것은 인덱스 배열이라고 지칭됩니다)
  2. 격자를 표현하고 싶습니다. 아마도 보드 게임에 사용하실 생각이겠지요 (이것은 내포 객체로 만들 수 있습니다)
  3. 각각에 이름이 있는 물품 목록이 있습니다. 예를 들어 과일의 특징에 맞추어 이름을 적용할 수 있습니다 (이것은 연관 배열이라고 부릅니다)

a. 객체 만들기

객체를 만들려면 몇 가지 방법이 있습니다. 가장 흔한 방법은 아래와 같습니다.
  1. MyObject := ["one", "two", "three", 17]
    각괄호 구문입니다. 이것으로 "인덱스 배열"을 만들 수 있습니다. 인덱스 배열은 항목 리스트를 1부터 쭈욱 나열해 보여주는 객체입니다. 이 예제에서, 값 "one"은 객체 키1에 저장됩니다 (인덱스 1), 그리고 값 17은 객체 키 4에 저장됩니다 (인덱스 4).
  2. Banana := {"Shape": "Elongated", "Color": "Yellow", "Taste": "Delicious", "Price": 3}
    활괄호 구문입니다. 이것으로 "연관 배열"을 정의할 수 있습니다. 연관 배열은 각 항목에 이름이 있는 데이터 집합입니다. 이 예제에서 값 "yellow"는 객체 키 "color"에 저장됩니다. 또, 값 3은 객체 키 "Price"에 저장됩니다.
  3. MyObject := Array("one", "two", "three", 17)
    "배열" 생성 함수입니다. 이 함수는 각괄호 구문과 동등하지만, 함수에 싸여 있습니다.
  4. Banana := Object("Shape", "Elongated", "Color", "Yellow", "Taste", "Delicious", "Price", 3)
    객체 생성 함수입니다. 이 함수는 활괄호와 동등하지만, 함수에 싸여 있습니다.
이 모든 정의가 같은 것(객체)을 만들어 낸다는 것을 기억하는 것이 중요합니다. 단지 키가 다를 뿐입니다.

b. 객체 사용하기

객체를 사용하는 방법이 여러가지가 있습니다. 값을 열람하기, 값을 설정하기, 값을 추가하기, 등등이 포함됩니다.

값을 설정하려면:
객체에 값을 설정하는 일은 변수에 값을 설정하는 것 만큼이나 단순합니다.
그냥 (열람 섹션에서 보시듯이) 표현식 할당 심볼 :=의 왼쪽에.
각괄호나 점 표기법을 배치하기만 하면 됩니다.
예를 들어:
Banana.Consistency := "Mushy"
Banana["Pickled"] := True ; 이 바나나는 절인 바나나입니다. 우웩.

값을 열람하려면:
  1. Value := Banana["Color"]
    각괄호 표기법입니다. 표현식을 키로 사용하여 객체로부터 값을 얻을 수 있습니다. 이 경우, 간단한 표현식 "Color"를 사용했습니다. 이것이 (당연히) 키 Color입니다. 메시지 박스에 "Yellow"라는 단어가 나타날 텐데, 이것은 앞 섹션에서 키 Color에 할당했던 값입니다.
  2. Value := Banana.Color
    점 표기법입니다. 이 방법은 기호 문자열만 키로 사용할 수 있습니다. 변수는 키로 사용할 수 없습니다.

새 키와 값을 추가하려면:
  1. 직접적으로 값을 추가하기
    직접적으로 키와 값을 추가하려면, 그냥 존재하지 않는 키를 설정하기만 하면 됩니다. 예를 들어:
    MyObject.NewKey := "Shiny"
    MyObject["NewerKey"] := 3.1415
  2. 값을 삽입하기
    객체에 키와 값을 추가하는 또다른 방법은 다음 방법 중 하나를 사용합니다.

    MyObject.InsertAt(Index, Value1, Value2, Value3...)
    Index는 정수 키입니다. 이렇게 하면 삽입할 때마다 이 값보다 더 높은 모든 키들이 위로 이동합니다. 틈이 있어도 이동합니다. (예를 들어, 키가 1부터 100 까지만 존재하고, 값을 키 50에 삽입하면, 100은 101로 이동합니다).

    MyObject.Push(Value1, Value2, Value3...)
    이렇게 하면 MyObject배열의 끝에 값이 "추가됩니다". 다른 말로 해서, 값을 가장 높은 정수키보다 하나 더 큰 위치에 삽입합니다.

키와 값을 삭제하려면:
  1. 값을 제거하기.
    가장 쉽게 값을 제거하는 방법은 그냥 없애 버리는 것입니다. 그냥 ""로 설정하면 됩니다. 빈 문자열이라고 부릅니다. 이것으로는 키가 제거되지 않지만, 값이 설정되지 않은 값과 동일하게 보이도록 만듭니다.
    HasKey 메쏘드를 사용하면 키가 여전히 존재한다고 알려줄 수 있습니다. 그러면 여전히 for 회돌이에 나타날 것입니다. (회돌이에 관해서는 나중에 자세히 말씀드리겠습니다)
  2. 키를 제거하기
    키와 값을 제거하는 몇 가지 다른 방법이 있습니다:
    1. RemovedValue := MyObject.Delete(AnyKey)
      MyObject[AnyKey]의 이전 값은 RemovedValue에 저장됩니다.
    2. NumberOfRemovedKeys := MyObject.Delete(FirstKey, LastKey)
      이런식으로 제거하면 FirstKey와 LastKey 사이의 숫자/정수 또는 문자열 키를 몽땅 제거할 수 있습니다.

      돌려받는 값은 제거된 키의 개수입니다. 이것은 키 사이에 틈이 있을 때 유용합니다 (예를 들어, 키를 1부터 4까지 지정했지만, 키 2는 존재하지 않는다면, NumberOfRemovedKeys가 3으로 설정되고 세 개의 키만 제거됩니다)
    3. MyObject.Pop()
      가장 높은 정수 키가 제거되고, 그 값을 돌려줍니다. 영향을 받을 더 높은 키는 전혀 없습니다.
    4. RemovedValue := MyObject.RemoveAt(Index)
      NumberOfRemovedKeys := MyObject.RemoveAt(Index, Length)
      Index부터 Index + Length - 1 (포함e)까지 모든 키들이 삭제됩니다. Length를 생략하면 1이 기본값입니다. 키를 제거한 다음 이 보다 높은 모든 숫자/정수 키들을 위로 올려서 틈을 메웁니다. 그래서 값이 Index + Length에 있었다면 이제 그 값은 Index에 있습니다. 이 방식은 여러 값이 지정된 InsertAt 메쏘드의 작동 방식과 비슷합니다.

8 - 기타 등등 도움

이제 여행의 막바지에 다다랐습니다. 모쪼록 무언가를 배웠기를 바랍니다. 그러나 끝내기 전에, 여러분이 꼭 알아야 한다고 생각하는 다른 것들을 여기에 제시합니다. 즐거운 시간 되시기를!

a. 신비한 []

문서를 통하여, 다음 두 심볼이 보일 겁니다 ([ 그리고 ]). 거의 모든 페이지 상단에 노란색 구문 박스 안에서 코드를 둘러 싸고 있지요. 이 각활호 안에 든 모든 것들은 선택적입니다. 그 안에 든 것들은 필요 없으면 생략해도 된다는 뜻입니다. 코드를 작성할 때, [] 는 절대로 타자하지 않습니다.

ControlGetText 페이지에서 이것을 보실 수 있습니다 (색깔 없이):
ControlGetText, OutputVar [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

그래서 그냥 원하다면 이렇게 해도 됩니다:
ControlGetText, OutputVar

또는 좀 더 세밀하게 이렇게 해도 됩니다:
ControlGetText, OutputVar, Control, WinTitle

ExcludeTitle를 사용하고 싶지만 WinText나 WinTitle은 채우고 싶지 않다면? 간단합니다!
ControlGetText, OutputVar, Control,,, ExcludeTitle

매개변수는 무시할 수 없습니다. 그냥 빈 채로 놓아 두는 것은 괜찮습니다.
"WinTitle, WinText"를 무시해 버리면, 다음과 같이 보일 것이고 문제를 일으킵니다:
ControlGetText, OutputVar, Control, ExcludeTitle
다음은 유효합니다.
ControlGetText, OutputVar, Control,,, ExcludeTitle

b. AHK 버전 알아내기

다음 코드를 실행하면 AHK 버전을 볼 수 있습니다:
MsgBox, %A_AHKVersion%
또는 "AutoHotkey 도움말 파일" 또는 "AutoHotkey.chm"을 시작 메뉴나 설치 디렉토리에서 찾아 보십시오.

c. 시행 착오

시행 착오는 배움에서 아주 흔하고 효과적인 방법입니다. 모든 것들에 도움을 구하는 대신에, 좀 혼자만의 시간을 가지고 (몇 시간이나 몇 일 동안) 작동시켜 보려고 시도하는 것이 더 빨리 배우는데 도움이 되실 겁니다.

뭔가를 시도해 보고 에러를 맞이해 보면서, 그 에러를 연구합니다. 다음 코드를 수정한 다음, 다시 시도해 봅니다. 여전히 에러를 맞이한다면, 코드를 좀 더 수정합니다. 코드가 더 이상 실패하지 않을 때까지 계속 시도와 실패를 거듭합니다. 문서를 읽고, 에러를 읽고 무엇이 작동하고 무엇이 작동하지 않는지 배우면서 많은 것을 배우실 겁니다. 시도, 실패, 시도, 실패,시도, 실패, 시도, 실패, 성공!

이 방법으로 수 많은 "프로들이" 배웠습니다. 그러나 도움을 구하는 데 두려워하지 마십시오. 면박당하지 않습니다. 배우는 데는 시간이 필요하며, 여러분이 만나는 "프로"가 단 몇 시간 몇 일 만에 배워서 마스터가 된 것이 아닙니다.

"처음에는 성공하지 못하더라도, 다시 시도, 또 시도, 시도하라." - Hickson, William E.

d. 들여쓰기

들여쓰기는 아주 중요합니다! 코드는 완벽하게 실행되지만, 코드를 읽을 때 심각한 두통거리가 될 것입니다. 작은 코드라면 (25 줄 이하) 아마도 들여쓰기가 없더라도 읽는데 문제가 없겠지만, 조만간 어려워질 겁니다. 되도록이면 빠리 들여쓰기를 배우는 편이 제일 좋습니다.
들여쓰기는 특별한 스타일이 없지만, 일관성을 유지하는 것이 제일 좋습니다.
"들여쓰기란 무엇인가?" 아마도 이렇게 묻고 싶겠지요? 무엇이 무엇에 속해 있는지 보기 위해 코드를 간격을 두어 쪼개는 것입니다. 사람들은 한 레벨 당 보통 3 이나 4 개의 공백 또는 한 개의 탭을 사용합니다.

들여쓰기 없음:
if (car="old")
{
msgbox, the car is really old
if (wheels="flat")
{
msgbox, this car is not safe to drive.
Return
}
else
{
msgbox, Be careful! This old car will be dangerous to drive.
}
}
else
{
msgbox, My`, what a shiny new vehicle you have there.
}
들여쓰기함:
if (car="old")
{
   msgbox, 자동차가 정말 오래되었습니다
   if (wheels="flat")
   {
      msgbox, 이 자동차는 운전하기에 안전하지 않습니다.
      Return
   }
   else
   {
      msgbox, 주의하세요! 이 구형 자동차는 운전하기에 위험합니다.
   }
}
else
{
   msgbox, 와우`, 정말 멋진 자동차를 가지셨군요.
}
Wiki에 다양한 스타일과 예제가 있습니다. 여러분이 읽기에 가장 쉽다고 생각하는 스타일을 골라 들여쓰기 하는 법을 배우십시오.
http://en.wikipedia.org/wiki/Indent_style

e. 도움 요청하기

물어보기 전에, 먼저 스스로 연구해 봅니다. 또는 스스로 코드해 봅니다. 결과가 만족스럽지 못하다면, 아래를 읽어 보십시오.
  • 두려워 하지 말고 도움을 청합니다. 가장 똑똑한 사람들조차 다른 이에게 도움을 구합니다.
  • 무엇을 시도하고 있는지 두려워 하지 말고 보여줍니다. 심지어 말도 안되는 것이라고 생각할지라도 말입니다.
  • 시도해 본 것들을 모두 게시합니다.
  • 여러분을 제외하고 누구든 멍청해서 아무것도 모른다고 생각하십시오. 되도록이면 많은 정보를 주어서 바보들에게 무엇을 하려고 하는지 일깨워 주십시오. 우리를 돕는 것이 바로 여러분을 돕는 것입니다.
  • 인내 하십시오.
  • 정중 하십시오.
  • 다음을 여십시오.
  • 친절 하십시오.
  • 즐기십시오
바로 답을 얻지 못하더라도, 적어도 하루 (24 시간)은 기다린 후에 도움을 더 요청합니다. 우리도 기꺼이 도와주고 싶지만, 시간이 나야 도와줄 수 있습니다. 일을 하고 있을 수도 있고, 잠자거나, 게임하거나, 가족과 함께이거나 아니면 그냥 바쁠 수 있습니다.
도움을 기다리는 동안, 스스로 시도하면서 배울 수 있습니다. 도움없이 스스로 뭔가를 이루면 큰 보람을 느끼실 것입니다.

f. 다른 링크들

자주 묻는 질문들 (FAQ)


Variables and Expressions

변수와 표현식

목차

  • 변수
  • 표현식
  • 표현식 안의 연산자
  • 내장 변수
  • 환경 변수 대 보통 변수
  • 변수의 가용성과 메모리

변수

변수 유형: 오토핫키는 명시적으로 정의된 변수 유형이 없습니다. 그렇지만, 숫자만 들어 있는 변수는 (선택적으로 소수점이 있으면) 수학 연산이나 비교가 필요할 경우 자동으로 숫자로 이해합니다 (수행성능을 개선하기 위해, 숫자는 내부적으로 캐쉬를 해서 문자열과의 상호변환을 피합니다.)

변수 영역과 선언: 함수에서 지역 변수를 제외하고, 모든 변수는 전역적입니다; 즉, 스크립트의 어디에서든 그 내용을 읽거나 변경할 수 있습니다. 함수 페이지에 적시한 때를 제외하고, 변수는 선언할 필요가 없습니다; 그냥 사용하면 존재합니다 (각 변수는 빈 상태로 시작합니다).

변수 이름: 변수 이름은 대소문자를 구분하지 않습니다 (예를 들어, CurrentDate는 currentdate와 동일합니다). 변수 이름은 길이가 253 문자까지 허용되고 기호와 숫자 그리고 다음 구두점 표시도 허용됩니다: # _ @ $

스타일 관례 때문에, 일반적으로 변수는 기호와 숫자 그리고 밑줄 문자만 사용하는 편이 더 좋습니다 (예를 들어: CursorPosition, Total_Items, 그리고 entry_is_valid). 이 스타일을 사용하면 다른 언어에 친숙한 사람들이 오토핫키 스크립트를 더 쉽게 읽을 수 있습니다. 또한, 오토핫키와 같은 관례를 다른 언어에 사용하면, 여러분 자신의 스크립트를 다시 읽기가 더 쉽다는 것을 아시게 될 것입니다.

변수 이름을 전적으로 숫자로 구성할 수도 있지만, 이것은 일반적으로 들어오는 명령어 줄 매개변수에만 사용됩니다. 그런 숫자 이름은 표현식에 사용할 수 없습니다. 왜냐하면 변수가 아니라 숫자로 인식되기 때문입니다.

단어 AND와 OR 그리고 NOT은 표현식에 연산자로 사용되기 때문에, 일반적으로 변수 이름으로 사용하면 안됩니다. 그런 이름을 표현식에 사용하면 적절하게 평가되지 않을 것입니다.

변수 안에 변수를 저장하기: 문자열이나 숫자를 변수에 저장하려면, 전통적 할당과 표현식 할당의 두 가지 방법이 있습니다. 전통적 방법은 등호 기호 연산자(=)를 사용하여 겹따옴표 없는 기호 숫자열이나 퍼센트 사인에 둘러싸인 변수를 할당합니다. 예를 들어:

MyNumber = 123
MyString = 이것은 문자열입니다.
CopyOfVar = %Var%  ; 변수의 내용을 열람하려면 등호(=) 연산자와 함께 퍼센트 사인이 필요합니다.

대조적으로, 표현식 할당은 쌍점-등호 연산자 (:=)를 사용하여, 숫자와 겹따옴표 붙인 문자열 그리고 기타 유형의 표현식을 저장합니다. 다음 예제는 기능적으로 앞의 예제와 동일합니다:

MyNumber := 123
MyString := "이것은 기호 문자열입니다."
CopyOfVar := Var  ; 앞의 예와 다르게, 퍼센트 사인이  := 연산자에 사용되지 않습니다.

더 명료하기 때문에 표현식 할당을 많은 사람들이 선호합니다. 그리고 표현식 할당이 지원하는 표현식 구문이 다른 많은 언어의 표현식 구문과 거의 동일하기 때문입니다.

위에서 눈치 채셨겠지만 변수의 내용을 지우는 데에도 두 가지 방법이 있습니다 (즉, 변수를 비우려면):

MyVar =
MyVar := ""

위에서 빈 겹따옴표 쌍은 := 연산자에만 사용해야 하는데 = 연산자와 사용하면 변수 안에 두 개의 겹따옴표 문자가 기호 그대로 저장되어 버리기 때문입니다.

변수의 내용 열람하기: 값을 저장하는 두 가지 방법과 마찬가지로, 값을 열람하는 방법도 역시 전통적 열람과 표현식 열람 두 가지의 방법이 있습니다. 전통적 열람은 각 변수 이름을 퍼센트 사인으로 둘러 싸기를 요구합니다. 예를 들어:

MsgBox Var 변수의 값은 %Var% 입니다.
CopyOfVar = %Var%

대조적으로, 표현식 열람은 변수 이름 둘레에 퍼센트 기호를 생략하지만, 기호 문자열은 겹따옴표로 둘러야 합니다. 그래서, 다음은 앞 에제의 동등한 표현식입니다:

MsgBox % "The value in the variable named Var is " . Var . "."  ; 두 개의 문자열을 결합하는데 마침표가 사용되었습니다.
CopyOfVar := Var

위의 MsgBox 줄에서, 퍼센트 사인과 스페이스가 매개변수를 전통적 모드에서 표현식 모드로 바꾸는데 사용되었습니다. 이것은 꼭 필요한데 전통적 방법이 모든 명령어에 기본값으로 사용되기 때문입니다 (문서에 적시된 경우는 예외입니다). 그렇지만, 어떤 명령어의 매개변수들은 표현식을 받아 들인다고 문서에 적시되어 있습니다. 그런 경우 앞의 퍼센트 사인은 허용되지만 필수는 아닙니다. 예를 들어, 다음의 모든 예는 효과가 똑 같습니다. 왜냐하면 Sleep의 첫 번째 매개변수가 표현식을 허용하기 때문입니다:

Sleep MillisecondsToWait
Sleep %MillisecondsToWait%
Sleep % MillisecondsToWait

변수 비교하기: 다양한 종류의 비교에 관한 중요한 고지 사항, 특히 언제 괄호를 사용해야 하는가에 관한 정보는 아래의 표현식 섹션을 읽어 보십시오.

표현식

표현식은 일련의 변수, 기호 문자열, 그리고/또는 기호 숫자에 하나 이상의 연산을 수행하는 데 사용됩니다.

변수 이름은 표현식에서 퍼센트 사인으로 둘러싸지 않습니다 (의사-배열과 기타 이중 참조는 제외합니다). 결과적으로, 기호 문자열은 겹따옴표로 둘러싸서 변수와 구별해야 합니다. 예를 들어:

if (CurrentSetting > 100 or FoundColor <> "Blue")
    MsgBox 설정이 너무 높거나 잘못된 색이 존재합니다.

위의 예제에서, "Blue"는 겹따옴표 안에 있는데 왜냐하면 기호 문자열이기 때문입니다. 실제로 인용-문자를 기호 문자열 안에 포함하려면, 두 개의 겹따옴표를 연속으로 지정합니다. 다음 예와 같이 두 번 나타나야 합니다: "She said, ""An apple a day.""".

중요: 표현식이 들어 있는 if-서술문은 예를 들어 If FoundColor <> Blue와 같은 전통적인 if-서술문과 다릅니다. 단어 "if" 뒤의 문자를 여는-괄호로 만듭니다. 이것은 보통 전체 표현식을 괄호로 둘러싸면 해결되지만, if (x > 0) and (y > 0)와 같이 해도 됩니다. 게다가, 여는-괄호는 단어 "if" 다음의 첫 항목이 함수 호출 또는 "not" 또는 "!"와 같은 연산자일 경우 완전히 생략해도 됩니다.

빈 문자열: 빈 문자열을 표현식에 지정하려면, 빈 겹따옴표 한 쌍을 사용합니다. 예를 들어, if (MyVar <> "") 서술문은 MyVar가 비어 있지 않으면 참입니다. 그렇지만, 전통적인-if에서, 한 쌍의 빈 겹따옴표는 기호 그대로 간주합니다. 예를 들어 if MyVar = ""는 MyVar에 실제로 겹따옴표 쌍이 담겨 있을 경우에만 참입니다. 그래서, 변수가 비어있는지 전통적인-if로 점검하려면, 다음 예와 같이 오른쪽에 아무것도 없이 = 또는 <>를 사용하십시오: if Var =.

관련해서 말씀 드리자면, (x +* 3)와 같이 무효한 식은 빈 문자열을 산출합니다.

표현식의 결과를 저장하기: 결과를 변수에 저장하려면, := 연산자를 사용합니다. 예를 들어:

NetPrice := Price * (1 - Discount/100)

불리언 값: 표현식을 참이나 거짓으로 평가할 필요가 있을 때 (IF-서술문처럼), 빈 또는 0인 결과는 거짓으로 간주되고 다른 모든 결과는 참으로 간주됩니다. 예를 들어, 서술문 if ItemCount는 ItemCount가 비어 있거나 0일 경우에만 거짓입니다. 비슷하게, 표현식 if not ItemCount는 그 반대 결과를 산출합니다.

NOT/AND/OR/>/=/<와 같은 연산자는 자동으로 참 또는 거짓 값을 생산합니다: 참에는 1 그리고 거짓에는 0을 산출합니다. 예를 들어, 다음 표현식에서, 변수 Done은 두 조건중 하나라도 참일 경우 1이 할당됩니다.:

Done := A_Index > 5 or FoundIt

위에서 암시하듯이, 변수는 그냥 비우거나 0을 할당하면 거짓값을 담는데 사용할 수 있습니다. 이를 이용하여, 단축 서술문 if Done을 사용하면 변수 Done이 참인지 거짓인지 점검할 수 있습니다.

단어 true와 false는 내장 변수로서 각각 1과 0을 담고 있습니다. 다음 예제와 같이 스크립트를 좀 더 읽기 쉽게 만들 수 있습니다:

CaseSensitive := false
ContinueSearch := true

정수와 부동 소수점 수: 표현식 안에서, 숫자는 안에 소수점이 있으면 부동 소수점 수로 간주됩니다; 그렇지 않으면 정수로 취급합니다. 대부분의 연산자에 대하여 -- 예를 들어 덧셈과 곱셈 -- 두 입력중 하나라도 부동 소수점 수이면, 그 결과도 역시 부동 소수점 수가 됩니다.

표현식과 비-표현식 안에서 비슷하게 정수는 16진수나 십진수 형식으로 작성할 수 있습니다. 16진수는 모두 접두사 0x로 시작합니다. 예를 들어, Sleep 0xFF는 Sleep 255와 동등합니다. v1.0.46.11+에서, 과학적 표기법으로 작성된 부동 소수점 수를 인지합니다; 그러나 안에 소수점이 포함되어 있을 경우에만 인지합니다 (예, 1.0e4 그리고 -2.1E-4).

강제로 표현식으로 만들기: 표현식은 매개변수에 사용할 수 있습니다. 직접적으로 지원하지 않더라도 (OutputVar 매개변수 제외) 표현식 앞에 퍼센트 사인과 스페이스 또는 퍼센트 사인과 탭을 두면 됩니다. [v1.1.21+]에서, 전통적인 IF 명령어를 제외하고 모든 명령어의 InputVar 매개변수에 이 접두사를 사용할 수 있습니다 (대신에 If (표현식)을 사용하십시오). 이 테크닉은 종종 배열에 접근하는 데 사용됩니다. 예를 들어:

FileAppend, % MyArray[i], My File.txt
FileAppend, % MyPseudoArray%i%, My File.txt
MsgBox % "The variable MyVar contains " . MyVar . "."
Loop % Iterations + 1
WinSet, Transparent, % X + 100
Control, Choose, % CurrentSelection - 1

표현식 안의 연산자

곱셈(*)과 나눗셈(/)과 같이 우선순위가 같은 연산자는 왼쪽에서 오른쪽 순서로 평가됩니다. 대조적으로, 덧셈 (+)과 같이 우선 순위가 낮은 연산자는 곱셈(*)과 같이 더 높은 연산자 다음에 평가됩니다. 예를 들어, 3 + 2 * 2는 3 + (2 * 2)으로 평가됩니다. 괄호를 사용하면 다음 예와 같이 우선 순위를 오버라이드할 수 있습니다: (3 + 2) * 2

아래에 적시한 때를 제외하고, 수학 연산과 관련된 빈 값 (빈 문자열)은 모두 0으로 간주되지 않습니다. 대신에, 에러로 취급합니다. 그 때문에 표현식의 일부가 빈 문자열로 평가됩니다. 예를 들어, 변수 X가 비어 있으면, 표현식 X+1은 1이 아니라 빈 값을 산출합니다.

표현식 연산자 (우선순위가 높은 순서부터 나열합니다)

%Var%

변수가 표현식 안에서 퍼센트 사인에 둘러 싸여 있으면 (예, %Var%), 그 변수에 들어 있는 것은 어떤 것이든 또다른 변수의 이름이나 부분 이름으로 간주합니다 (그런 변수가 없다면, %Var%는 빈 문자열로 결정됩니다). 이런 일은 다음 예와 같이 의사-배열을 참조하는 데 자주 사용됩니다:

Var := MyArray%A_Index% + 100

하위 호환을 위해, "표현식일 수 있음"으로 문서화되어 있는 명령어 매개변수는 퍼센트 기호 안에 이름만 있는 변수에서 마치 퍼센트 사인이 없는 것처럼 취급합니다 (예, %Var%, 그러나 Array%i%는 아님). 괄호 안에 그 참조를 둘러싸면 이런 일을 피할 수 있습니다; 예, Sleep (%Var%).

[AHK_L 52+]: 보통 변수 외에도, %Var%는 환경 변수, 클립보드, 또는 예약/읽기-전용 변수로 결정될 수 있습니다. revision 52이전에서, 이런 경우 %Var%는 빈 문자열을 산출했었습니다.
x.y | [AHK_L 31+]: 객체 접근. x 객체에 메쏘드를 호출하거나 값을 설정하고 얻습니다. 여기에서 y는 기호 그대로의 값입니다. 객체 구문을 참조하십시오.
new | [v1.1.00+]: 또다른 객체로부터 상속받아 새 객체를 생성합니다. 예를 들어, x := new y는 종종 x := {base: y}와 동등합니다. new는 다음에 GlobalClass.NestedClass의 형태로 변수나 간단한 클래스 이름이 따라와야 합니다. 그리고 선택적으로 x := new y(z)에서와 같이 매개변수가 따라 옵니다 (여기에서 y는 사용가능하지만, 함수 이름은 아닙니다). 자세한 것은 맞춤 객체를 참조하십시오.
++
-- 		전위/후위 증감. 변수에서 1을 더하거나 뺍니다 (그러나 1.0.46 이전 버전이면, 이것은 오직 그 자체로 한 줄에 사용해야 합니다; 다른 연산자가 없어야 합니다). 연산자는 변수 이름의 앞이나 뒤에 나타납니다. 이름 앞에 나타나면, 연산이 즉시 수행되고 그 결과가 다음 연산에 사용됩니다. 예를 들어, Var := ++X는 X를 즉시 증가시킨 다음 그의 값을 Var에 할당합니다. 반대로, 증감 연산자가 변수 이름 뒤에 있으면 그 변수가 다음 연산에 사용되고 난 후에 연산이 수행됩니다. 예를 들어, Var := X++는 현재 X값을 Var에 할당하고 난 후에 X를 증가시킵니다. 하위 호환의 문제 때문에, ++ 과 -- 증감 연산자는 빈 변수를 0으로 취급합니다. 그러나 한 줄에 홀로 있을 때만 그렇습니다; 예를 들어, y:=1, ++x 그리고 MsgBox % ++x는 둘 다 x 가 비어 있을 때 빈 결과를 산출합니다.
** Power. 밑수와 지수 모두 십진 소수점을 담을 수 있습니다. 지수가 음수이면, 그 결과는 부동 소수점 수로 포맷됩니다. 밑수와 지수 둘 모두 정수일지라도 그렇습니다. **는 우선 순위가 단항 마이너스 보다 높기 때문에, -2**2는 -(2**2)로 평가되고 그래서 -4를 산출합니다. 그러므로, 기호 음수를 제곱하려면, (-2)**2와 같이 괄호로 둘러싸십시오. 주의: (-2)**0.5와 같이 음의 밑수가 분수 지수와 결합하는 것은 지원하지 않습니다; 빈 문자열이 산출될 것입니다. 그러나 (-2)**2와 (-2)**2.0는 둘 모두 지원합니다.
-
!
~
& *

Unary minus (-): 뺄셈 연산자와 같은 심볼을 사용하지만, 단항 마이너스는 오직 하나의 항목에만 적용됩니다. 또는 다음 두 예제에서 보여주는 바와 같이 부분-표현식에만 적용됩니다: -(3 / -x). 관련하여 덧붙인다면, 표현식 안에서 단항 플러스 사인(+)은 무시됩니다.

Logical-not (!): 피연산자가 비어 있거나 0이면, 논리적-not을 적용한 결과는 1입니다. 참("true")이라는 뜻입니다. 그렇지 않으면 그 결과는 0입니다 (false). 예를 들어: !x or !(y and z). 주의: 단어 NOT은 !와 동의어입니다. 단 !가 더 우선 순위가 높습니다. v1.0.46+에서, !!Var와 같이 연속적인 단항 연산자가 허용됩니다. 왜냐하면 오른쪽에서 왼쪽 순서로 평가되기 때문입니다.

Bitwise-not (~): 피연산자의 각 비트를 뒤집습니다. 피연산자가 부동소수점 값이면, 먼저 정수로 자르고 나서 계산합니다. 피연산자가 0부터 4294967295 (0xffffffff) 사이이면, 부호 없는 32-비트 값으로 취급됩니다. 그렇지 않으면 부호 있는 64-비트 값으로 취급됩니다. 예를 들어, ~0xf0f는 0xfffff0f0 (4294963440)으로 평가됩니다.

Address (&): &MyVar는 메모리에서 MyVar의 내용이 있는 주소를 열람합니다. 이 주소는 전형적으로 DllCall 구조에 사용됩니다. &MyVar는 또 그 변수에 대한 이진 숫자를 캐싱하는 것을 불능으로 만듭니다. 수학 계산이나 숫치 비교에 사용되기라도 하면 수행성능이 떨어질 수 있기 때문입니다. 캐싱은 그의 주소가 바뀔 때마다 (예, VarSetCapacity()를 통하여) 재활성화됩니다.

Dereference (*): *Expression는 Expression이 숫치형 메모리 주소로 결정될 것이라고 간주합니다; 그 주소의 바이트를 0부터 255 사이의 숫자로 열람합니다 (주소가 0이면 언제나 0이 열람됩니다; 그러나 다른 무효한 주소는 모두 스크립트가 충돌할 수 있기 때문에 피해야 합니다). 그렇지만, NumGet()은 일반적으로 이진 숫자를 열람할 때 훨씬 더 수행성능이 좋습니다.
*
/
//

곱셈 (*): 입력이 모두 정수이면 그 결과도 정수입니다; 그렇지 않으면, 부동 소수점 수입니다.

실수 나눗셈 (/): EnvDiv와 다르게, 실수 나눗셈(true division)은 두 입력이 모두 정수라도 부동 소수점 수를 결과로 산출합니다. 예를 들어, 3/2는 1이 아니라 1.5를 산출하고, 4/2는 2가 아니라 2.0을 산출합니다.

바닥 나눗셈 (//): 이중-정사선 연산자는 두 입력이 모두 정수이면 성능이 높은 정수 나눗셈을 수행합니다. 예를 들어, 5//3는 1이고 5//-3은 -1입니다. 입력 중 하나가 부동 소수점 형식이면, 부동 소수점 나눗셈이 수행되고 그 결과는 왼쪽으로 가장 가까운 정수로 잘라냅니다. 예를 들면, 5//3.0은 1.0이고 5.0//-3은 -2.0입니다. 이 부동 소수점 나누셈이 결과가 정수임에도 불구하고, 부동 소수점 형식으로 저장됩니다. 그래서 그 값을 사용하는 것들은 모두 부동 소수점 수라고 인식합니다. 나머지 연산자(modulo)에 관한 것은 mod()를 참조합니다.

*= 연산자와 /= 연산자는 간략하게 한 변수 안의 값을 다른 값으로 곱하거나 나누는 방법입니다. 예를 들어, Var*=2는 Var:=Var*2와 같은 결과를 산출합니다 (그렇지만 전자가 수행성능이 더 좋습니다).

0으로 나누면 빈 결과 (빈 문자열)이 산출됩니다.
+
-

더하고(+) 뺍니다 (-). 관련해서 말씀 드리자면, += 그리고 -= 연산자는 간략하게 변수를 증가시키거나 감소시키는 방법입니다. 예를 들어, Var+=2는 Var:=Var+2와 같은 결과를 생산합니다 (그렇지만 전자가 더 수행성능이 좋습니다). 비슷하게, Var++, Var--, ++Var, 또는 --Var을 사용하면 변수를 1씩 증가시키거나 감소시킬 수 있습니다.
<<
>> 		왼쪽으로 비트 이동 (<<) 그리고 오른쪽으로 비트 이동 (>>). 사용 방법: Value1 << Value2. 부동 소수점 수 입력은 먼저 정수로 잘라내고 나서 계산됩니다. 왼쪽으로 이동 (<<)은 Value1을 "Value2의 제곱". 만큼 곱하는 것과 동등합니다. 오른쪽으로 이동은 (>>) Value1을 "Value2의 제곱" 만큼 나누고 그 결과를 왼쪽으로 가장 가까운 정수로 결정하는 것과 동등합니다; 예를 들어, -3>>1은 -2입니다.
&
^
| 		비트별-and (&), 비트별-배타적-or (^), 그리고 비트별-or (|). 계통도에서, &가 우선 순위가 제일 높고 |가 제일 낮습니다. 부동 소수점 수는 먼저 정수로 자른 다음에 계산합니다.
.

결합. 점(dot) 연산자는 두 개의 항목을 하나의 문자열로 결합하는 데 사용됩니다 (점의 양쪽에 적어도 하나의 공간이 있어야 합니다). 점을 생략해도 같은 결과를 얻을 수 있습니다 (단 x -y와 같이 애매하거나, 오른쪽에 있는 항목 앞에 ++ 또는 --이 있는 경우는 제외합니다.). 점이 생략되면, 병합될 항목 사이에 적어도 공간 하나가 있어야 합니다.
예제 (표현식 방법): Var := "The color is " . FoundColor
예제 (전통적 방법): Var = The color is %FoundColor%

하위-표현식도 역시 결합할 수 있습니다. 예를 들어: Var := "The net price is " . Price * (1 - Discount/100).

점으로 (또는 기타 다른 연산자로) 시작하는 줄은 자동으로 윗 줄에 추가됩니다.
~= [AHK_L 31+]: RegExMatch에 대한 약자입니다. 예를 들어, "abc123" ~= "\d"는 ErrorLevel을 0으로 설정하고 (첫 번째 숫자의 위치) 4를 산출합니다. v1.1.03 이전 버전에서, 이 연산자는 등호 (=) 연산자와 우선순위가 같았고 완벽하게 문서화되어 있지 않았습니다.
> <
>= <= 		초과 (>), 미만 (<), 이상 (>=), 그리고 이하 (<=). 입력 중 하나라도 숫자가 아니면, 둘은 알파벳 순으로 비교됩니다 ("55"와 같이 겹따옴표가 붙은 문자열은 이 문맥에서 언제가 숫자가 아닌 것으로 간주됩니다). 비교는 대소문자를 구분하지 않습니다. StringCaseSense가 켜져 있으면 대소문자를 구분해서 비교합니다. 다음도 참조하십시오: Sort
=
==
<> != 		등호 (=), 대소문자-구분-등호 (==), 그리고 같지-않음 (<> 또는 !=). 연산자 !=와 <>는 기능면에서 동일합니다. == 연산자는 =와 동일하게 행위합니다. 입력 중 하나라도 숫자가 아닌 경우는 제외하는데, 그 경우 ==는 언제나 대소문자를 구분하고 =는 언제나 대소문자를 구분하지 않습니다 (대소문자의 구분은 StringCaseSense에 달려 있습니다). 대조적으로, <>와 !=는 StringCaseSense에 순종합니다. 주의: "55"와 같이 겹따옴표 붙은 기호 문자열은 언제나 이 문맥에서 숫자가 아닌 것으로 간주됩니다.
NOT | 논리적-NOT. 우선 순위가 낮은 점을 빼고는 ! 연산자와 동일합니다 예를 들어, not (x = 3 or y = 3)는 !(x = 3 or y = 3)와 같습니다.
AND
&& 		둘 모두 논리적-AND입니다. 예를 들어: x > 3 and x < 10. 수행성능을 개선하기 위해, 단축-회로 평가가 적용됩니다. 또한, AND/OR/&&/|| (또는 기타 다른 연산자)로 시작하는 줄은 자동으로 윗 줄에 추가됩니다.
OR
|| 		둘 모두 논리적-OR입니다. 예를 들어: x <= 3 or x >= 10. 수행성능을 개선하기 위해, 단축-회로 평가가 적용됩니다.
?: 삼진 연산자 [v1.0.46+]. 이 연산자는 if-else 서술문을 간략하게 교체한 것입니다. 왼쪽의 조건을 평가해 보고 두 분기 중에서 어느 쪽을 최종 결과로 할지 결정합니다. 예를 들어, var := x>y ? 2 : 3는 x가 y보다 크면 2를 Var에 저장하고; 그렇지 않으면 3을 저장합니다. 수행 성능을 개선하기 위하여, 오직 참인 분기만 평가됩니다 (단축-회로 평가를 참조하십시오).
:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=

할당. 변수의 내용에 연산을 수행하고 그 결과를 다시 같은 변수에 저장합니다 (그러나 1.0.46 이전 버전에서는 한 줄 위에서 가장 왼쪽 연산자로만 사용할 수 있었습니다. 그리고 연산자를 앞쪽 다섯 개까지만 지원했습니다.). 가장 단순한 할당 연산자는 쌍점-등호 (:=)입니다. 표현식의 결과를 변수에 저장합니다. 다른 연산자들이 어떤 일을 하는지 그 설명은 이 표에서 관련 엔트리를 참조하십시오. 예를 들어, Var //= 2는 바닥 나눗셈을 수행하여 Var를 2로 나눈 다음, 그 결과를 다시 Var에 저장합니다. 비슷하게, Var .= "abc"는Var := Var . "abc"를 간략하게 작성한 것입니다.

대부분의 다른 연산자와 다르게, 할당은 오른쪽에서 왼쪽으로 평가됩니다. 결과적으로 Var1 := Var2 := 0와 같은 줄은 제일 먼저 0을 Var2에 할당한 다음 Var2를 Var1에 할당합니다.

할당을 다른 연산자의 입력으로 사용하면, 그의 값은 변수 자체입니다. 예를 들어, 표현식 (Var+=2) > 50는 Var에 새로-증가된 값이 50을 초과할 경우에만 참입니다. 이렇게 하면 할당을 ByRef로 건넬 수 있는데, 즉, 그의 주소로 건넬 수 있습니다; 예를 들어: &(x:="abc").

할당 연산자의 우선순위는 구문 에러를 피하거나 보다 직관적인 행위를 제공하면 자동으로 높아집니다. 예를 들어: not x:=y는 not (x:=y)로 평가됩니다. 비슷하게, ++Var := X는 ++(Var := X)으로 평가됩니다; 그리고 Z>0 ? X:=2 : Y:=2는 Z>0 ? (X:=2) : (Y:=2)으로 평가됩니다.

하위 호환의 문제 때문에 야기되는 알려진 제한이 있습니다 (미래의 버전에서는 해결될 수 있습니다):

  1. /=가 표현식에서 가장 왼쪽의 연산자이고 다중-서술문 표현식의 일부가 아니면, 바닥 나눗셈(floor division)을 수행합니다. 입력 중 하나라도 부동 소수점 수가 아니어야 합니다 (다른 경우는 모두, /=는 실수 나눗셈(true division)을 합니다.);
  2. 날짜/시간 계산을 +=과 -= 이 지원합니다. 그러나 오직 그 연산자가 한 줄의 가장 왼쪽에 홀로 있을 때만 지원합니다;
  3. 연산자 +=, -=, 그리고 *= 는 빈 변수를 0으로 취급합니다. 그러나 한 줄에 홀로 있을 경우에만 그렇습니다; 예를 들어, y:=1, x+=1와 MsgBox % x-=3는 둘 다 x가 비어 있을 때 빈 결과를 산출합니다.

,

쉼표 (다중-서술문) [v1.0.46+]. 쉼표를 사용하면 여러 하위 표현식을 한 줄에 작성할 수 있습니다. 다중 할당이나 함수 호출을 그룹짓는데 자주 사용됩니다. 예를 들어: x:=1, y+=2, ++index, func(). 그런 서술문들은 왼쪽에서 오른쪽으로 순서대로 실행됩니다. 주의: 쉼표로 (또는 다른 연산자로) 시작하는 줄은 자동으로 윗 줄에 추가됩니다. 다음도 참조하십시오: 쉼표의 연산 성능.

v1.0.46.01+에서, 쉼표 다음에 곧바로 변수가 따라 오고 다음에 등호 사인이 오면, 그 등호 사인은 자동으로 할당 (:=)으로 취급됩니다. 예를 들어, 다음은 모두 할당입니다: x:=1, y=2, a=b=c. 새 스크립트는 이 행위에 의존하면 안됩니다. 나중에 변경될 수도 있기 때문입니다. 규칙은 오직 평범한 변수에만 적용될 뿐 이중-참조(double-derefs)에는 적용되지 않습니다. 그래서 다음은 오직 하나의 할당만 담겨 있습니다: x:=1, %y%=2

mod()
round()
abs()

 이것과 더불어 다른 내장 수학 함수는 여기에 기술되어 있습니다.
func.()

[AHK_L 48+]: 객체 func에서 빈 이름의 메쏘드를 호출하려고 시도합니다. 관례적으로, 객체의 "기본" 메쏘드가 호출됩니다. func에 객체가 없다면, 대신에 기본 베이스 객체가 요청됩니다.

[v1.0.95+]: func에 함수 이름이 있다면, 그 함수가 호출됩니다.
F(p*) | [AHK_L 60+]: 가변 함수를 참조하십시오.
x[y] | [AHK_L 31+]: 객체 접근. 객체 x의 메쏘드를 호출하거나 설정하거나 얻습니다. 여기에서 y는 매개변수 리스트이거나 계산된 메쏘드 이름입니다. 배열 구문과 객체 구문을 참조합니다.

수행 성능: v1.0.48+에서, 쉼표 연산자는 보통 별도의 표현식을 작성하는 것보다 더 빠릅니다. 특히 한 변수를 또다른 변수에 할당할 때 그렇습니다 (예, x:=y, a:=b). 표현식이 모이고 모여 하나의 표현식으로 결합될 수록 수행성능이 향상됩니다; 예를 들어, 다섯개나 열 개의 단순한 표현식을 하나의 표현식으로 결합하면 5% 정도 더 빠릅니다.

내장 변수

다음 변수들은 프로그램 안에 내장되어 있으며 스크립트로 참조할 수 있습니다. Clipboard, ErrorLevel, 그리고 명령줄 매개변수는 제외하고, 이런 변수들은 읽기 전용입니다; 즉, 스크립트가 그 내용을 직접적으로 바꿀 수 없습니다.

목차

  • 특수 문자: A_Space, A_Tab
  • 스크립트 특성: 명령줄 매개변수, A_WorkingDir, A_ScriptDir, A_ScriptName, (...기타 등등...)
  • 날짜와 시간: A_YYYY, A_MM, A_DD, A_Hour, A_Min, A_Sec, (...기타 등등...)
  • 스크립트 설정: A_IsSuspended, A_BatchLines, A_TitleMatchMode, (...기타 등등...)
  • User Idle Time: A_TimeIdle, A_TimeIdlePhysical
  • GUI 창과 메뉴 바: A_Gui, A_GuiControl, A_GuiEvent, A_EventInfo
  • 핫키, 핫스트링, 그리고 맞춤 메뉴 항목: A_ThisHotkey, A_EndChar, A_ThisMenuItem, (...기타 등등...)
  • 운영 체제와 사용자 정보: A_OSVersion, A_ScreenWidth, A_ScreenHeight, (...기타 등등...)
  • 기타: A_Cursor, A_CaretX, A_CaretY, Clipboard, ClipboardAll, ErrorLevel
  • 회돌이: A_Index, (...기타 등등...)

특수 문자

A_Space | 이 변수는 스페이스 문자가 하나 담겨 있습니다. 자세한 것은 AutoTrim을 참조하십시오.
A_Tab | 이 변수는 탭 문자 하나가 담겨 있습니다. 자세한 것은 AutoTrim 을 참조하십시오.

스크립트 특성

1, 2, 3, 등등. | 이 변수들은 스크립트가 명령어줄 매개변수와 함께 기동할 때마다 자동으로 생성됩니다. 마치 보통의 변수 이름처럼 똑같이 참조하고 변경할 수 있습니다 (예: %1%). 변수 %0%에는 건네어진 매개변수의 개수가 담겨 있습니다 (아무것도 없으면 0입니다). 자세한 것은 명령어 줄 매개변수를 참조하십시오.
A_WorkingDir | 스크립트의 현재 작업 디렉토리로서, 기본값으로 여기에서 파일에 접근합니다. 마지막의 역사선은 루트 디렉토리가 아닌 한 포함되지 않습니다. 다음은 두 개의 예입니다: C:\ 그리고 C:\My Documents. SetWorkingDir를 사용하면 작업 디렉토리를 바꿀 수 있습니다.
A_ScriptDir | 현재 스크립트가 위치한 디렉토리의 완전한 경로입니다. 마지막의 역사선은 생략합니다 (루트 디렉토리도 마찬가지로 생략합니다).
A_ScriptName | 현재 스크립트의 파일 이름입니다. 경로가 없습니다. 예, MyScript.ahk.
A_ScriptFullPath | 위의 두 변수를 조합해 스크립트를 완전하게 지정합니다. 예, C:\My Documents\My Script.ahk
A_ScriptHwnd
[v1.1.01+] 		스크립트의 숨은 메인 창의 유일한 ID (HWND/handle)입니다.
A_LineNumber

스크립트 안에서 현재 실행중인 줄의 번호입니다 (또는 그의 #Include 파일 중 하나입니다). 이 줄 번호는 ListLines이 보여주는 줄 번호와 일치합니다; 다음 예제와 같이 에러를 보고할 경우에 유용하게 사용할 수 있습니다: MsgBox 로그 파일에 기록할 수 없었음 (줄 번호: %A_LineNumber%).

컴파일된 스크립트는 자신의 모든 #Include 파일들을 하나의 커다란 스크립트로 병합해 넣기 때문에, 비-컴파일 모드에서 실행할 때와 줄 번호가 다를 수 있습니다.
A_LineFile | A_LineNumber가 속해 있는 파일의 전체 경로와 이름입니다. A_ScriptFullPath와 동일합니다. 물론 그 줄이 비-컴파일된 스크립트의 #Include 파일 중 하나에 속해 있지 않아야 합니다.
A_ThisFunc
[v1.0.46.16+] 		현재 실행 중인 사용자-정의 함수의 이름입니다 (없으면 비어 있습니다); 예를 들어: MyFunction. 다음도 참조하십시오: IsFunc()
A_ThisLabel
[v1.0.46.16+] 		현재 실행 중인 라벨 (서브루틴)의 이름입니다 (없으면 비어 있습니다); 예를 들어: MyLabel. 스크립트가 Gosub/Return 또는 Goto를 실행할 때마다 갱신됩니다. 또 자동으로-호출되는 라벨에 대해서도 갱신됩니다. 여기에는 타이머, GUI 쓰레드, 메뉴 항목, 핫키, 핫스트링, OnClipboardChange (라벨), 그리고 OnExit이 있습니다. 그렇지만, 실행이 위의 자동-호출 라벨로부터 또다른 라벨로 "떨어지는"경우 A_ThisLabel는 갱신되지 않습니다; 그런 일이 일어나면, A_ThisLabel은 이전의 값을 유지합니다. 다음도 참조하십시오: A_ThisHotkey 그리고 IsLabel()
A_AhkVersion | 1.0.22 이전 버전에서, 이 변수는 비어 있습니다. 그렇지 않으면, 스크립트를 실행하고 있는 오토핫키의 버전이 담깁니다. 예, 1.0.22. 컴파일된 스크립트의 경우, 원래 컴파일에 사용된 버전이 보고됩니다. 버전 번호의 형식을 보고 스크립트는 A_AhkVersion이 다음 예와 같이 > 또는 >=로 최소한의 버전 번호보다 큰지 점검할 수 있습니다: if A_AhkVersion >= 1.0.25.07.
A_AhkPath

비-컴파일 스크립트라면: 현재 스크립트를 실제로 실행중인 EXE 파일의 이름과 전체 경로입니다. 예를 들어: C:\Program Files\AutoHotkey\AutoHotkey.exe

컴파일된 스크립트라면: 위와 같지만 예외는 AutoHotkey 디렉토리가 레지스트리 HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey\InstallDir 엔트리를 통하여 발견된다는 것입니다. 그런 엔트리가 없다면, A_AhkPath는 비어 있습니다.
A_IsUnicode | 문자열이 유니코드 (16-비트)이면 1이 ANSI (8-비트)이면 빈 문자열이 담깁니다 (거짓으로 간주됨). 문자열의 형식은 스크립트를 실행하는 데 사용된 AutoHotkey.exe 버전에 따라 다릅니다. 컴파일된 스크립트라면, 컴파일에 사용된 실행파일에 따라 다릅니다.
A_IsCompiled | 스크립트가 컴파일 된 EXE로 실행되면 1이 그렇지 않으면 빈 문자열이 담깁니다 (거짓으로 간주).
A_ExitReason | 스크립트를 끝내게 된 가장 최근의 이유입니다. 이 변수는 스크립트에 OnExit 서브루틴이 있고 그 서브루틴이 현재 실행중이거나 종료 시도로 적어도 한 번 호출된 적이 없는 한, 비어 있습니다. 자세한 것은 OnExit을 참조하십시오.

날짜와 시간

A_YYYY | 현재의 4-자리 년도입니다 (예, 2004). A_Year와 동의어입니다. 주의: 여러분의 로케일과 언어에 대하여 적절하게 포맷된 날짜와 시간을 열람하려면, FormatTime, OutputVar (시간과 긴 날짜) 또는 FormatTime, OutputVar,, LongDate (긴-형식의 날짜를 열람)를 사용하십시오.
A_MM | 현재의 2-자리 월입니다 (01-12). A_Mon와 동일합니다.
A_DD | 현재 2-자리 월별 날짜입니다 (01-31). A_MDay와 동일합니다.
A_MMMM | 현재 사용자 언어로 현재 달의 전체 이름입니다. 예, July
A_MMM | 현재 사용자 언어로 현재 달의 약자입니다. 예, Jul
A_DDDD | 현재 사용자 언어로 현재 요일의 전체 이름입니다. 예, Sunday
A_DDD | 현재 사용자 언어로 현재 요일의 3-문자 약어입니다. 예, Sun
A_WDay | 현재 요일의 1-자리 수입니다 (1-7). 1은 모든 로케일에서 일요일입니다.
A_YDay | 연별 현재 날짜입니다 (1-366). 값은 0으로 채워지지 않습니다. 예를 들어, 0이 열람되지, 009가 열람되는 것은 아닙니다. 0으로 덧대어진 값을 열람하려면, 다음을 사용합니다: FormatTime, OutputVar,, YDay0.
A_YWeek ISO 8601에 따른 현재 년도와 주 번호 (예. 200453). 년도와 주를 가르려면 StringLeft, Year, A_YWeek, 4 그리고 StringRight, Week, A_YWeek, 2를 사용합니다.

A_YWeek의 정밀한 정의: 1월 1일을 담고 있는 주가 새 해에서 4일 이상을 가지면, 그것을 1 번 주로 간주합니다. 그렇지 않으면, 이전 년도의 마지막 주이고, 다음 주가 1 번 주입니다.

A_Hour | 24시간제로 현재의 2-자리 시 (00-23) (예를 들어, 17는 오후 5시). AM/PM 표시와 함께 12시간제로 열람하려면, 다음 예를 따르십시오: FormatTime, OutputVar, , h:mm:ss tt
A_Min

현재 2-자리 분 (00-59).
A_Sec | 현재 2-자리 초 (00-59).
A_MSec | 현재 3-자리 밀리초 (000-999). 앞의 0을 제거하려면 다음 예제를 따르십시오: Milliseconds := A_MSec + 0.
A_Now | YYYYMMDDHH24MISS 형식으로 현재 로컬 시간 입니다. 주의: 날짜와 시간 연산은 EnvAdd 그리고 EnvSub로 수행할 수 있습니다. 또, FormatTime으로 날짜와 시간을 여러분의 로케일 또는 기호에 맞게 포맷할 수 있습니다.
A_NowUTC | 현재의 협정 세계시(Coordinated Universal Time (UTC))입니다. 형식은 YYYYMMDDHH24MISS입니다. UTC는 본질적으로 그리니치 표준시(Greenwich Mean Time (GMT))과 똑같습니다.
A_TickCount

컴퓨터가 리부팅된 이후로 경과한 밀리초의 개수. A_TickCount를 변수에 저장해 두고 나중에 가장 마지막 A_TickCount 값에서 빼어서 경과한 시간을 측정할 수 있습니다. 예를 들어:

StartTime := A_TickCount
Sleep, 1000
ElapsedTime := A_TickCount - StartTime
MsgBox,  %ElapsedTime% 밀리초가 경과하였습니다.

A_TickCount의 밀리초보다 더 정밀해야 한다면, QueryPerformanceCounter()를 사용합니다.

Script Settings

A_IsSuspended | 스크립트가 보류중이면(suspended) 1이 그렇지 않으면 0이 담깁니다.
A_IsPaused [v1.0.48+] | 현재 쓰레드 바로 아래의 쓰레드가 정지되어 있으면 1이 담깁니다. 그렇지만 0이 담깁니다.
A_IsCritical [v1.0.48+] | 현재 쓰레드에 대하여 임계구역 밖이면 0이 담깁니다. 그렇지 않으면 0보다 큰 정수값이 담깁니다. 즉, Critical에서 메시지-점검 빈도를 사용중입니다. Critical 0이면 임계 구역 점검을 끄기 때문에, 임계 구역의 현재 상태를 저장하고 나중에 Old_IsCritical := A_IsCritical를 한 다음에 Critical %Old_IsCritical%를 통하여 복구할 수 있습니다.
A_BatchLines | (A_NumBatchLines와 동의어) SetBatchLines에 의하여 설정된 현재 값입니다. 예제: 200 또는 10ms (포맷에 따라 다름).
A_TitleMatchMode | SetTitleMatchMode가 설정한 현재 부합모드입니다: 1, 2, 3, 또는 RegEx.
A_TitleMatchModeSpeed | SetTitleMatchMode가 설정한 현재 일치 속도입니다 (fast 또는 slow) .
A_DetectHiddenWindows | DetectHiddenWindows가 설정한 현재 모드입니다 (On 또는 Off).
A_DetectHiddenText | DetectHiddenText가 설정한 현재 모드입니다 (On 또는 Off).
A_AutoTrim | AutoTrim이 설정한 현재 모드입니다 (On 또는 Off) .
A_StringCaseSense | StringCaseSense가 설정한 현재 모드입니다 (On, Off, 또는 Locale) .
A_FileEncoding | [AHK_L 46+] 다양한 명령어에 대하여 기본 인코딩이 담겨 있습니다; FileEncoding를 참조하십시오.
A_FormatInteger | SetFormat이 설정한 현재 정수 형식 (H 또는 D). [AHK_L 42+]: 이것은 소문자 h를 담을 수도 있습니다.
A_FormatFloat | SetFormat이 설정한 현재 부동 소수점 수 형식.
A_KeyDelay | SetKeyDelay가 설정한 현재 지연 시간 (언제나 10진수를 사용합니다). 이 지연 시간은 전통적인 SendEvent 모드를 위한 것이며, SendPlay를 위한 것이 아닙니다.
A_WinDelay | SetWinDelay가 설정한 현재 지연 시간 (언제나 십진법을 사용합니다).
A_ControlDelay | SetControlDelay가 설정한 현재 지연 시간 (언제나 10진수를 사용합니다).
A_MouseDelay | SetMouseDelay가 설정한 현재 지연 시간 (언제나 십지수를 사용합니다). 이 지연은 전통적인 SendEvent 모드를 위한 것이며, SendPlay를 위한 것이 아닙니다.
A_DefaultMouseSpeed | SetDefaultMouseSpeed가 설정한 현재 속도 (언제나 십진법을 사용합니다. 십육진법은 사용하지 않습니다).
A_RegView | [v1.1.08+]: SetRegView가 설정한 현재 레지스트리 뷰입니다.
A_IconHidden | 트레이 아이콘이 현재 보이지 않으면 1 그렇지 않으면 0이 담깁니다. 아이콘은 #NoTrayIcon이나 Menu 명령어를 통하여 감출 수 있습니다.
A_IconTip | 트레이 아이콘에 맞춤 툴팁이 Menu, Tray, Tip을 통하여 지정되어 있지 않은 한, 비어 있습니다 -- 지정되어 있으면 툴팁 텍스트가 담깁니다.
A_IconFile | 맞춤 트레이 아이콘이 Menu, tray, icon을 통하여 지정되어 있지 않은 한 비어 있습니다 --지정 되어 있을 경우 그 아이콘 파일의 전체 경로와 이름이 담깁니다. 알려진 한게: 스크립트가 처음부터 상대적인 경로를 시스템 DLL에 건넸다면 이 경로는 올바르지 않을 수 있습니다; 예를 들어, Menu, Tray, Icon, user32.dll, 2.
A_IconNumber | A_IconFile이 비어 있으면 비어 있습니다. 그렇지 않으면, A_IconFile의 아이콘 번호입니다 (전형적으로 1).

User Idle Time

A_TimeIdle | 키보드나 마우스 또는 기타 입력으로부터 시스템이 입력을 받은 이후로 경과한 시간의 밀리초 개수입니다. 사용자가 컴퓨터 앞에 있는지 판단하는데 유용합니다. 사용자로부터 받는 물리적 입력과 더불어 프로그램이나 스크립트가 만들어 내는 인위적인 입력은 (Send 또는 MouseMove 명령어) 이 값을 다시 0으로 재설정합니다. 이 값은 10씩 증가하는 경향이 있기 때문에, 다른 값과 같은지 비교하면 안됩니다. 대신에, 다른 값보다 큰지 작은지로 비교하십시오. 예를 들어: IfGreater, A_TimeIdle, 600000, MsgBox, 마지막 키보드나 마우스 활동이 적어도 10 분 전이었습니다.
A_TimeIdlePhysical | 위와 비슷하지만 상응하는 갈고리가 설치되어 있으면 인위적인 키눌림과 마우스 클릭을 무시합니다. (keyboard 또는 mouse); 즉, 오직 물리적 이벤트에만 응답합니다. (마치 사용자가 존재하는 듯이 키보드나 마우스 클릭을 흉내내는 것을 방지합니다.) 갈고리가 설치되어 있지 않으면, 이 값은 A_TimeIdle과 동등합니다. 둘 중에 하나의 갈고리만 설치되어 있으면, 물리적 입력의 유형만 A_TimeIdlePhysical에 영향을 미칩니다 (다른/설치-안된 갈고리의 입력은, 물리적 입력과 인위적 입력에 모두 영향이 없습니다).

GUI 창과 메뉴 바

A_Gui 현재 쓰레드를 기동한 GUI의 이름이나 번호입니다. 이 변수는 Gui 콘트롤, 메뉴 바 항목, 또는 GuiClose/GuiEscape와 같은 이벤트가 현재 쓰레드를 기동하지 않았다면 비어 있습니다.
A_GuiControl 현재 쓰레드를 기동한 구이 콘트롤에 연관된 변수의 이름입니다. 구이 콘트롤에 연관 변수가 없으면, 대신에 A_GuiControl에는 해당 콘트롤의 텍스트/캡션의 앞쪽 63개의 문자가 담깁니다 (각 버튼에 변수 이름을 부여하지 않기 위해 자주 사용됩니다). A_GuiControl은 다음과 같은 경우 비어 있습니다:
  1. A_Gui가 비어 있다;
  2. GUI 메뉴 바 항목이나 GuiClose/GuiEscape과 같은 이벤트가 현재 쓰레드를 기동시켰다;
  3. 콘트롤에 연관 변수가 없으며 캡션도 없다;
  4. 또는 현재 쓰레드를 기동시킨 최초의 콘트롤이 (아마도 Gui Destroy 때문에 더 이상 존재하지 않는다).
A_GuiWidth
A_GuiHeight 		GuiSize 서브루틴에서 참조할 때 GUI 창의 너비와 높이가 담깁니다. 창의 클라이언트 구역에 적용됩니다. 클라이언트 구역은 타이틀 바와 메뉴 바 그리고 테두리를 제외한 구역입니다. [v1.1.11+]: 이 값들은 DPI 스케일링에 영향을 받습니다.
A_GuiX
A_GuiY 		GuiContextMenu 이벤트와 GuiDropFiles 이베트가 일어날 때 X 좌표와 Y 좌표를 담고 있습니다. 좌표는 창의 좌상 모서리에 상대적입니다. [v1.1.11+]: 이 값들은 DPI 스케일링에 영향을 받습니다.
A_GuiEvent
또는 A_GuiControlEvent

현재 쓰레드를 기동한 이벤트의 종류. 쓰레드가 GUI 행위를 통하여 기동되지 않았다면, 이 변수는 비어 있습니다. 그렇지 않으면, 다음 문자열 중 하나가 담깁니다:

Normal: 이벤트가 왼클릭 또는 키눌림으로 기동되었습니다 (화살표 키, TAB 키, 스페이스바, 밑줄 단축키 등등.). 이 값은 또GuiClose 그리고 GuiEscape와 같은 특수한 이벤트 그리고 메뉴 바 항목에도 사용됩니다.

DoubleClick: 이벤트가 더블클릭으로 촉발되었습니다. 주의: 클릭-쌍 중에 첫 클릭은 먼저 Normal 이벤트를 받습니다. 다시 말해, 서브루틴은 두 번 기동됩니다: 한 번은 첫 클릭에 그리고 다시 두 번째 클릭에 기동됩니다.

RightClick: 오직 GuiContextMenu, ListViews, 그리고 TreeViews에만 일어납니다.

문맥-감지 값: 자세한 것은 GuiContextMenu, GuiDropFiles, Slider, MonthCal, ListView, 그리고 TreeView를 참조하십시오.
A_EventInfo

다음 이벤트들에 대한 추가 정보를 담고 있습니다:

  • OnClipboardChange 라벨
  • 마우스 휠 핫키 (WheelDown/Up/Left/Right)
  • RegisterCallback()
  • GUI events, 즉 GuiContextMenu, GuiDropFiles, ListBox, ListView, TreeView, 그리고 StatusBar. 이벤트에 대하여 더 이상 추가 정보가 없으면, A_EventInfo에는 0이 담깁니다.

주의: A_ThisHotkey와 같은 변수와 다르게, 각 쓰레드마다 A_Gui, A_GuiControl, A_GuiX/Y, A_GuiEvent, 그리고 A_EventInfo에 대하여 자신의 값을 유지합니다. 그러므로, 쓰레드가 다른 쓰레드에 의해 인터럽트 되더라도, 실행을 재개하면 여전히 이 값들에서 자신의 원래/올바른 값을 볼 수 있습니다.

핫키, 핫스트링, 그리고 맞춤 메뉴 항목

A_ThisMenuItem | 가장 최근에 선택된 맞춤 메뉴 항목의 이름입니다 (없으면 비어 있습니다).
A_ThisMenu | A_ThisMenuItem가 선택된 곳의 메뉴 이름입니다.
A_ThisMenuItemPos | 안에서 A_ThisMenuItem의 현재 위치를 가리키는 번호입니다. 메뉴에서 첫 번째 항목은 1이고, 두 번째 항목은 2, 등등입니다. 메뉴 가름자 줄도 계산에 들어 갑니다. 이 변수는 A_ThisMenu메뉴 안에 A_ThisMenuItem이 비어 있거나 더 이상 존재하지 않으면 비어 있습니다. 또 A_ThisMenu 자체가 존재하지 않을 경우에도 비어 있습니다.
A_ThisHotkey

가장 최근에 실행된 핫키 또는 비-자동-교체 핫스트링입니다 (없으면 비어 있습니다). 예, #z. 이 값은 현재 쓰레드가 또다른 핫키로 인터럽트 되면 변합니다. 그래서 나중에 서브루틴에서 사용하기 위해 원래 값이 필요하다면 즉시 또다른 변수에 복사하십시오.

핫키가 처음으로 - 스크립트에서 핫키 명령어나 이중-쌍점 라벨로 -- 만들어질 때, 그의 키 이름과 그의 수식 심볼의 순서가 그 핫키의 영구적인 이름이 됩니다. 그 이름을 핫키의 모든 변형들이 공유합니다.

다음도 참조하십시오: A_ThisLabel
A_PriorHotkey | 위와 같지만 이전의 핫키는 제외합니다. 없으면 비어 있습니다.
A_PriorKey | [v1.1.01+]: 가장 최근의 키-누름이나 키-뗌보다 앞에 눌린 마지막 키의 이름입니다. 아니면 키 히스토리에서 적용가능한 키-누름을 발견할 수 없을 경우 비어 있습니다. 오토핫기 스크립트가 생성한 모든 입력은 배제됩니다. 이 변수를 사용하려면, 키보드 갈고리나 마우스 갈고리가 반드시 설치되어 있어야 하고 키 히스토리가 활성화되어 있어야 합니다.
A_TimeSinceThisHotkey | A_ThisHotkey가 눌린 이후로 경과한 밀리초의 개수입니다. A_ThisHotkey가 빌 때마다 -1이 됩니다.
A_TimeSincePriorHotkey | A_PriorHotkey가 눌린 이후로 경과한 밀리초의 개수입니다. A_PriorHotkey가 빌 때마다 -1이 됩니다.
A_EndChar | 가장 최근의 비-자동-교체-핫스트링을 촉발시키기 위해 사용자가 누른 종료 문자(ending character)입니다. 종료 문자를 ( * 옵션 때문에) 요구하지 않았다면, 이 값은 비어 있습니다.

운영 체제와 사용자 정보

ComSpec
[v1.0.43.08+] 		ComSpec 환경 변수와 같은 문자열을 담고 있습니다(예, C:\Windows\system32\cmd.exe). 종종 Run/RunWait와 함께 사용됩니다. 주의: 이 변수에는 A_ prefix가 붙지 않습니다.
A_Temp
[v1.0.43.09+] 		임시 파일을 보유하도록 지정된 폴더의 전체 경로와 이름 (예, C:\DOCUME~1\UserName\LOCALS~1\Temp). (순서대로) 다음 위치 중 하나에서 열람합니다: 1) 환경 변수 TMP, TEMP, 또는 USERPROFILE; 2) Windows 디렉토리.
A_OSType | 실행 중인 운영 체제의 종류입니다. AutoHotkey 1.1은 오직 NT-기반의 운영 체제만 지원하기 때문에, 이 값은 언제나 WIN32_NT입니다. 예전 버전은 Windows 95/98/ME에서 실행될 때 WIN32_WINDOWS를 돌려줍니다.
A_OSVersion

다음 문자열 중 하나입니다: WIN_7 [requires AHK_L 42+], WIN_8 [requires v1.1.08+], WIN_8.1 [requires v1.1.15+], WIN_VISTA, WIN_2003, WIN_XP, WIN_2000.

호환성 설정을 오토핫키 실행파일이나 컴파일된 스크립트의 특성에 적용하면 운영체제가 다른 버전 번호를 돌려줍니다. 이것이 A_OSVersion에 반영됩니다.

[v1.1.20+]: OS 버전을 위에 언급한 리스트에서 찾을 수 없으면, 문자열이 "major.minor.build" 형태로 반환됩니다. 예를 들어 10 TP는 6.4.9841입니다.

; 이 예제는 폐기되었습니다. 이 운영체제는 더 이상 지원하지 않습니다.
if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME  ; 주의: 쉼표 둘레에 스페이스가 없음에 주의합니다.
{
    MsgBox 이 스크립트는 Windows 2000/XP 이상을 요구합니다.
    ExitApp
}
A_Is64bitOS | [v1.1.08+]: 운영체제가 64비트이면 1 (true) 또는 운영체제가 32비트이면 0 (false)을 담고 있습니다.
A_PtrSize | [AHK_L 42+]: 포인터의 크기를 바이트 단위로 담고 있습니다. 이것은 4 (32-bit) 또는 8 (64-bit)입니다. 어떤 유형의 실행파일을 (EXE) 스크립트가 실행하는가에 따라 다릅니다.
A_Language | 시스템의 기본 언어입니다 다음 4-자리 코드중 하나입니다.
A_ComputerName | 네트워크에 보여지는 컴퓨터 이름입니다.
A_UserName | 이 스크립트를 기동한 사용자의 로그온 이름입니다.
A_WinDir | 윈도우즈 디렉토리입니다. 예를 들어: C:\Windows
A_ProgramFiles
또는 ProgramFiles 		프로그램 파일 디렉토리입니다 (예, C:\Program Files). v1.0.43.08+에서, A_ prefix를 생략해도 가능합니다. 그러면 쉽게 #NoEnv이전하는 데 도움이 됩니다.
A_AppData
[v1.0.43.09+] 		현재 사용자 어플리케이션의 특정한 데이터를 담고 있는 폴더의 전체 경로와 이름입니다. 예를 들어: C:\Documents and Settings\Username\Application Data
A_AppDataCommon
[v1.0.43.09+] 		모든-사용자 어플리케이션의 특정한 데이터를 담고 있는 폴더의 전체 경로와 이름입니다.
A_Desktop | 현재 사용자 데스크탑 파일을 담고 있는 폴더의 전체 경로와 이름입니다.
A_DesktopCommon | 모든-사용자 데스크탑 파일을 담고 있는 폴더의 전체 경로와 이름입니다.
A_StartMenu | 현재 사용자이 시작 메뉴 폴더의 전체 경로와 이름입니다.
A_StartMenuCommon | 모든-사용자 시작 메뉴 폴더의 전체 경로와 이름입니다.
A_Programs | 현재 사용자 시작 메뉴에 있는 프로그램 폴더의 전체 경로와 이름입니다.
A_ProgramsCommon | 모든 사용자 시작 메뉴에 있는 프로그램 폴더의 전체 경로와 이름입니다.
A_Startup | 현재 사용자 시작 메뉴에 있는 시작 폴더의 전체 경로와 이름입니다.
A_StartupCommon | 모든-사용자 시작 메뉴에 있는 시작 폴더의 전체 경로와 이름입니다.
A_MyDocuments | 현재 사용자의 "나의 문서" 폴더의 전체 경로와 이름입니다. 대부분의 비슷한 변수와 다르게, 이 폴더가 드라이브의 루트이면, 마지막 역사선을 포함하지 않습니다. 예를 들어, M:\가 아니라 M:이 됩니다.
A_IsAdmin

현재 사용자가 관리자 권한이 있으면, 이 변수는 1, 그렇지 않으면 0이 담깁니다.

윈도우즈 비스타 이후에서 어떤 스크립트는 적절하게 기능을 발휘하기 위해 관리자 권한을 요구합니다 (예를 들어 프롯스나 창과 상호작용하는 스크립트는 관리자 권한으로 실행됩니다). 이렇게 하려면, 다음을 스크립트의 상단에 추가하십시오:

if not A_IsAdmin
{
   Run *RunAs "%A_ScriptFullPath%"  ; Requires v1.0.92.01+
   ExitApp
}

A_ScreenWidth
A_ScreenHeight

기본 모니터의 너비와 높이, 픽셀 단위 (예, 1024 그리고 768).

다중 모니터 시스템에서 다른 모니터의 크기를 알려면, SysGet를 사용합니다.

대신에 (다중 모니터에 걸쳐 있더라도) 전체 데스크탑의 너비와 높이를 알려면, 다음 예제를 사용합니다:

SysGet, VirtualWidth, 78
SysGet, VirtualHeight, 79

게다가, SysGet을 사용하면 모니의 작업 영역을 알 수 있습니다. 모니터의 전체 영역보다 더 작을 수 있습니다. 왜냐하면 태스크바와 기타 등록된 데스크탑 툴바가 배제되어 있기 때문입니다.
A_ScreenDPI [v1.1.11+] | 화면 너비를 따라 논리적 인치당 픽셀의 개수입니다. 다중 모니터 시스템에서, 이 값은 모든 모니터에 대하여 같습니다. 대부분의 시스템에 이 값은 96입니다; 그렇지만 시스템의 텍스트 크기(DPI) 설정에 따라 다릅니다. 또 Gui -DPIScale을 참조하십시오.
A_IPAddress1 through 4 | 컴퓨터에서 네트워크 어댑터의 IP 주소의 앞쪽 4 자리입니다.

기타

A_Cursor

현재 화면에 보여지는 마우스 커서의 유형입니다. 다음 단어 중 하나입니다:
AppStarting, Arrow, Cross, Help, IBeam, Icon, No, Size, SizeAll, SizeNESW, SizeNS, SizeNWSE, SizeWE, UpArrow, Wait, Unknown.

Size-유형의 커서에 사용된 약자는 방위를 나타냅니다. 예, NESW = NorthEast+SouthWest. 손-모양의 커서는 (찍기와 잡기)는 Unknown으로 분류되어 있습니다.
A_CaretX
A_CaretY

현재 캐럿(텍스트 삽입 위치)의 X와 Y 좌표입니다. 이 좌표는 활성 창에 상대적입니다. CoordMode를 사용하여 전체 화면에 대하여 상대적으로 만들지 않는 한 말입니다. 활성 창이 없거나 캐럿 위치를 결정할 수 없으면, 이 변수는 비어 있습니다.

다음 스크립트로 캐럿을 이동시켜서 그의 현재 위치가 자동-갱신 툴팁에 나타나는 것을 볼 수 있습니다. 어떤 창은 (예, MS Word) 실제 위치에 상관 없이 같은 캐럿 위치를 보고합니다.

#Persistent
SetTimer, WatchCaret, 100
return
WatchCaret:
  ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
return
Clipboard | 운영체제의 클립보드에 있는 내용입니다. 읽고 쓸 수 있습니다. 클립보드 섹션을 참조하십시오.
ClipboardAll | 클립보드의 전체 내용입니다 (포맷과 텍스트 같은). ClipboardAll을 참조하십시오.
ErrorLevel | ErrorLevel을 참조하십시오.
A_LastError | OS의 GetLastError() 함수의 결과 또는 COM 객체 요청의 최종 결과. 자세한 것은 DllCall() 그리고 Run/RunWait를 참조합니다.

회돌이

A_Index | 현재 회돌이의 반복 횟수입니다 (64-비트 정수). 예를 들어, 스크립트가 회돌이의 몸체를 처음 실행하면, 이 변수는 숫자 1이 담깁니다. 더 자세한 것은 회돌이 또는 While-회돌이를 참조하십시오.
A_LoopFileName, 등등. | 이 변수와 기타 관련 변수들은 파일-회돌이 안에서만 유효합니다.
A_LoopRegName, 등등. | 이 변수와 기타 관련 변수들은 레지스트리-회돌이 안에서만 유효합니다.
A_LoopReadLine | 파일-읽기 회돌이를 참조하십시오.
A_LoopField | 회돌이 파싱하기를 참조하십시오.

환경 변수 대. "보통" 변수

환경 변수는 운영 체제가 관리합니다. 명령어 프롬프트에서 SET을 타자하고 엔터를 치면 그 목록을 보실 수 있습니다.

스크립트는 EnvSet으로 새 환경 변수를 만들거나 기존의 변수 내용을 바꿀 수 있습니다. 그렇지만, 그렇게 추가하고 변경하는 것은 사적입니다; 나머지 시스템에 보이지 않습니다. 한 가지 예외는 스크립트가 Run이나 RunWait를 사용하여 프로그램을 (또다른 스크립트) 기동시켰을 때입니다: 그런 프로그램은 부모 스크립트의 환경 변수 사본을 상속받습니다. 사적인 환경 변수도 당연히 포함됩니다.

v1.0.43.08+에서, 모든 새 스크립트는 Path와 같은 환경 변수를 다음과 같이 열람하기를 권장합니다:

EnvGet, OutputVar, Path  ; For explanation, see #NoEnv.

변수의 가용성과 메모리

  • 각 변수는 최대 64 MB 텍스트를 담을 수 있습니다 (이 제한은 #MaxMem을 증가시킬 수 있습니다).
  • 변수에 현재 내용보다 더 긴 새 문자열이 주어지면, 추가 시스템 메모리가 자동으로 할당됩니다.
  • 거대한 메모리가 점유한 메모리는 비워 버리면 해제됩니다. 예, var := "".
  • 스크립트에 얼마나 많은 변수를 생성할 수 있는지는 제한이 없습니다. 적어도 수 백만개의 변수를 수행성능의 저하 없이 지원하도록 설계되어 있습니다.
  • 숫치 입력을 받는 명령어, 함수, 그리고 표현식은 일반적으로 부동 소수점 수에 대하여 15 자리수의 정밀도를 지원합니다. 정수에 대해서는, 64-비트 부호있는 값을 지원합니다. 그 범위는 -9223372036854775808 (-0x8000000000000000)부터 9223372036854775807 (0x7FFFFFFFFFFFFFFF)까지입니다. 이 범위를 벗어나는 정수 상수는 지원하지 않으며 일관성 없는 결과를 산출합니다. 대조적으로, 정수 산술 연산은 빙 돌아 범람해 버립니다 (예, 0x7FFFFFFFFFFFFFFF + 1 = -0x8000000000000000).


Welcome to AutoHotkey

환영합니다...

시작하기

AutoHotkey로 뭔가를 할 수 있으려면, 먼저 스크립트를 작성해 무엇을 할지 알려주어야 합니다.
자습서를 읽거나 아니면 곧장 뛰어 들어가면 그 방법을 배울 수 있습니다.

도움을 얻거나 많은 유용한 스크립트를 발견할 수 있습니다: 우리의 토론 포럼에 오십시오.

왜 내가 이 페이지를 보고 있나요?

어느 스크립트를 실행할지 알려주지 않고 오토핫키를 실행했는데 기본 위치에서 스크립트를 찾을 수 없었기 때문입니다.


#AllowSameLineComments

v1.1.09에서 제거됨: 더 이상 지원하지 않음.

AutoIt v2 (.aut) 전용: 주석이 명령어와 같은 줄에 나타날도록 허용합니다.

#AllowSameLineComments

이 지시어를 AutoIt v2 (.aut) 스크립트의 상단에 지정하면 같은-줄 주석을 사용할 수 있습니다. 보통 호환성의 이유로 꺼져 있습니다. 스트립트 상단에 사용하지 않으면, 같은-줄 주석이 지원되지 않습니다. 이 지시어가 나타나는 시점부터만 효과가 있습니다.

예제

#AllowSameLineComments
Sleep, 1  ; 이 주석은 같은-줄 주석입니다.


#ClipboardTimeout

첫 시도가 실패하면 스크립트가 클립보드에 얼마나 오랫동안 접근을 시도해야 하는지 변경합니다.

#ClipboardTimeout Milliseconds

매개변수

Milliseconds

밀리초 단위 간격. -1을 지정하면 무제한 시도합니다. 0을 지정하면 한 번만 시도합니다. 이 지시어가 없는 스크립트는 1000 ms 시간제한을 사용합니다.

논평

어떤 어플리케이션은 클립보드를 오랜 시간 동안 열어 둡니다. 아마도 상당히 많은 양의 데이터를 읽고 쓰기 위해서 일겁니다. 그런 경우, 이 설정을 증가시키면 스크립트가 포기하고 에러 메시지를 보여주기 전에 오랫 동안 기다릴 수 있습니다.

이 설정은 모든 클립보드 연산에 적용됩니다. 그 중에 가장 단순한 예는 다음과 같습니다: Var = %Clipboard% 그리고 Clipboard = New Text.

클립보드가 다시 사용 가능할 때까지 스크립트가 기다릴 때마다, 새 쓰레드는 기동할 수 없으며 타이머도 실행되지 않습니다. 그렇지만, 사용자가 핫키를 누르거나, 맞춤 메뉴 항목을 선택하거나, 아니면 버튼을 누른 것과 같은 GUI 행위를 수행하면, 그 이벤트는 나중에, 다시 말해, 클립보드가 완전히 사용 가능해진 후에 그의 서브루틴이 실행될 때까지 버퍼 처리됩니다.

이 지시어가 있으면 첫 시도가 실패하더라도 클립보드 데이터를 다시 읽으려고 시도하지 않습니다. v1.1.16 이전에서는 스크립트가 시간제한이 풀릴 때까지 기다려야 했습니다. 그러나 그렇게 함으로써 더 이상 데이터를 받지 못하게 되었습니다.

관련 항목

Clipboard, Thread

예제

#ClipboardTimeout 2000


#CommentFlag

스크립트의 주석 심볼을 쌍반점으로부터 다른 문자열로 변경합니다.

#CommentFlag NewString

매개변수

NewString

새로운 주석 플래그로 사용될 하나 이상의 문자. 15 문자까지 지정할 수 있습니다.

논평

기본 주석 플래그는 쌍반점입니다 (;).

주석 플래그는 다음에 따라오는 텍스트가 스크립트에서 작동하지 말아야 한다고 알려 주는 데 사용됩니다 (주석은 스크립트가 기동할 때 메모리 안으로 적재되지 않습니다. 그래서 수행성능에 영향을 주지 않습니다).

주석 플래그가 명령어와 같은 줄에 나타나면 왼쪽에 적어도 하나 이상의 스페이스나 탭이 있어야 주석으로 간주됩니다. 예를 들어:

MsgBox, Test1 ; 이것은 주석입니다.
MsgBox, Test2; 이것은 주석이 아니고 MsgBox가 보여줍니다.

관련 항목

#EscapeChar

예제

#CommentFlag //  ; C++ 주석 스타일로 변경하니다.


#ErrorStdOut

스크립트의 실행을 막는 구문 에러를 대화상자에 보여주지 않고 표준에러(stderr)로 보냅니다.

#ErrorStdOut

[AHK_L 42+]: 에러는 표준출력(stdout)이 아니라 표준에러(stderr)에 씌여집니다. 명령 프롬프트와 멋진 편집기는 보통 둘 다 보여줍니다. 이 변경은 v1.1.19.01 이전까지 문서화되어 있지 않았습니다.

이 덕분에 Textpad, SciTE, Crimson, 그리고 EditPlus와 같은 멋진 편집기들은 구문 에러가 일어날 때 문제의 줄로 바로 점프해 갈 수 있습니다. #ErrorStdOut 지시어는 스크립트마다 추가해도 좋을 것입니다. 보통 오토핫키 스크립트를 기동할 때 편집기를 명령 줄 스위치 /ErrorStdOut를 사용하도록 설정하는 것이 더 좋습니다 (설정에 관한 지시 사항은 아래를 참조하십시오).

오토핫키는 콘솔 프로그램이 아니기 때문에, 에러는 명령 프롬프트에 직접 나타나지 않습니다. 대신에, 그런 출력은 파이프나 방향전환을 통하여 잡을 수 있습니다. 예를 들어:

"C:\Program Files\AutoHotkey\AutoHotkey.exe" /ErrorStdOut "My Script.ahk" 2>&1 |more
"C:\Program Files\AutoHotkey\AutoHotkey.exe" /ErrorStdOut "My Script.ahk" 2>"Syntax-Error Log.txt"

출력을 직접 클립보드로 파이프 처리해 넣을 수도 있습니다. cb.zip (4 KB)을 내려 받고, 다음 예제를 따르십시오:

"C:\Program Files\AutoHotkey\AutoHotkey.exe" /ErrorStdOut "My Script.ahk" 2>&1 |cb.exe

주의: 2>&1는 stderr를 stdout로 방향전환되도록 만듭니다. 반면에 2>Filename는 stderr만 파일로 방향전환합니다.

특정 편집기를 위한 지시 사항

EditPlus:
메뉴 바에서, 도구 > 사용자 도구 구성을 선택합니다.
다음 버튼을 누릅니다: 도구 > 프로그램
메뉴 텍스트: 여러분의 마음대로 설정합니다
명령어: C:\Program Files\AutoHotkey\AutoHotkey.exe
인자: /ErrorStdOut "$(FilePath)"
최초 디렉토리: $(FileDir)
출력 캡쳐: 네

TextPad:
메뉴 바에서, Configure > Preferences를 선택합니다.
Tools 엔트리를 확대합니다.
Add 버튼을 누르고 "Program"을 선택합니다.
복사해 붙여 넣습니다 (여러분의 경로에 맞게 조절하십시오): C:\Windows\System32\cmd.exe -- 다음 OK를 누릅니다.
리스트 박스에 새로 추가된 버튼을 세번 클릭합니다 (cmd.exe). 그리고 이름을 여러분 마음대로 바꿉니다 (예,. Launch Script).
Apply를 누릅니다.
왼쪽 트리에서 새 항목을 선택하고 다음 정보를 입력합니다:
Command (이미 채워져 있을 것입니다): cmd.exe (또는 전체 경로를 지정)
Parameters (필요하면 여러분의 경로에 맞게 조절): /c ""C:\Program Files\AutoHotkey\AutoHotkey.exe" /ErrorStdOut "$File""
Initial folder: $FileDir
다음 박스를 체크합니다: 1) Run minimized; 2) Capture output.
OK를 누릅니다. 새로 추가된 항목이 이제 Tools 메뉴에 나타날 것입니다.

관련 사항

FileAppend (이 역시 텍스트를 표준출력으로 보낼 수 있습니다)

예제

#ErrorStdOut


#EscapeChar (and explanation of escape sequences)

#EscapeChar (피신 연속열 설명)

스크립트의 피신 문자를 변경합니다 (예, accent vs. backslash).

#EscapeChar NewChar

매개변수

NewChar

문자 하나를 지정합니다.

논평

피신 문자는 바로 다음에 오는 문자가 정상과 다르게 번역되어야 한다는 것을 나타내는 데 사용됩니다.

기본 피신 문자는 액센트/백틱입니다 (`).

피신 연속열 (액센트가 피신 문자일 때)

다음은 | 이렇게 번역됩니다
`, | , (글자 그대로의 쉼표). 주의: 쉼표가 명령어의 마지막 매개변수에 나타나면 피신시킬 필요가 없습니다. 왜냐하면 프로그램이 그것을 문자 그대로 취급해야 한다는 것을 알고 있기 때문입니다. MsgBox의 모든 매개변수에도 마찬가지 규칙이 적용됩니다. 왜냐하면 똑똑한 쉼표 처리 방법을 알고 있기 때문입니다.
`% | % (글자 그대로의 퍼센트)
`` | ` (글자 그대로의 액센트; 즉, 두 개의 연속 피신 연속열은 하나의 글자 그대로의 문자가 결과가 됩니다.)
`; | ; (글자 그대로의 쌍반점). 주의: 쌍반점의 왼쪽에 스페이스나 탭이 있을 경우에만 필요합니다. 그렇지 않다면, 피신시키지 않아도 올바르게 인지합니다.
`:: | :: (글자 그대로의 쌍점 쌍). v1.0.40+에서는 더 이상 피신시킬 필요가 없습니다.
`n | 새줄 (라인피드/LF)
`r | 캐리지 리턴 (CR)
`b | 백스페이스
`t | 탭 (전형적인 수평 탭)
`v | 수직 탭 -- Ascii 값 11에 상응. 어떤 어플리케이션에서는 Control+K를 타자해 명확하게 밝힐 수 있습니다.
`a | 벨소리 (bell) -- Ascii 값 7에 상응. 어떤 어플리케이션에서는 Control+G를 타자해 명확하게 밝힐 수 있습니다.
`f | 폼피드 -- Ascii 값 12에 상응. 어떤 어플리케이션에서는 Control+L를 타자해 명확하게 밝힐 수 있습니다.
Send | Send 명령어나 핫스트링이 기본 모드 (비-날 모드)에서 사용될 때, {}^!+#와 같은 문자들은 특별한 의미가 있습니다. 그러므로, 이런 경우 문자 그대로 사용하려면, 활괄호로 둘러 싸십시오. 예를 들어: Send {^}{!}{{}.
"" | 표현식 안에서, 기호 그대로의 문자열 안에 둘러 싸인 두 개의 연속 따옴표는 문자 그대로의 하나의 따옴표로 결정됩니다. 예를 들어: Var := "The color ""red"" was found.".

관련 항목

잘 사용되지 않는 다음 지시어도 존재합니다; 사용법은 다음 예제에 보여줍니다:

#DerefChar #  ; 보통의 기본값 퍼센트를 샵으로 바꿉니다.
#Delimiter /  ; 보통의 기본값 쉼표를 정사선으로 바꿉니다

예제

#EscapeChar \  ; 기본 값 액센트 (`) 대신에 역사선으로 변경합니다.


#HotkeyInterval

#MaxHotkeysPerInterval과 함께, 핫키의 활성화 비율을 지정합니다. 이 값을 넘어서면 경고 대화상자가 타나납니다.

#HotkeyInterval Milliseconds

매개변수

Milliseconds

밀리초 단위로 간격의 길이.

논평

스크립트에 이 지시어를 지정하지 않으면 마치 2000을 지정한 것처럼 행위합니다.

자세한 내용과 논평은 #MaxHotkeysPerInterval를 참조하십시오.

관련 항목

#MaxHotkeysPerInterval

예제

#HotkeyInterval 2000  ; 이것이 기본값입니다 (밀리초).
#MaxHotkeysPerInterval 200


#HotkeyModifierTimeout

핫키 수식자의 행위에 영향을 미칩니다: CTRL, ALT, WIN, 그리고 SHIFT.

#HotkeyModifierTimeout Milliseconds

매개변수

Milliseconds

밀리초 단위 간격. 값이 -1이면 시간 제한이 없습니다 (수식 키는 Send 후에 언제나 제자리로 돌아옵니다), 또는 0이면 언제나 시간 제한이 있습니다 (수식 키는 절대로 제자리로 돌아오지 않습니다).

논평

이 지시어는 다음과 같은 경우 사용할 필요가 없습니다:

  • 핫키가 SendInput이나 SendPlay 방법으로 키눌림을 전송할 경우, Send 명령어가 완료될 때까지 이 메쏘드들은 사용자 키의 물리적 눌림이나 뗌을 연기하기 때문입니다.
  • 스크립트에 키보드 갈고리가 설치되어 있을 경우 (메인 창의 "View->Key history" 메뉴 항목이나 KeyHistory 명령어를 통하여 스크립트가 갈고리를 사용하는지 알아볼 수 있습니다), 사용자가 물리적으로 어느 수식 키를 (ALT/CTRL/WIN/SHIFT) 누르는지 갈고리가 추적할 수 있고 그리고 시간제한을 사용할 필요가 없기 때문입니다.

이 지시어의 효과를 시연하기 위해, 다음 예제를 생각해 보십시오: ^!a::Send, abc.

Send 명령어가 실행되면, 첫 번째로 CTRL과 ALT 키를 뗍니다. 그래서 문자들이 제대로 전송됩니다. 모든 키를 보내고 나면, 명령어는 어떻게 해야 CTRL과 ALT를 안전하게 제자리로 돌려놓을 수 있을지 알지 못합니다 (사용자가 여전히 수식 키를 누르고 있는지 어떤지 알 수가 없기 때문입니다). 그러나 지정된 밀리초 시간 동안에는 사용자가 아직 키를 뗄 기회를 갖지 못했다고 간주하고 수식 키들을 물리적 상태에 맞게 다시 돌려 놓습니다. 지정된 시간이 지나면, 수식 키는 다시 제자리로 돌아오지 않습니다. 수식키가 키를 변경하도록 만들려면 사용자는 수식 키를 떼고 다시 눌러야 합니다.

시간제한은 사용자가 전형적으로 핫키의 수식자를 떼기 전에 누르고 있는 시간보다 작은 값으로 설정해야 합니다. 그렇지 않으면, 수식키는 사용자가 물리적으로 누르고 있지 않아도 누른 위치로 복구되어 버릴 수 있습니다 (눌린 상태가 됨).

이 지시어의 사용을 줄이거나 필요를 없앨 수 있습니다. 다음 중 하나를 사용하면:

  • 키보드 갈고리를 설치합니다. 스크립트 아무데나 #InstallKeybdHook줄을 추가하면 됩니다.
  • 전통적인 SendEvent 방법 말고 SendInput 또는 SendPlay 방법을 사용합니다.
  • 전통적인 SendEvent 방법을 사용할 때, SetKeyDelay를 0 또는 -1로 줄이십시오. 키눌림이 더 빠르게 전달되기 때문에 도움이 될 것입니다.

이 지시어를 지정하지 않으면, 50으로 설정된 것처럼 행위합니다.

관련 항목

GetKeyState

예제

#HotkeyModifierTimeout 100


#Hotstring

핫스트링 옵션이나 종료 문자를 변경합니다.

#Hotstring NoMouse
#Hotstring EndChars NewChars
#Hotstring NewOptions

매개변수

NoMouse

마우스 클릭 때문에 여기에 기술하는 바와 같이 핫스트링 인식자가 재설정되지 않도록 막습니다. 부작용으로서, 이것은 또 마우스 갈고리를 핫스링이 요구하지 못하도록 막습니다 (그렇지만 스크립트가 다른 목적으로 요구하면 여전히 설치될 것입니다. 예를 들어, 마우스 핫키). #Hotstring NoMouse이 스크립트에 존재하면 모든 핫스트링에 영향을 줍니다. 단순히 물리적으로 그 아래에만 영향을 미치는 것이 아닙니다.

EndChars NewChars

단어 EndChars 다음에 스페이스를 하나 두고 다음에 새 종료 문자를 지정하십시오. 예를 들어:

#Hotstring EndChars -()[]{}':;"/\,.?!`n `t

새 종료 문자는 전체 스크립트에 전역적으로 효과가 있으므로 -- EndChars 지시어가 어디에 나타나는가에 상관 없이 -- EndChars를 한 번 이상 지정할 필요가 없습니다.

종료 문자의 최대 개수는 100개입니다. 이 길이를 넘어서는 문자는 무시합니다.

탭을 종료 문자로 만들려면, 목록에 `t를 포함하십시오. 스페이스를 종료 문자로 만들려면, 목록에 두 개의 다른 문자 사이에 포함하면 됩니다 (또는 리스트에 오직 문자가 하나 밖에 없다면 또는 하나도 없다면, 처음에 포함시킵니다).

NewOptions

핫스트링 옵션에 기술하는 바와 같이 새 옵션을 지정합니다. 예를 들어: #Hotstring r s k0 c0.

위의 EndChars와 다르게, #Hotstring 지시어는 이런 식으로 사용될 때 위치에 민감합니다. 다른 말로 하면, 핫스트링의 전체 섹션은 다음 예제와 같이 기본 옵션이 다를 수 있습니다:

::btw::by the way

#Hotstring r c  ; 이 아래의 핫스트링은 모두 "날 전송 모드"를 사용하고 기본으로 대소문자를 구분합니다.
::al::airline
::CEO::Chief Executive Officer

#Hotstring c0  ; 이 지점 아래의 모든 핫스트링을 대소문자에 무감각하게 만듭니다.

관련 항목

Hotstrings


#If

#If [AHK_L]

문맥-감지 핫키와 핫스트링을 만듭니다. 문맥 감지 핫키는 표현식의 결과에 따라 다르게 조치를 수행합니다 (또는 아무것도 하지 않습니다).

#If [, Expression ]

매개변수

Expression

유효한 표현식.

기본 연산

유효한 연산식이면 핫키가 활성화 될 문맥을 정의하는 데 사용할 수 있습니다. 예를 들어:

#If WinActive("ahk_class Notepad") or WinActive(MyWindowTitle)
#Space::MsgBox You pressed Win+Spacebar in Notepad or %MyWindowTitle%.

#IfWin 지시어처럼, #If도 위치에 민감합니다: 스크립트에서 물리적으로 아래에 있는 모든 핫키와 핫스트링에 영향을 줍니다. #If 그리고 #IfWin는 또 상호 배타적입니다; 즉, 가장 최근의 #If 또는 #IfWin만 효과가 있습니다.

문맥 감지를 끄려면, 모든 매개변수를 생략하고 #If 또는 #IfWin 지시어를 지정하면 됩니다. 예를 들어:

#If

총평

핫키를 구성하는 키 조합이 눌리면, #If 표현식을 평가하여 그 핫키를 활성화 할지 말지를 결정합니다. 표현식의 평가가 완료될 때까지 또는 시간제한이 풀릴 때까지 시스템은 키보드나 마우스 입력에 응답하지 않을 가능성이 있습니다. 표현식이 평가되고 있는 동안에 (예를 들어 표현식이 호출한 함수로부터) 키눌림이나 마우스 클릭을 전송하면 복잡한 일이 야기되므로 피하는 편이 좋습니다.

표현식은 프로그램이 핫키가 활성화되어 있는지 알 필요가 있을 때마다 평가될 수도 있습니다. 예를 들어, a & b::와 같은 맞춤 조합에 대하여 #If 표현식은 접두 키가 (이 예제에서는 a) 눌릴 때 평가되어, 맞춤 수식 키로 행위해야 할지 말지 결정합니다.

위에 기술한 이유 때문에, 표현식은 반드시 빨리 완료되도록 그리고 부작용이 없도록 작성해야 합니다.

[AHK_L 53+]: A_ThisHotkey와 A_TimeSinceThisHotkey는 현재 #If 표현식이 평가되고 있는 핫키에 기반하도록 설정됩니다.

[v1.0.95.00+]: A_PriorHotkey와 A_TimeSincePriorHotkey는 임시로 "This" 변수에 상응하는 이전의 값을 담고 있습니다.

관련 항목

#IfWin 지시어의 행위 특성은 대부분 #If에도 적용됩니다.

#IfTimeout을 사용하면 기본 시간제한 값을 바꿀 수 있습니다.

예제

; 예제 1: 태스크 바 위에서 마우스 휠을 스크롤해서 볼륨을 조절합니다.
#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}

MouseIsOver(WinTitle) {
    MouseGetPos,,, Win
    return WinExist(WinTitle . " ahk_id " . Win)
}

; 예제 2: 모든 편집 콘트롤을 위한 간단한 단어-삭제 단축키.
#If ActiveControlIsOfClass("Edit")
^BS::Send ^+{Left}{Del}
^Del::Send ^+{Right}{Del}

ActiveControlIsOfClass(Class) {
    ControlGetFocus, FocusedControl, A
    ControlGet, FocusedControlHwnd, Hwnd,, %FocusedControl%, A
    WinGetClass, FocusedControlClass, ahk_id %FocusedControlHwnd%
    return (FocusedControlClass=Class)
}

; 예제 3: 문맥-감지 핫키.
#If
Esc::ExitApp

; 예제 4: 동적인 핫키. 예제 1을 필요로 함.
NumpadAdd::
Hotkey, If, MouseIsOver("ahk_class Shell_TrayWnd")
if (doubleup := !doubleup)
    Hotkey, WheelUp, DoubleUp
else
    Hotkey, WheelUp, WheelUp
return

DoubleUp:
Send {Volume_Up 2}
return


#IfTimeout

#IfTimeout [AHK_L 8+]

#If 표현식 하나를 평가하는 데 소모될 최대 시간을 설정합니다.

#IfTimeout Timeout

매개변수

Timeout

timeout 값은 밀리초 단위로 전역적으로 적용됩니다.

논평

시간제한은 오랫 동안 실행되는 표현식 때문에 키보드 입력 처리가 지체되지 않도록 구현되어 있습니다. 시간제한 값을 초과하면, 표현식은 계속 평가를 하지만, 키보드 갈고리는 마치 그 표현식이 이미 거짓을 돌려준 것처럼 계속됩니다.

이 지시어를 스크립트에 지정하지 않으면, 마치 1000이 설정되어 있는 것처럼 행위합니다.

시스템은 자신만의 시간제한이 있다는 사실을 명심하십시오. 다음 레지스트리 키에 DWORD 값 LowLevelHooksTimeout로 정의되어 있습니다:

HKEY_CURRENT_USER\Control Panel\Desktop

시스템 시간제한 값을 초과하면, 시스템은 스크립트의 키보드 갈고리 호출을 중지합니다. 그래서 그 갈고리가 재등록되거나 스크립트가 재적재될 때까지 갈고리 핫키들이 작동하지 못합니다. 그 갈고리는 보통 재등록할 수 있습니다. 모든 핫키를 보류하고 풀어주면 됩니다.

주어진 핫키에 여러 #If 변형이 들어 있으면, 시간제한은 각 변형마다 독립적으로 적용됩니다. 그래서, 시스템 시간제한을 초과할 가능성이 더 높아집니다. 이 행위는 앞으로 업데이트될 가능성이 있습니다.

관련 항목

#If

예제

#IfTimeout 10 ; 시간제한을 10 ms로 설정합니다.


#IfWinActive / #IfWinExist

문맥-감지 핫키와 핫스트링을 만듭니다. 그런 핫키는 활성화 된 또는 존재하는 창의 종류에 따라 다른 조치를 수행합니다 (또는 아무일도 하지 않습니다).

#IfWinActive [, WinTitle, WinText]
#IfWinExist [, WinTitle, WinText]
#IfWinNotActive [, WinTitle, WinText]
#IfWinNotExist [, WinTitle, WinText]
#If [, Expression]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

부합하는 행위는 자동-실행 섹션에 설정된 대로SetTitleMatchMode가 결정합니다.

대부분의 다른 지시어처럼, 변수는 지원하지 않습니다. ahk_pid와 ahk_id를 하드-코드된 프로세스나 창 ID와 함께 사용할 수는 있지만, 더 일반적인 것은 #IfWin이 간접적으로 GroupAdd나 Hotkey IfWin을 통하여 사용하는 것입니다.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 자동-실행 섹션 (스크립트이 최상단)에 켜져 있으면 탐지됩니다.

ExcludeTitle
ExcludeText

이것들은 지원되지 않지만, WinTitle대하여 ahk_group MyGroup를 지정하면 간접적으로 사용할 수 있습니다 (여기에서 MyGroup은 GroupAdd를 통하여 생성된 그룹이며, 이 그룹은 ExcludeTitle/Text를 지원합니다).

기본 연산

#IfWin 지시어로 문맥 감지 핫키와 핫스트링을 쉽게 만들 수 있습니다. 예를 들어:

#IfWinActive ahk_class Notepad
#space::MsgBox 노트패드 안에서 Win+Spacebar를 눌렀습니다.

#IfWin 지시어는 위치에 민감합니다: 스크립트에서 물리적으로 아래에 있는 모든 핫키와 핫스트링에 영향을 미칩니다. 이 둘은 또 상호 배타적입니다; 즉, 가장 최신의 것만 효과가 있습니다.

문맥 감지를 끄려면, 매개변수 없이 #IfWin 지시어를 지정하십시오. 예를 들어:

#IfWinActive

#IfWin이 꺼져 있을 때 (또는 스크립트에 전혀 사용되지 않으며), 모든 핫키와 핫스트링이 모든 창에 대하여 활성화 됩니다 (Suspend나 Hotkey 명령어를 통하여 끌 수 있습니다).

마우스나 키보드 핫키가 #IfWin를 통하여 꺼져 있을 때, 고유의 기능을 수행합니다; 즉, 마치 그런 핫키가 전혀 없는 것처럼 활성 창에 건네집니다. 한 가지 예외가 있습니다: 조이스틱 핫키는: #IfWin이 작동하더라도, 다른 프로그램이 버튼 누름을 보는 것을 막지 않습니다.

#IfWin는 또 정상 키의 행위를 마치 엔터키나 스페이스 키처럼 바꾸는 데에도 사용할 수 있습니다. 이는 특정 창이 그 키를 무시하거나 마음에 안드는 행위를 수행할 경우 유용합니다. 예를 들어:

#IfWinActive Reminders ahk_class #32770  ; 아웃룩의 "알리미" 창.
Enter::Send !o  ; "Enter" 키눌림은 선택된 알리미를 재우는게 아니라 열리도록 만듭니다.
#IfWinActive

변종 (중복) 핫키

특정 핫키나 핫스트링은 각 정의마다 #IfWin 기준이 다르다면 스크립트에 한 번 이상 정의할 수 있습니다. 이것을 핫키 변종이라고 합니다. 예를 들어:

#IfWinActive ahk_class Notepad
^!c::MsgBox 노트패드에서 Control+Alt+C를 눌렀습니다.
#IfWinActive ahk_class WordPadClass
^!c::MsgBox 워드패드에서 Control+Alt+C를 눌렀습니다.
#IfWinActive
^!c::MsgBox 노트패드/워드패드가 아닌 창에서 Control+Alt+C를 눌렀습니다.

여러 변종이 촉발될 수 있다면, 스크립트에서 제일 위쪽에 있는 변종만 촉발됩니다. 예외가 있다면 전역 변종입니다 (#IfWin 기준이 전혀 없다면): 언제나 가장 우선 순위가 낮습니다. 그러므로, 경쟁 상대로 다른 변종이 전혀 없을 경우에만 촉발됩니다 (이 예외는 핫스트링에 적용되지 않습니다).

중복 핫키를 만들 때, ^!+#와 같은 수식 심볼의 순서는 문제가 되지 않습니다. 예를 들어, ^!c는 !^c와 동일합니다. 그렇지만, 키는 일관성이 있게 철자가 되어야 합니다. 예를 들어, 이런 목적으로 Esc는 Escape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 또, 와일드카드 접두 심볼(*)이 있는 핫키는 완전히 비-와일드카드 핫키와 구분됩니다; 예를 들어, *F1와 F1는 각자 자신만의 변종 집합이 있습니다.

같은 핫키 서브루틴을 여러 변종이 실행하도록 만들려면, 가장 쉬운 방법은 동일한 핫키를 주욱 늘어놓고, 각각 #IfWin 지시어를 다르게 만드는 것입니다. 예를 들어:

#IfWinActive ahk_class Notepad
#z::
#IfWinActive ahk_class WordPadClass
#z::
MsgBox 노트패드 또는 워드패드에서 Win+Z를 눌렀습니다.
return

대안으로, #IfWinActive ahk_group MyGroup을 통하여 창 그룹을 사용할 수 있습니다.

핫키 변종을 (스크립트가 실행중인 동안에) 동적으로 생성하려면, "Hotkey IfWin"를 참조하십시오.

총평

#IfWin는 또 적절할 때 접두 키를 자신의 고유 기능으로 복구합니다 (접두 키는 "a & b"와 같이 핫키 안에 있는 "a" 키입니다). 주어진 접두 심볼에 대하여 활성화된 핫키가 전혀 없을 때마다 이런 일이 일어납니다.

Gosub나 Goto를 사용하여 핫키나 핫스트링 라벨에 점프할 때, 스크립트 상단에 가까운 변종으로 점프합니다.

핫키가 현재 #IfWin을 통하여 꺼져 있으면, 그의 키나 마우스 버튼은 "#" 문자와 함께 KeyHistory의 "Type" 컬럼에 나타납니다. 이는 스크립트 디버깅에 도움이 됩니다.

%Var%와 같은 변수 참조는 현재 지원하지 않습니다. 그러므로, 퍼센트 사인은 `%를 통하여 피신시켜야 합니다. 앞으로는 지원할 가능성이 있습니다. 비슷하게, (`,를 통하여) 글자 그대로의 쉼표도 피신시켜야 합니다. 추가 매개변수가 미래에 추가될 가능성이 있습니다. 이 한계를 우회할 필요가 있다면, GroupAdd와 ahk_group를 사용하십시오.

Hotkey 명령어가 핫키에 할당한 라벨은 #IfWin에 직접적으로 영향을 받지는 않습니다. 대신에, #IfWin를 스크립트 상단에 가깝게 사용하면 Hotkey 명령어가 생성한 모든 핫키에 영향을 줍니다 (단 "Hotkey IfWin"가 사용되어 그것을 바꾸지 않았어야 합니다).

알트-탭 핫키는 #IfWin에 영향을 받지 않습니다: 오히려 모든 창에 효과가 있습니다.

마지막 발견 창은이 #IfWinActive/Exist이 설정합니다 (그렇지만 #IfWinNotActive/NotExist로는 설정되지 않습니다). 예를 들어:

#IfWinExist ahk_class Notepad
#n::WinActivate  ; #IfWin이 발견한 창을 활성화합니다.

#IfWin의 매개변수 중 하나에 선두 또는 후미의 스페이스/탭이 필요하면, 피신 연속열 `s와 `t를 사용할 수 있습니다.

수행성능의 이유로, #IfWin는 지정된 창의 존재나 활성화를 항상 관제하지는 않습니다. 대신에, 핫키나 핫스트링을 타자할 때만 부합하는 창이 있는지 점검합니다. 부합하는 창이 존재하지 않으면, 키눌림이나 마우스 클릭은 활성 창 안으로 그대로 통과시킵니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows이 (스크립트 상단) 자동 실행 섹션에서 켜졌다면 탐지됩니다 .

관련 항목

#If 표현식, Hotkey 명령어, Hotkeys, Hotstrings, Suspend, IfWinActive, IfWinExist, SetTitleMatchMode, DetectHiddenWindows

예제

#IfWinActive ahk_class Notepad
^!a::MsgBox 노트패드가 활성화되어 있는 동안 Ctrl-Alt-A를 눌렀습니다.  ; 이 핫키는 다른 창에 눌려봐야 아무 효과도 없습니다 (그대로 "통과 시킵니다").
#c::MsgBox 노트패드가 활성화되어 있는 동안 Win-C를 눌렀습니다.
::btw:노트패드에 있는 동안에만 :"btw"에 대하여 이 텍스트로 교체됩니다.
#IfWinActive
#c::MsgBox 노트패드가 아닌 창에서 Win-C를 눌렀습니다.


#Include

#Include / #IncludeAgain

스크립트는 마치 지정된 파일의 내용이 정확하게 이 위치에 존재하는 것처럼 행위합니다.

#Include FileOrDirName
#Include <LibName>
#IncludeAgain FileOrDirName

매개변수

FileOrDirName

아래에 기술하는 바와 같이 파일이나 디렉토리의 경로. 겹따옴표나 와일드카드 또는 변수 참조가 포함되면 안됩니다. 단 %A_ScriptDir%, %A_AppData%, %A_AppDataCommon% 그리고 (v1.1.11+ 전용) %A_LineFile%와 같은 변수 참조는 제외합니다. 피신 연속열은 쌍점 (`;)을 제외하고 사용하면 안됩니다. 퍼센트 기호 같은 문자들을 문자 그대로 취급하기 때문에 필요하지도 않습니다.

File: 삽입될 파일의 이름.. 절대 경로를 지정하지 않으면 기동/작업 디렉토리에 있다고 간주합니다 (ahk2exe는 제외합니다. 파일이 스크립트의 디렉토리에 있다고 간주합니다). 주의: SetWorkingDir는 #Include에 영향을 주지 않습니다. 왜냐하면 #Include를 처리 한 후에 스크립트가 실행을 시작하기 때문입니다.

Directory: 파일 대신에 디렉토리를 지정하여 작업 디렉토리를 변경합니다. 이어 나타나는 모든 #Include 그리고 FileInstall이 이 디렉토리를 사용합니다. 주의: 이런 식으로 작업 디렉토리를 변경하더라도 스크립트가 실행을 시작할 때의 최초 작업 디렉토리에는 영향을 미치지 않습니다 (A_WorkingDir). 이를 바꾸려면 스크립트의 상단에서 SetWorkingDir을 지정하십시오.

LibName

[AHK_L 57+]: 라이브러리 파일이나 함수 이름. 예를 들어, #include <lib> 그리고 #include <lib_func>는 둘 다 함수 라이브러리 폴더 중 하나로부터 lib.ahk을 포함합니다.

논평

스크립트는 마치 포함된 파일의 내용이 (마치 복사해 붙여 넣기 한 것처럼) 물리적으로 정확하게 #Include 지시어의 위치에 존재하는 것처럼 행위합니다. 결과적으로, 두 개의 분리된 스크립트를 하나로 기능하는 스크립트로 병합할 수 없습니다 (그렇게 하려면, www.autohotkey.com/forum/topic18545.html를 참조하십시오).

#Include는 FileName을 여러 번 포함시켜도 오직 한 번만 포함된다고 확인해 줍니다. 대조적으로, #IncludeAgain은 같은 파일을 여러 번 포함할 수 있습니다. 하지만 모든 면에서 #Include와 똑 같습니다.

FileName 매개변수는 선택적으로 앞에 *i와 하나의 스페이스를 둘 수 있습니다. 그러면 프로그램은 포함된 파일을 읽는데 실패하더라도 무시합니다. 예를 들어: #Include *i SpecialOptions.ahk. 이 옵션은 포함된 파일의 내용이 메인 스크립트의 연산에 별로 중요하지 않을 경우에만 사용해야 합니다.

메인 창에 ListLines이나 View->Lines 메뉴를 통하여 보여지는 줄들은 언제나 자신의 파일 안에서 물리적 순서에 맞게 번호가 매겨집니다. 다른 말로, 새 파일을 포함하면 메인 스크립트의 파일의 줄 번호가 한 줄 만큼만 변경됩니다. 즉, #Include 줄 자체 만큼 변경됩니다 (컴파일된 스크립트는 제외합니다. 포함 파일을 하나의 거대한 스크립트로 컴파일 시간에 병합하기 때문입니다).

#Include는 종종 외부 파일에 정의된 함수를 적재하는 데 사용됩니다. 서브루틴의 라벨과 다르게, 함수는 자동-실행 섹션에 영향을 주지 않고 스크립트 맨 꼭대기에 포함할 수 있습니다.

다른 # 지시어처럼, #Include는 조건적으로 실행할 수 없습니다. 다른 말로, 다음 예제는 작동하지 않습니다:

if x = 1
    #Include SomeFile.ahk  ; 이 줄은 x의 값에 관계 없이 효과가 있습니다.
    y = 2  ; 그리고 이 줄은 위의 IF에 속합니다. 왜냐하면 # 지시어는  IF에 속할 수 없기 때문입니다.

이름으로 라이브러리 함수를 호출하면 파일을 자동으로 포함할 수 있습니다 (즉, #Include를 사용할 필요가 없습니다).

[v1.1.11+]: %A_LineFile%\..를 사용하면 현재 파일이 담긴 디렉토리를 참조할 수 있습니다. 메인 스크립트 파일이 아니더라도 상관이 없습니다. 예를 들어, #Include %A_LineFile%\..\other.ahk.

관련 항목

라이브러리 함수, Functions, FileInstall

예제

#Include C:\My Documents\Scripts\Utility Subroutines.ahk
#Include %A_ScriptDir%  ; 다음에 오는 #Includes과 FileInstalls을 위해작업 디렉토리를 변경합니다.
#Include C:\My Scripts  ; 위와 같지만 명시적으로 이름을 지정한 디렉토리를 위해 변경합니다.


#InputLevel

#InputLevel [v1.1.06+]

핫키와 핫스트링이 무시하는 인위적인 키눌림과 마우스 이벤트를 제어합니다.

#InputLevel [, Level]

매개변수

Level

0과 100 사이의 정수값. 생략하면, 기본값은 0입니다.

총평

SendLevel과 #InputLevel의 작동 방식에 대한 설명은 SendLevel을 참조하십시오.

이 지시어는 위치에 민감합니다: 다음 #InputLevel 지시어가 나타날 때까지 모든 핫키와 핫트링에 영향을 줍니다. #InputLevel 지시어가 설정되어 있지 않으면, 핫키와 핫스트링은 기본값이 0입니다.

핫키 또는 비-자동-교체 핫스트링의 레벨은 자신이 생산한 키눌림이나 버튼 클릭에 대하여 기본 전송 레벨로도 사용됩니다. 키보드나 마우스 리맵핑은 실제로는 한 쌍의 핫키이므로, #InputLevel을 사용하면 리맵핑이 다른 핫키를 촉발시킬 수 있습니다.

v1.1.06 이전 버전은 #InputLevel 0인 것처럼 그리고 SendLevel 0의 효과가 있는 것처럼 행위합니다.

관련 항목

SendLevel, 핫키, 핫스트링

예제

#InputLevel 1
Numpad0::LButton
#InputLevel 0
; 이 핫키는 Numpad0와 LButton이 모두 촉발할 수 있습니다:
~LButton::Msgbox Clicked


#InstallKeybdHook

키보드 갈고리를 무조건 강제로 설치합니다.

#InstallKeybdHook

Remarks

키보드 갈고리는 (운영체제에 내장되어 있는 함수인) RegisterHotkey가 지원하지 않는 핫스트링과 키보드 핫키를 활성화하기 위한 목적으로 키눌림을 관제합니다. 또한 Input 명령어와 같이 몇 가지 다른 특징도 지원합니다.

오토핫키는 키보드 갈고리와 마우스 갈고리를 무조건 설치하지는 않습니다. 왜냐하면 그 둘이서 적어도 500 KB의 메모리를 소비하기 때문입니다. 그러므로, 키보드 갈고리는 보통 스크립트에 다음과 같은 것이 포함되어 있을 경우에만 설치됩니다:

  1. 핫스트링;
  2. 키보드 갈고리를 요구하는 (대부분은 그렇지 않음) 하나 이상의 핫키;
  3. SetCaps/Scroll/Numlock AlwaysOn/AlwaysOff;
  4. Input 명령어, 실제로 처음 사용될 때 갈고리가 설치됩니다.

대조적으로, #InstallKeybdHook 지시어는 무조건 키보드 갈고리를 설치합니다. KeyHistory가 마지막 20 개의 키눌림을 보여주거나 (디버깅 목적으로), 또는 #HotkeyModifierTimeout가 필요없도록 회피할 때 유용합니다.

스크립트가 갈고리를 사용 중인지 여부는 KeyHistory 명령어 또는 메뉴 항목을 통하여 알 수 있습니다. 어느 핫키가 갈고리를 사용하는지는 ListHotkeys 명령어나 메뉴 항목을 통하여 알 수 있습니다.

이 지시어는 또한 스크립트를 영속적으로 만듭니다. 즉, 종료하려면 ExitApp를 사용해야 한다는 뜻입니다.

관련 항목

#InstallMouseHook, #UseHook, 핫키, Input, #Persistent, 키히스토리, 핫스트링, GetKeyState, KeyWait

예제

#InstallKeybdHook


#InstallMouseHook

마우스 갈고리를 무조건 강제로 설치합니다.

#InstallMouseHook

논평

마우스 갈고리는 마우스 핫키를 활성화하고 핫스트링을 촉발시키기 위한 목적으로 마우스 클릭을 관제합니다.

오토핫키는 키보드 갈고리와 마우스 갈고리를 무조건 설치하지는 않습니다. 왜냐하면 그 둘이 적어도 500 KB의 메모리를 소비하기 때문입니다 (그러나 키보드 갈고리가 설치되어 있다면, 마우스 갈고리는 겨우 50 KB의 추가 메모리를 요구할 뿐입니다; 그리고 그 반대도 마찬가지입니다). 그러므로, 마우스 갈고리는 스크립트에 하나 이상의 마우스 핫키가 들어 있을 경우에만 설치됩니다. 핫스트링에 대해서도 설치가 되지만, 그것은 #Hotstring NoMouse를 통하여 비활성화할 수 있습니다.

대조적으로, #InstallMouseHook 지시어는 무조건 마우스 갈고리를 설치합니다. KeyHistory가 마우스 클릭을 관제해야 할 경우에 유용합니다.

스크립트가 갈고리를 사용하는지 KeyHistory나 메뉴를 통하여 알 수 있습니다. 어느 핫키가 갈고리를 사용하는지는 ListHotkeys 명령어나 메뉴를 통하여 알 수 있습니다.

이 지시어는 또한 스크립트를 영속적으로 만듭니다. 종료하려면 ExitApp를 사용해야 한다는 뜻입니다.

관련 항목

#InstallKeybdHook, #UseHook, 핫키, #Persistent, KeyHistory, GetKeyState, KeyWait

예제

#InstallMouseHook


#KeyHistory

KeyHistory 창에 보여지는 키보드와 마우스 이벤트의 최대 개수를 설정합니다. 0을 설정하면 키 이력이 꺼집니다.

#KeyHistory MaxEvents

매개변수

MaxEvents
KeyHistory 창에 보여지는 키보드와 마우스 이벤트의 최대 개수 (기본값은 40이고, 최대는 500). 0을 지정하면 키 이력이 완전히 꺼집니다.

논평

이 설정은 스크립트가 실행을 시작하기 전에 효과를 내기 때문에, (스크립트 어느 곳에서나) 한 번만 지정하면 됩니다.

각 키눌림과 마우스 클릭은 다운-이벤트와 업-이벤트로 구성되기 때문에, KeyHistory는 "완전한 이벤트"의 반쪽만 지정된 갯수만큼 보여줍니다. 예를 들어, 스크립트에 #KeyHistory 50이 들어 있다면, 키눌림과 마우스 클릭을 25 개까지 보여줍니다

관련 항목

KeyHistory, #NoTrayIcon

예제

#KeyHistory 0    ; 키 이력을 끕니다.
#KeyHistory 100  ; 100 개의 이벤트까지 저장합니다.


#MaxHotkeysPerInterval

#HotkeyInterval과 함께, 핫키 활성화 비율을 지정합니다. 이 값을 넘어서면 경고 대화상자가 나타납니다.

#MaxHotkeysPerInterval Value

매개변수

Value

경고 대화상자를 촉발하지 않고 #HotkeyInterval가 지정한 시간 사이에 누를 수 있는 핫키의 최대 개수.

논평

너무 관대하게 지정하지 않도록 주의하십시오. 왜냐하면 의도치 않게 무한 키눌림 회돌이를 초래한다면 (Send 명령어를 사용했는데 우연하게도 다른 핫키를 촉발하게 되면), 범람하는 키보드 이벤트 때문에 컴퓨터가 응답을 하지 못하게 될 수 있습니다.

좀 과도하게 간략한 예제를 들자면, 핫키 ^c::Send ^c는 무한 키눌림 회돌이를 생산합니다. 이를 피하려면, 핫키 정의에 $ prefix 접두사를 추가해 (예, $^c::) 핫키가 Send 명령어로 촉발되지 못하게 하십시오.

이 지시어가 스크립트 안에 지정되어 있지 않으면, 70으로 설정한 것처럼 행위합니다.

관련 항목

#HotkeyInterval

예제

#MaxHotkeysPerInterval 200


#MaxMem

각 변수의 최대 가용 능력을 지정된 개수의 메가바이트로 설정합니다.

#MaxMem Megabytes

매개변수

Megabytes

변수에 허용할 메가바이트의 개수. 4095보다 큰 값은 4095로 간주합니다. 1보다 작은 값은 1로 간주합니다.

논평

이 지시어가 스크립트에 지정되어 있지 않으면, 마치 64로 설정된 것처럼 행위합니다.

각 변수의 가용 능력을 제한하는 목적은 버그가 있는 스크립트가 모든 시스템 메모리를 고갈시키지 못하도록 하기 위함입니다. 제한을 올리고 내려도 스크립트의 수행성능에는 영향을 미치지 않습니다. 스크립트가 실제로 사용하는 메모리 크기도 바뀌지 않습니다 (단, WinGetText과 ControlGetText의 경우는 제외합니다. #MaxMem을 늘리면 더 많은 텍스트를 받을 수 있기 때문입니다).

이 설정은 전역적입니다. (스크립트 아무데서나) 한 번만 지정하면 전체 스크립트의 행위에 영향을 줄 수 있다는 뜻입니다.

이 설정은 변수가 스스로 자동 확장되는 경우만 제한합니다. VarSetCapacity에는 영향을 주지 않습니다.

관련 항목

VarSetCapacity, 변수, Sort, WinGetText, ControlGetText, #MaxThreads

예제

#MaxMem 256  ; 변수 당 256를 허용합니다.


#MaxThreads

동시 쓰레드의 최대 개수를 설정합니다.

#MaxThreads Value

매개변수

Value

동시에 존재할 수 있는 쓰레드의 최대 개수. 255 보다 큰 값을 지정하면 255를 지정한 것과 동일합니다 (1.0.48 이전 버전에는, 20이 제한 값이었습니다).

논평

이 설정은 전역적입니다. (스크립트 아무데서나) 한 번만 지정하면 전체 스크립트의 행위에 영향을 미친다는 뜻입니다.

값이 1인 것도 허용하지만, 권장하지 않습니다. 스크립트가 MsgBox나 기타 대화상자를 보여줄 때마다 새로운 핫키가 기동하지 못하도록 막기 때문입니다. 또한 또다른 쓰레드가 자고 있거나 대기하고 있을 때마다 타이머도 실행되지 못합니다

#MaxThreads 에 도달하더라도 다음 유형의 쓰레드를 최대 두 개까지 만들 수 있습니다:

핫키, 핫스트링, OnClipboardChange, 또는 GUI 이벤트가 그 유형에 해당됩니다. 단, 그의 서브부틴의 첫 줄이 ExitApp, Pause, Edit, Reload, KeyHistory, ListLines, ListVars, 또는 ListHotkeys인 경우에만 허용됩니다.

또한, OnExit subroutine은 언제나 얼마나 많은 쓰레드가 있는지에 상관없이 기동합니다.

이 설정이 #MaxThreadsPerHotkey보다 작으면, 그 설정을 오버라이드 하는 효과가 있습니다.

이 지시어가 스크립트에 지정되어 있지 않으면, 10이 설정된 것처럼 행위합니다.

관련 항목

#MaxThreadsPerHotkey, Threads, #MaxHotkeysPerInterval, #HotkeyInterval, ListHotkeys, #MaxMem

예제

#MaxThreads 2


#MaxThreadsBuffer

#MaxThreadsPerHotkey 제한에 도달할 때 키눌림을 무시하지 않고 모든 또는 어느 정도는 핫키가 버퍼 처리됩니다.

#MaxThreadsBuffer On|Off

매개변수

On|Off

On: 여기부터 다음 #MaxThreadsBuffer ON 지시어 사이의 모든 핫키 서브루틴이 #MaxThreadsPerHotkey 제한에 걸릴 때마다 핫키의 눌림을 무시하는 대신에 버퍼 처리됩니다.

Off: 이것이 기본 행위입니다. 핫키를 눌러도 핫키가 이미 쓰레드의 최대 개수를 이미 실행하고 있다면 무시됩니다 (보통 1이지만, 이는 #MaxThreadsPerHotkey로 바꿀 수 있습니다).

논평

이 지시어는 잘 사용되지 않습니다. 왜냐하면 이런 유형의 버퍼 처리는, OFF가 기본값인데, 보통 득보다 실이 많기 때문입니다. 예를 들어, 우발적으로 핫키를 두 번 눌러, 이 설정이 ON이 되고, 그의 첫 번째 쓰레드가 끝나는데 1 초보다 적게 걸리면 그 핫키의 서브루틴은 자동으로 두 번 실행됩니다. (이런 유형의 버퍼는 1초 이후에 종료되도록 설계되어 있습니다). 오토핫키는 핫키를 여러가지 방식으로 버퍼 처리한다는 것을 주목하십시오 (예를 들어 Thread Interrupt 그리고 Critical). 이런 특이한 방식은 해롭기만 할 뿐입니다. 그리하여 기본으로 OFF 상태입니다.

이 지시어를 사용하는 주 목적은 키보드의 자동-반복 특징의 반응 능력을 끌어 올리는 데 있습니다. 예를 들어, 핫키를 누르고 있을 때 #MaxThreadsPerHotkey가 1로 설정되어 있다면 (기본값), 들어오는 키눌림은 그 핫키 서브루틴이 이미 실행 중일 경우 무시됩니다. 그리하여, 서브루틴이 끝날 때, 다음 자동-반복 키눌림이 들어오기를 기다려야 합니다. 이 대기 시간은 자동-반복 사이클의 키눌림 사이에 잡혀 있기 때문에 대략 50ms 남짓 걸릴 것입니다. 이 50ms의 지연 시간을 피할 수 있습니다. 자동-반복되는 동안에 좋은 반응성이 필요한 모든 핫키에 이 지시어를 활성화하면 됩니다.

다른 모든 # 지시어처럼, 이 지시어는 그냥 명령어처럼 아무데나 배치하면 안됩니다 (즉, 서브루틴 안에 포함시킬 필요가 없습니다). 대신에, 효과를 주고 싶은 첫 핫키 라벨 바로 다음에 배치하십시오.

관련 항목

#MaxThreads, #MaxThreadsPerHotkey, Critical, Thread (명령어), 쓰레드, 핫키, #MaxHotkeysPerInterval, #HotkeyInterval, ListHotkeys

예제

#MaxThreadsBuffer on
#x::MsgBox, 이 핫키는 위와 같은 종류의 버퍼 처리를 사용합니다.
#y::MsgBox, 이것도 마찬가지입니다.
#MaxThreadsBuffer off
#z::MsgBox, 그러나 이것은 아닙니다.


#MaxThreadsPerHotkey

핫키 또는 핫트링당 동시 쓰레드의 최대 개수를 설정합니다. .

#MaxThreadsPerHotkey Value

매개변수

Value

주어진 핫키/핫스트링 서브루틴에 대하여 기동할 수 있는 쓰레드의 최대 개수 (255로 제한).

논평

이 설정은 주어진 핫키 또는 핫스트링 서브루틴의 "실체"가 동시에 얼마나 많이 존재하도록 허용할지 제어하는 데 사용됩니다. 예를 들어, 어떤 핫키가 최대값 1이고 서브루틴이 이미 실행 중인 동안에 다시 눌린다면, 그 키눌림은 무시됩니다. 이렇게 하면 우발적으로 두 번 누르는 일을 방지할 수 있습니다. 그렇지만, 이 키 눌림을 무시하는 대신에 버퍼 처리하고 싶다면 -- 아마도 키보드의 자동-반복 특징의 반응성을 높이고 싶다면 -- #MaxThreadsBuffer를 사용하십시오.

#MaxThreads와 다르게, 이 설정은 전역적이 아닙니다. 대신, 영향을 주고 싶은 첫 핫키 라벨 앞에 배치하십시오. 결과적으로 그 뒤에 잇다르는 핫키들은 그 값을 사용하게 됩니다. 이 지시어의 또다른 실체를 만나기 전까지는 말입니다.

핫키 서브루틴에서 첫 줄이 ExitApp, Pause, Edit, Reload, KeyHistory, ListLines, ListVars, 또는 ListHotkeys이면 이 설정에 상관없이 언제나 그 핫키가 실행됩니다.

#MaxThreads의 설정이 -- 이 설정보다 낮으면 -- 우선 순위를 갖습니다.

이 지시어가 스크립트에 지정되어 있지 않으면, 마치 1이 설정된 것처럼 행위합니다.

관련 항목

#MaxThreads, #MaxThreadsBuffer, Critical, Threads, Hotkey, #MaxHotkeysPerInterval, #HotkeyInterval, ListHotkeys

예제

#MaxThreadsPerHotkey 3


#MenuMaskKey

#MenuMaskKey [AHK_L 38+]

Win 또는 Alt 키업 이벤트를 마스크하는데 사용될 키를 변경합니다.

#MenuMaskKey KeyName

매개변수

KeyName

A 키 이름 또는 0 아닌 가상 키코드를 지정하는 vkNN 연속열. 스캔코드는 사용되지 않습니다.

논평

이 설정은 전역적입니다. (스크립트 아무데서나) 딱 한 번만 지정하면 전체 스크립트에 영향을 미친다는 뜻입니다

핫키를 키보드 갈고리나 마우스 갈고리를 사용하여 구현했다면, 마지막 키눌림은 활성창과 시스템에 보이지 않을 수도 있습니다. Win 또는 Alt 수식 키를 사용하는 핫키에 대하여, 이 수식키가 눌릴 때 시작 메뉴나 활성창의 메뉴 바가 활성화될 수 있습니다. 이런 일이 일어나는 것을 피하기 위해 오토핫키는 키눌림을 전송하여 키업 이벤트를 "은폐" 합니다. 개정판 38 이전에서는 언제나 Ctrl 키눌림이었고, 이 때문에 어떤 어플리케이션에는 문제가 된다고 알려져 있습니다.

스크립트에 이 지시어가 지정되어 있지 않으면, Ctrl을 지정한 것처럼 행위합니다.

관련 항목

배경 정보는 이 쓰레드를 참조하십시오.

예제

#MenuMaskKey vk07  ; vk07은 할당되지 않습니다.
#UseHook
#Space::
!Space::
    KeyWait LWin
    KeyWait RWin
    KeyWait Alt
    KeyHistory
return


#NoEnv

#NoEnv [v1.0.43.08+]

빈 문자열이 환경 변수인지 점검하는 것을 회피합니다 (모든 새 스크립트에 권장).

#NoEnv

스크립트 아무데나 #NoEnv 줄을 지정하면 빈 문자열이 잠재적으로 환경 변수인지 찾아 보지 못하도록 막습니다. 예를 들어:

#NoEnv
MsgBox %WinDir%

위 코드는 "WinDir" 환경변수를 열람하지 않습니다 (물론 스크립트 상단 근처에 WinDir := A_WinDir와 같이 처리하면 해결할 수 있습니다).

모든 새 스크립트에 #NoEnv을 지정하는 것을 권장합니다. 왜냐하면:

  1. 빈 문자열이 표현식이나 명령어에 사용될 때마다 수행성능이 눈에 띄게 개선됩니다. 또한 따옴표 없는 매개변수 유형을 사용할 때 DllCall의 수행성능도 향상됩니다. (예, int vs. "int").
  2. 환경 변수 때문에 스크립트에 버그가 생기는 것을 방지합니다. 그 이름이 예상치 못하게 스크립트에 사용되는 변수에 일치할 수 있기 때문입니다.
  3. AutoHotkey v2는 이 행위를 기본값으로 사용할 것입니다.

쉽게 #NoEnv로 이전하기 위해, 내장 변수 Comspec과 ProgramFiles이 추가되었습니다. 상응하는 환경변수와 똑 같은 문자열이 안에 들어 있습니다.

#NoEnv가 효과를 발휘하면, 스크립트는 EnvGet을 사용하여 환경 변수를 열람해야 합니다. 아니면 A_WinDir과 같은 내장 변수를 사용하십시오.

관련 항목

EnvGet, Comspec, ProgramFiles, A_WinDir


#NoTrayIcon

트레이 아이콘을 끕니다.

#NoTrayIcon

스크립트 아무데서나 이 지시어를 지정하면 스크립트가 기동될 때 트레이 아이콘이 나타나는 것을 막습니다. (스크립트를 EXE로 컴파일해도 마찬가지입니다).

핫키를 가진 스크립트에 이를 사용하면, 핫키를 ExitApp 명령어에 묶는 게 좋습니다. 그렇지 않으면, 쉽게 프로그램을 빠져 나갈 방법이 없습니다 (컴퓨터를 재시작하거나 프로세스를 죽여야 합니다). 예를 들어: #x::ExitApp.

트레이 아이콘을 스크립트가 실행되는 동안 언제든지 감추거나 보여줄 수 있습니다. 다음 명령어 Menu, Tray, Icon 또는 Menu, Tray, NoIcon을 사용하면 됩니다. Menu, Tray, NoIcon을 스크립트의 맨 위에서 사용하면 단점이 있습니다. 스크립트가 처음으로 기동될 때 트레이 아이콘이 잠깐 보일 수 있습니다. 그를 피하려면, 대신에 #NoTrayIcon을 사용하십시오.

트레이 아이콘이 현재 보이지 않으면 내장 변수 A_IconHidden에 1이 담깁니다. 그렇지 않으면 0이 담깁니다.

관련 항목

Menu, ExitApp

예제

#NoTrayIcon


#Persistent

스크립트를 영원히 실행 합니다 (즉, 사용자가 닫거나 ExitApp를 만날 때까지).

#Persistent

이 지시어가 스크립트에 존재하면, 자동 실행 섹션이 (스크립트이 상단 부분) 끝난 후에도 계속해서 실행됩니다. 스크립트에 타이머나 맞춤 메뉴 항목이 들어 있을 경우는 유용합니다. 그러나 핫키, 핫스트링, 또는 OnMessage()나 Gui를 사용할 경우는 그렇지 않습니다.

이 지시어를 기존의 스크립트에 추가하면, Exit을 ExitApp로 바꾸는 편이 좋습니다. 왜냐하면 Exit는 영구적인 스크립트를 종료하지 못하기 때문입니다; 오직 현재 쓰레드만 종료시킵니다.

v1.0.16+에서 이 지시어는 또 스크립트를 단일-실체로 만들기도 합니다. 이를 오버라이드 하거나 단일-실체의 행위를 바꾸려면, #SingleInstance를 참조하십시오.

관련 항목

#SingleInstance, SetTimer, Menu, Exit, ExitApp

예제

#Persistent


#SingleInstance

스크립트에게 이미 실행 중일 때 다시 실행을 허용할지 결정합니다.

#SingleInstance [force|ignore|off]

매개변수

force|ignore|off

이 매개변수는 스크립트의 실체가 이미 이전에 실행 중일 때 스크립트가 또 기동하면 무슨 일이 일어날 지 결정합니다:

단어 FORCE는 대화 상자를 건너 뛰고 자동으로 예전 실체를 교체합니다. 그 효과는 Reload 명령어와 비슷합니다.

단어 IGNORE는 대화 상자를 건너 뛰고 예전 실체를 그대로 실행되도록 둡니다. 즉, 이미 실행 중인 스크립트의 기동 시도를 무시합니다.

단어 OFF는 스크립트의 여러 실체를 병행적으로 실행되도록 허용합니다.

이 매개변수를 생략하면, 대화상자가 나타나 예전 실체를 유지할지 새 실체로 교체할지 묻습니다.

논평

스크립트에 hotkeys, hotstrings, #Persistent, OnMessage(), 또는 Gui가 담겨 있으면 기본값은 단일-실체입니다 (대화상자가 나타나 & 묻습니다). 다른 스크립트는 기본적으로 다중 실체를 허용합니다. 이 행위는 위에 기술한 것처럼 불능화하거나 변경할 수 있습니다.

관련 항목

Reload, #Persistent

예제

#SingleInstance force
#SingleInstance ignore
#SingleInstance off


#UseHook

모든 또는 어떤 키보드 핫키를 구현하는 데 갈고리의 사용을 강제합니다.

#UseHook [On|Off]

매개변수

On|Off

#UseHook 뒤에 아무것도 없으면 #UseHook On과 동등합니다.

On: 지금부터 (있다면) 다음 #UseHook OFF 사이에 모든 키보드 핫키를 구현하는 데 키보드 갈고리가 사용됩니다.

Off: 핫키는 기본 방법을 사용하여 구현됩니다 (가능하면 RegisterHotkey()를; 그렇지 않으면, 키보드 갈고리를 사용합니다).

논평

보통, 키보드 핫키를 구현하는 데 가능하면 윈도우즈 API 함수 RegisterHotkey()가 사용됩니다. 그렇지만, 대신 키보드 갈고리를 사용하면 어떤 상황에서는 핫키의 반응성이 더 좋은 경우가 있습니다.

이 지시어를 켜면(ON) 각 핫키의 정의 앞에 $ 접두 심볼을 사용한 것과 효과가 같습니다.

모든 # 지시어처럼 -- 스크립트가 기동할 때 한 번만 처리되는 -- #UseHook은 명령어처럼 스크립트 아무데나 배치하면 안됩니다 (즉, 서브루틴 안에 포함시킬 필요가 없습니다). 대신에, 영향을 주고 싶은 첫 핫키 라벨 바로 앞에 배치하십시오.

기본값으로, 키보드 갈고리를 사용하는 핫키는 Send 명령어로 촉발시킬 수 없습니다. 비슷하게, 마우스 핫키는 Click 명령어로 촉발시킬 수 없습니다. 왜냐하면 모든 마우스 핫키가 마우스 갈고리를 사용하기 때문입니다. 한 가지 우회책은 Gosub를 사용하여 곧바로 핫키의 서브루틴에 점프하는 것입니다. 예를 들어: Gosub #LButton.

[v1.1.06+]: #InputLevel 그리고 SendLevel는 어느 핫키 그리고 핫스트링이 Send 명령어로 촉발될지 제어할 수 있습니다.

이 지시어가 스크립트에 전혀 나타나지 않으면, OFF를 지정한 것처럼 행위합니다.

관련 항목

#InstallKeybdHook, #InstallMouseHook, ListHotkeys, #InputLevel

예제

#UseHook  ; 이 시점 이후로 핫키에 대하여 갈고리의 사용을 강제합니다.
#x::MsgBox, 이 핫키는 갈고리로 구현될 것입니다.
#y::MsgBox, 이것도 마찬가지입니다.
#UseHook off
#z::MsgBox, 그러나 이것은 아닙니다.


#Warn

#Warn [v1.0.95.00+]

특정한 조건에 대한 경고를 켜고 끕니다. 철자오류가 있거나 선언이 없는 경우와 같이 에러를 나타낼 수도 있습니다.

#Warn [, WarningType, WarningMode]

매개변수

WarningType

켜고 끌 경고의 종류. 생략하면, All이 기본값입니다.

UseUnsetLocal 또는 UseUnsetGlobal: 변수가 이전에 값이 할당되어 있지 않거나 VarSetCapacity로 초기화되지 않은 채로 읽혀지면 경고를 보냅니다. 변수를 비울 목적이라면, 빈 문자열을 할당해 이 경고를 누르십시오.

지역 변수와 전역 변수에 대하여 따로 경고 유형이 나눠집니다. 전역 변수는 영속적이고 스크립트-전체에 걸쳐 영향을 미치는 성질이 있으므로 미리 초기화하지 않고 사용하는 것이 보다 일반적이기 때문입니다. 이런 이유로, 어떤 스크립트 저자는 이런 종류의 경고를 지역 변수에는 켜고 전역 변수에는 끄고 싶어합니다.

#Warn
;y := ""  ; 이렇게 하면 경고를 누릅니다.
x := y    ; y에는 아직 값이 할당되지 않았습니다.

UseEnv: 환경 변수가 빈 스크립트 변수 대신에 자동으로 사용되면 경고를 보냅니다. 이런 일은 종종 환경 변수의 이름이 예상치 못하게 스크립트가 사용하는 변수에 일치할 때 일어납니다. 이 경고는 변수에 접근할 때 일어납니다. 그러나 스크립트에 #NoEnv가 켜져 있으면 절대로 일어나지 않습니다 (여러 가지 이유로 권장함).

#Warn
;#NoEnv             ; 이것을 추가해 "temp"가 환경 변수가 아니라고 밝히십시오.
;EnvGet temp, TEMP  ; 이렇게 하면 환경 변수의 값을 스크립트 변수 안으로 복사할 것입니다.
temp := ""          ; 이 줄을 삭제해도, temp는 여전히 값을 가지고 있습니다.
MsgBox % temp       ; 이것은 이름이 "TEMP"인 환경 변수에 접근합니다.

LocalSameAsGlobal: 스크립트가 실행을 시작하기 전에, 전역 변수와 이름이 같은 선언되지 않은 지역 변수에 대하여 경고를 보여줍니다. 이것은 깜박잊고 전역 변수를 함수 안에 선언한 다음, 거기에 접근을 시도하면 야기되는 에러를 방지하기 위한 목적입니다. 그 변수가 실제로 지역 변수이기를 의도했다면, local x 또는 static y와 같이 선언하여 경고를 누를 수 있습니다.

#Warn
g := 1
ShowG() {       ; 함수를 호출하지 않아도 경고가 나타납니다.
    ;global g   ; <-- 전역 변수에 접근하기 위해 필요합니다.
    MsgBox % g  ; 선언할 필요없이, "g"는 빈 지역 변수입니다.
}

All: 주어진 WarningMode를 지원되는 모든 경고 유형에 적용합니다.

WarningMode

어떻게 경고를 보낼지 가리키는 값. 생략되면, 기본값은 MsgBox입니다.

MsgBox: 경고를 기술하는 메시지 박스를 보여줍니다. 메시지 박스를 묵살하면, 스크립트는 보통처럼 실행을 계속합니다.

StdOut [v1.1.04+]: 경고를 기술하는 말을 표준출력(stdout)으로 보냅니다 (프로그램의 표준 출력 스트림). 파일 이름과 줄 번호를 함께 보냅니다. 이 덕분에 SciTE같은 환상적인 편집기들은 스크립트를 방해하지 않고 경고를 나포할 수 있습니다 - 사용자는 나중에 편집기의 출력 판을 통하여 문제의 줄에 점프해 갈 수 있습니다.

OutputDebug: 화면에 보여주기 위해 경고 문구를 디버거에게 보냅니다. 디버거가 켜져 있지 않으면, 아무 효과가 없습니다. 더 자세한 정보는 OutputDebug를 참조하십시오.

Off: 주어진 WarningType의 경고를 끕니다.

논평

기본값으로, 모든 경고는 꺼져 있습니다.

경고는 실행시간에는 켜고 끌 수 없습니다; 설정은 스크립트가 적재될 때 결정됩니다. 그러므로, 스크립트에서 위치는 의미가 없습니다 (그리고, 다른 # 지시어처럼, #Warn은 조건적으로 실행할 수 없습니다).

그렇지만, 여러 #Warn 지시어의 순서는 의미가 있습니다: 마지막으로 나타나 주어진 경고를 설정한 지시어가 그 경고에 대한 모드를 결정합니다. 그래서, 예를 들어, UseEnv를 제외하고 아래의 두 서술문은 조합하여 모든 경고를 켠 효과가 있습니다:

#Warn All
#Warn UseEnv, Off

EnvSet EnvVar, 1
x := EnvVar       ; #NoEnv가 사용되지 않았으므로 문제가 없습니다.
x := NotAnEnvVar  ; 경고.

관련 항목

지역 변수와 전역 변수

예제

#Warn All, Off                    ; 모든 경고를 끕니다. 이것이 기본 상태입니다.
#Warn                             ; 모든 종류의 경고를 켭니다; 각 경고를 메시지 상자에 보여줍니다.
#Warn UseUnsetLocal, OutputDebug  ; 지역 변수를 설정하기 전에 사용되면 경고합니다; OutputDebug로 경고를 보냅니다.


#WinActivateForce

창을 활성화하는 부드러운 방법을 건너 뛰고 곧바로 강제로 활성화합니다.

#WinActivateForce

이것을 스크립트 어느 곳에나 지정하면 창을 활성화하는 명령어가 -- WinActivate, WinActivateBottom, 그리고 GroupActivate 같은 명령어 -- 창을 활성화하는 "부드러운" 방법을 건너뛰고 곧바로 더 강력한 방법을 사용합니다.

이 지시어는 보통 창을 얼마나 빨리 얼마나 신뢰성이 있게 활성화 해야 하는지는 변경하지 않습니다. 그러나 여러 다른 창들이 재빠르게 서로 활성화 될 때 태스크바 버튼이 번쩍이는 것을 막을 수도 있습니다.

관련 항목

WinActivate, WinActivateBottom, GroupActivate

예제

#WinActivateForce


AutoTrim

Var1 = %Var2% 서술문에서 Var2의 앞 뒤로부터 스페이스와 탭 문자를 걷어낼지 말지 결정합니다.

AutoTrim, On|Off

매개변수

On|Off

On: Var1 = %Var2%와 같은 서술문에서, 탭과 스페이스가 Var2의 앞 뒤에 있으면 Var1으로부터 걷어냅니다. 이것이 기본값입니다.

Off: 탭과 스페이스를 걷어내지 않습니다.

기호 그대로의 탭과 스페이스는 이 설정에 상관없이 생략됩니다. v1.1.06이전에는, 여기에 `t 또는 기타 피신된 기호 그대로의 스페이스나 탭이 포함되었습니다. 예를 들어 AutoTrim이 Off일 때, 서술문 Var = `t는 v1.1.06에서는 탭 문자를 할당하고 그 이전 버전은 빈 문자열이 할당됩니다.

논평

이 명령어가 스크립트에 없으면, 설정은 ON이 기본값입니다.

내장 변수 A_AutoTrim에는 현재 설정이 담겨 있습니다 (On 또는 Off).

내장 변수 A_Space 그리고 A_Tab에는 단일 스페이스와 단일 탭 문자가 각각 들어 있습니다.

AutoTrim은 Var := " string "와 같은 표현식 할당에 영향을 주지 않습니다. 다른 말로 하면, 그 경우 선두 후미의 스페이스와 탭은 언제나 그대로 유지됩니다.

새로 기동된 쓰레드마다 (핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본값을 가지고 새로 시작합니다. 이 설정은 이 명령어를 자동-실행 섹션에 (스크립트의 상단 부분) 사용하면 바꿀 수 있습니다.

관련 항목

SetEnv

예제

AutoTrim, off
NewVar1 = %OldVar%  ; OldVar에 선두와 후미에 스페이스가 들어 있으면, NewVar도 역시 그대로 가집니다.
NewVar2 = %A_Space%  ; AutoTrim이 꺼져 있으면, 단일 스페이스를 이런 식으로 할당할 수 있습니다.

Var1 := "`t" . Var2 . " "  ; 표현식이기 때문에 AutoTrim의 설정은 문제가 되지 않습니다.


Blocks

{...} (block)

한 쌍의 활괄호는 블록을 뜻합니다. 블록은 전형적으로 함수, Else, Loop, While-loop, 그리고 IF-명령어와 함께 사용됩니다.

{
0개 이상의 명령어 나열
}

논평

블록은 두 개 이상의 명령어들을 하나로 묶는 데 사용됩니다. 또 어느 IF에 ELSE가 속하는지 바꾸는 데에도 사용됩니다. 다음 예제와 같이 블록은 ELSE를 두 번째가 아니라 첫 번째 IF에 속하게 만듭니다:

if var1 = 1
{
    if var2 = abc
        sleep, 1
}
else
    return

블록은 아무데나 사용할 수 있지만, 현재는 오직 functions, Else, Loop, 또는 IF-유형의 명령어들 (예를 들어 IfEqual 또는 IfWinExist)과 사용될 때만 의미가 있습니다.

만약 IF, ELSE, Loop, While-회돌이, 또는 For-회돌이에 명령어가 하나 밖에 없다면, 그 명령어는 블록에 쌀 필요가 없습니다. 그렇지만, 스크립트의 가독성을 향상시키고 유지관리성을 용이하게 하기 위해 그래야 할 경우가 있습니다.

블록은 비어 있어도 됩니다 (명령어가 없음). 이 경우는 블록 자체를 제거하지 않고 블록의 내용을 주석 처리하고 싶을 때 유용합니다.

One True Brace (OTB, K&R 스타일): OTB 스타일을 선택적으로 다음과 같은 경우에 사용할 수 있습니다: if-서술문의 표현식, else 키워드, while-회돌이, For-회돌이, 보통 회돌이, 함수 정의, Try, Catch, 그리고 Finally. 이 스타일은 블록의 시작 활괄호를 블록의 제어 서술문과 같은 줄에 배치합니다. 그 줄 아래 따로 두지 않습니다. 예를 들어:

if (x < y) {
    ...
} else {
    ...
}
While x < y {
    ...
}
For k,v in obj {
    ...
}
Loop %RepeatCount% {
    ...
}
MyFunction(x, y) {
    ...
}
Try {
    ...
} Catch e {
    ...
} Finally {
    ....
}

비슷하게, 명령어 또는 기타 조치는 활괄호 우측에 존재합니다 (단, One True Brace 스타일의 여는 괄호는 제외합니다). 예를 들어:

if x = 1
{ MsgBox 이 줄은 여는 괄호의 오른쪽에 나타납니다. IF-서술문이 참일 때마다 실행됩니다.
    MsgBox 이 줄은 다음 줄입니다.
} MsgBox 이 줄은 닫는 괄호의 오른쪽에 나타납니다. 무조건 실행됩니다.

관련 항목

Functions, While-회돌이, Loop, Else, If, If(Expression)

예제

if x = 1
{
    MsgBox, test1
    Sleep, 5
}
else
    MsgBox, test2


BlockInput

사용자가 컴퓨터와 키보드와 마우스를 통하여 상호작용 할지 말지 여부를 켜고 끕니다.

BlockInput, Mode

매개변수

Mode

Mode 1: 다음 단어 중 하나:

On: 사용자가 컴퓨터와 상호작용하지 못합니다 (마우스와 키보드 입력은 효과가 없습니다).

Off: 입력을 가능하게 합니다.

Mode 2: 이 모드는 다른 두 개와 독립적으로 작동합니다. 예를 들어, BlockInput On이면 BlockInput Off이 사용될 때까지 입력을 막습니다. 아래의 옵션이 효과를 발휘해도 상관없습니다.

Send: Send 또는 SendRaw가 진행 중인 동안 사용자의 키보드와 마우스 입력을 무시합니다 (전통적인 SendEvent 모드만 허용합니다). 사용자의 키 입력 때문에 흉내낸 키눌림의 흐름이 방해받지 않도록 막습니다. Send가 끝날 때, 입력이 다시 가능해집니다 (앞에서 BlockInput On으로 막고 있는 경우는 제외합니다).

Mouse: 사용자의 키보드와 마우스 입력은 Click, MouseMove, MouseClick, 또는 MouseClickDrag이 진행 중일 때 무시됩니다 (전통적인 SendEvent 모드만 허용합니다). 사용자의 마우스 이동과 클릭 때문에 흉내낸 마우스 이벤트 흐름이 방해받지 않도록 막습니다. 마우스 명령어가 끝날 때 (이전에 BlockInput On이 사용되여 여전히 입력을 막고 있지만 않다면) 입력이 다시 가능해집니다.

SendAndMouse: 위 두 방법을 조합.

Default: Send와 Mouse 모드를 모두 끄지만, 입력 방지의 현재 상태를 바꾸지 않습니다. 예를 들어, BlockInput On이 현재 효과가 있다면, BlockInput Default를 사용해도 꺼지지 않습니다.

Mode 3 (v1.0.43.11+ 요구): 이 모드는 다른 두 방법과 독립적으로 작동합니다. 예를 들어, BlockInput On과 BlockInput MouseMove가 둘 다 켜져 있으면, 마우스 이동은 둘 다 꺼질 때까지 막힙니다.

MouseMove: 마우스 커서는 사용자의 물리적 마우스 이동에 반응하지 않습니다 (DirectInput 어플은 예외적으로 가능합니다). 스크립트가 이 명령어를 처음 사용할 때, (아직 설치되지 않았다면) 마우스 갈고리가 설치됩니다. 게다가, 스크립트는 영속적이 됩니다. ExitApp를 사용해야만 종료할 수 있다는 뜻인다. 마우스 갈고리는 다음 Suspend 또는 Hotkey 명령어를 사용할 때까지 여전히 설치되어 있을 것입니다. 그 순간 핫키나 핫스트링을 요구하지 않으면 제거됩니다 (#Hotstring NoMouse 참조).

MouseMoveOff: 사용자에게 마우스 커서를 이동하도록 허용합니다.

논평

BlockInput보다, 종종 SendMode Input 또는 SendMode Play을 사용하는 편이 더 좋을 경우가 많습니다. 왜냐하면 키눌림과 마우스 클릭을 인터럽트할 수 없기 때문입니다. BlockInput과 다르게, 위 모드는 전송 중 사용자가 타자한 것을 버리지 않습니다; 대신에, 버퍼 처리했다가 나중에 전송합니다. BlockInput을 피하면 다음 문단에서 기술하는 바와 같이 키가 눌러붙는 것을 우회할 필요도 없어집니다.

사용자가 키를 누르고 있는 동안에 BlockInput이 활성화된다면, 그런 키들은 "눌러 붙어버립니다". 이것은 그 키가 놓일 때까지 기다렸다가 BlockInput을 켜면 해결됩니다. 다음 예제와 같이:

^!p::
KeyWait Control  ; 키를 떼기를 기다립니다. 각각의 핫키 수식자마다 KeyWait를 하나씩 사용합니다.
KeyWait Alt
BlockInput On
; ... 키눌림과 마우스 클릭을 전송합니다 ...
BlockInput Off
return

입력 방지는 ALT 이벤트가 전송될 때마다 자동으로 그리고 임시로 꺼집니다 (나중에 다시 활성화됩니다).

BlockInput이 켜져 있을 때, 사용자 입력은 막히지만 오토핫키는 키눌림과 마우스 클릭을 흉내낼 수 있습니다. 그렇지만, Ctrl+Alt+Del을 누르면 Windows API 특징 때문에 입력이 다시 가능해집니다.

어떤 유형의 갈고리 핫키는 BlockInput이 켜져 있어도 여전히 촉발될 수 있습니다. 예로는 MButton (마우스 갈고리) 그리고 LWin & Space (수식 심볼 $#이 아니라 명시적으로 접두 심볼이 붙은 키보드 갈고리)가 있습니다.

스크립트가 끝날 때 자동으로 입력이 다시 가능해집니다.

관련 항목

SendMode, Send, Click, MouseMove, MouseClick, MouseClickDrag

예제

BlockInput, on
Run, notepad
WinWaitActive, Untitled - Notepad
Send, {F5} ; 날짜와 시간을 붙여 넣습니다
BlockInput, off


Break

회돌이를 빠져 나옵니다. 모든 종류의 회돌이에 적용됩니다.

Break [, LoopLabel]

[AHK_L 59+]: 지정되면, LoopLabel은 이 서술문을 적용해야 할 회돌이를 식별합니다; 라벨 이름 또는 숫치로 지정된 내포 레벨. 생략하거나 1이면 , 이 서술문은 가장 안쪽 회돌이에 적용됩니다. LoopLabel은 상수 값이어야 합니다 - 변수와 표현식은 지원하지 않습니다. 라벨이 지정되면, 직접적으로 회돌이 명령어를 가리켜야 합니다.

goto보다 Break와 Continue의 사용을 권장합니다. 왜냐하면 보통 스크립트를 더 읽기 쉽고 더 관리하기 쉽게 만들어주기 때문입니다.

관련 항목

Continue, Loop, While-회돌이, For-회돌이, 블록, 라벨

예제

Loop
{
    ...
    if var > 25
        break
    ...
    if var <= 5
        continue
}
; 내포 회돌이 안으로부터 바깥 회돌이로 빠져 나옵니다.
outer:
Loop 3
{
    x := A_Index
    Loop 3
    {
        if (x*A_Index = 6)
            break outer  ; break 2 또는 goto break_outer와 동등합니다.
        MsgBox %x%,%A_Index%
    }
}
break_outer: ; goto를 위한 라벨.


Catch

Catch [v1.1.04+]

try서술문의 실행 중에 예외가 일어나면 실행할 코드를 지정합니다.

Catch [, OutputVar]
    Statement
Catch [, OutputVar]
{
    Statements
}

매개변수

OutputVar

(선택적) 예외의 값을 저장할 변수의 이름.

Statement(s)

예외가 일어나면 실행할 명령어 또는 표현식.

논평

catch가 사용되면 바로 위 try 서술문에 종속됩니다. catch는 언제나 바로 위 가장 가까운 try 서술문에 속합니다. 단, 블록을 사용하여 그 행위를 바꿀 수 있습니다.

One True Brace (OTB) 스타일을 선택적으로 사용할 수 있습니다. 예를 들어:

try {
    ...
} catch e {
    ...
}

실행시간 에러

try-catch 서술문은 실행 시간 에러를 처리하는 데에도 사용할 수 있습니다. 두 가지 종류의 실행시간 에러가 있습니다: 보통 ErrorLevel을 설정하는 에러와, 보통 에러 메시지를 보여준 후에 현재 쓰레드를 종료시키는 에러가 있습니다. 적재시간 에러는 처리가 불가능합니다. 왜냐하면 try 서술문이 실행되기 전에 일어나기 때문입니다. 하위 호환을 위해 (그리고 어떤 경우는 편의를 위해), 실행시간 에러는 try 블록이 실행되는 동안 오직 예외만 던집니다. 대부분의 명령어는 try-catch의 사용을 지원합니다; 그렇지만, ErrorLevel은 명령어가 성공하면 여전히 0으로 설정됩니다.

OutputVar에 저장된 값은 (존재하면) 예외 객체입니다.

관련 항목

Try, Throw, Finally, Blocks

예제

Try 참조.


Click

Click [v1.0.43+]

지정된 좌표에 마우스 버튼을 클릭합니다. 또 마우스 버튼을 누르고 있을 수 있으며 휠을 돌릴 수 있습니다. 마우스를 이동할 수도 있습니다.

자주 사용되는 방법입니다 (모든 쉼표는 선택적입니다):

Click (단독) | 왼쪽 마우스 버튼을 현재 커서 위치에 한 번 클릭합니다.
Click 44, 55 | 왼버튼을 좌표 44, 55에 한 번 클릭합니다 (CoordMode에 기반).
Click right 44, 55 | 위와 동등하지만 우버튼을 클릭합니다.
Click 2 | 왼 버튼을 커서의 현재 위치에 두 번 클릭합니다 (즉, 더블-클릭).
Click down | 왼버튼을 누르고 그대로 있습니다.
Click up right | 우버튼을 뗍니다.
Click %x% %y% | 클릭은 표현식을 지원하지 않기 때문에, 변수는 퍼센트 사인으로 둘러싸야 합니다.

0개 이상의 다음 항목들이 단어 Click 다음에 올 수 있습니다. 각 항목은 다음 항목과 적어도 하나의 스페이스, 탭 또는 쉼표로 분리하십시오. 항목들은 순서에 상관없이 나타날 수 있습니다. ClickCount는 제외하는데, (좌표가 현재 존재한다면) 좌표의 오른쪽 어딘가에 나타나야 하기 때문입니다.

X, Y: 마우스 커서가 클릭하기 전에 이동해야 할 x/y 좌표. 좌표는 활성 창에 상대적입니다. 단, CoordMode가 사용되어 좌표가 변경된 경우는 제외합니다. 생략하면, 커서의 현재 위치가 사용됩니다.

Button Name: Left (기본값), Right, Middle (또는 그냥 첫 문자); 또는 다섯 여섯 번째 마우스 버튼 (X1 또는 X2). 주의: MouseClick과 다르게, 왼버튼과 우버튼은 모든 시스템에 걸쳐 행위에 일관성이 있습니다. 사용자가 시스템 제어판을 통하여 버튼을 서로 바꾸었다고 할지라도 말입니다.

Mouse Wheel: WheelUp 또는 WU를 지정해 휠을 위로 돌립니다 (멀어지게); WheelDown 또는 WD를 지정해 휠을 아래로 돌립니다 (가까워지게). v1.0.48+에서, WheelLeft (WL) 또는 WheelRight (WR)을 지정할 수 있습니다 (그러나 윈도우즈 비스타 이전의 구형 버전에서는 아무 효과도 없습니다). (아래의) ClickCount에 대하여 돌릴 휠의 눈금을 지정합니다. 그렇지만, 어떤 어플리케이션은 마우스 휠에 대하여 1 보다 큰 ClickCount를 존중하지 않습니다. 그런 경우라면 다음과 같이 회돌이를 사용합니다:

Loop 5
    Click WheelUp

ClickCount: 마우스를 클릭할 횟수 (예제: Click 2, Click 100, 200, 2). 생략하면, 버튼은 한 번 클릭됩니다. 좌표가 지정되면, ClickCount는 그 다음에 나타나야 합니다. 영 (0)을 지정하면 마우스를 클릭하지 않고 이동할 수 있습니다 (예를 들어: Click 100, 200, 0).

Down 또는 Up: 이 단어들은 보통 생략됩니다. 이 경우 각 클릭마다 다운-이벤트와 다음에 업-이벤트가 따라옵니다. 그렇지 않으면, Down을 (또는 D) 지정하면 마우스 버튼을 떼지 않고 누르고 있을 수 있습니다. 나중에, Up (또는 U)를 사용하면 마우스 버튼을 뗄 수 있습니다.

Relative: 단어 Rel 또는 Relative는 지정된 X와 Y 좌표를 현재 마우스 위치로부터 상대 거리로 취급합니다. 다른 말로, 커서는 그의 현재 위치로부터 X 픽셀만큼 오른쪽으로 (음의 정수이면 왼쪽으로) 그리고 Y 픽셀만큼 아래로 (음의 정수이면 위로) 이동합니다.

논평

일반적으로 MouseClick보다 Click을 선호합니다. 왜냐하면 시스템의 제어판을 통하여 사용자가 좌우 마우스 버튼을 바꾸더라도 자동으로 보상해 주기 때문입니다.

Click은 SendMode가 설정한 전송 메쏘드를 사용합니다. 특정한 클릭에 대하여 이 모드를 오버라이드 하려면, 다음 예제와 같이 구체적인 Send 명령어를 사용하십시오: SendEvent {Click, 100, 200}.

왼클릭이나 콘트롤-클릭을 수행하려면, 일반적으로 Send {Click} 메쏘드가 가장 쉽습니다. 예를 들어:

Send +{Click 100, 200}  ; Shift+LeftClick
Send ^{Click 100, 200, right}  ; Control+RightClick

Send와 다르게, Click은 자동으로 수식 키를 떼지 않습니다 (Control, Alt, Shift, 그리고 Win). 예를 들어, Control 키가 현재 눌려 있으면, Click은 control-click을 생산하지만 Send {Click}는 보통의 클릭을 생산합니다.

SendPlay 모드는 다른 모드들 보다 더 광범위한 게임에 성공적으로 마우스 이벤트를 만들 수 있습니다. 게다가, 어떤 어플리케이션과 게임은 너무 빨리 움직이면 추적에 어려움이 있을 수 있습니다. 그런 경우 SetDefaultMouseSpeed를 사용하면 속도를 줄일 수 있습니다 (그러나 SendEvent 모드 전용입니다).

BlockInput 명령어를 사용하면 사용자의 물리적인 마우스 활동 때문에 마우스 명령어로 생산되는 흉내낸 마우스 이벤트들이 어질러지는 것을 막을 수 있습니다. 그렇지만, 이는 일반적으로 SendInput 모드와 SendPlay 모드에 필요하지 않습니다. 왜냐하면 자동으로 사용자의 물리적 마우스 움직임을 뒤로 지연하기 때문입니다.

마우스를 클릭해서 누르고 뗄 때마다 뒤에 자동으로 지연시간이 있습니다 (SendInput 모드와 마우스 휠 돌리기는 제외합니다). SetMouseDelay를 사용하면 지연시간을 변경할 수 있습니다.

관련 항목

Send {Click}, SendMode, CoordMode, SetDefaultMouseSpeed, SetMouseDelay, MouseClick, MouseClickDrag, MouseMove, ControlClick, BlockInput

예제

Click  ; 왼버튼을 마우스 커서의 현재 위치에 클릭합니다.
Click 100, 200  ; 왼버튼을 지정된 좌표에 클릭합니다.
Click 100, 200, 0  ; 마우스를 클릭없이 이동합니다.
Click 100, 200 right  ; 우버튼을 클릭합니다.
Click 2  ; 더블-클릭을 수행합니다.
Click down  ; 왼버튼을 누르고 그대로 유지합니다.
Click up right  ; 우버튼을 뗍니다.


ClipWait

클립보드에 데이터가 담기기를 기다립니다.

ClipWait [, SecondsToWait, 1]

매개변수

SecondsToWait

생략하면, 무한정 기다립니다. 그렇지 않으면 지정한 초 개수 만큼만 기다립니다 (소수점을 포함할 수 있고 표현식이 될 수 있습니다). 0을 지정하면 0.5를 지정한 것과 같습니다.

1

이 매개변수를 생략하면, 더 선택의 범위가 넓어집니다. 특히 텍스트나 파일이 나타나기를 기다립니다 ("텍스트"는 무엇이든 노트패드에 붙여 넣을 때 텍스트를 생산하기만 하면 됩니다.). 이 매개변수가 1이면 (표현식 가능), 종류에 상관없이 데이터가 클립보드에 나타나기를 기다립니다.

ErrorLevel

대기 시간이 경과하면, ErrorLevel는 1로 설정됩니다. 그렇지 않으면 (즉, 클립보드에 데이터가 있으면), ErrorLevel은 0이 설정됩니다.

논평

클립보드가 비어 있는지 알아 보기 위해 회돌이보다 이 명령어를 사용하는 편이 더 좋습니다. 왜냐하면 클립보드는 이 명령어로 열리지 않기 때문입니다. 그래서 더 수행성능이 좋고 클립보드를 사용하고 있는 다른 어플리케이션과 서로 간섭할 가능성을 피할 수 있기 때문입니다.

이 명령어는 텍스트로 변환 가능한 것이면 무엇이든 (예, HTML) 텍스트로 간주합니다. 또한 탐색기 창에서 Control-C를 통하여 복사할 수 있는 파일도 텍스트로 간주합니다. 클립보드 변수 (%clipboard%)가 스크립트에서 참조될 때마다 그런 파일은 (전체 경로와 함께) 그의 파일이름으로 자동으로 변환됩니다. 자세한 것은 Clipboard를 참조하십시오.

1이 첫 번째 매개변수로 존재하면, 어떤 종류이든 데이터가 클립보드에 나타나면 명령어를 만족시킵니다. 이것은 ClipboardAll과 함께 사용되어 그림과 같이 텍스트가 아닌 데이터를 저장할 수 있습니다.

이 명령어가 대기 상태에 있는 동안에, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드가 기동할 수 있습니다.

관련 항목

Clipboard, WinWait, KeyWait

예제

clipboard = ; 클립보드를 비웁니다
Send, ^c
ClipWait, 2
if ErrorLevel
{
    MsgBox, 클립보드에 텍스트를 복사하려는 시도가 실패하였습니다.
    return
}
MsgBox, clipboard = %clipboard%
return


ComObjActive()

ComObjActive() [AHK_L 53+]

OLE로 등록되어 실행 중인 객체를 열람합니다.

ComObject := ComObjActive(CLSID)

매개변수나 반환 값에 건넬 유형 있는 값을 나타내는 객체를 만듭니다.

ParamObj := ComObject(VarType, Value [, Flags])

절대 비추천:

아래에 보여주는 사용법은 추천하지 않습니다. 앞으로는 사용이 불가능하거나 바뀔 수 있습니다.

COM 객체의 메쏘드를 호출할 때 선택적인 매개변수의 기본 값 대신에 사용할 객체를 만듭니다. v1.1.12부터 폐기되었습니다: 대신에 그냥 두 개의 쉼표를 연속적으로 사용하십시오. 다음과 같이: Obj.Method(1,,3)

ParamObj := ComObjMissing()

IDispatch 포인터를 객체에 싸 넣고 자동으로 AddRef를 호출합니다.

ComObject := ComObjEnwrap(DispPtr)
DispPtr := ComObjUnwrap(ComObject)

미래를 보장하는 코드를 작성하려면, 대신 다음과 같이 사용하십시오:

ComObject := ComObject(9, DispPtr, 1), ObjAddRef(DispPtr)
DispPtr := ComObjValue(ComObject), ObjAddRef(DispPtr)

매개변수

CLSID

CLSID 또는 사람이-읽을 수 있는 COM 객체의 Prog ID.

ComObject

객체 구문에 사용가능한 COM 객체.

VarType

값의 유형을 나타내는 정수. 유형 목록은 ComObjType()을 참조하십시오.

Value

포장할 값. 현재 오직 정수와 포인터 값만 지원합니다.

Flags

이 함수의 행위와 포장 객체의 행위에 영향을 주는 플래그; 아래 참조.

DispPtr

날 IDispatch 포인터.

플래그

0 | 기본 행위. AddRef는 IUnknown과 IDispatch 포인터에 대하여 자동으로 호출됩니다. 그래서 호출자는 ObjRelease를 사용하여 적절하게 포인터 사본을 놓아 주어야 합니다. 기본 행위는 앞으로 바뀔 수 있으므로, 인터페이스 포인터를 포장할 때 언제나 Flags를 1로 설정하기를 권장합니다. 그리고 필요하면 ObjAddRef()를 호출하기를 권장합니다.
1 | IUnknown, IDispatch 또는 SAFEARRAY 포인터의 소유권을 획득합니다. AddRef는 호출되지 않습니다. 포장 객체에 SAFEARRAY가 들어 있으면 (VT_BYREF는 제외), 포장 객체가 해제될 때 SafeArrayDestroy가 자동으로 호출됩니다.

ByRef [v1.1.17+]

포장 객체의 VarType에 VT_BYREF (0x4000) 플래그가 들어 있으면, 빈 각괄호[]를 사용하여 참조된 값을 읽거나 쓸 수 있습니다.

참조를 생성할 때, Value는 반드시 주어진 유형의 값을 저장하기에 충분한 가용 능력이 있는 변수나 버퍼의 메모리 주소이어야 합니다. 예를 들어, 다음을 사용하면 VBScript 함수가 쓸 수 있는 변수를 만들 수 있습니다:

VarSetCapacity(var, 24, 0)
vref := ComObject(0x400C, &var)  ; 0x400C는 VT_BYREF와 VT_VARIANT의 조합입니다.

vref[] := "in value"
sc.Run("Example", vref)  ; sc는 반드시 아래의 예제와 같이 초기화되어야 합니다.
MsgBox % vref[]

총평

현재 버전에서, "ComObj"로 시작하는 함수가 다른 COM 함수 중 하나와 일치하지 않으면 실제로는 ComObjActive를 호출합니다. 예를 들어, ComObjEnwrap(DispPtr)와 ComObjActive(DispPtr)는 모두 ComObject(DispPtr)와 동등합니다 (묵시적으로 VarType은 9입니다). 그렇지만, 이 행위는 앞으로 사용하지 못할 것입니다. 그래서 이 페이지에서 보여주는 바와 같이 ComObject()와 ComObjActive()만 사용하는 것이 제일 좋습니다.

IDispatch나 IUnknown 인터페이스 포인터를 포장하거나 열람하는 데 이 함수가 사용될 때, 기본 행위는 COM 객체의 참조 횟수를 늘리는 것입니다. 그러므로, 인터페이스 포인터는 더 이상 필요하지 않을 때 수동으로 해제해야 합니다. 포장 객체가 해제될 때, 그 안에 든 참조는 자동으로 해제됩니다.

알려진 한계: COM 객체가 포장될 때마다, 새 포장 객체가 생성됩니다. obj1 == obj2 그리고 array[obj1] := value와 같은 비교와 할당은 같은 COM 객체를 포함하고 있을 지라도 두 개의 포장 객체를 유일한 것으로 취급합니다.

관련 항목

ComObjCreate, ComObjGet, ComObjConnect, ComObjError, ComObjFlags, ObjAddRef/ObjRelease, ComObjQuery, GetActiveObject (MSDN)

예제

ComObjUnwrap: 다음 참조 ComObjConnect.

; 여는 말- ScriptControl은 32-비트 버전의 오토핫키를 요구합니다.
code =
(
Sub Example(Var)
    MsgBox Var
    Var = "out value!"
End Sub
)
sc := ComObjCreate("ScriptControl"), sc.Language := "VBScript", sc.AddCode(code)

; 예제: VARIANT ByRef를 COM 함수에 건넵니다.
var := ComVar()
var[] := "in value"
sc.Run("Example", var.ref)
MsgBox % var[]

; ComVar: 값을 ByRef로 건네는 데 사용할 수 있는 객체를 생성합니다.
;   ComVar[] 값을 열람합니다
;   ComVar[] := Val은 값을 설정합니다
;   ComVar.ref는 COM 함수에 건네기 위해 ByRef 객체를 열람합니다.
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: ComObject(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._))
}


ComObjArray()

ComObjArray() [v1.0.91+]

COM에 사용할 SafeArray를 생성합니다.

ArrayObj := ComObjArray(VarType, Count1 [, Count2, ... Count8])

매개변수

VarType
배열의 기본 유형 (배열의 각 원소의 VARTYPE). VARTYPE은 variant 유형의 부분집합으로 제한됩니다. VT_ARRAY도 VT_BYREF 플래그도 설정할 수 없습니다. VT_EMPTY와 VT_NULL은 배열에 대하여 유효한 기본 유형이 아닙니다. 다른 모든 유형은 적법합니다.

가능한 값의 목록은 ComObjType를 참조하십시오.

CountN

각 차원의 크기. 배열은 8 차원까지 지원됩니다.

ArrayObj

SafeArray를 담고 있는 포장 객체.

메쏘드

배열 포장 객체는 다음 메쏘드를 지원합니다:

Array.MaxIndex(n): n번째 차원의 상한 값을 돌려줍니다. n이 생략되면 기본값은 1입니다.

Array.MinIndex(n): n번째 차원이 하한 값을 돌려줍니다. n이 생략되면, 기본값은 1입니다.

Array.Clone() [v1.0.96.00+]: 배열의 사본을 돌려줍니다.

Array._NewEnum() [v1.0.96.00+]: 보통 스크립트가 호출하지 않습니다; for-회돌이를 SafeArrays에 사용할 수 있습니다.

총평

COM 메쏘드와 ComObjActive는 어떠한 포장 객체도 돌려줄 수 있으며 스크립트는 값이 배열인지 다음과 같이 알아낼 수 있습니다:

if ComObjType(obj) & 0x2000
    MsgBox % "Array subtype: " . ComObjType(obj) & 0xfff
else
    MsgBox Not an array.

최대 8 차원까지 지원됩니다.

[v1.0.96.00+]: 안전배열(SafeArrays)는 다중 참조를 지원하도록 설계되어 있지 않기 때문에, 한 안전배열이 또다른 안전배열의 원소로 할당될 때, 사본이 따로 생성됩니다. 그렇지만, 이런 일은 그 포장 객체에 F_OWNVALUE 플래그가 있을 경우에만 일어납니다. 이 플래그는 그 배열을 파괴할 책임이 있다는 뜻을 나타냅니다. ComObjFlags를 사용하면 이 플래그를 제거할 수 있습니다.

[v1.1.17.00+]: COM 클라이언트에 의하여 호출되는 함수나 메쏘드가 F_OWNVALUE를 가진 안전배열을 돌려주면, 대신에 사본이 생성되고 반환됩니다. 원래의 SafeArray는 자동으로 파괴됩니다.

관련 항목

ComObjType, ComObjValue, ComObjActive, ComObjFlags, 배열 조작 함수 (MSDN)

예제

; 예제 #1: 간단한 사용법.

arr := ComObjArray(VT_VARIANT:=12, 3)
arr[0] := "Auto"
arr[1] := "Hot"
arr[2] := "key"
Loop % arr.MaxIndex() + 1
   t .= arr[A_Index-1]
MsgBox % t

; 예제 #2: 다 차원.

arr := ComObjArray(VT_VARIANT:=12, 3, 4)

; 차원의 개수를 얻습니다:
dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr))

; 각 차원의 상한값과 하한값을 얻습니다:
Loop %dim%
    dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n"
MsgBox %dims%

; 간단한 사용법:
Loop 3 {
    x := A_Index-1
    Loop 4 {
        y := A_Index-1
        arr[x, y] := x * y
    }
}
MsgBox % arr[2, 3]


ComObjConnect()

ComObjConnect() [AHK_L 53+]

객체의 이벤트 소스를 주어진 접두사를 가진 함수에 연결합니다.

ComObjConnect(ComObject [, Prefix])

매개변변수

ComObject

이벤트를 일으키는 객체.

객체가 IConnectionPointContainer 인터페이스를 지원하지 않거나 또는 객체의 클래스에 관한 유형정보를 열람할 수 없으면, 에러 메시지가 나타납니다. 이것은 ComObjError 또는 try/catch으로 억누르거나 처리할 수 있습니다.

[v1.1.22]+에서, IProvideClassInfo 인터페이스를 객체가 지원하면 그 클래스의 관한 유형정보를 열람하는 데 사용됩니다. 그렇지 않으면, ComObjConnect는 객체의 IDispatch 인터페이스를 통하 유형 정보를 열람하려고 시도하는데, 이것은 신뢰성이 떨어집니다.

Prefix

이벤트 이름 앞에 붙일 문자열. 이벤트가 일어날 때 호출할 함수를 결정합니다.

생략하면, 객체가 "연결이 끊깁니다"; 즉, 스크립트는 더 이상 그의 이벤트 고지를 받지 않습니다.

[v1.1.01+]: 이 매개변수는 스크립트가 지정한 객체일 수 있습니다. 이벤트가 일어나면, 그에 상응하는 메쏘드가 호출됩니다. 첫 매개변수는 보통 숨은 this 매개변수입니다. 이 매개변수는 COM 객체 말고 스크립트에-정의된 객체를 참조합니다. 각 이벤트마다 메쏘드를 정의하지 않고 모든 이벤트를 나포하려면 __Call 메타-함수를 정의하십시오.

사용법

효과적으로 ComObjConnect를 사용하려면, 먼저 관심을 둔 이벤트를 처리할 함수를 스크립트에 작성해야 합니다. "이벤트-처리자"라고 하는 그런 함수는 구조가 다음과 같습니다:

PrefixEventName([Params..., ComObject])
{
    ... event-handling code ...
    return returnValue
}

Prefix는 여러분이 고른 접두사입니다. 반면에 EventName은 함수가 처리해야 하는 이벤트의 이름입니다.

Params는 이벤트가 가진 매개변수에 상응합니다. 이벤트에 매개변수가 없으면, Params도 완전히 생략되어야 합니다. ComObject는 선택적입니다. 그리고 Params의 개수가 올바르게 정의되어 있을 경우에만 사용해야 합니다; 그 안에 ComObjConnect에 건넸던 원래 포장 객체를 가리키는 참조가 들어 있습니다. "ComObject"는 여러분의 스크립트 문맥에 맞게 보다 의미있는 이름으로 교체되어야 합니다.

이벤트 처리자는 반환 값이 있을 수 있다는 사실에 주목하십시오. COM-종속적 유형의 값을 돌려주려면, ComObject(type, value)를 사용하십시오. 예를 들어, return ComObject(0,0)는 variant 유형의 VT_EMPTY를 돌려줍니다. 이것은 자바스크립트에서 undefined를 돌려주는 것 (또는 아무것도 돌려주지 않는 것)과 동등합니다.

이벤트 처리를 켜려면 ComObjConnect(yourObject, "Prefix")를 호출합니다.

객체와 연결을 끊으려면 (이벤트 처리를 중지하려면) ComObjConnect(yourObject)를 호출합니다.

매개변수 개수를 알지 못하면, 가변 함수를 사용할 수 있습니다.

관련 항목

ComObjCreate, ComObjGet, ComObjActive, ComObjError, WScript.ConnectObject (MSDN)

예제

ie := ComObjCreate("InternetExplorer.Application")

; 상응하는 스크립트 함수에 접두사를 "IE_"로 하여 이벤트를 연결합니다.
ComObjConnect(ie, "IE_")

ie.Visible := true  ; 이것은 IE7에서 제대로 작동하지 않는다고 알려져 있습니다.
ie.Navigate("http://ahkscript.org/")
#Persistent

IE_DocumentComplete(ieEventParam, url, ieFinalParam) {
    global ie
    if (ie != ieEventParam)
        s .= "첫 매개변수는 새 포장 객체입니다.`n"
    if (ie == ieFinalParam)
        s .= "마지막 매개변수는 원래 포장 객체입니다.`n"
    if ((disp1:=ComObjUnwrap(ieEventParam)) == (disp2:=ComObjUnwrap(ieFinalParam)))
        s .= "두 포장 객체 모두 같은 IDispatch 실체를 가리킵니다.`n"
    ObjRelease(disp1), ObjRelease(disp2)
    MsgBox % s . "Finished loading " ie.Document.title " @ " url
    ie.Quit()
    ExitApp
}


ComObjCreate()

ComObjCreate() [AHK_L 53+]

COM 객체를 만듭니다.

ComObject := ComObjCreate(CLSID [, IID])

매개변수

CLSID

CLSID 또는 인간이-읽을 수 있는 COM 객체의 Prog ID.

IID

[v1.0.96.00+]: 객체가 지원하는 인터페이스의 식별자.

반환 값

에러가 일어나면, 빈 문자열이 반환됩니다.

IID가 지정되면, 인터페이스 포인터가 반환됩니다. 스크립트는 포인터 작업이 끝나면 전형적으로 ObjRelease를 호출합니다.

그렇지 않으면, 스크립트가 사용할 수 있는 포장 객체가 반환됩니다. 객체 구문을 참조하십시오.

관련 항목

ComObjGet, ComObjActive, ComObjConnect, ComObjArray, ComObjError, ComObjQuery, CreateObject (MSDN)

예제

계속해서 증가하는 리스트의 예는 다음 포럼의 토픽을 참조하십시오: http://www.autohotkey.com/forum/topic61509.html.

ie := ComObjCreate("InternetExplorer.Application")
ie.Visible := true  ; IE7에 대해서는 잘 작동하지 않는다고 알려져 있습니다.
ie.Navigate("http://ahkscript.org/")


ComObjError()

ComObjError() [AHK_L 53+]

COM 에러의 고지를 켜고 끕니다.

Enabled := ComObjError([Enable])

Parameters

Enable

불리언 값 (true 또는 false). 선택적.

Enabled

[v1.0.91+]: 이 함수가 호출되기 전에 효과가 있던 값을받습니다.

총평

COM 객체에 접근하고 나면, A_LastError에는 COM 객체의 IDispatch::Invoke 함수가 돌려주는 HRESULT 코드가 담깁니다. 스크립트는 자신만의 에러-처리를 구현할 수 있습니다. ComObjError(false)를 호출하여 에러 고지를 끄고 A_LastError의 값을 참고하면 됩니다.

관련 항목

ComObjCreate, ComObjGet, ComObjActive, ComObjConnect


ComObjFlags()

ComObjFlags() [v1.0.96.00+]

COM 포장 객체의 행위를 제어하는 플래그를 열람하거나 바꿉니다.

Flags := ComObjFlags(ComObject [, NewFlags, Mask])

매개변수

ComObject

COM 포장 객체.

NewFlags

Mask로 식별되는 프래그에 대한 새 값, 또는 추가하거나 더할 플래그.

Mask

바꿀 비트마스크 플래그.

Flags

ComObject객체의 모든 플래그 (지정하면, NewFlags가 적용된 후의).

Flags

F_OWNVALUE
1 		현재는 오직 SafeArrays에만 영향을 줍니다. 이 플래그가 설정되면, SafeArray는 포장 객체가 해제될 때 파괴됩니다. SafeArrays는 참조 횟수 세기 메커니즘이 없으므로, 만약 이 플래그를 가진 SafeArray가 또다른 SafeArray의 한 원소에 할당되면, 따로 사본이 생성됩니다.

총평

Mask를 생략하면, NewFlags는 (양수이면) 더할 플래그, (음수이면) 제거할 플래그를 지정합니다. 예를 들어, ComObjFlags(obj, -1)는 F_OWNVALUE 플래그를 제거합니다. Mask에는 0이나 1말고 다른 값을 지정하지 마십시오; 다른 모든 비트는 미래에 사용할 목적으로 예약되어 있습니다.

관련 항목

ComObjActive, ComObjArray

예제

; 예제: F_OWNVALUE 플그래가 있는지 점검합니다.

arr := ComObjArray(0xC, 1)
if ComObjFlags(arr) & 1
    MsgBox arr은 자동으로 파괴됩니다.
else
    MsgBox arr는 자동으로 파괴되지 않습니다.

; 예제: 배열-안의 배열 행위 바꾸기.

arr1 := ComObjArray(0xC, 3)
arr2 := ComObjArray(0xC, 1)
arr2[0] := "original value"
arr1[0] := arr2         ; 묵시적 사본을 할당합니다.
ComObjFlags(arr2, -1)   ; F_OWNVALUE를 제거합니다.
arr1[1] := arr2         ; 원본 배열을 할당합니다.
arr1[2] := arr2.Clone() ; 명시적 사본을 할당합니다.
arr2[0] := "new value"
for arr in arr1
    MsgBox % arr[0]

arr1 := ""
; arr2 == arr1[1]이기 때문에 유효하지 않습니다. 이미 파괴되었습니다:
;  arr2[0] := "foo"


ComObjGet()

ComObjGet() [AHK_L 53+]

COM 컴포넌트가 제공한 객체를 가리키는 참조를 돌려줍니다.

ComObject := ComObjGet(Name)

매개변수

Name

열람 가능한 객체의 이름. 더 자세한 정보는 MkParseDisplayName (MSDN)을 참조하십시오.

관련 항목

ComObjCreate, ComObjActive, ComObjConnect, ComObjError, ComObjQuery, CoGetObject (MSDN)

예제

; 예제: Shift+Escape를 누르면 활성 창의 프로세스를
;   기동시키는 데 사용된 명령줄 을 볼 수 있습니다.
+Esc::
    WinGet pid, PID, A
    ; WMI 서비스 객체를 얻습니다.
    wmi := ComObjGet("winmgmts:")
    ; 질의를 실행해 부합하는 프로세스(들)를 열람합니다.
    queryEnum := wmi.ExecQuery(""
        . "Select * from Win32_Process where ProcessId=" . pid)
        ._NewEnum()
    ; 첫 번째로 부합하는 프로세스를 얻습니다.
    if queryEnum[process]
        MsgBox 0, Command line, % process.CommandLine
    else
        MsgBox Process not found!
    ; 모든 전역 객체를 풀어줍니다 (지역 변수를 사용할 때는 필요치 않음).
    wmi := queryEnum := process := ""
return
; Win32_Process: http://msdn.microsoft.com/en-us/library/aa394372.aspx


ComObjQuery()

ComObjQuery() [v1.0.96.00+]

COM 객체에 인터페이스나 서비스가 있는지 질의합니다.

InterfacePointer := ComObjQuery(ComObject, [SID,] IID)

매개변수

ComObject

COM 포장 객체 또는 날 인터페이스 포인터.

IID

인터페이스 식별자 (GUID). 형식 "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}".

SID

서비스 식별자. IID와 형식이 값습니다. 이 매개변수가 생략되면, 쉼표도 생략됩니다.

총평

그의 두-매개변수 모드에서, 이 함수는 IUnknown::QueryInterface와 동등합니다. SID와 IID 모두 지정되면, 내부적으로 IServiceProvider 인터페이스에 질의한 다음, IServiceProvider::QueryService를 호출합니다. 어느 경우든, 반환 값은 0 이거나 아니면 요청된 인터페이스를 가리키는 포인터입니다. 일반적으로 이 포인터는 반드시 스크립트가 일을 마칠 때 해제되어야 합니다.

관련 항목

ObjRelease, ComObjCreate, ComObjGet, ComObjActive, ComObjError

예제

; 예제: 객체의 클래스 이름을 알아냅니다

obj := ComObjCreate("Scripting.Dictionary")

MsgBox % "Interface name: " ComObjType(obj, "name")

IID_IProvideClassInfo := "{B196B283-BAB4-101A-B69C-00AA00341D07}"

; 그 객체의 IProvideClassInfo 인터페이스를 가리키는 포인터를 요구합니다.
if !(pci := ComObjQuery(obj, IID_IProvideClassInfo))
{
    MsgBox IProvideClassInfo interface not supported.
    return
}

; GetClassInfo를 호출해 ITypeInfo 인터페이스를 가리키는 포인터를 열람합니다.
DllCall(vtable(pci, 3), "ptr", pci, "ptr*", ti)

; GetDocumentation을 호출하여 그 객체의 완전한 유형 이름을 얻습니다.
DllCall(vtable(ti, 12), "ptr", ti, "int", -1, "ptr*", name, "ptr", 0, "ptr", 0, "ptr", 0)

; BSTR 포인터를 쓸모있는 문자열로 변환합니다.
name := StrGet(name, "UTF-16")

; 날 인터페이스 포인터들을 해제합니다.
ObjRelease(ti)
ObjRelease(pci)

; 유형 이름을 보여줍니다!
MsgBox % "Class name: " name

vtable(ptr, n) {
    ; NumGet(ptr+0)은 그 객체의 가상 함수 테이블의 (약자로 vtable)
    ; 주소를 돌려줍니다. 표현식의 나머지는 n번째 함수의 주소를
    ; vtable로부터 열람합니다.
    return NumGet(NumGet(ptr+0), n*A_PtrSize)
}

; 예제: 기존의 인터넷 익스플로러 창을 자동화하기.

sURL := "http://ahkscript.org/boards/"
if webBrowser := GetWebBrowser()
   webBrowser.Navigate(sURL)
return

GetWebBrowser()
{
    ; 최상위 IE 창의 문서 객체를 가리키는 날 포인터를 얻습니다.
    static msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
    SendMessage msg, 0, 0, Internet Explorer_Server1, ahk_class IEFrame
    if ErrorLevel = FAIL
        return  ; IE가 발견되지 않음.
    lResult := ErrorLevel
    DllCall("oleacc\ObjectFromLresult", "ptr", lResult
        , "ptr", GUID(IID_IHTMLDocument2,"{332C4425-26CB-11D0-B483-00C04FD90119}")
        , "ptr", 0, "ptr*", pdoc)

    ; WebBrowserApp 서비스에 질의합니다. 이 특별한 경우는
    ; SID와 IID가 같습니다. 그러나 언제나 이런 것은 아닙니다.
    static IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
    static SID_SWebBrowserApp := IID_IWebBrowserApp
    pweb := ComObjQuery(pdoc, SID_SWebBrowserApp, IID_IWebBrowserApp)

    ; 문서 객체 포인터를 풀어줍니다.
    ObjRelease(pdoc)

    ; WebBrowser 객체를, 사용을 위해 포장해서, 반환합니다:
    static VT_DISPATCH := 9, F_OWNVALUE := 1
    return ComObject(VT_DISPATCH, pweb, F_OWNVALUE)
}

GUID(ByRef GUID, sGUID) ; 문자열을 이진 GUID로 변환하고 그의 주소를 돌려줍니다.
{
    VarSetCapacity(GUID, 16, 0)
    return DllCall("ole32\CLSIDFromString", "wstr", sGUID, "ptr", &GUID) >= 0 ? &GUID : ""
}


ComObjType()

ComObjType() [v1.0.91+]

유형 정보를 COM 객체로부터 열람합니다.

VarType := ComObjType(ComObject)
Name    := ComObjType(ComObject, "Name")
IID     := ComObjType(ComObject, "IID")

매개변수

ComObject

COM 객체 또는 유형 있는 값을 담고 있는 포장 객체.

VarType

값의 유형을 나타내는 정수. 아래 참조.

Name

인터페이스 유형 이름.

IID

인터페이스 유형을 나타내는 전역적으로 유일한 식별자 (GUID)

반환 값

두 번째 매개변수를 생략하면, 포장 객체에 담긴 variant 유형의 값이 반환됩니다.

두 번째 매개변수가 "Name" 또는 "IID"이고 포장 객체에 COM 객체가 들어 있으면 (variant 유형 VT_DISPATCH), 그 COM 객체의 유형 이름 또는 그의 첫 인터페이스의 식별자가 반환됩니다.

매개변수가 유효하지 않거나 에러가 일어나면, 빈 문자열이 반환됩니다.

Variant 유형의 상수들

VT_EMPTY     =      0  ; 값 없음
VT_NULL      =      1  ; SQL-스타일의 널
VT_I2        =      2  ; 16-비트 유부호 정수
VT_I4        =      3  ; 32-비트 유부호 정수
VT_R4        =      4  ; 32-비트 부동 소수점 수
VT_R8        =      5  ; 64-비트 부동 소수점 수
VT_CY        =      6  ; 화폐
VT_DATE      =      7  ; 날짜
VT_BSTR      =      8  ; COM 문자열 (고정 길이의 유니코드 문자열)
VT_DISPATCH  =      9  ; COM 객체
VT_ERROR     =    0xA  ; 에러 코드 (32-비트 정수)
VT_BOOL      =    0xB  ; 불리언 True (-1) 또는 False (0)
VT_VARIANT   =    0xC  ; VARIANT (반드시 VT_ARRAY 또는 VT_BYREF와 조합해 사용해야 함)
VT_UNKNOWN   =    0xD  ; IUnknown 인터페이스 포인터
VT_DECIMAL   =    0xE  ; (지원 안함)
VT_I1        =   0x10  ; 8-비트 유부호 정수
VT_UI1       =   0x11  ; 8-비트 무부호 정수
VT_UI2       =   0x12  ; 16-비트 무부호 정수
VT_UI4       =   0x13  ; 32-비트 무부호 정수
VT_I8        =   0x14  ; 64-비트 유부호 정수
VT_UI8       =   0x15  ; 64-비트 무부호 정수
VT_INT       =   0x16  ; 유부호 머신 정수
VT_UINT      =   0x17  ; 무부호 머신 정수
VT_RECORD    =   0x24  ; 사용자-정의 유형 -- 지원하지 않음
VT_ARRAY     = 0x2000  ; SAFEARRAY
VT_BYREF     = 0x4000  ; 또다른 유형의 값을 가리키는 포인터
/*
 VT_ARRAY와 VT_BYREF는 또다른 값과 조합하여 (비트별 OR을 사용) 정확한 유형을 지정합니다. 예를 들면, 0x2003는 32-비트 유부호 정수로 구성된 SAFEARRAY로 식별되고 0x400C는  VARIANT를 가리키는 포인터로 식별됩니다.
*/

총평

대부분의 경우, COM 객체의 메쏘드나 특성으로부터 반환된 값은 오토핫키가 지원하는 적절한 데이터 유형으로 변환됩니다. 구체적으로 처리가 되지 않는 유형은 VariantChangeType를 통하여 강제로 문자열로 변환됩니다; 이것이 실패하거나 variant 유형에 VT_ARRAY 또는 VT_BYREF 플래그가 들어 있다면, 대신에 값과 그의 유형을 모두 담고 있는 객체가 반환됩니다.

모든 변수 x에 대하여, 만약 ComObjType(x)가 정수를 돌려주면, x에는 COM 객체 포장자가 들어 있습니다.

관련 항목

ComObjValue, ComObjCreate, ComObjGet, ComObjActive

예제

d := ComObjCreate("Scripting.Dictionary")
VarType := ComObjType(d)          ; 언제나 9는 스크립트를 호출할 수 있는 객체를 뜻합니다.
Name    := ComObjType(d, "Name")  ; 스크립틀 호출할 수 있는 객체에만 유효합니다.
IID     := ComObjType(d, "IID")   ; 위와 같습니다.
MsgBox Variant type:`t%VarType%`nType name:`t%Name%`nInterface ID:`t%IID%


ComObjValue()

ComObjValue() [v1.0.91+]

COM 포장 객체에 저장된 값이나 포인터를 열람합니다.

Value := ComObjValue(ComObject)

매개변수

Value

64-비트 부호있는 정수.

ComObject

COM 객체 또는 유형이 있는 값을 담고 있는 포장 객체.

총평

이 함수는 범용 목적이 아닙니다.

ComObjValue를 호출하는 것은 variant.llVal와 동등합니다. 여기에서 ComObject는 VARIANT 구조체로 취급됩니다. 이 함수를 사용하는 스크립트는 모두 반드시 어떤 유형의 값을 포장 객체가 가지고 있는지 그리고 어떻게 취급해야 할지 알고 있어야 합니다. 예를 들어, 인터페이스 포인터가 반환되면, Release는 호출하지 말아야 합니다. 그러나 AddRef는 스크립트가 그 포인터를 가지고 무엇을 하는가에 따라 필요할 수도 있습니다.

관련 항목

ComObjType, ComObjCreate, ComObjGet, ComObjActive


Continue

현재 남은 회돌이 반복을 건너 뛰고 새 반복을 시작합니다. 어떤 종류의 회돌이 안에도 유효합니다.

Continue [, LoopLabel]

[AHK_L 59+]: 지정되면, LoopLabel은 다음 서술문을 적용해야 할 회돌이를 식별합니다; 라벨 이름 또는 숫자로 내포 레벨을 지정합니다. 생략하거나 1이면, 이 서술문은 가장 안쪽 회될이에 적용됩니다. LoopLabel은 상수 값이어야 합니다 - 변수나 표현식은 지원하지 않습니다. 라벨을 지정하면, 회돌이 명령어를 직접 가리켜야 합니다.

Continue는 회돌이의 닫는 반괄호에 도달한 것과 같이 행위합니다:

  1. A_Index를 1만큼 증가시킵니다.
  2. 회될이 몸체의 나머지를 건너 뜁니다.
  3. 회돌이 조건을 만족하는지 (있다면) 점검합니다. 만족하면, 새 반복을 시작합니다; 그렇지 않으면 회돌이를 끝냅니다.

goto 보다 Break와 Continue의 사용을 권장합니다. 왜냐하면 스크립트를 읽기 더 쉽고 관리하기 더 쉽기 때문입니다

관련 항목

Break, Loop, Until, While-회돌이, For-회돌이, 블록, 라벨

예제

; 이 예제는 5개의 MsgBox를 보여줍니다. 각각 6부터 10까지 담고 있습니다.
; 회돌이의 앞쪽 5회에, "continue" 명령어 때문에
; 회돌이가 MsgBox 줄에 도착하기 전에 다시 시작하는 것을 주목하십시오.
Loop, 10
{
    if A_Index <= 5
        continue
    MsgBox %A_Index%
}
; 내포 회돌이 안에서 바깥 회돌이를 계속합니다.
outer:
Loop 3
{
    x := A_Index
    Loop 3
    {
        if (x*A_Index = 4)
            continue outer  ; continue 2 또는 goto continue_outer와 동등합니다.
        MsgBox %x%,%A_Index%
    }
    continue_outer: ; goto를 위함.
    ErrorLevel:=ErrorLevel ; 개정판 57 이전에서, 라벨은 블록의 끝을 가리킬 수 없었습니다.
}


Control

콘트롤에 다양한 변경을 합니다.

Control, Cmd [, Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

Cmd, Value

아래 리스트 참조.

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 다 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합하는 행위는 SetTitleMatchMode로 알아냅니다. 이 매개변수가 비어 있으면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤의 HWND (창 핸들)에 작동하게 하려면, Control 매개변수를 빈 채로 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이 방법은 숨은 콘트롤에도 작동합니다. 심지어 DetectHiddenWindows가 꺼져 있어도 됩니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는DllCall을 통하여 열람합니다.

WinTitle

창 제목 또는 목표 창을 식별하는 기타 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

Cmd, Value

Cmd와 Value 매개변수는 서로 의존합니다. 그리고 그 사용법은 아래에 기술합니다.

Check: 라디오 버튼이나 체크 박스를 켭니다 (체크 표시를 함).

Uncheck: 라디오 버튼이나 체크 박스를 끕니다.

Enable: 이전에 꺼져 있다면 콘트롤을 켭니다.

Disable: 콘트롤을 불능화합니다 ("회색 처리를 함").

Show: 이전에 숨어 있었다면 콘트롤을 보여줍니다.

Hide: 콘트롤을 감춥니다. 콘트롤의 단축 키(밑줄 문자)를 작동하지 못하도록 막고 싶다면, Control Disable을 통하여 콘트롤을 끄십시오.

Style, N 또는 ExStyle, N: 콘트롤의 스타일이나 확장 스타일을 변경합니다. N 첫 문자가 플러스 또는 마이너스 사인이면 N에 있는 스타일이 추가되거나 제거됩니다. 첫 문자가 캐럿 (^)이면, N에 있는 스타일들이 각각 반대 상태로 토글됩니다. 첫 문자가 숫자이면, 그 콘트롤의 스타일이 완전히 덮여 씌여집니다; 즉, N이 됩니다. ErrorLevel은 목표 창/콘트롤이 발견되지 않으면 또는 스타일이 적용되지 않으면 1이 설정됩니다.

어떤 스타일 변경은 WinSet Redraw를 사용하여 전체 창을 다시 그리기를 요구합니다. 또, 스타일 테이블에 스타일 번호들을 나열하고 있습니다. 예를 들어:

Control, Style, ^0x800000, Edit1, WinTitle  ; WS_BORDER 스타일을 그의 반대 상태로 설정합니다.

ShowDropDown: 선택이 보이도록 ComboBox 메뉴를 내립니다.

HideDropDown: 위를 반대로 합니다.

TabLeft [, Count] 그리고 TabRight [, Count]: SysTabControl32에서 하나 이상의 탭만큼 오른쪽 왼쪽으로 이동합니다. Count는 생략하거나 비어 있으면 1로 간주됩니다. 대신에 탭을 직접적으로 번호로 선택하려면, 아래의 숫자 5를 이 보다 작은 숫자로 교체하십시오. 원하는 탭 번호로 교체하시면 됩니다. 다른 말로 하면, 0은 첫 번째 탭을 선택하고, 1은 두 번째 탭을 선택합니다. 등등:

SendMessage, 0x1330, 5,, SysTabControl321, WinTitle  ; 0x1330 is TCM_SETCURFOCUS.
Sleep 0  ; 이 줄과 다음 줄은 어떤 탭 콘트롤에는 꼭 필요합니다.
SendMessage, 0x130C, 5,, SysTabControl321, WinTitle  ; 0x130C is TCM_SETCURSEL.

Add, String: 문자열(String)을 새 엔트리로 ListBox, ComboBox (그리고 가능한 다른 유형들) 아래에 추가합니다.

Delete, N: N번째 엔트리를 ListBox 또는 ComboBox로부터 제거합니다. N은 첫 엔트리에 대하여 1이 되고 두 번째 엔트리는 2가 됩니다. 등등.

Choose, N: ListBox 또는 ComboBox에서 N번째 엔트리를 선택합니다. N은 첫 엔트리에 1, 두 번째 엔트리에 2가 됩니다. 등등. 다중-선택 리스트박스에서 모든 항목을 선택하거나 해제하려면, 다음 예제를 따르십시오:

PostMessage, 0x185, 1, -1, ListBox1, WinTitle  ; Select all listbox items. 0x185 is LB_SETSEL.

ChooseString, String: 앞 부분이 String에 부합하는 첫 번째 엔트리를 ListBox 또는 ComboBox에서 선택합니다. 검색은 대소문자를 구분하지 않습니다. 예를 들어, ListBox/ComboBox에 "UNIX Text"라는 항목이 들어 있다면, 단어를 unix (소문자)로 지정해도 충분히 선택할 수 있습니다.

EditPaste, String: Edit 콘트롤에서 String을 캐럿/삽입 위치에 붙여 넣습니다 (클립보드의 내용은 영향을 받지 않습니다).

ErrorLevel

[v1.1.04+] 이 명령어는 실패하면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

신뢰성을 개선하기 위하여, 이 명령어를 사용할 때마다 자동으로 지연 시간이 있습니다 (Style과 ExStyle 제외). 그 지연 시간은 SetControlDelay를 통하여 변경할 수 있습니다.

현재 마우스가 올라와 있는 콘트롤의 ClassNN 또는 HWND를 알아내려면, MouseGetPos를 사용하십시오.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

SetControlDelay, ControlGet, GuiControl, ControlGetText, ControlSetText, ControlMove, ControlGetPos, ControlClick, ControlFocus, ControlSend, WinSet

예제

Control, HideDropDown, , ComboBox1, Some Window Title


ControlClick

마우스 버튼이나 마우스 휠 이벤트를 콘트롤에 보냅니다.

ControlClick [, Control-or-Pos, WinTitle, WinText, WhichButton, ClickCount, Options, ExcludeTitle, ExcludeText]

매개변수

Control-or-Pos

이 매개변수가 비어 있으면, 목표 창의 최상위 콘트롤이 클릭됩니다 (또는 콘트롤이 없으면 목표 창 자체가 클릭됩니다). 그렇지 않으면, 아래의 두 모드 중 하나가 사용됩니다.

Mode 1 (Position): 목표 창의 좌상 모서리에 상대적인 X와 Y 좌표를 지정하십시오. X 좌표가 Y 좌표보다 먼저 나와야 하고 적어도 하나의 탭이나 스페이스가 그 사이에 있어야 합니다. 예를 들어: X55 Y33. 지정된 좌표에 콘트롤이 있다면, 그 좌표에 정확하게 클릭 이벤트가 전송됩니다. 콘트롤이 없다면, 목표 창 자체에 그 이벤트가 전송됩니다 (창의 성질에 따라 아무 효과가 없을 수 있습니다). 주의: 이 모드에서, Options 매개변수의 X와 Y 옵션 기호는 무시됩니다.

Mode 2 (ClassNN 또는 Text): ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 이름/텍스트를 지정하십시오. 둘 모두 Window Spy로 알아낼 수 있습니다. 이름/텍스트를 사용할 때, 부합하는 창은 SetTitleMatchMode로 결정됩니다.

기본값으로 모드 2가 모드 1보다 우선 순위가 높습니다. 예를 들어, 혹시라도 한 콘트롤의 텍스트나 ClassNN이 "Xnnn Ynnn" 형식이라면, 그러면 Mode 2인 것처럼 작동할 것입니다. 이를 오버라이드해서 무조건 모드 1을 사용하려면, 단어 Pos를 Options에 다음 예제와 같이 지정하십시오: ControlClick, x255 y152, WinTitle,,,, Pos.

콘트롤의 HWND (창 핸들)에 작동시키라면, 이 매개변수를 빈 채로 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 또한 숨은 창에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 됩니다). 콘트롤의 HWND는 전형적으로ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람됩니다.

WinTitle

창 제목 또는 목표 창을 식별하는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있어야 탐지됩니다.

WhichButton

클릭할 버튼: LEFT, RIGHT, MIDDLE (또는 그냥 각 첫 문자). 생략하거나 비어 있으면, LEFT 버튼이 사용됩니다.

X1 (XButton1, 네 번째 마우스 버튼) 그리고 X2 (XButton2, 다섯 번째 마우스 버튼)도 지원됩니다.

WheelUp (또는 WU) 그리고 WheelDown (또는 WD)도 지원됩니다. 이 경우, ClickCount는 휠을 돌릴 눈금의 개수입니다.

Windows Vista 이상 [v1.0.48+]: WheelLeft (또는 WL) and WheelRight (또는 WR)도 지원됩니다 (예전 운영 체제에서는 아무 효과도 없습니다). 이 경우, ClickCount는 휠을 돌릴 눈금의 개수입니다.

ClickCount

보낼 클릭 횟수, 표현식이 가능합니다. 생략되거나 비어 있으면, 1 클릭이 전송됩니다.

Options

다음 기호들이 옵션으로 사용됩니다. 예를 들어: d x50 y25.

NA [v1.0.45+]: 신뢰성을 개선할 수 있습니다. 아래의 신뢰성을 참조하십시오.

D: 마우스 버튼을 누르지만 떼지 않습니다 (즉, 누르기-이벤트 발생). D와 U 옵션이 모두 없으면, (누르고 뗀) 완전한 클릭이 전송됩니다.

U: 마우스 버튼을 뗍니다 (즉 뗌-이벤트 발생). 이 옵션은 D 옵션이 이미 있으면 나타나면 안됩니다 (그 반대도 마찬가지입니다).

Pos: 단어 Pos를 Options 아무데나 지정하면, 위의 Control-or-Pos 매개변수에 기술되어 있듯이 무조건 X/Y 위치 지정 모드를 사용합니다.

Xn: n에다 클릭할 X 위치를 지정합니다. 이 위치는 콘트롤의 좌상 모서리에 상대적입니다. 지정하지 않으면, 클릭이 콘트롤의 수평-중앙에 일어납니다.

Yn: n에다 클릭할 Y 위치를 지정합니다. 이 위치는 콘트롤의 좌상 모서리에 상대적입니다. 지정하지 않으면 클릭이 수직-중앙에 일어납니다.

X와 Y 옵션에 십진수를 사용합니다 (십육진수 불가).

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패하면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1, 그렇지 않으면 0이 설정됩니다.

신뢰성

신뢰성을 개선하려면 -- 특히 ControlClick이 작동하는 동안 사용자가 물리적으로 마우스를 움직이면 -- 다음 방법이 도움이 될 것입니다:

1) ControlClick 전에 SetControlDelay -1를 사용합니다. 이렇게 하면 클릭하는 동안 마우스를 누르고 있을 필요가 없습니다. 이 덕분에 사용자의 물리적 마우스 이동과의 간섭 가능성이 줄어듭니다.

2) 아래와 같이 문자열 NA를 여섯 번째 매개변수 아무데나 (Options) 지정합니다:

SetControlDelay -1
ControlClick, Toolbar321, WinTitle,,,, NA

NA를 지정하면 목표 창을 활성화 상태로 표식을 할 필요가 없고 그의 입력 처리를 스크립트이 입력 처리와 병합할 필요가 없습니다. 이 덕분에 마우스의 물리적 이동 때문에 간섭 받지 않아도 됩니다 (그러나 보통 목표 창이 비활성화 상태일 경우에만 그렇습니다). 그렇지만, 이 방법은 모든 유형의 창과 콘트롤에 작동하는 것은 아닙니다.

논평

모든 어플리케이션이 마우스 휠을 돌릴 때 1보다 큰 ClickCount를 준수하는 것은 아닙니다. 그런 어플리케이션이라면 Loop를 사용해 한 눈금 이상 휠을 돌리십시오. 다음 예제는 다섯 눈금을 돌리고 있습니다:

Loop, 5
    ControlClick, Control, WinTitle, WinText, WheelUp

창 제목 또는 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

SetControlDelay, Control, ControlGet, ControlGetText, ControlMove, ControlGetPos, ControlFocus, ControlSetText, ControlSend, Click

예제

ControlClick, OK, Some Window Title  ; OK 버튼을 클릭합니다
ControlClick, x55 y77, WinTitle  ; 좌표 세트를 클릭합니다. X와 Y 사이에 쉼표가 없는 것에 주목하십시오.

; 다음 방법은 신뢰성을 개선하고 부작용을 줄여줍니다:
SetControlDelay -1
ControlClick, Toolbar321, WinTitle,,,, NA x192 y10  ; 지정한 이름의 콘트롤에 상대적인 좌표를 NA 모드에서 클릭합니다.


ControlFocus

입력 초점을 한 창의 주어진 콘트롤에 전송합니다.

ControlFocus [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy로 알아낼 수 있습니다. 텍스트를 사용할 때, 부합하는 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어있거나 생략되면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 빈 채로 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 창에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관 없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람됩니다.

WinTitle

창 제목 또는 목표 창을 식별하는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러 참조.

ErrorLevel는 문제가 있으면 1, 그렇지 않으면 0이 설정됩니다.

논평

효과가 있으려면, 콘트롤의 창이 일반적으로 최소화되어 있거나 숨어 있으면 안됩니다.

신뢰성을 개선하기 위하여, 이 명령어를 사용할 때마다 자동으로 지연 시간이 있읍니다. 이 지연 시간은 SetControlDelay를 통하여 바꿀 수 있습니다.

현재 마우스가 떠 있는 콘트롤의 ClassNN 또는 HWND를 발견하려면, MouseGetPos를 사용하십시오.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

SetControlDelay, ControlGetFocus, Control, ControlGet, ControlMove, ControlGetPos, ControlClick, ControlGetText, ControlSetText, ControlSend

예제

ControlFocus, OK, Some Window Title  ; 초점을 OK 버튼에 설정합니다


ControlGet

콘트롤에 관하여 다양한 유형의 정보를 열람합니다.

ControlGet, OutputVar, Cmd [, Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

Cmd 명령의 결과를 저장할 변수의 이름.

Cmd, Value
아래 리스트 참조
Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합하는 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있으면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 빈 채로 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다.

WinTitle

창 제목 또는 목표 창을 식별하는 기타 기준. WinTitle 참조.

WinText

존재하면 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 노출됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

Cmd, Value

Cmd와 Value 매개변수는 서로 의존합니다. 그 사용법은 아래에 기술합니다.

List: ListView, ListBox, ComboBox, 또는 DropDownList로부터 항목 리스트를 열람합니다.

ListView: ListView를 열람하는 구문은 다음과 같습니다:

ControlGet, OutputVar, List, Options, SysListView321, WinTitle, WinText

Options 매개변수가 비어 있거나 생략되면, 콘트롤에 있는 모든 텍스트가 열람됩니다. 마지막 행을 제외하고 각 행마다 라인피드 문자로 끝납니다 (`n). 각 행 안에서, 각 필드 (컬럼)은 마지막을 제외하고 탭 문자로 끝납니다 (`t).

Options에 다음 단어들을 지정하십시오. 각 옵션은 다음 옵션과 스페이스 또는 탭으로 구분됩니다:

Selected: 모든 행 말고 선택된 (강조된) 행들만 열람합니다. 아무것도 없으면, OutputVar는 비워집니다.
Focused: 초점 행만 열람합니다. 없으면, OutputVar는 비워집니다.
Col4: 모든 컬럼 말고 네 번째 컬럼(필드)만 열람합니다 (4를 원하는 번호로 교체).
Count: 콘트롤에 있는 전체 행의 개수를 열람합니다.
Count Selected: 선택된 (강조된) 행의 개수를 열람합니다.
Count Focused: 초점 행의번호(위치)를 열람합니다 (없으면 0).
Count Col: 콘트롤에 있는 컬럼의 개수를 열람합니다 (또는 개수를 셀 수 없으면 -1).

주의: 어떤 어플리케이션은 ListView 텍스트를 따로 보관합니다. 그 때문에 텍스트를 열람할 수 없습니다. 이런 경우, ErrorLevel은 보통 0으로 설정됩니다 (성공을 뜻함). 그러나 열람된 필드는 비어 있을 것입니다. 또한 ListView 텍스트 열람은 #MaxMem으로 제한되지 않습니다.

성공하면, ErrorLevel은 0이 설정됩니다. 실패하면 1로 설정되고 OutputVar는 비워집니다. 실패는 다음과 같은 경우 일어납니다:

  1. 목표 창이나 콘트롤이 존재하지 않는다;
  2. 목표 창이 SysListView32 유형이 아니다;
  3. ListView를 소유한 프로세스를 열 수 없다. 아마도 사용자가 권한이 없거나 잠겨 있기 때문일 것이다;
  4. ColN 옵션에 존재하지 않는 컬럼을 지정했다.

ListView로부터 개별적으로 행과 필드를 추출하려면, 다음 예제와 같이 파싱 회돌이를 사용하십시오:

ControlGet, List, List, Selected, SysListView321, WinTitle
Loop, Parse, List, `n  ; 행은 라인피드로 구분됩니다 (`n).
{
    RowNumber := A_Index
    Loop, Parse, A_LoopField, %A_Tab%  ; 각 행의 필드 (컬럼)은 탭으로 구분됩니다 (A_Tab).
        MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%.
}

관련하여 말씀 드리자면, ListView의 컬럼은 SendMessage를 통하여 크기를 변경할 수 있습니다. 다음 예제에 보여줍니다:

SendMessage, 4126, 0, 80, SysListView321, WinTitle  ; 4126은 메시지 LVM_SETCOLUMNWIDTH입니다.
; 위에서, 0은 첫 컬럼을 나타냅니다 (1은 두 번째, 2는 세 번째, 등등.)  또한, 80은 새 너비입니다.
; 80을 -1로 바꾸면 컬럼의 크기가 자동으로 조절됩니다. -2로 교체하면 헤더 텍스트 너비까지 고려하여 크기를 조절해 줍니다.

ListBox, ComboBox, DropDownList: 콘트롤로부터 모든 텍스트가 열람됩니다 (즉, 위의Count과 Selected같은 ListView 옵션은 지원하지 않습니다).

각 행은 마지막을 제외하고 라인피드로 끝납니다 (`n). 항목에 개별적으로 접근하려면, 다음 예제와 같이 파싱 회돌이를 사용하십시오:

ControlGet, List, List,, ComboBox1, WinTitle
Loop, Parse, List, `n
    MsgBox Item number %A_Index% is %A_LoopField%.

Checked: 체크박스나 라디오 버튼이 체크되어 있으면 OutputVar에 1을 설정합니다. 그렇지 않으면 0을 설정합니다.

Enabled: Control이 활성화되어 있으면 OutputVar에 1을 설정합니다. 그렇지 않으면 0을 설정합니다.

Visible: Control이 보이면 OutputVar에 1을 설공하고, 숨어 있으면 0을 설정합니다.

Tab: OutputVar에 SysTabControl32 콘트롤의 탭 번호를 설정합니다. 첫 탭은 1, 두 번째 탭은 2입니다, 등등. 대신에 얼마나 많은 탭(페이지)가 탭 콘트롤에 있는지 알아 보려면, 다음 예제를 따르십시오:

SendMessage, 0x1304,,, SysTabControl321, WinTitle  ; 0x1304는 TCM_GETITEMCOUNT입니다.
TabCount = %ErrorLevel%

FindString, String: ListBox 또는 ComboBox에서 String에 정확하게 일치한 엔트리의 갯수를 OutputVar에 설정합니다. 콘트롤의 첫 엔트리는 1이고, 두 번째 엔트리는 2입니다, 등등. 일치가 없으면, OutputVar는 비워지고 ErrorLevel은 1로 설정됩니다.

Choice: ListBox 또는 ComboBoxSet에서 현재 선택된 엔트리의 이름을 OutputVar에 설정합니다. 대신에 선택된 항목의 위치를 열람하려면, 다음 예제를 따르십시오 (앞의 두 줄만 사용합니다):

SendMessage, 0x188, 0, 0, ListBox1, WinTitle  ; 0x188은 LB_GETCURSEL입니다 (ListBox).
SendMessage, 0x147, 0, 0, ComboBox1, WinTitle  ; 0x147은 CB_GETCURSEL입니다 (DropDownList 또는 ComboBox).
ChoicePos = %ErrorLevel%  ; 항목이 선택되어 있지 않으면 -1이 설정됩니다.
ChoicePos += 1  ; 0-기반에서 1-기반으로 변환합니다. 그래서 첫 항목은 0이 아니라, 1입니다.

LineCount: Edit 콘트롤의 줄의 개수를 OutputVar에 설정합니다. 모든 Edit 콘트롤은 콘트롤이 비어 있을지라도 적어도 1 줄이 있습니다.

CurrentLine: Edit 콘트롤에서 현재 캐럿이 있는 (삽입 지점) 줄의 번호를 OutputVar에 설정합니다. 첫 줄은 1입니다. 콘트롤에 선택된 텍스트가 있다면, 선택이 시작하는 곳의 줄 번호를 OutputVar에 설정합니다.

CurrentCol: Edit 콘트롤에서 현재 캐럿이 있는 (텍스트 삽입 지점) 열 번호를 OutputVar에 설정합니다. 첫 열은 1입니다. 선택된 텍스트가 콘트롤에 있다면, OutputVar에 선택이 시작되는 곳의 열 번호가 설정됩니다.

Line, N: Edit 콘트롤에서 N 번 줄의 텍스트를 OutputVar에 설정합니다. Line 1은 첫 줄입니다. 콘트롤의 특성에 따라, OutputVar는 캐리지 리턴 (`r) 또는 캐리지 리턴 + 라인피드 (`r`n)로 끝날 수 있습니다. 지정된 줄 번호가 비어 있거나 존재하지 않으면, ErrorLevel 에 1이 설정되고 OutputVar는 비워집니다.

Selected: Edit 콘트롤에서 선택된 텍스트를 OutputVar에 설정합니다. 아무 텍스트도 선택되어 있지 않으면, OutputVar는 비워지고 ErrorLevel에는 0이 설정됩니다 (즉, 에러 없음). 어떤 유형의 콘트롤은 RichEdit20A와 같이 어떤 경우 올바르게 텍스트를 생산하지 않을 수 있습니다 (예, Metapad).

Style: 콘트롤의 스타일을 나타내는 8-자리 십육진 수를 열람합니다. 스타일 목록은 스타일 테이블을 참조하십시오.

ExStyle: 콘트롤의 확장 스타일을 나타내는 8-자리 십육진 수를 열람합니다.

Hwnd [v1.0.43.06+]: 지정된 콘트롤의 창 핸들(HWND)을 열람합니다: ControlGet, OutputVar, Hwnd,, Edit1, WinTitle. 콘트롤의 HWND는 PostMessage, SendMessage, 그리고 DllCall에 자주 사용됩니다. 관련하여 말씀 드리자면, 콘트롤의 HWND는 MouseGetPos를 통해서 열람할 수도 있습니다. 마지막으로, 콘트롤의 HWND를 ahk_id WinTitle로 직접적으로 사용할 수 있습니다 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관없습니다).

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

성공하면, ErrorLevel은 0이 설정됩니다. 문제가 발생하면 -- 존재하지 않는 창이나 콘트롤 같은 경우 -- ErrorLevel은 1이 설정되고 OutputVar는 비워집니다.

논평

콘트롤을 변경하는 명령어와 다르게, ControlGet은 자동 지연이 없습니다; 즉, SetControlDelay에 영향을 받지 않습니다.

현재 마우스가 떠 있는 콘트롤의 ClassNN 또는 HWND를 알아내려면, MouseGetPos를 사용하십시오. 창의 콘트롤 목록을 얻으려면, WinGet ControlList를 사용하십시오.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

Control, GuiControlGet, ControlMove, ControlGetText, ControlSetText, ControlGetPos, ControlClick, ControlFocus, ControlSend, WinGet

예제

ControlGet, OutputVar, Line, 1, Edit1, Some Window Title

ControlGet, WhichTab, Tab, , SysTabControl321, Some Window Title
if ErrorLevel
    MsgBox There was a problem.
else
    MsgBox Tab #%WhichTab% is active.


ControlGetFocus

목표 창에서 초점이 있는 콘트롤을 열람합니다.

ControlGetFocus, OutputVar [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

콘트롤의 식별자를 저장할 변수의 이름. 그 구성은 클래스이름 다음에 그의 부모 안에서의 연속 번호가 따라옵니다. 예, Button12.

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있어야(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 입력 초점이 있는 콘트롤을 성공적으로 열람하면 0이 설정됩니다. 그렇지 않으면 (예, 목표 창이 존재하지 않거나 입력 초점이 있는 콘트롤이 없는 경우) 1로 설정됩니다.

논평

이 명령어로 열람한 콘트롤은 키보드 초점이 있습니다. 다시 말해, 사용자가 타자를 하면 키눌림을 받아들입니다.

목표 창이 초점이 있는 콘트롤을 가지려면 활성화되어 있어야 합니다. 창이 활성화되어 있지 않으면, OutputVar는 비워집니다.

v1.1.19.03이전에서, ControlGetFocus를 높은 빈도로 (즉, 500 ms 보다 빠르게) 반복적으로 실행하면, 보통 사용자의 더블-클릭을 방해했습니다. 이 문제는 이제 해결되었습니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

ControlFocus, ControlMove, ControlClick, ControlGetText, ControlSetText, ControlSend

예제

ControlGetFocus, OutputVar, Untitled - Notepad
if ErrorLevel
    MsgBox, The target window doesn't exist or none of its controls has input focus.
else
    MsgBox, Control with focus = %OutputVar%


ControlGetPos

콘트롤의 위치와 크기를 열람합니다.

ControlGetPos [, X, Y, Width, Height, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

X, Y

Control의 좌상 모서리의 X와 Y 좌표를 저장할 변수 이름 (픽셀 단위). 이 좌표는 목표 창의 좌상 모서리에 상대적이며 그래서 ControlMove가 사용하는 좌표와 같습니다.

X나 Y를 생략하면, 상응하는 값이 저장되지 않습니다.

Width/Height

Control의 너비와 높이를 (픽셀 단위로) 저장할 변수의 이름. 생략하면, 상응하는 값이 저장되지 않습니다.

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합하는 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있으면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 빈 채로 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관 없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall를 통하여 열람합니다.

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

논평

부합하는 창이나 콘트롤이 발견되지 않으면, 출력 변수는 비워집니다.

콘트롤을 변경하는 명령어와 다르게, ControlGetPos는 자동 지연이 없습니다 (SetControlDelay에 영향을 받지 않습니다).

현재 마우스가 떠 있는 콘트롤의 ClassNN이나 HWND를 발견하려면 MouseGetPos를 사용하십시오. 창의 모든 콘트롤 목록을 열람하려면 WinGet을 사용하십시오.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

ControlMove, WinGetPos, Control, ControlGet, ControlGetText, ControlSetText, ControlClick, ControlFocus, ControlSend

예제

; 다음의 작동하는 예제는 계속 갱신하면서
; 현재 마우스 아래의 콘트롤의 위치와 이름을 보여줍니다:
Loop
{
    Sleep, 100
    MouseGetPos, , , WhichWindow, WhichControl
    ControlGetPos, x, y, w, h, %WhichControl%, ahk_id %WhichWindow%
    ToolTip, %WhichControl%`nX%X%`tY%Y%`nW%W%`t%H%
}


ControlGetText

콘트롤로부터 텍스트를 열람합니다.

ControlGetText, OutputVar [, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

열람된 텍스트를 저장할 변수의 이름.

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 다 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있거나 생략되면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 비워두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다.

WinTitle

목표 창을 식별하는 창 제목이나 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

주의: 텍스트를 ListView, ListBox, 또는 ComboBox으로부터 열람하려면, 대신에 ControlGet List를 사용하십시오.

열람된 텍스트가 잘려 나간 것 같으면 (불완전하면), ControlGetText 말고 VarSetCapacity(OutputVar, 55)를 사용해 보십시오 [55를 잘려나간 텍스트보다 상당히 더 긴 크기로 교체하십시오]. 어플리케이션이 WM_GETTEXTLENGTH 메시지에 제대로 응답하지 않는 경우, AutoHotkey가 출력 변수를 너무 작게 만들어 모든 텍스트를 담지 못하기 때문입니다.

열람된 텍스트의 양은 변수의 최대 가용 능력으로 제한됩니다 (이는 #MaxMem 지시어를 통하여 변경할 수 있습니다). 결과적으로, 목표 콘트롤에 방대한 양의 텍스트가 담겨 있으면 (예를 들어, 편집기에 방대한 문서가 열려 있는 경우) 이 명령어는 방대한 양의 램을 사용할 가능성이 있습니다. 그렇지만, 변수의 메모리는 아무것도 지정하지 않으면 손쉽게 해제할 수 있습니다. 즉, OutputVar =.

대부분의 콘트롤 유형으로부터 열람된 텍스트는 각 줄의 끝을 표시하기 위해 홀로 라인피드(`n)를 사용하지 않고 캐리지 리턴과 라인피드 (`r`n)를 사용합니다.

SetTitleMatchMode Slow를 처리할 필요는 없습니다. 왜냐하면 ControlGetText는 언제나 텍스트를 느린 방법으로 받기 때문입니다 (그 때문에 광범위한 범위의 콘트롤 유형에 작동합니다).

창의 모든 콘트롤 목록을 열람하려면, WinGet ControlList를 사용하십시오.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

ControlSetText, WinGetText, Control, ControlGet, ControlMove, ControlFocus, ControlClick, ControlSend, #MaxMem

예제

ControlGetText, OutputVar, Edit1, Untitled -


ControlMove

콘트롤을 이동하거나 크기를 변경합니다.

ControlMove, Control, X, Y, Width, Height [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트입니다. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있으면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 비워두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows기 꺼져 있어도 상관이 없습니다). 콘트롤의 HWND은 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다.

X, Y

Control의 새 위치의 좌상 모서리의 X와 Y 좌표 (픽셀 단위), 표현식 가능. 좌표가 비어 있으면, Control의 그 차원의 위치는 변경되지 않습니다. 좌표는 Control의 부모 창의 좌상 모서리에 상대적입니다; ControlGetPos 또는 Window Spy를 사용하면 그 좌표를 알 수 있습니다.

Width, Height

Control의 새 너비와 높이 (픽셀 단위), 표현식도 가능. 이 매개변수가 비어 있거나 생략되면, 그 차원의 Control의 크기는 변경되지 않습니다.

WinTitle

목표 창을 식별하는 창 제목이나 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

신뢰성을 개선하기 위해, 이 명령어를 사용할 때마다 자동으로 지연됩니다. 이 지연 시간은 SetControlDelay을 통하여 변경할 수 있습니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

ControlGetPos, WinMove, SetControlDelay, Control, ControlGet, ControlGetText, ControlSetText, ControlClick, ControlFocus, ControlSend

예제

SetTimer, ControlMoveTimer
InputBox, OutputVar, My Input Box
return

ControlMoveTimer:
IfWinNotExist, My Input Box
    return
; 그렇지 않으면 위에서 우리를 위해 "마지막으로 발견된" 창을 설정합니다:
SetTimer, ControlMoveTimer, off
WinActivate
ControlMove, OK, 10, , 200  ; OK 버튼을 왼쪽으로 이동하고 그의 너비를 늘립니다.
return


ControlSend / ControlSendRaw

흉내낸 키눌림을 창이나 콘트롤에 보냅니다.

ControlSend [, Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText]
ControlSendRaw: 위와 매개변수 동일.

매개변수

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있거나 생략되면, 목표 창의 최상위 콘트롤이 사용됩니다. 이 매개변수가 ahk_parent이면, 키눌림이 그의 콘트롤 중 하나가 아니라 곧바로 목표 창으로 전송됩니다 (예제는 Winamp 자동화하기를 참조하십시오).

콘트롤의 HWND (창 핸들)에 작동시키려면, Control 매개변수를 비워두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관이 없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다.

Keys

전송할 키 연속 (자세한 것은 Send 명령어 참조). 문자 그대로의 쉼표를 전송하려면, 피신시키십시오 (`,). 문자를 전송하는 비율은 SetKeyDelay로 결정됩니다.

Send 명령어와 다르게, 마우스 클릭은 ControlSend로 보낼 수 없습니다. 마우스 클릭을 보내려면 ControlClick을 사용하십시오.

WinTitle

목표 창을 식별하는 창 제목이나 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 배제합니다.

ExcludeText

텍스트에 이 값이 있는 창은 배제합니다.

ErrorLevel

[v1.1.04+] 이 명어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

논평

ControlSendRaw는 Keys 매개변수에 있는 키눌림을 정확하게 나타나는 그대로 전송합니다. {Enter}를 ENTER 키눌림으로, ^c를 Control-C로, 등등 변환하지 않습니다.

Control 매개변수를 생략하면, 이 명령어는 목표 창에 직접 전송을 시도합니다. 그의 최상위 콘트롤에 전송하거나 (보통 올바른 창) 또는 콘트롤이 없으면 그 창 자체에 전송합니다. 창에 콘트롤이 전혀 없는 듯 보일 때, 또는 그냥 편하게 어느 콘트롤에 보내야 할지 고민하고 싶지 않을 때 유용합니다.

기본값으로, 수식 키 (Control, Alt, Shift, 그리고 Win)는 보통 Send 명령어로 전송되는 것과 똑 같이 전송됩니다. 이렇게 하면 명령어 프롬프트와 기타 콘솔 창이 대문자, 제어 문자 등등을 적절하게 탐지할 수 있습니다. 또 다른 면에서 신뢰성도 향상됩니다.

그렇지만, 어떤 경우 이 수식 이벤트는 활성 창과 얽힐 수 있습니다. 특히 ControlSend가 진행 중인 동안에 사용자가 격렬하게 타자하고 있다면 또는 Alt 키가 전송 중이라면 (Alt는 활성 창의 메뉴 바를 활성화 시키기 때문에) 간섭 현상이 일어날 수 있습니다. 이런 일은 다음 예제와 같은 명시적으로 수식 키를 누르고 떼는 이벤트를 전송하면 피할 수 있습니다:

ControlSend, Edit1, {Alt down}f{Alt up}, Untitled - Notepad

위의 방법은 또 워크스테이션이 잠겨 있는 동안 (로그온 프롬프트로 보호되어 있는 동안)에도 수식키 눌림 (Control/Alt/Shift/Win)을 전송할 수 있습니다.

BlockInput는 명령어 프롬프트와 같은 콘솔 창에 ControlSend를 사용할 때 절대 피해야 합니다. 왜냐하면 Control과 같은 수식키와 대소문자 변환이 제대로 작동하지 못하기 때문입니다.

SetKeyDelay의 값은 키가 전송되는 속도를 결정합니다. 목표 창이 키 눌림을 제대로 받지 않으면, 다음 예제와 같은 SetKeyDelay의 두 번째 매개변수를 통하여 누름 지속 시간을 늘려 보십시오:

SetKeyDelay, 10, 10
SetKeyDelay, 0, 10
SetKeyDelay, -1, 0

목표 콘트롤이 Edit 콘트롤이면 (또는 그 비슷한 콘트롤이면), ControlSend보다 다음이 보통 더 믿을 만하고 더 빠릅니다:

Control, EditPaste, 이 텍스트는 캐럿 위치에 삽입됩니다., ControlName, WinTitle
ControlSetText, ControlName, 이 텍스트는 현재 텍스트를 완전히 교체합니다., WinTitle

ControlSend는 일반적으로 창의 메뉴 바를 조작할 수 없습니다. 이를 우회하려면, WinMenuSelectItem을 사용하십시오. 메뉴 바의 특성 때문에 그 마저도 사용할 수 없으면, 원하는 메뉴 항목에 상응하는 메시지를 찾아보십시오. 다음 SendMessage 자습서를 따르시면 됩니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

SetKeyDelay, 피신 연속열 (예, `%), Control, ControlGet, ControlGetText, ControlMove, ControlGetPos, ControlClick, ControlSetText, ControlFocus, Send, Winamp 자동화하기

예제

ControlSend, Edit1, 이 줄은 노트패드 창에 있는 줄입니다., Untitled
SetTitleMatchMode, 2
ControlSend, , abc, cmd.exe  ; 명령어 프롬프트 창에 직접 전송합니다.


ControlSetText

콘트롤의 텍스트를 변경합니다.

ControlSetText [, Control, NewText, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

Control

ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 다 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는 SetTitleMatchMode로 결정됩니다. 이 매개변수가 비어 있으면, 목표 창의 최상위 콘트롤이 사용됩니다.

콘트롤으 HWND (창 핸들)에 작동 시키려면, Control 매개변수를 비워 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 콘트롤에도 작동합니다. DetectHiddenWindows가 꺼져 있어도 상관 없습니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다.

NewText

콘트롤 안에 설정해 넣을 새 텍스트. 비어 있거나 생략되면, 콘트롤이 비워집니다.

WinTitle

목표 창을 식별하는 창 제목이나 기타 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외됩니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예러를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 실패하면 1 성공하면 0이 설정됩니다.

논평

대부분의 콘트롤 유형은 홀로 라인피드 (`n) 말고 캐리지 리턴과 라인피드 (`r`n)를 사용해 각 줄의 끝을 표시합니다. `n 문자가 포함된 텍스트 블록을 변환하려면, 다음 예제를 따르십시오:

StringReplace, MyVar, MyVar, `n, `r`n, All

신뢰성을 향상시키기 위해, 이 명령어를 사용할 때마다 지연 시간이 자동으로 삽입됩니다. 이 지연 시간은 SetControlDelay를 통하여 바꿀 수 있습니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

SetControlDelay, ControlGetFocus, ControlGetText, ControlGet, Control, ControlMove, ControlGetPos, ControlClick, ControlFocus, ControlSend

예제

ControlSetText, Edit1, 여기에 새 텍스트 설정, Untitled -


CoordMode

다양한 명령어에 대하여 화면 또는 활성 창에 좌표 모드가 상대적이 되도록 설정합니다.

CoordMode, ToolTip|Pixel|Mouse|Caret|Menu [, Screen|Window|Client]

매개변수

Param1

ToolTip: ToolTip에 영향을 줍니다.

Pixel: PixelGetColor, PixelSearch, 그리고 ImageSearch에 영향을 줍니다.

Mouse: Affects 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+]: 좌표는 활성 창의 클라이언트 영역에 상대적입니다. 클라이언트 영역에서 제목 바, 메뉴 (표준 메뉴라면) 그리고 테두리는 제외됩니다. 클라이언트 좌표는 OS 버전와 테마에 의존하지 않습니다.

논평

이 명령어가 사용되지 않으면, 모든 명령어는 따로 문서화되어 있는 명령어를 제외하고 (예, WinMove 그리고 InputBox) 활성 창에 상대적인 좌표를 사용합니다.

새로 기동된 쓰레드는 (핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 값을 가지고 새롭게 시작합니다. 그 기본 값은 자동-실행 섹션 (스크립트 상단)에 이 명령어를 사용하여 바꿀 수 있습니다).

관련 항목

Click, MouseMove, MouseClick, MouseClickDrag, MouseGetPos, PixelGetColor, PixelSearch, ToolTip, Menu

예제

CoordMode, ToolTip, Screen  ; 툴팁을 절재 화면 좌표에 배치합니다:
CoordMode, ToolTip  ; 위와 같습니다. 똑 같이 "screen"이 기본값입니다.


Critical

임계(Critical)

현재 쓰레드가 다른 쓰레드에게 인터럽트 되지 않도록 방지합니다. 또는 인터럽트 되도록 활성화합니다.

Critical [, Off]
Critical 50 ; 아래의 논평을 보십시오.

첫 매개변수가 생략되면 (또는 단어가 On이면), 현재 쓰레드를 임계 값으로 만듭니다. 다른 쓰레드가 인터럽트 할 수 없다는 뜻입니다. 첫 매개변수가 Off이면 (또는 v1.0.48+에서 0이면), 현재 쓰레드는 Thread Interrupt의 설정에 상관이 없이 즉시 인터럽트가 가능해집니다.

임계 쓰레드의 행위

우선순위가-높은 쓰레드와 다르게, 임계 쓰레드 동안 발생하는 이벤트는 폐기되지 않습니다. 예를 들어, 현재 쓰레드가 임계 상태인 동안 사용자가 핫키를 누르면 그 핫키는 현재 쓰레드가 종료하거나 비임계 쓰레드가 될 때 까지 무한정 버퍼 처리되다가, 종료하는 그 순간 그 핫키가 새 쓰레드로 기동됩니다.

임계 쓰레드는 비상 시에만 인터럽트 됩니다. 비상 시란 다음과 같이 구성됩니다:

  1. OnExit 서브루틴;
  2. 0x312 보다 작은 메시지 번호를 관제하는 OnMessage() 함수 (또는 그런 메시지가 촉발한 역호출 함수);
  3. 그리고 임계 쓰레드 자체가 간접적으로 촉발한 역호출 함수 (예, SendMessage 또는 DllCall를 통하여)
이런 인터럽트를 피하려면, 임시로 그런 함수들을 비활성화 시키십시오.

임계 쓰레드는 MsgBox나 기타 대화상자가 화면에 나타나면 인터럽트될 수 있습니다. 그렇지만, Thread Interrupt과 다르게, 이 쓰레드는 사용자가 대화상자를 취소하고 나면 다시 임계 쓰레드가 됩니다.

Critical Off

버퍼 처리된 이벤트가 새로운 쓰레드가 시작되기를 기다리고 있을 때, Critical Off를 사용하면 현재 쓰레드를 즉시 인터럽트하지 않습니다. 대신에, 평균 5 밀리초가 지난 다음 인터럽트가 일어납니다. 이렇게 하면 Critical Off 뒤에 적어도 한 줄이 인터럽트 전에 실행될 확률이 99.999% 이상입니다. 강제로 인터럽트를 즉시 일어나게 할 수 있습니다. 아직 존재하지 않는 창에 대하여 Sleep -1 또는 WinWait와 같은 지연을 사용하면 됩니다.

Critical Off는 현재 쓰레드가 임계 쓰레드가 아니었더라도 그의 인터럽트 불가침성을 취소합니다. 그러므로 GuiSize와 같은 이벤트를 더 빨리 더 예측 가능하게 처리할 수 있습니다.

쓰레드 설정

임계값의 현재 설정을 저장하고 복구하는 법은 A_IsCritical을 참조하십시오. 그렇지만, 임계값은 쓰레드에-종속적인 설정이므로, 임계 쓰레드가 끝나면, 그 아래의/재개된 쓰레드는 (있다면) 자동으로 비임계 쓰레드가 됩니다. 결론적으로 쓰레드를 끝내기 바로 전에 "Critical Off"를 할 필요가 없습니다.

자동 실행 섹션에 (스크립트이 상단 부분) 임계값이 사용되지 않으면, 모든 쓰레드는 비임계 값으로 시작합니다 (그렇지만 Thread Interrupt 설정을 영향을 미칩니다). 대조적으로, 자동-실행 섹션에서 임계값을 켜고 다시 끄지 않으면, 새로 기동하는 매 쓰레드마다 (핫키, 맞춤 메뉴 항목, 또는 시간 제한 서브루틴 등은) 임계값으로 시작합니다.

명령어 Thread NoTimers는 Critical과 비슷하지만 타이머의 인터럽트만 방지한다는 점이 다릅니다.

v1.0.47+에서, Critical을 켜두고 SetBatchLines -1를 배치하면 현재 쓰레드에 영향을 미칩니다.

메시지 점검 간격

v1.0.47+에서, 양의 정수를 첫 매개변수로 지정하면 (예를 들어, Critical 30) 임계값이 켜질 뿐만 아니라 내부 메시지 큐를 점검하는 간격이 수 밀리초로 변경됩니다. 지정하지 않으면, 임계값이 켜져 있는 동안 메시지는 매 16 밀리초마다 점검됩니다. 그리고 꺼져 있으면 매 5초마다 점검됩니다. 점검 간격을 증가시키면 메시지/이벤트의 도착을 지연시킵니다. 그래서 현재 쓰레드는 더 시간을 가지고 종료할 수 있습니다. 이렇게 하면 "이미 실행 중인 쓰레드 때문에" 어떤 OnMessage() 그리고 GUI 이벤트가 소실될 가능성이 줄어듭니다. 그렇지만, Sleep와 WinWait같은 대기 명령어는 이 설정에 관계 없이 메시지를 점검합니다 (우회책은 DllCall("Sleep", Uint, 500)입니다). 주의: 메시지-점검 간격을 너무 많이 늘리면 GUI 창 다시 그리기와 같은 다양한 이벤트에 반응하지 못할 수 있습니다.

관련 항목

Thread (command), Threads, #MaxThreadsPerHotkey, #MaxThreadsBuffer, OnMessage(), RegisterCallback(), Hotkey, Menu, SetTimer

예제

#space::  ; Win+Space 핫키.
Critical
ToolTip 이 툴팁이 사라진 후에만 새 쓰레드가 시작합니다.
Sleep 3000
ToolTip  ; 팁을 끕니다.
return  ; 핫키 서브루틴으로부터 반환되면 쓰레드가 종료됩니다. 재개 될 아래의 쓰레드는 정의상 임계값이 아닙니다.


DetectHiddenText

창을 찾기 위한 목적으로 창에서 보이지 않은 텍스트를 "보여줄지 말지" 결정합니다. 이것은 IfWinExist 그리고 WinActivate와 같은 명령어들에 영향을 줍니다.

DetectHiddenText, On|Off

매개변수

On|Off

On: 이것이 기본 값입니다. 숨은 텍스트가 탐지됩니다.

Off: 숨은 텍스트는 탐지되지 않습니다.

논평

"숨은 텍스트"는 창에서 보이지 않는 콘트롤을 가리키는 용어입니다. 그래서 그의 텍스트도 "숨은"것으로 간주합니다. DetectHiddenText를 끄면 멀티-탭 대화상자 또는 다중-판 창에서 다른 판 사이의 차이를 발견하고 싶을 때 유용합니다. Window Spy를 사용하면 현재 활성 창에서 숨어 있는 텍스트를 알아낼 수 있습니다. WinText를 매개변수로 하는 명령어는 모두 이 설정에 영향을 받습니다. 여기에는 WinActivate, IfWinActive, WinWait, 그리고 IfWinExist가 포함됩니다.

내장 변수 A_DetectHiddenText에 현재 설정이 들어 있습니다 (On 또는 Off).

새로 기동된 쓰레드는 (핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 값을 가지고 새롭게 시작합니다. 이 기본 값은 자동-실행 섹션 (스크립트 상단)에서 이 명령어를 사용하여 바꿀 수 있습니다.

관련 항목

DetectHiddenWindows

예제

DetectHiddenText, off


DetectHiddenWindows

스크립트에 보이지 않은 창을 "보여줄지 말지" 결정합니다.

DetectHiddenWindows, On|Off

매개변수

On|Off

On: 숨은 창을 탐지합니다.

Off: 이것이 기본값입니다. 숨은 창은 탐지되지 않습니다. 단,WinShow 명령어로는 탐지할 수 있습니다.

논평

DetectHiddenWindows를 켜면 어떤 경우 스크립팅이 힘들어질 수 있습니다. 왜냐하면 어떤 숨은 시스템 창이 우발적으로 여러분이 작업을 시도하는 텍스트 또는 창 제목에 부합해 버릴 수 있기 때문입니다. 그래서 대부분의 스크립트는 이 설정을 끈 상태로 두어야 합니다. 그렇지만, 숨은 창과 직접적으로 작업을 하고 싶다면 켜는게 좋습니다. 작업 전에 먼저 WinShow를 사용하여 보여주어야 할 필요가 없습니다.

모든 창 명령어는 WinShow를 제외하고 이 설정에 영향을 받습니다. 여기에는WinActivate, IfWinActive, WinWait, IfWinExist가 포함됩니다. 대조적으로, WinShow는 언제나 숨은 창을 보여줍니다. 숨은 창 탐지가 켜져 있지 않더라도 상관없습니다.

ahk_id method를 통하여 또는 마지막 발견 창으로 콘트롤이나 자손 창에 접근할 때 DetectHiddenWindows을 켤 필요가 없습니다. 또 GUI 창에 Gui +LastFound를 통하여 접근할 때도 필요 없습니다.

내장 함수 A_DetectHiddenWindows에 현재 설정이 담겨 있습니다 (On 또는 Off).

새로 기동된 쓰레드는 (핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어의 기본 값을 가지고 새로 시작합니다. 이 기본 값은 자동 실행 섹션 (스크립트 상단)에서 이 명령어를 사용하여 바꿀 수 있습니다).

관련 항목

DetectHiddenText

예제

DetectHiddenWindows, on


DllCall()

표준 Windows API 함수 같이, DLL안의 함수를 호출합니다.

Result := DllCall("[DllFile\]Function" [, Type1, Arg1, Type2, Arg2, "Cdecl ReturnType"])

매개변수

Result

DllCall은 함수가 돌려주는 실제 값을 돌려줍니다. 함수가 값을 돌려주지 않는 유형이라면, 그 결과는 정의되지 않은 정수입니다. 에러 때문에 함수를 호출할 수 없다면, 그 결과 값은 비어 있습니다(빈 문자열).

[DllFile\]Function

DLL이나 EXE 파일 이름 다음에 역사선 그리고 함수의 이름이 따라옵니다. 예를 들어: "MyDLL\MyFunction" (확장자가 생략되면 ".dll"이 기본값입니다). 절대 경로를 지정하지 않으면, DllFile은 시스템 PATH 또는 A_WorkingDir에 있다고 간주됩니다.

DllFile은 User32.dll, Kernel32.dll, ComCtl32.dll, 또는 Gdi32.dll에 거주하는 함수들을 호출할 때 생략할 수 있습니다. 예를 들어, "User32\IsWindowVisible"는 "IsWindowVisible"와 결과가 같습니다.

함수가 주어진 이름으로 발견되지 않으면, A (ANSI) 또는 W (Unicode) 접미사를 어느 버전의 오토핫키가 스크립트를 실행중인가에 기반하여 자동으로 추가합니다. 예를 들어, "MessageBox"는 ANSI 버전은 "MessageBoxA" 그리고 유니코드 버전은 "MessageBoxW"와 같습니다.

반복적으로 DLL에 호출할 경우 미리 적재하면 수행성능을 극적으로 향상시킬 수 있습니다.

v1.0.46.08+에서, 이 매개변수는 정수 만으로 구성될 수 있습니다. 호출할 함수의 주소로 번역됩니다. 그런 주소의 소스로는 COM 그리고 RegisterCallback()이 포함됩니다.

Type1, Arg1

각 쌍마다 함수에 건네질 하나의 매개변수를 나타냅니다. 쌍의 개수는 제한이 없습니다. Type에 관한 것은 아래의 유형 테이블을 참조하십시오. Arg에 대하여, 함수에 건넬 값을 지정합니다.

Cdecl ReturnType

단어 Cdecl은 보통 생략합니다. 대부분의 함수가 표준 호출 관례를 사용하지 "C" 호출 관례를 사용하지는 않기 때문입니다 (wsprintf 함수와 같이 가변 개수의 인자를 받는 함수는 예외로 합니다). Cdecl을 생략했지만 호출에서 ErrorLevel An를 산출한다면 -- 여기에서 n는 건넨 인자들의 총 크기입니다 -- Cdecl이 필요할 수 있습니다. 대부분의 객체-지향 C++ 함수는 thiscall 관례를 사용하지만, 이는 지원하지 않습니다.

존재한다면, 단어 Cdecl은 반환 유형보다 (있다면) 먼저 나타나야 합니다. 다음 단어와 스페이스나 탭으로 분리하십시오. 예를 들어: "Cdecl Str".

[AHK_L 53+]: 별도로 "C" 호출 관례는 64-비트 코드에 존재하지 않기 때문에, Cdecl을 지정해도 64-비트 빌드의 오토핫키에서는 아무 효과가 없을 수 있습니다.

ReturnType: 함수가 32-비트 부호있는 정수 (Int), BOOL을 돌려주거나, 또는 아무것도 돌려주지 않으면, ReturnType을 생략할 수 있습니다. 그렇지 않으면, 아래의 유형 테이블에 있는 인자 중 하나를 지정하십시오. 별표 접미사도 지원됩니다.

인자의 유형과 반환 값

Str

"Blue"나 MyVar 같은 문자열. 호출된 함수가 그 문자열을 변경하고 인자가 비보호 변수이면, 그의 내용이 갱신됩니다. 예를 들어, 다음 호출은 MyVar의 내용을 대문자로 변경합니다: DllCall("CharUpper", "Str", MyVar).

그렇지만, 함수가 한 변수의 현재 내용보다 더 큰 문자열을 저장하도록 설계되었다면, 변수가 충분히 더 큰지 먼저 점검한 다음 그 함수를 호출하십시오. VarSetCapacity(MyVar, 123)를 호출해 보면 알 수 있습니다. 여기에서 123은 MyVar가 보유할 수 있는 길이입니다.

Str 인자는 숫자로 평가되는 표현식이 되면 안됩니다 (예를 들어, i+1). 그렇다면, 함수는 호출되지 않으며 ErrorLevel은 -2로 설정됩니다.

별표 변수 "Str*"은 지원되지만 거의 사용되지 않습니다. "TCHAR **" 또는 "LPTSTR *" 같은 것을 기대하는 함수와 함께 사용할 수 있습니다.

주의: 문자열을 함수에 건넬 때, 함수가 어떤 유형의 문자열을 기대하는지 인지해야 합니다.
AStr
WStr 		[AHK_L 42+]: ANSI 문자열 또는 Unicode (Wide character) 문자열. 동등한 Win32 유형과 기타 자세한 사항은 스크립트 호환성을 참조하십시오.
Int64 | 64-비트 정수로서, 범위는 -9223372036854775808 (-0x8000000000000000)부터 9223372036854775807 (0x7FFFFFFFFFFFFFFF)까지입니다.
Int

32-비트 정수로서 (일반적인 정수 유형), 범위는 -2147483648 (-0x80000000)부터 2147483647 (0x7FFFFFFF)까지입니다. Int는 종종 "Long"이라고도 부릅니다.

Int는 또 BOOL 인자를 기대하는 함수에 사용할 수 있습니다 (BOOL 값은 1 또는 0입니다).

부호없는 Int (UInt)도 상당히 자주 사용됩니다. 예를 들어 DWORD.
Short | 16-비트 정수로서 범위는 -32768 (-0x8000)부터 32767 (0x7FFF)까지입니다. 부호없는 Short (UShort)는 WORD를 기대하는 함수에 사용할 수 있습니다.
Char | 8-비트 정수입니다. 범위는 -128 (-0x80)부터 127 (0x7F)까지입니다. 부호없는 character (UChar)는 BYTE를 기대하는 함수에 사용할 수 있습니다.
Float | 32-비트 부동 소수점 수입니다. 정밀도는 6자리입니다.
Double | 64-비트 부동 소수점 수. 정밀도는 15자리입니다.
Ptr

[AHK_L 42+]: 포인터-ㅋ기의 정수로서, . 스크립트를 실행하는 버전이 32비트인가 아니면 64비트인가에 따라 Int 또는 Int64와 동등합니다. Ptr은 배열이나 구조체를 가리키는 포인터 (RECT* 또는 LPPOINT) 그리고 거의 모든 핸들과 (HWND, HBRUSH 또는 HBITMAP) 함께 사용해야 합니다. 매개변수가 LPDWORD 또는 int*와 같이 단일 숫치 값을 가리키는 포인터이면, 일반적으로 "Ptr" 대신에 * 또는 P 접미사를 사용해야 합니다.

Ptr은 또 * 또는 P 접미사와도 사용가능합니다; LPVOID* 류를 통하여 포인터를 출력하는 함수와 함께 사용해야 합니다.

UPtr도 유효하지만, 32-비트 빌드에서는 부호가 없습니다. 오토핫키가 부호없는 64-비트 정수를 지원하지 않기 때문입니다.

예전 버전의 오토핫키와 호환이 필요하면, 아래에 보여주는 바와 같이 변수 유형을 사용하십시오:

Ptr := A_PtrSize ? "Ptr" : "UInt" ; A_PtrSize가 정의되어 있지 않으면 대신 UInt를 사용합니다.
DllCall("DeleteFile", Ptr, &filename) ; Ptr 둘레에 인용 부호를 생략합니다.

주의: NULL 핸들이나 포인터를 건네려면, 정수 0을 건네십시오.
* or P
(suffix)

별표를 (선택적으로 앞에 스페이스와 함께) 위의 유형에 추가하면 값 자체가 아니라 인자의 주소가 건네집니다 (호출되는 함수는 그것을 받아들이도록 설계되어 있어야 합니다). 그런 인자의 값은 함수가 변경할 수 있기 때문에, naked 변수가 인자로 건네질 때마다, 그 변수의 내용은 갱신됩니다. 예를 들어, 다음 호출은 MyVar의 내용을 MyFunction에 주소로 건넵니다. 그러나 MyVar도 갱신되어 MyFunction 함수의 변경을 반영합니다: DllCall("MyDll\MyFunction", "Int*", MyVar).

일반적으로, 별표는 함수에 인자 유형이나 반환 유형이 "LP"로 시작할 때마다 사용됩니다. 가장 흔한 예는 LPDWORD인데, 이는 DWORD 값을 가리키는 포인터입니다. DWORD는 부호 없는 32-비트 정수이기 때문에 "UInt*"나 "UintP"를 사용하여 LPDWORD를 표현하십시오. 별표는 LPTSTR와 같은 문자열 유형, LPRECT와 같이 구조체를 가리키는 포인터, 또는 배열에 사용하면 안됩니다; 여기에 대해서는, 변수를 건네는가 아니면 그의 주소를 건네는가에 따라, "Str"이나 "Ptr"을 사용해야 합니다..

주의: "Char*"는 "Str"과 같지 않습니다. 왜냐하면 "Char*"는 8-비트 숫자의 주소를 건네는 반면에, "Str"은 일련의 문자열의 주소를 건네기 때문입니다. 문자는 오토핫키의 버전에 따라, 8-비트 (ANSI) 또는 16-비트 (Unicode)일 수 있습니다. 비슷하게, "UInt*"는 32-비트 숫자의 주소를 건넵니다. 그래서 함수가 값의 배열 또는 32비트보다 더 큰 구조를 기대할 경우 사용하면 안 됩니다.

오토핫키의 변수는 유형이 고정되어 있지 않기 때문에, 함수에 건네는 주소는 변수 자체가 아니라 임시 메모리를 가리킵니다. 변수에 VarSetCapacity을 호출할 필요가 없습니다. 함수가 반환되면 DllCal이 올바르게 그 변수를 갱신해 줄 것이기 때문입니다.
U (prefix)

위의 정수 유형 앞에 문자 U를 배치하면 부호없는 정수로 번역됩니다 (UInt64, UInt, UShort, 그리고 UChar). 엄밀히 말해, 이것은 반환 값과 별표 변수에만 필요합니다. 왜냐하면 값으로 건네어진 인자가 부호가 있는지 없는지 신경쓰지 않기 때문입니다 (Int64는 제외).

부호없는 인자에 음의 정수를 지정하면, 되면, 그 정수는 부호없는 영역으로 변환됩니다. 예를 들어, -1을 UInt로 보내면, 0xFFFFFFFF이 됩니다.

함수가 생산하는 Unsigned 64-비트 정수는 지원하지 않습니다. 그러므로, 0x8000000000000000 이상의 수와 작업하려면, U 접두사를 생략하고 함수로부터 받은 음의 정수 값은 거대한 정수로 번역하십시오. 예를 들어, -1을 Int64로 산출하는 함수는 실제로 0xFFFFFFFFFFFFFFFF을 생산하고 있는 것입니다. UInt64를 산출하도록 설계되어 있다면 말입니다.

주의: 인자 유형 또는 반환 유형을 지정할 때 스페이스나 별표가 들어 있지 않으면, 그 주위에 인용부호를 두루지 않아도 됩니다. 예를 들어, Str을 "Str" 대신에 사용할 수 있고 CDecl을 "CDecl" 대신 사용할 수 있습니다. 게다가, 문자 P를 별표 대신 사용해도 인용부호를 생략할 수 있습니다. 예를 들어: UIntP.

ErrorLevel

[v1.1.04+] 이 함수는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 다음 값 중 하나로 설정되어 호출이 성공했는지 실패했는지를 알려줍니다.

0: 성공.

-1 (음수 1): [DllFile\]Function 매개변수는 부동 소수점 수입니다. 문자열 또는 음수가 필요합니다.

-2: 반환 유형 또는 지정된 인자 유형중 하나가 유효하지 않습니다. 이 에러는 숫자로 평가되는 표현식을 문자열에 건네도 일어납니다 (str).

-3: 지정된 DllFile에 접근 또는 적재할 수 없습니다. DllFile 파일에 명시적으로 경로가 지정되지 않았다면, 그 파일은 시스템에 PATH 또는 A_WorkingDir에 존재해야 합니다. 이 에러는 사용자가 파일에 접근권한이 없을 경우, 또는 오토핫키가 32비트이고 DLL이 64-비트 또는 그 반대인 경우에도 일어날 수 있습니다.

-4: 지정된 함수를 DLL 안에서 발견할 수 없습니다.

N (양의 정수): 함수가 호출되었지만 치명적인 에러 번호 N과 함께 실패했습니다 (예를 들어, 0xC0000005는 "무단 접근"을 뜻합니다). 그런 경우, 함수는 빈 값(빈 문자열)을 돌려주지만, 별표 변수는 모두 여전히 갱신됩니다. 치명적인 예외의 예는 NULL과 같은 무효한 포인터를 참조하는 것입니다. Cdecl 함수는 다음 문단에서 절대로 "An" 에러를 생산하지 않기 때문에, 너무 인자를 적게 건네면 예외가 일어날 수도 있습니다.

An (문자 A 다음에 정수 n): 함수가 호출되었지만 인자를 너무 많게 또는 너무 적게 건넸습니다. "n"는 인자 리스트에서 올바르지 않은 바이트의 개수입니다. n이 양수이면, 너무 많은 (또는 너무 큰 인자를) 인자를 건넸기 때문입니다. 그렇지 않으면 CDecl로 호출해야 합니다. n이 음수이면, 너무 적게 인자를 건넸기 때문입니다. 이 상황은 함수의 연산의 신뢰성을 위해 반드시 교정해야 합니다. 이 에러의 존재는 또한 예외가 일어났다는 것을 가리킵니다. 이 경우 함수는 빈 문자열을 돌려줍니다. x64 호출 관례 때문에, 64-비트 빌드는 ErrorLevel에 An을 설정하지 않습니다.

예외와 A_LastError

내장 예외 처리에도 불구하고, 여전히 스크립트가 DllCall과 충돌할 가능성이 있습니다. 이런 일은 함수가 직접적으로 예외를 일으키지 않고 종료하지 않는 문자열이나 나쁜 포인터 같이 뭔가 부적적한 것을 산출할 경우 일어날 수 있습니다. 스크립트가 적당하지 않은 값을 건넸다면, 예를 들어, 나쁜 포인터나 가용 능력이 불충분한 "str"을 건넸다면 이것은 함수의 잘못이 아닐 수 있습니다. 부적절한 인자 유형이나 반환 유형을 지정할 때에도 스크립트가 충돌할 수 있습니다. 예를 들어 함수가 생산한 보통의 정수를 별표 변수 또는 str이기를 요구하면 충돌합니다.

내장 변수 A_LastError에는 운영 체제의 GetLastError() 함수의 결과 값이 담겨 있습니다. 이 함수는 해당 함수가 호출된 후에 바로 호출됩니다. (이 때문에 받는 수행성능의 충격은 측정할 수 없습니다). A_LastError는 0부터 4294967295 사이의 숫자입니다 (언제나 십진수로 포맷됩니다. 십육진수로 포맷되지 않습니다). ErrorLevel처럼, A_LastError은 쓰레드마다 설정됩니다; 즉, 다른 쓰레드가 인터럽트 하더라도 변하지 않습니다. 그렇지만, A_LastError는 Run/RunWait로도 설정될 수 있습니다.

수행성능

DLL을 반복적으로 호출할 때, 명시적으로 적재하면 수행성능이 극적으로 향상됩니다 ( User32와 같은 표준 DLL에는 필요하지 않습니다. 언제나 메모리에 상주하기 때문입니다). 이런 관례를 차용하면 DllCall은 내부적으로 매번 LoadLibrary와 FreeLibrary를 호출할 필요가 없어집니다:

hModule := DllCall("LoadLibrary", "Str", "MyFunctions.dll", "Ptr")  ; 회돌이 안에서 DllCall()이 라이브러리를 적재할 필요가 없습니다.
Loop, C:\My Documents\*.*, , 1
    result := DllCall("MyFunctions\BackupFile", "Str", A_LoopFileFullPath)
DllCall("FreeLibrary", "Ptr", hModule)  ; 메모리를 절약하기 위해, DLL은 사용한 다음 내려도 됩니다.

v1.0.46.08+에서는 함수의 주소를 미리 찾아놓으면 훨씬 더 빠르게 수행성능을 개선시킬 수 있습니다. 예를 들어:

; 다음 예제에서, DLL이 아직 적재되지 않았다면, GetModuleHandle 대신 LoadLibrary를 사용합니다.
MulDivProc := DllCall("GetProcAddress", Ptr, DllCall("GetModuleHandle", Str, "kernel32", "Ptr"), AStr, "MulDiv", "Ptr")
Loop 500
    DllCall(MulDivProc, Int, 3, Int, 4, Int, 3)

[AHK_L 31+]: DllCall의 첫 번째 매개변수가 "MulDiv"와 같은 기호 문자열이고 그 함수를 담고 있는 DLL이 보통 스크립트가 실행되기 전에 적재되어 있다면, 그 문자열은 자동으로 함수 주소로 결정됩니다. 이런 내장 최적화는 위에 보여준 예제보다 더 효과적입니다.

또한, 스크립트의 아무데나 #NoEnv줄을 추가하면 인용부호 없는 매개변수 유형이 사용될 때 (예, Int vs. "Int") DllCall의 수행성능이 향상됩니다.

마지막으로, 문자열-변수를 함수에 건넬 때 그 함수가 문자열의 길이를 변경하지 않을 경우, 그 변수를 "str" 이 아니라 (특히 문자열이 아주 길 때) 주소로 보내면 (예, &MyVar) 수행성능을 향상시킬 수 있습니다. 다음 예제는 문자열을 대문자로 변환합니다: DllCall("CharUpper", Ptr, &MyVar, Ptr).

구조체와 배열

구조체는 메모리에 서로 이웃해 저장된 멤버 (필드) 집단입니다. 대부분의 멤버는 정수인 경향이 있습니다.

구조체의 주소를 (또는 메모리-블록 배열을) 받는 함수는 그 구조체의 날 이진 데이터를 보통 변수에 저장하면 호출할 수 있습니다. 일반적으로 다음 단계를 밟습니다:

1) VarSetCapacity(MyStruct, 123, 0)를 호출하여 목표 변수가 그 구조체의 데이터를 수용할 만큼 충분한지 확인합니다. 123을 적어도 그 구조체의 크기만큼 큰 숫자로 교체합니다. 선택적으로 마지막 매개변수에 0을 지정할 수 있습니다; 모든 멤버가 이진 0으로 초기화됩니다. 전형적으로 이렇게 해서 다음 단계에서 NumPut()이 자주 호출되는 것을 막습니다.

2) 목표 함수가 구조체에 있는 값들을 최초로 사용한다면, NumPut(123, MyStruct, 4, "UInt")을 호출해 모든 멤버들을 0아닌 값으로 초기화합니다. 123을 목표 멤버 안에 배치될 정수로 교체합니다 (또는 &Var에 변수의 주소를 저장하도록 지정합니다). 4를 목표 멤버의 오프셋으로 교체합니다 ( "오프셋" 설명은 step #4를 참조합니다). "UInt"를 적절한 유형으로 교체하거나 멤버가 포인터나 핸들이라면 생략합니다.

3) 목표 함수를 호출합니다. MyStruct의 주소를 UInt (또는 AHK_L 42+에서는 Ptr) 인자로 건넵니다. 예를 들어, DllCall("MyDll\MyFunc", Ptr, &MyStruct). 함수는 멤버들을 조사해 보고 필요하면 변경합니다.

4) MyInteger := NumGet(MyStruct, 4, "UInt")를 사용하면 구조체로부터 원하는 값을 얼마든지 열람할 수 있습니다. 4를 구조체에 있는 목표 멤버의 오프셋으로 교체합니다. 첫 멤버는 언제나 0에 있습니다. 두 번째 멤버는 오프셋 0부터 첫 멤버의 크기를 더한 위치에 있습니다 (전형적으로 4). 두 번째를 넘어선 멤버의 위치는 바로 앞 멤버의 오프셋의 위치에 그 크기를 더한 위치에 있습니다. 대부분이 멤버는 -- DWORD, Int, 그리고 키타 32-비트 정수 유형 -- 크기가 4 바이트입니다. "UInt"를 적절한 유형으로 교체하거나 멤버가 포인터나 핸들이면 생략하십시오.

실제 사용법은 구조체 예제를 참조하십시오.

알려진 한계

배열의 주소를 (예, &MyVar) 함수에 건넬 때 그 함수가 변수의 내용의 길이를 변경하면, 그 다음부터 변수를 사용하면 올바르게 작동하지 않을 가능성이 있습니다. 이를 해결하려면, 다음 중 하나의 조치를 수행하십시오: 1) MyVar를 Ptr/address가 아니라 "Str" 인자로 건네십시오; 2) v1.0.44.03+에서, VarSetCapacity(MyVar, -1)를 호출하면 DllCall을 호출한 후에 변수의 내부에 저장된 길이가 갱신됩니다. .

함수가 변수에 저장한 이진값 0은 그 오른쪽의 모든 데이터를 감추어 버립니다; 즉, 그런 데이터는 대부분의 명령어와 함수에서 접근하거나 변경할 수 없습니다. 그렇지만, 주소 연산자 그리고 NumPut/NumGet, 뿐만 아니라 DllCall 자체로 조작할 수 있습니다.

자신에게 건네어진 문자열의 주소를 돌려주는 함수는 예상과 다르게 다른 메모리 주소에 동일한 문자열을 돌려줄 가능성이 있습니다. 예를 들어, 프로그래밍 언어로 CharLower(CharUpper(MyVar))를 호출하면 MyVar의 내용이 소문자로 변환됩니다. 그러나 같은 일을 DllCall()로 하면, MyVar는 그 다음 호출 뒤에 대문자가 됩니다. 왜냐하면 CharLower는 MyVar와 내용이 동일한 다른/임시 문자열에 연산을 수행하기 때문입니다 :

MyVar = ABC
result := DllCall("CharLower", str, DllCall("CharUpper", Str, MyVar, Str), Str)

이를 우회하려면, 위에서 두 개의 밑줄 붙은 "Str" 값을 Ptr로 변경하십시오. 이렇게 하면 CharUpper의 반환 값이 순수한 주소로 번역됩니다. CharLower에 정수로 건네어질 것입니다.

문자열을 다룰 때 다른 한계를 마주할 수도 있습니다. 자세한 것은 스크립트 호환성을 참조하십시오.

컴포넌트 객체 모델 (COM)

COM 객체는 VBScript와 비슷한 언어로 접근할 수 있으며 전형적으로 오토핫키의 ComObjCreate, ComObjGet 또는 ComObjActive 그리고 내장 객체 구문을 통하여 접근할 수도 있습니다.

IDispatch를 지원하지 않는 COM 객체는 DllCall과 함께 사용하려면 함수의 주소를 그 객체 인터페이스의 가상 함수 테이블에서 열람합니다. 더 자세한 것은 아래의 예제를 참조하십시오.

.NET 프레임워크 대부분도 COM과 DllCall을 통하여 접근할 수 있습니다. 다음http://www.autohotkey.com/forum/topic26191.html을 참조하십시오.

관련

스크립트 호환성, PostMessage, OnMessage(), RegisterCallback(), Run, VarSetCapacity, Functions, SysGet, MSDN Library

예제

; 예제: Windows API 함수 "MessageBox"를 호출하고 사용자가 누른 버튼을 보고합니다.

WhichButton := DllCall("MessageBox", "Int", "0", "Str", "Press Yes or No", "Str", "Title of box", "Int", 4)
MsgBox You pressed button #%WhichButton%.
; 예제: 바탕화면 화면을 지정된 비트맵 파일로 바꿉니다 (.bmp).

DllCall("SystemParametersInfo", UInt, 0x14, UInt, 0, Str, A_WinDir . "\winnt.bmp", UInt, 2)
; 예제: API 함수 "IsWindowVisible"를 호출해 노트패드 창이 보이는지 알아냅니다.

DetectHiddenWindows On
if not DllCall("IsWindowVisible", "Ptr", WinExist("Untitled - Notepad"))  ; WinExist() returns an HWND.
    MsgBox The window is not visible.
; 예제: API의 wsprintf()를 호출해  432 숫자 앞에 0을 덧대어 10 자리 너비의 문자로 만듭니다 (0000000432).

VarSetCapacity(ZeroPaddedNumber, 20)  ; 변수가 새 문자열을 받을 만큼 충분히 큰지 확인합니다.
DllCall("wsprintf", "Str", ZeroPaddedNumber, "Str", "%010d", "Int", 432, "Cdecl")  ; Cdecl 호출 관례를 요구합니다.
MsgBox %ZeroPaddedNumber%
; 예제: QueryPerformanceCounter()의 사용법을 보여줍니다. A_TickCount의 10ms 보다 더 정밀도가 높습니다.

DllCall("QueryPerformanceCounter", "Int64*", CounterBefore)
Sleep 1000
DllCall("QueryPerformanceCounter", "Int64*", CounterAfter)
MsgBox % "Elapsed QPC time is " . CounterAfter - CounterBefore
; 예제: 임시로 마우스의 속도를 줄여주는 핫키입니다. 더 정밀하게 위치를 잡는데 도움이 됩니다.
; F1 키를 누르면 커서의 속도가 느려집니다. 떼면 원래의 속도로 돌아옵니다.

F1::
SPI_GETMOUSESPEED = 0x70
SPI_SETMOUSESPEED = 0x71
; 나중에 복구할 수 있도록 현재 속도를 열람합니다:
DllCall("SystemParametersInfo", UInt, SPI_GETMOUSESPEED, UInt, 0, UIntP, OrigMouseSpeed, UInt, 0)
; 이제 마우스를 더 느린 속도로 지정합니다. 가장 마지막 매개변수 바로 앞에 지정되어 있습니다 (범위는  1-20이고, 10이 기본값입니다):
DllCall("SystemParametersInfo", UInt, SPI_SETMOUSESPEED, UInt, 0, Ptr, 3, UInt, 0)
KeyWait F1  ; 키보드 자동 반복 때문에 DllCall이 반복적으로 호출되는 것을 방지합니다.
return

F1 up::DllCall("SystemParametersInfo", UInt, 0x71, UInt, 0, Ptr, OrigMouseSpeed, UInt, 0)  ; 원래 속도를 복구합니다
; 예제: 창의 유일한 ID 그리고 그의 콘트롤 중 ClassNN이나 텍스트를 건넬 때,
; 다음 함수는 그 콘트롤의 HWND (유일한 ID)를 돌려줍니다.
; v1.0.43.06+: 이 함수는 다음 명령어로 교체되었습니다. 이것이 더 정확합니다.

ControlGet, OutputVar, Hwnd,, ClassNN, WinTitle
; 예제: 활성 창을 관제하고 초점이 있는 콘트롤 안에서 그의 수직 스크롤바의 위치를 (실시간으로 갱신하여) 보여줍니다.
; 이것은 v1.0.43.06+을 요구합니다. 왜냐하면 ControlGet Hwnd를 사용하기 때문입니다.

#Persistent
SetTimer, WatchScrollBar, 100
return

WatchScrollBar:
ActiveWindow := WinExist("A")
if not ActiveWindow  ; No active window.
    return
ControlGetFocus, FocusedControl, ahk_id %ActiveWindow%
if not FocusedControl  ; No focused control.
    return
; 툴팁에 수평 또는 수직 스크롤바의 위치를 보여줍니다:
ControlGet, ChildHWND, Hwnd,, %FocusedControl%, ahk_id %ActiveWindow%
ToolTip % DllCall("GetScrollPos", "Ptr", ChildHWND, "Int", 1)  ;  마지막 매개변수는 SB_VERT에 대해 1 for, SB_HORZ에 대해 0입니다.
return
; 예제: 작동하는 스크립트입니다. 텍스트를 파일에 쓴다음 다시 메모리로 읽어 들입니다 (v1.0.34+ 요구).
; 이 메쏘드를 사용하면 여러 파일을 동시에 읽거나 쓸 경우 수행성능이 향상 됩니다.
; AHK_L 42+에서는 FileOpen을 사용하면, 같은 일을 할 수 있습니다.

FileSelectFile, FileName, S16,, Create a new file:
if FileName =
    return
GENERIC_WRITE = 0x40000000  ; 읽기가 아니라 쓰기 용도로 파일을 엽니다.
CREATE_ALWAYS = 2  ; 새 파일을 만듭니다 (기존의 파일을 덮어씀).
hFile := DllCall("CreateFile", Str, FileName, UInt, GENERIC_WRITE, UInt, 0, Ptr, 0, UInt, CREATE_ALWAYS, UInt, 0, Ptr, 0, Ptr)
if not hFile
{
    MsgBox Can't open "%FileName%" for writing.
    return
}
TestString = This is a test string.`r`n  ; 파일을 이런 식으로 쓸 때,  `n 말고 `r`n을 사용하여 새 줄을 시작하십시오.
DllCall("WriteFile", Ptr, hFile, Str, TestString, UInt, StrLen(TestString), UIntP, BytesActuallyWritten, Ptr, 0)
DllCall("CloseHandle", Ptr, hFile)  ; 파일을 닫습니다.

; 파일에 썼으므로 이제 다시 그 내용을 메모리로 읽어 들입니다.
GENERIC_READ = 0x80000000  ; 쓰기 말고 읽기 용도로 파일을 엽니다.
OPEN_EXISTING = 3  ; 이 모드는 열릴 파일이 이미 존재해야 함을 가리킵니다.
FILE_SHARE_READ = 0x1 ; This and the next are whether other processes can open the file while we have it open.
FILE_SHARE_WRITE = 0x2
hFile := DllCall("CreateFile", Str, FileName, UInt, GENERIC_READ, UInt, FILE_SHARE_READ|FILE_SHARE_WRITE, Ptr, 0, UInt, OPEN_EXISTING, UInt, 0, Ptr, 0)
if not hFile
{
    MsgBox Can't open "%FileName%" for reading.
    return
}
; 테스트 목적으로 변수를 비우지만, 가용 능력이 충분한지 확인하십시오:
BytesToRead := VarSetCapacity(TestString, StrLen(TestString))
DllCall("ReadFile", Ptr, hFile, Str, TestString, UInt, BytesToRead, UIntP, BytesActuallyRead, Ptr, 0)
DllCall("CloseHandle", Ptr, hFile)  ; 파일을 닫습니다.
MsgBox The following string was read from the file: %TestString%
; 예제: Win+C를 누를 때 마우스 커서를 감춥니다. 나중에 커서를 보여주려면, 다시 Win+C를 누릅니다.
; 스크립트는 www.autohotkey.com/forum/topic6107.html에서 얻을 수 있습니다.

OnExit, ShowCursor  ; 스크립트가 종료할 때 커서가 보이는지 확인합니다.
return

ShowCursor:
SystemCursor("On")
ExitApp

#c::SystemCursor("Toggle")  ; Win+C 핫키로 커서를 켜고 끕니다.

SystemCursor(OnOff=1)   ; INIT = "I","Init"; OFF = 0,"Off"; TOGGLE = -1,"T","Toggle"; ON = others
{
    static AndMask, XorMask, $, h_cursor
        ,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; 시스템 커서
        , b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13   ; 빈 커서
        , h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13   ; 기본 커서의 핸들
    if (OnOff = "Init" or OnOff = "I" or $ = "")       ; 요청될 때 또는 첫 번째로 호출될 때 초기화합니다
    {
        $ = h                                          ; 기본 커서를 활성화합니다
        VarSetCapacity( h_cursor,4444, 1 )
        VarSetCapacity( AndMask, 32*4, 0xFF )
        VarSetCapacity( XorMask, 32*4, 0 )
        system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
        StringSplit c, system_cursors, `,
        Loop %c0%
        {
            h_cursor   := DllCall( "LoadCursor", "Ptr",0, "Ptr",c%A_Index% )
            h%A_Index% := DllCall( "CopyImage", "Ptr",h_cursor, "UInt",2, "Int",0, "Int",0, "UInt",0 )
            b%A_Index% := DllCall( "CreateCursor", "Ptr",0, "Int",0, "Int",0
                , "Int",32, "Int",32, "Ptr",&AndMask, "Ptr",&XorMask )
        }
    }
    if (OnOff = 0 or OnOff = "Off" or $ = "h" and (OnOff < 0 or OnOff = "Toggle" or OnOff = "T"))
        $ = b  ; 빈 커서를 사용합니다
    else
        $ = h  ; 저장된 커서를 사용합니다

    Loop %c0%
    {
        h_cursor := DllCall( "CopyImage", "Ptr",%$%%A_Index%, "UInt",2, "Int",0, "Int",0, "UInt",0 )
        DllCall( "SetSystemCursor", "Ptr",h_cursor, "UInt",c%A_Index% )
    }
}
; 구조체 예제: RECT 구조체의 주소를 GetWindowRect()에 건넵니다.
; 구조체의 멤버가 창의 좌, 상, 우, 하의 위치에 설정됩니다 (화면에 상대적임).

Run Notepad
WinWait Untitled - Notepad  ; This also sets the "last found window" for use with WinExist() below.
VarSetCapacity(Rect, 16)  ; A RECT is a struct consisting of four 32-bit integers (i.e. 4*4=16).
DllCall("GetWindowRect", Ptr, WinExist(), Ptr, &Rect)  ; WinExist() returns an HWND.
MsgBox % "Left " . NumGet(Rect, 0, "Int") . " Top " . NumGet(Rect, 4, "Int")
    . " Right " . NumGet(Rect, 8, "Int") . " Bottom " . NumGet(Rect, 12, "Int")
; 구조체 예제: FillRect()에 RECT 구조체의 주소를 건넵니다.
; 이 구조체는 임시로 빨갛게 칠할 화면의 구역을 가리킵니다.

VarSetCapacity(Rect, 16, 0)  ; 4-바이트 정수를 수용하도록 가용능력을 설정하고 그 모두를 0으로 초기화합니다.
NumPut(A_ScreenWidth//2, Rect, 8, "Int")  ; 구조체에서 세 번째 정수는 "rect.right"입니다.
NumPut(A_ScreenHeight//2, Rect, 12, "Int") ; 구조체에서 네 번째 정수는 "rect.bottom"입니다.
hDC := DllCall("GetDC", "Ptr", 0, "Ptr")  ; 0을 건네 데스크탑의 장치 문맥을 얻습니다.
hBrush := DllCall("CreateSolidBrush", "UInt", 0x0000FF, "Ptr")  ; 빨간색 브러쉬를 만듭니다 (BGR 형식으로 0x0000FF 임).
DllCall("FillRect", "Ptr", hDC, "Ptr", &Rect, "Ptr", hBrush)  ; 지정된 사각구역을 위의 브러쉬를 사용하여 채웁니다.
DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)  ; 청소.
DllCall("DeleteObject", "Ptr", hBrush)  ; 청소.
; 구조체 예제: 시스템 시계를 지정된 날짜와 시간으로 변경합니다.
; 앞으로 날짜를 변경할 때 주의하십시오. 일정이 잡혀 있는 작업이 너무 이르게 실행될 가능성이 있습니다!

SetSystemTime("20051008142211")  ; 시간도장을 건넵니다 (지역시간입니다. UTC아님).

SetSystemTime(YYYYMMDDHHMISS)
; 시스템 시계를 지정된 날짜와 시간으로 설정합니다.
; 호출자는 들어오는 매개변수가 유효한 날짜-시간 도장인지 확인해야 합니다
; (지역시간이지, UTC 시간이 아닙니다). 성공하면 0-아닌 값을 돌려주고 그렇지 않으면 0을 돌려줍니다.
{
    ; SetSystemTime()에 사용하기 위해 매개변수를 지역 시간에서  UTC 시간으로 변경합니다.
    UTC_Delta -= A_NowUTC, Seconds  ; 반올림 문제 때문에 초가 더 정확합니다.
    UTC_Delta := Round(-UTC_Delta/60)  ; 가장 가까운 분으로 반올림해 정확도를 확인합니다.
    YYYYMMDDHHMISS += UTC_Delta, Minutes  ; UTC로 변환하기 위해 오프셋을 적용합니다.

    VarSetCapacity(SystemTime, 16, 0)  ; 이 구조는 8개의 UShort로 구성됩니다(즉, 8*2=16).

    StringLeft, Int, YYYYMMDDHHMISS, 4    ; YYYY (해)
    NumPut(Int, SystemTime, 0, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 5, 2  ; MM (달, 1-12)
    NumPut(Int, SystemTime, 2, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 7, 2  ; DD (날)
    NumPut(Int, SystemTime, 6, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 9, 2  ; HH (24-시간제 시간)
    NumPut(Int, SystemTime, 8, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 11, 2 ; MI (분)
    NumPut(Int, SystemTime, 10, "UShort")
    StringMid, Int, YYYYMMDDHHMISS, 13, 2 ; SS (초)
    NumPut(Int, SystemTime, 12, "UShort")

    return DllCall("SetSystemTime", Ptr, &SystemTime)
}
/* 고급 구조체 예제:

1) DllCall()을 사용하여 TCP/IP 서버에 네트워크 접속을 만들고 그로부터 데이터를 받는 방법은 WinLIRC 클라이언트 스크립트를 참조하십시오.

2) 운영 체제는 사용자가 글꼴이나 컬러 또는 아이콘을 고를 수 있도록 표준 대화상자를 제공합니다.
이런 대화상자는 구조체를 사용하고 www.autohotkey.com/forum/topic17230.html에서 예를 보실 수 있습니다.

*/
/*
  예제: COM을 사용하여 임시로 활성 창을 태스크바에서 제거합니다.

  ITaskbarList의 VTable에 있는 메쏘드:
    IUnknown:
      0 QueryInterface  -- 대신 ComObjQuery를 사용하십시오
      1 AddRef          -- 대신 ObjAddRef 를 사용하십시오
      2 Release         -- 대신use ObjRelease 를 사용하십시오
    ITaskbarList:
      3 HrInit
      4 AddTab
      5 DeleteTab
      6 ActivateTab
      7 SetActiveAlt
*/
IID_ITaskbarList  := "{56FDF342-FD6D-11d0-958A-006097C9A090}"
CLSID_TaskbarList := "{56FDF344-FD6D-11d0-958A-006097C9A090}"

; TaskbarList 객체를 만들고 그의 주소를 tbl에 저장합니다.
tbl := ComObjCreate(CLSID_TaskbarList, IID_ITaskbarList)

activeHwnd := WinExist("A")

DllCall(vtable(tbl,3), "ptr", tbl)                     ; tbl.HrInit()
DllCall(vtable(tbl,5), "ptr", tbl, "ptr", activeHwnd)  ; tbl.DeleteTab(activeHwnd)
Sleep 3000
DllCall(vtable(tbl,4), "ptr", tbl, "ptr", activeHwnd)  ; tbl.AddTab(activeHwnd)

; 분배가 없는 객체는 언제나 수작업으로 해제해야 합니다.
ObjRelease(tbl)

vtable(ptr, n) {
    ; NumGet(ptr+0)은 객체의 가상 함수 데이블을 (간단히 말해 vtable을) 돌려줍니다
    ; 표현식에서 나머지는 vtable로부터 n 번째 함수의 주소의 주소를 열람합니다.

    return NumGet(NumGet(ptr+0), n*A_PtrSize)
}


Drive

CD 또는 DVD 드라이브의 트레이를 꺼내고 넣습니다. 또는 드라이브의 볼륨 라벨을 설정합니다.

Drive, Sub-command [, Drive , Value]

부-명령어, 드라이브, 그리고 볼륨 매개변수는 서로 의존적입니다. 그의 사용법은 아래에 기술합니다.

Label, Drive [, NewLabel]: Drive의 볼륨 라벨을 NewLabel로 바꿉니다 (NewLabel을 생략하면, 드라이브는 라벨이 없습니다). Drive는 드라이브 기호 다음에 쌍점과 선택적으로 역사선이 따라옵니다 (UNC와 맵핑된 드라이브에서도 작동). 예를 들어: Drive, Label, C:, Seagate200.

현재 라벨을 열람하려면, 다음 예제를 따르십시오: DriveGet, OutputVar, Label, C:.

Lock, Drive: 드라이브의 꺼내기 기능이 작동하지 못 하도록 막습니다. 예를 들어: Drive, Lock, D:. 대부분의 드라이브는 "열어둔 채로 잠글 수" 없습니다. 그렇지만, 열려 있는 동안에 드라이브를 잠그면 아마도 그 결과는 닫히는 순간 잠기게 될 것입니다. 이 명령어는 잠금을 지원하지 않는 드라이브에는 아무 효과가 없습니다 (대부분의 읽기-전용 드라이브). 드라이브가 스크립트에 의해 잠기고 그리고 그 스크립트가 끝나버리면, 그 드라이브는 또 다른 스크립트나 프로그램이 풀어줄 때까지 또는 시스템이 재시작할 때까지 그대로 잠겨 있습니다. 지정된 드라이브가 존재하지 않거나 잠금 특징을 지원하지 않으면, ErrorLevel에 1이 설정됩니다. 그렇지 않으면 0이 설정됩니다.

Unlock, Drive: 위와 반대입니다. 드라이브가 여러 번 잠겼다면 Unlock은 여러 번 실행할 필요가 있습니다 (적어도 어떤 드라이브는 해당됩니다). 예를 들어, Drive, Lock, D:이 세번 실행되었다면, Drive, Unlock, D:를 세 번 실행해야 잠금이 풀릴 것입니다. 이 때문에 그리고 드라이브가 현재 잠겨 있는지 확인할 방법이 없기 때문에, 그의 잠금 상태를 변수에 추적 관리하는 것이 유용합니다.

Eject [, Drive, 1]: CD 또는 DVD 드라이브의 트레이를 꺼냅니다 (다른 미디어 또는 장치의 유형을 꺼내려면, 이 페이지 하단의 DllCall 예제를 참조하십시오).

Drive 생략되면, 기본 값은 CD/DVD 드라이브가 사용됩니다. 트레이를 꺼내려면, 마지막 매개변수를 생략합니다. 트레이를 닫으려면 1을 마지막 매개변수에 지정합니다; 예를 들어: Drive, Eject, D:, 1.

Drive Eject 스크립트를 계속 진행하기 전에 꺼내기가 완료되기를 기다립니다. 트레이가 이미 올바른 상태에 있다면 (열려 있거나 또는 닫혀 있거나), ErrorLevel은 0이 설정됩니다 (즉, "에러 없음").

Drive Eject 네트워크 드라이브나 CD/DVD 드라이브가 아니면 작동하지 않습니다. 실패하면, ErrorLevel에 1이 설정됩니다.

이전의 트레이 상태를 탐지하는 것도 가능합니다. 명령어가 완료에 소비되는 시간을 측정해 보면 압니다. 예를 들어, 다음 핫키는 트레이가 반대 상태가 되도록 토글합니다:

#c::
Drive, Eject
; 명령어가 빨리 완료되었다면, 트레이는 아마도 이미 꺼내져 있을 것입니다.
; 그 경우 다시 넣습니다:
if A_TimeSinceThisHotkey < 1000  ; 필요하면 이 시간을 조절합니다.
    Drive, Eject,, 1
return

CD나 DVD 드라이브의 미디어의 상태를 결정하려면 (연주, 정지, 열림, 등등), DriveGet을 참조하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

논평

다음은 또다른 꺼내기 방법입니다. CD/DVD 말고도 다른 유형의 미디어/장치에도 작동합니다:

; 원하는 드라이브 기호에 일치시키려면 아래의 첫 줄을 갱신하십시오 (그 아래 다른 줄은 모두 무시해도 좋습니다).
Driveletter = I:  ; 여기에 꺼내고 싶은 드라이브 기호를 설정하십시오.

hVolume := DllCall("CreateFile"
    , Str, "\\.\" . Driveletter
    , UInt, 0x80000000 | 0x40000000  ; GENERIC_READ | GENERIC_WRITE
    , UInt, 0x1 | 0x2  ; FILE_SHARE_READ | FILE_SHARE_WRITE
    , UInt, 0
    , UInt, 0x3  ; OPEN_EXISTING
    , UInt, 0, UInt, 0)
if hVolume <> -1
{
    DllCall("DeviceIoControl"
        , UInt, hVolume
        , UInt, 0x2D4808   ; IOCTL_STORAGE_EJECT_MEDIA
        , UInt, 0, UInt, 0, UInt, 0, UInt, 0
        , UIntP, dwBytesReturned  ; Unused.
        , UInt, 0)
    DllCall("CloseHandle", UInt, hVolume)
}

관련 항목

DriveGet, DriveSpaceFree

예제

Drive, Label, D:, BackupDrive
Drive, Eject,, 1 ; 기본 CD 또는 DVD 드라이브의 트레이를 닫습니다(넣습니다).


DriveGet

컴퓨터 드라이브에 관하여 다양한 유형의 정보를 열람합니다.

DriveGet, OutputVar, Cmd [, Value]

매개변수

OutputVar

Cmd의 결과를 저장할변수의 이름.

Cmd, Value
아래 리스트 참조

Cmd, Value

Cmd와 Value 매개변수는 서로 의존적입니다. 그의 사용법은 아래에 기술합니다. 문제를 만나면 OutputVar가 비워지고 ErrorLevel에 1이 설정됩니다.

List [, Type]: OutputVar에 기호로 구성된 문자열을 설정합니다. 각 기호 하나가 시스템에 있는 드라이브를 나타냅니다. 예를 들어: ACDEZ. 만약 Type이 생략되면, 모든 드라이브 유형이 열람됩니다. 그렇지 않으면, Type이 반드시 다음 중 하나를 지정해야 오직 그 특정한 드라이브만 열람할 수 있습니다: CDROM, REMOVABLE, FIXED, NETWORK, RAMDISK, UNKNOWN.

Capacity (또는 Cap), Path: Path (예, C:\)의 총 용량을 메가바이트 단위로 열람합니다. 빈 공간을 알아내려면 DriveSpaceFree를 사용하십시오.

Filesystem (또는 FS), Drive: Drive의 파일 시스템 유형을 열람합니다. Drive는 드라이브 기호와 다음에 쌍점 그리고 선택적으로 역사선으로 구성되거나, 또는 \\server1\share1과 같은 UNC 이름입니다. OutputVar는 다음 단어 중 하나가 설정됩니다: FAT, FAT32, NTFS, CDFS (전형적으로 CD를 가리킴), UDF (전형적으로 DVD를 가리킴). 드라이브에 포맷된 미디어가 들어 있지 않으면 OutputVar는 비워지고 ErrorLevel은 1이 설정됩니다.

Label, Drive: Drive의 볼륨 라벨을 열람합니다. Drive는 드라이브 기호와 다음에 쌍점 그리고 선택적으로 역사선으로 구성되거나, 또는 \\server1\share1과 같은 UNC 이름입니다. 라벨을 변경하려면, 다음 예제를 따르십시오: Drive, Label, C:, MyLabel.

Serial, Drive: 십진 정수로 표현된 Drive의 일련 번호를 열람합니다. Drive는 드라이브 기호와 다음에 쌍점 그리고 선택적으로 역사선으로 구성되거나, 또는 \\server1\share1과 같은 UNC 이름입니다. 십육진수로 바꾸는 방법은 SetFormat을 참조하십시오.

Type, Path: Path의 드라이브 유형을 열람합니다. 다음 단어 중 하나입니다: Unknown, Removable, Fixed, Network, CDROM, RAMDisk.

Status, Path: Path의 상태를 열람합니다. 다음 단어 중 하나입니다: Unknown (unformatted/RAW를 가리킬 수도 있음), Ready, NotReady (전형적으로 이동식 드라이브에 미디어가 없는 경우), Invalid (Path가 존재하지 않거나 현재 접근할 수 없는 네트워크 드라이브이거나, 등등.)

StatusCD [, Drive]: CD 또는 DVD 드라이브의 상태를 열람합니다. Drive는 드라이브 기호와 쌍점으로 구성됩니다 (Drive를 생략하면, 기본 CD/DVD 드라이브가 사용됩니다). 상태를 알아낼 수 없으면 OutputVar는 비워집니다. 그렇지 않으면 다음 문자열 중 하나가 설정됩니다:

not ready | 드라이브에 접근할 준비가 되지 않았습니다. 아마도 쓰기 작업 중일 수 있습니다. 알려진 한계: "not ready"는 또한 드라이브에 CD가 아니라 DVD가 들어 있는 경우에도 일어납니다.
open | 드라이브에 디스크가 없거나, 트레이가 사출되어 있습니다.
playing | 드라이브가 디스크를 연주 중입니다.
paused | 이전에 연주 중이던 오디오 또는 비디오가 현재 정지되어 있습니다.
seeking | 드라이브를 탐색 중입니다.
stopped | 드라이브에 CD가 들어 있지만 현재 접근하지 못합니다.

이 명령어는 아마도 네트워크 드라이브나 비-CD/DVD 드라이브에서는 작동하지 않을 것입니다; 그런 경우 또는 다른 어떤 이유로 실패하면, OutputVar는 비워지고 ErrorLevel은 1이 설정됩니다.

트레이가 최근에 닫혔다면, 명령어가 완료하려면 좀 시간이 걸릴 수 있습니다.

트레이를 빼거나 넣으려면, Drive 명령어를 참조하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

문제가 있었으면 ErrorLevel에 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

어떤 명령어는 네트워크 공유 이름을 경로(Path)로 받습니다. 예, \\MyServer\MyShare\

관련 항목

Drive, DriveSpaceFree

예제

; 다음은 작동하는 스크립트입니다.
FileSelectFolder, folder, , 3, 분석할 드라이브를 고르십시오:
if folder =
    return
DriveGet, list, list
DriveGet, cap, capacity, %folder%
DrivespaceFree, free, %folder%
DriveGet, fs, fs, %folder%
DriveGet, label, label, %folder%
DriveGet, serial, serial, %folder%
DriveGet, type, type, %folder%
DriveGet, status, status, %folder%
MsgBox All Drives: %list%`nSelected Drive: %folder%`nDrive Type: %type%`nStatus: %status%`nCapacity: %cap% M`nFree Space: %free% M`nFilesystem: %fs%`nVolume Label: %label%`nSerial Number: %serial%


DriveSpaceFree

드라이브의 여유 공간을 메가바이트 단위로 열람합니다.

DriveSpaceFree, OutputVar, Path

매개변수

OutputVar

결과를 저장할 변수, 온전한 숫자에 가장 가깝게 반내림됩니다.

path

정보를 수신할 드라이브 경로. NTFS는 볼륨 마운트와 디렉토리 연결을 지원하므로, 같은 "드라이브" 일 지라도 어떤 경우는 폴더마다 여유 공간을 다르게 보고할 수 있습니다.

논평

OutputVar는 메가바이트 단위로 디스크 여유 공간의 양이 설정됩니다 (가까운 메가바이트로 반내림됩니다).

관련 항목

Drive, DriveGet

예제

DriveSpaceFree, FreeSpace, c:\


Edit

현재 스크립트를 연관된 편집기에 열어 편집합니다.

Edit

Edit 명령어는 현재 스크립트를 열어 편집합니다. 레지스트리의 "edit" 명령어를 사용합니다. (아무것도 지정되어 있지 않으면 Notepad를 사용함). 그렇지만, 편집기 창에 이미 해당 스크립트가 열려 있는 것 같으면 (그의 창 제목을 보고 유추함), 새 편집기 실체를 여는 대신에 그 창이 활성화됩니다.

이 명령어는 컴파일된 스크립트 안에서 실행하면 아무 효과가 없습니다.

관련해서 한 마디 하자면, 오토핫키 문법 강조는 다양한 편집기에서 사용할 수 있습니다 - 아래를 참조하십시오. 게다가, 편집기에서 오토핫키 명령어에 대한 문맥 감지 도움말은 다음 예제를 통하여 활성화할 수 있습니다. 마지막으로, 여러분의 생산성을 개선할 수 있습니다. ISense와 같은 자동-완성 기능을 사용하면 좋습니다. 이 기능은 거의 모든 편집기에서 작동합니다. 타자하는 것을 지켜 보다가 메뉴와 메개변수 목록을 보여줍니다. 덕분에 타자 수를 절약할 수 있고 매개변수의 순서를 기억하는 데에도 도움이 됩니다.

관련 항목

Reload

예제

Edit ; 편집을 위해 스크립트를 엽니다.
; 편집기의 명령 줄 사용법이 다음과 같다면,
; 이 스크립트를 사용하여 ahk 파일을 위한 기본 편집기로 설정할 수 있습니다:
;
;   Editor.exe "Full path of script.ahk"
;
; 스크립트를 실행하면,
; 편집기의 실행 파일을 선택하라고 요구합니다.
;
FileSelectFile Editor, 2,, 편집기를 선택하십시오, Programs (*.exe)
if ErrorLevel
    ExitApp
RegWrite REG_SZ, HKCR, AutoHotkeyScript\Shell\Edit\Command,, "%Editor%" "`%1"

오토핫키를 지원하는 편집기

SciTE4AutoHotkey는 SciTE라고 불리우는 편집기를 AutoHotkey스크립트를 위해 특별히 재단한 버전입니다. 다음과 같은 특징이 있습니다:

  • 구문 강조
  • 똑똑한 자동-들여쓰기
  • 자동-완성
  • 콜팁 (인텔리센스(IntelliSense)라고도 함)
  • 코드 접기
  • 상호대화 디버깅 지원
  • 기타 오토핫키 스크립트를 위한 도구들

SciTE4AutoHotkey는 다음에서 얻을 수 있습니다: http://fincs.ahk4.net/scite4ahk/

오토핫키 구문 강조를 사용할 수 있는 다른 편집기는 아래와 같습니다:

  • AkelPad - http://www.autohotkey.com/forum/topic23586.html
  • Crimson Editor - http://www.autohotkey.com/forum/topic5506.html
  • Eclipse, FAR1 관리자, 그리고 기타 Colorer take5를 사용하는 편집기들 - http://www.autohotkey.com/forum/topic10378.html
  • Emacs - https://github.com/tinku99/ahk-org-mode
  • Notepad++ - http://www.autohotkey.com/forum/topic58792.html
  • Notepad2 - http://www.autohotkey.com/forum/viewtopic.php?t=37652
  • PSPad - http://www.autohotkey.com/forum/topic9294.html
  • SciTE 그리고 신틸라 기반의 편집기들 - http://www.autohotkey.com/forum/topic9656.html
  • Sublime Text Editor - http://www.autohotkey.com/forum/viewtopic.php?p=368326#368326
  • Total Commander with Synplus plugin - http://www.autohotkey.com/forum/topic7278.html

추가로, AutoHotkey Basic (http://www.autohotkey.com/download/)의 압축 파일을 내려 받아 보면 다음과 같은 편집기에서 구문 강조를 활성화시켜 주는 파일들이 들어 있습니다. 그렇지만, 이 파일들은 심하게 기한이 오래 되었고 잘 작동하지 않을 수도 있습니다:

  • ConTEXT
  • EditPlus
  • EmEditor
  • jEdit
  • MED
  • TextPad
  • UltraEdit
  • Vim

여러분의 편집기가 목록에 없다면, 포럼을 검색해서 여러분의 운을 시험해 보십시오.

이 페이지에 추가된 편집기를 얻으려면, 포럼을 통한 Lexikos 또는 GitHub를 방문해 보십시오.


Else

IF-서술문이 FALSE로 평가되면 수행할 멸령어를 지정합니다. 하나 이상의 명령어가 존재하면, 블록 안에 (활괄호) 싸 넣으십시오.

Else

논평

ELSE를 사용하면 바로 위의 IF-서술문에 속합니다 (연관됩니다). ELSE는 언제나 위쪽으로 가장 가까운 IF-서술문에 속합니다. 단, 블록을 사용하여 그 행위를 바꾼 경우는 제외합니다.

ELSE 다음에 바로 같은 줄에 명령어 하나가 따라올 수 있습니다. 이것은 "else if" 사다리에 가장 많이 사용됩니다 (아래의 예제를 참조하십시오).

IF 또는 ELSE가 한 줄 이상을 소유하면, 그런 줄은 활괄호로 둘러 싸야 합니다. 그렇지만, 한 줄만 IF 또는 ELSE에 속해 있다면, 활괄호는 선택적입니다. 예를 들어:

if count > 0  ; 다음 줄에 괄호가 필요 없습니다. 왜냐하면 한 줄만 있기 때문입니다.
    MsgBox 프로세스를 시작하려면 OK를 누르십시오.
else  ; 아래 섹션에는 활괄호를 반드시 둘러야 합니다. 왜냐하면 한 줄 이상으로 구성되어 있기 때문입니다.
{
    WinClose Untitled - Notepad
    MsgBox 항목이 하나도 없습니다.
}

One True Brace (OTB) 스타일은 선택적으로 "else" 둘레에 사용할 수 있습니다. 예를 들어:

if IsDone {
    ...
} else if (x < y) {
    ...
} else {
    ...
}

관련 항목

Blocks 참조. 또, IF-명령어마다 ELSE를 사용할 수 있습니다. 여기에는 IfWinActive, IfWinExist, IfMsgBox, IfInString, IfBetween, IfIn, IF, 그리고 IF (expression)가 포함됩니다.

예제

IfWinExist, Untitled - Notepad
{
    WinActivate
    Send This is a test.{Enter}
}
else
{
    WinActivate, Some Other Window
    MouseClick, left, 100, 200
}

if x = 1
    Gosub, a1
else if x = 2 ; "else if" 스타일
    Gosub, a2
else IfEqual, x, 3 ; 대안 스타일
{
    Gosub, a3
    Sleep, 1
}
else Gosub, a4  ; 즉, 명령어가 하나만 있으면  ELSE와 같은 줄에 있을 수 있습니다.

; Also OK:
IfEqual, y, 1, Gosub, b1
else {
    Sleep, 1
    Gosub, b2
}


EnvAdd

주어진 값을 자신과 합해 변수에 설정합니다 (날짜-시간 값으로부터 시간을 더하거나 뺄 수도 있습니다). 다음과 동등합니다: var += value.

EnvAdd, Var, Value [, TimeUnits]
Var += Value [, TimeUnits]
Var++

Parameters

Var

연산을 할 변수의 이름.

Value

정수, 부동 소수점 수, 또는 표현식.

TimeUnits

존재하면, 이 매개변수는 명령어를 방향 전환 시켜서 Value를 Var에 더하도록 만듭니다. Var를 YYYYMMDDHH24MISS 형식의 날짜-시간 도장으로 취급하고 Value를 더할 정수나 부동 소수점 수 단위로 취급합니다 (음수를 지정하면 뺄셈을 수행합니다). TimeUnits은 Seconds, Minutes, Hours, 또는 Days (또는 그냥 각 단어의 첫 문자)가 될 수 있습니다).

Var가 빈 변수이면, 현재 시간이 대신 사용됩니다. Var에 무효한 시간도장이 들어 있거나 년도가 1601년 이전이가나, 또는 Value가 숫치가 아니면, Var는 문제를 나타내기 위해 비워집니다.

내장 변수 A_Now는 현재 지역 시간이 YYYYMMDDHH24MISS 형식으로 담깁니다.

두 시간도장 사이의 시간의 양을 계산하려면 EnvSub를 사용하십시오.

논평

이 명령어는 다음 단축 스타일과 동등합니다: Var += Value.

변수는 Var++, Var--, ++Var, 또는 --Var를 사용해 1 만큼씩 늘거나 줄 수 있습니다.

Var나 Value가 비어 있거나 숫자로 시작하지 않으면, 계산의 목적을 위해 0으로 간주됩니다 (내부적으로 표현식에 사용될 때 그리고 TimeUnits 매개변수를 사용할 때는 예외입니다).

Var나 Value에 소수점이 들어 있다면, 결과는 부동 소수점 수가 되고 형식은 SetFormat에 의해 설정됩니다.

관련 항목

EnvSub, EnvMult, EnvDiv, SetFormat, 표현식, If var is [not] type, SetEnv, FileGetTime

예제

EnvAdd, MyCount, 2
MyCount += 2  ; 위와 동등

var1 =  ; 비워서 아래가 대신 현재 시간을 사용하도록 만듭니다.
var1 += 31, days
MsgBox, %var1%  ; 답은 지금부터 31일 후가 될 것입니다.


EnvDiv

변수에 자기자신을 주어진 값으로 나누어 설정합니다. 다음과 동일: Var /= Value.

EnvDiv, Var, Value

매개변수

Var

연산을 수행할 변수의 이름.

Value

정수, 부동 소수점 수, 또는 표현식.

논평

이 명령어는 다음 단축 스타일과 동등합니다: Var /= Value.

0으로 나누면 스크립트가 적재될 때에러 메시지 창이 나타납니다; 그렇지 않으면 그 변수를 비워버립니다.

Var나 Value가 비어 있거나 숫자로 시작하지 않으면, 계산을 목적으로 0으로 간주됩니다 (Var := X /= Y와 같이 내부적으로 표현식 안에 사용될 때는 예외입니다).

Var 또는 Value에 소수점이 들어 있으면, 그 결과는 부동 소수점 수 입니다. 형식은 SetFormat으로 지정됩니다. 그렇지 않으면 그 결과는 잘려 나갑니다 (예, 19 나누기 10은 1을 산출합니다).

관련 항목

EnvAdd , EnvSub, EnvMult, SetFormat, 표현식, If var is [not] type, SetEnv, 비트별 연산 (변형)

예제

EnvDiv, MyCount, 2
MyCount /= 2  ; 위와 동등함


EnvGet

EnvGet [v1.0.43.08+]

환경 변수를 열람합니다.

EnvGet, OutputVar, EnvVarName

매개변수

OutputVar

문자열을 저장할 변수 이름.

EnvVarName

열람할 환경 변수의 이름. 예를 들어: EnvGet, OutputVar, Path.

논평

지정된 환경 변수가 비어 있거나 존재하지 않으면, OutputVar 비워집니다.

운영 체제는 환경 변수의 길이를 32 KB의 텍스트로 제한합니다.

관련 항목

EnvSet, #NoEnv, 환경 변수, EnvUpdate, SetEnv, Run, RunWait

예제

EnvGet, OutputVar, LogonServer


EnvMult

주어진 값을 변수에 곱해 그 변수에 다시 설정합니다. 다음과 동등: Var *= Value.

EnvMult, Var, Value

매개변수

Var

연산을 수행할 변수의 이름.

Value

정수, 부동 수수점 수, 또는 표현식.

논평

이 명령어는 다음 단축 스타일과 동등합니다: Var *= Value.

Var나 Value가 비어 있거나 또는 숫자로 시작하지 않으면, 계산을 위해 0으로 간주됩니다 (단 내부적으로 표현식에 Var := X *= Y와 같이 사용할 경우는 제외합니다).

Var나 Value에 소수점이 포함되어 있으며, 그 결과는 부동 소수점 수가 됩니다. 형식은 SetFormat으로 설정됩니다.

관련 항목

EnvAdd, EnvSub, EnvDiv, SetFormat, 표현식, If var is [not] type, SetEnv, 비트별 연산 (변형)

예제

EnvMult, MyCount, 2
MyCount *= 2  ; 위와 동등합니다


EnvSet

값을 환경 변수에 씁니다.

EnvSet, EnvVar, Value

매개변수

EnvVar
사용할 환경 변수의 이름. 예, "COMSPEC" 또는 "PATH".
Value

환경 변수에 설정할 값.

ErrorLevel

[v1.1.04+] 이 명령어는 실패 시에 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있다면 1 아니면 0이 설정됩니다.

관련 항목

운영 체제는 각 환경 변수를 32 KB의 텍스트로 제한합니다.

이 명령어로 생성되거나 변경된 환경 변수는 스크립트가 Run 또는 RunWait를 통하여 실행한 프로그램에서만 접근이 가능합니다. 더 자세한 것은 환경 변수를 참조하십시오.

이 명령어는 SetEnv와 별도로 존재합니다. 왜냐하면 정상적인 스크립트 변수는 운영 체제의 환경에 저장되지 않기 때문입니다. 수행성능이 악화되고 OS가 환경 변수를 32 KB의 길이로 제한하기 때문입니다.

관련 항목

EnvGet, #NoEnv, 환경 변수, EnvUpdate, SetEnv, Run, RunWait

예제

EnvSet, AutGUI, 변수에 넣을 텍스트.


EnvSub

주어진 값을 자신에서 빼어 변수에 설정합니다 (날짜-시간 값도 뺄 수 있습니다). 다음과 동일: Var -= Value.

EnvSub, Var, Value [, TimeUnits]
Var -= Value [, TimeUnits]
Var--

매개변수

Var

연산을 수행할 변수의 이름.

Value

정수, 부동 소수점 수, 또는 표현식 (TimeUnits이 존재하면 표현식은 지원하지 않습니다).

TimeUnits

존재하면, 이 매개변수는 명령어를 방향전환해서 Value를 Var로부터 빼도록 만듭니다. 마치 둘 모두 YYYYMMDDHH24MISS 형식의 날짜-시간 도장인 것처럼 간주합니다. TimeUnits은 Seconds, Minutes, Hours, 또는 Days (또는 그냥 각 단어의 첫 문자)가 될 수 있습니다. Value가 비어 있으면, 현재 시간이 대신 사용됩니다. 비슷하게, Var가 빈 변수이면, 현재 시간이 대신 사용됩니다.

결과는 언제나 가장 가까운 정수로 내림됩니다. 예를 들어, 두 시간도장 사이의 실제 차이가 1.999 일이면, 1 일로 보고합니다. 더 높은 정밀도가 필요하면, Seconds를 TimeUnits에 지정하고 그 결과를 60.0, 3600.0, 또는 86400.0으로 나누십시오.

Var 또는 Value가 유효하지 않은 시간도장이거나 1601 년 이전의 년도를 담고 있으면, Var를 비워서 그 문제를 나타냅니다.

내장 변수 A_Now는 현재 지역 시간을 YYYYMMDDHH24MISS 형식으로 담고 있습니다.

두 이벤트 사이에 경과한 시간을 정밀하게 재고 싶다면, A_TickCount method를 사용하십시오. 밀리초의 정밀도를 제공합니다.

시간도장으로부터 초, 분, 시간 또는 날을 빼거나 더하려면, EnvAdd를 사용하십시오 (음수를 추가하면 뺄셈을 할 수 있습니다).

논평

이 명령어는 다음 단축 스타일과 동등합니다: Var -= Value.

변수를 1 만큼씩 늘리고 줄이려면 Var++, Var--, ++Var, 또는 --Var를 사용하십시오.

Var 또는 Value가 비어 있거나 숫자로 시작하지 않으면, 계산을 위한 목적으로 0으로 취급됩니다 (내부적으로 표현식에 사용할 때 그리고 TimeUnits 매개변수를 사용할 때는 예외입니다).

Var 또는 Value에 소수점이 들어 있으면, 결과는 부동 소수점 수입니다. 형식은 SetFormat에 의해 결정됩니다.

관련 항목

EnvAdd, EnvMult, EnvDiv, SetFormat, 표현식, If var is [not] type, SetEnv, FileGetTime

예제

EnvSub, MyCount, 2
MyCount -= 2  ; 위와 동등합니다

var1 = 20050126
var2 = 20040126
EnvSub, var1, %var2%, days
MsgBox, %var1%  ; 답은 366이 됩니다. 왜냐하면 2004년은 윤년이기 때문입니다.


EnvUpdate

OS와 실행 중인 모든 어플에 환경 변수가 변했다고 고지합니다.

EnvUpdate

ErrorLevel

[v1.1.04+] 이 명령어는 실패하면 에러를 던질 수 있습니다. 더 자세한 정보는 Runtime Errors를 참조하십시오.

ErrorLevel는 문제가 있으면 1 그렇지 않으면 0이 설정됩니다.

논평

OS 환경을 갱신합니다. 로그오프 했다가 다시 로그온 한 것과 비슷한 효과가 있습니다.

예를 들어, 다음 레지스트리 키를 변경한 후에, EnvUpdate를 사용하면 변경 사항을 방송할 수 있습니다: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment

관련 항목

EnvSet, RegWrite

예제

EnvUpdate


Exit

현재 쓰레드를 종료합니다. 또는 (스크립트가 영속적이 아니고 핫키가 포함되어 있지 않으면) 전체 스크립트를 종료합니다.

Exit [, ExitCode]

매개변수

ExitCode

스크립트가 종료할 때 호출자로부터 반환된 -2147483648부터 2147483647 사이의 정수 (표현식 가능). 이 코드는 그 스크립트를 부화한 어떤 프로그램도 예를 들어, 또다른 스크립트 (RunWait를 통하여) 또는 배치 파일 (.bat)도 접근할 수 있습니다.. 생략되면, ExitCode는 0이 기본값입니다. 0은 전통적으로 성공을 나타내는 데 사용됩니다.

논평

스크립트에 핫키가 없다면, 그리고 영속적이 아니라면, 그리고 Num/Scroll/CapsLock 키를 AlwaysOn 또는 AlwaysOff 상태를 유지하도록 요구하지 않았다면, Exit을 만나면 그 즉시 종료합니다 (단, OnExit 서브루틴이 있다면 예외입니다).

그렇지 않으면, Exit 명령어는 현재 쓰레드를 종료합니다. 다른 말로, 메뉴나 타이머 또는 핫키 서브루틴으로부터 직접 간접적으로 호출된 서브루틴의 스택은 마치 각각 Return을 만난 것처럼 모두 한꺼번에 반환됩니다. Exit이 그런 서브루틴 안에서 직접 사용되면 -- 자신이 간접적으로 호출한 서브루틴 중의 하나가 아니라 -- Exit은 Return과 동등합니다.

ExitApp를 사용하면 영속적이거나 핫키가 있는 스크립트를 완전히 종료할 수 있습니다.

관련 항목

ExitApp, OnExit, Functions, Gosub, Return, Threads, #Persistent

예제

#z::
Gosub, Sub2
MsgBox, 이 msgbox는 EXIT 때문에 절대 나타나지 않습니다.
return

Sub2:
Exit  ; 이 서브루틴과 더불어 호출한 서브루틴을 종료합니다.


ExitApp

스크립트를 무조건 종료합니다.

ExitApp [, ExitCode]

매개변수

ExitCode

-2147483648부터 2147483647 사이의 정수 ( v1.0.48.01+에서 표현식 가능). 이 값은 스크립트가 종료할 호출자에게 반환됩니다. 이 코드는 스크립트를 부화시킨 어느 프로그램도 접급할 수 있습니다. 예를 들어 (RunWait를 통한) 스크립트 또는 배치 파일(.bat). 생략하면, ExitCode는 기본값으로 0이 설정됩니다. 전통적으로 0은 성공을 나타내는 데 사용됩니다.

논평

스크립트는 즉시 종료합니다. OnExit 서브루틴이 있는 경우는 제외입니다. 이는 스크립트의 트레이 아이콘이나 메인 메뉴에서 "Exit"를 선택한 것과 동등합니다.

Exit 그리고 ExitApp는 스크립트에 핫키가 없고, 스크립트가 영구적이 아니며, 그리고 Num/Scroll/Capslock 키가 항상 AlwaysOn 또는 AlwaysOff를 유지하기를 요청하지 않는 경우는 행위가 동일합니다.

스크립트에 OnExit 서브루틴이 있다면, ExitApp에 응답하여 실행됩니다.

관련 항목

Exit, OnExit, #Persistent

예제

#x::ExitApp  ; 이 스크립트를 종료할 핫키를 할당합니다.


FileAppend

텍스트를 파일 끝에 씁니다 (필요하면 먼저 파일을 생성합니다).

FileAppend [, Text, Filename, Encoding]

매개변수

Text

파일에 추가할 텍스트. 이 텍스트는 라인피드 문자 (`n)를 포함해 새줄을 시작할 수도 있습니다. 게다가, 기다란 한줄은 계속 섹션을 이용하여 더 짧은 여러 줄로 분리할 수 있습니다.

Text가 비어 있으면, Filename이 임시 파일로 생성됩니다 (그러나 그 파일이 이미 존재하면, 그의 수정 시간이 갱신됩니다).

Text가 %ClipboardAll%이거나 이전에 ClipboardAll의 값이 할당된 변수라면, Filename은 무조건 그 클립보드의 전체 내용으로 덮어쓰기 됩니다 (즉, FileDelete가 필요하지 않습니다).

Filename

추가될 파일의 이름. 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

이진 모드: 텍스트 모드가 아니라 이진 모드로 추가하려면, 별표를 파일이름 앞에 추가하십시오. 이렇게 하면 각 라인피드 문자 (`n)가 윈도우즈의 표준 CR+LF 대신에 한개짜리 라인피드 (LF)가 씌여집니다. 예를 들어: *C:\My Unix File.txt.

파일이 (파일-읽기 회돌이 안에 있어서) 아직 열려 있지 않은 경우, Text에 캐리지 리턴과 라인피드가 쌍으로 들어 있다면 (`r`n) 그 파일은 자동으로 이진 모드로 열립니다. 다른 말로, 앞 문단에서 기술한 별표 옵션이 자동으로 효력을 발휘합니다. 그렇지만 Text에 `r`n가 들어 있을 때 별표를 지정하면 수행성능이 향상됩니다. 왜냐하면 프로그램이 Text를 스캔해 `r`n을 찾을 필요가 없기 때문입니다.

표준 출력 (stdout): 별표 (*)를 Filename에 지정하면 Text는 표준 출력 (stdout)으로 전송됩니다. 그런 텍스트는 파일에 방향전환할 수 있고, 또다른 EXE로 파이프 처리해 보낼 수 있으며, 또는 환상적인 편집기로 나포할 수 있습니다. 예를 들어, 다음은 명령어 프롬프트에서 타자하면 유효합니다:

"%ProgramFiles%\AutoHotkey\AutoHotkey.exe" "My Script.ahk" >"Error Log.txt"

그렇지만, 표준출력으로 전송된 텍스트는 처음 기동된 프롬프트에 나타나지 않습니다. 이 문제는 스크립트의 출력을 또다른 명령어나 프로그램에 파이프 처리해 우회할 수 있습니다. 예를 들어:

"%ProgramFiles%\AutoHotkey\AutoHotkey.exe" "My Script.ahk" |more
For /F "tokens=*" %L in ('""%ProgramFiles%\AutoHotkey\AutoHotkey.exe" "My Script .ahk""') do @Echo %L

[v1.1.20+]: 별표 두 개 (**)를 Filename에 지정하면 Text가 표준에러(stderr) 스트림으로 전송됩니다.

인코딩

[AHK_L 42+]: FileEncoding으로 설정된 기본 인코딩을 오버라이드 합니다. Encoding은 같은 형식을 따릅니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 문제가 있으면 1 없으면 0이 설정됩니다.

A_LastError는 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

기존의 파일을 덮어쓰려면, FileAppend를 사용하기 전에 FileDelete로 지우십시오.

목표 파일은 텍스트가 추가된 후 자동으로 닫힙니다 (단, FileAppend가 파일-읽기/쓰기 회돌이 안에서 단일-매개변수 모드를 사용할 때는 예외입니다).

[AHK_L 42+]: FileOpen()을 추가 모드로 사용하는 것이 FileAppend보다 더 섬세하게 제어할 수 있고 계속 파일을 열어 둘 수도 있습니다. 매번 파일을 열고 닫을 필요가 없습니다. 일단 파일이 추가 모드로 열리면 file.Write(string)를 사용해 추가하면 됩니다. 파일 객체는 RawWrite/RawRead 또는 WriteNum/ReadNum를 통하여 이진 I/O도 지원합니다. 반면에 FileAppend는 오직 텍스트만 지원합니다.

관련 항목

FileOpen/File Object, FileRead, file-reading loop, FileReadLine, IniWrite, FileDelete, OutputDebug, 계속 섹션

예제

FileAppend, Another line.`n, C:\My Documents\Test.txt

; 다음 예제는 계속 섹션을 사용해 가독성과 유지관리성을 향상시킵니다:
FileAppend,
(
한 줄의 텍스트.
기본으로, 이전 줄과 이 줄 사이의 하드 캐리지 리턴은 (Enter) 파일에 쓰여집니다.
    이 줄은 탭 하나로 들여쓰기 됩니다; 기본으로, 탭도 파일에 씌여집니다.
%Var%와 같은 변수 참조는 기본으로 확장됩니다.
), C:\My File.txt

; 다음 예제는 운영 체제의 내장 FTP 명령어를 사용하여
; FTP 업로드를 자동화 하는 법을 보여줍니다. 이 스크립트는 Windows XP에서 검증되었습니다.

FTPCommandFile = %A_ScriptDir%\FTPCommands.txt
FTPLogFile = %A_ScriptDir%\FTPLog.txt
FileDelete %FTPCommandFile%  ; 이전 실행이 너무 일찍 끝났을 경우.

FileAppend,  ; 이 경우 쉼표가 필요합니다.
(
open host.domain.com
username
password
binary
cd htdocs
put %VarContainingNameOfTargetFile%
delete SomeOtherFile.htm
rename OldFileName.htm NewFileName.htm
ls -l
quit
), %FTPCommandFile%

RunWait %comspec% /c ftp.exe -s:"%FTPCommandFile%" >"%FTPLogFile%"
FileDelete %FTPCommandFile%  ; 보안상의 이유로 삭제합니다.
Run %FTPLogFile%  ; 검토를 위해 로그 기록을 보여줍니다.


FileCopy

파일을 복사합니다.

FileCopy, SourcePattern, DestPattern [, Flag]

매개변수

SourcePattern

단일 파일이나 폴더 또는 C:\Temp\*.tmp 같으 와일드 카드 패턴. SourcePattern은 절재 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

DestPattern
목표의 이름이나 패턴, 절대 경로가 지정되지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 간단한 복사를 수행하려면 -- 기존의 파일이름은 그대로 두고 -- 폴더 이름만 지정하십시오. 다음에 보여주는 예제는 기능상 동등합니다:
FileCopy, C:\*.txt, C:\My Folder
FileCopy, C:\*.txt, C:\My Folder\*.*
Flag

(선택적) 이 플래그는 파일이 이미 존재하면 덮어쓸지 말지 결정합니다:

0 = (기본값) 기존의 파일을 덮어쓰지 않습니다
1 = 기존의 파일을 덮어 씁니다

이 매개변수는 표현식일 수 있습니다. 심지어 참이나 거짓으로 평가되는 것이면 무엇이든 가능합니다 (왜냐하면 내부적으로 참은 1 거짓은 0으로 저장되기 때문입니다).

ErrorLevel

[v1.1.04+] 이 명령어는 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 에러 때문에 복사에 실패한 파일의 개수가 설정됩니다. 그렇지 않으면 0이 설정됩니다.

어느 경우든, 소스 파일이 단일 파일이고 (와일드카드 없음) 그리고 그 파일이 존재하지 않으면, ErrorLevel은 0으로 설정됩니다. 이 상황을 탐지하려면, 복사하기 전에 IfExist 또는 FileExist()를 소스 파일에 사용하십시오.

FileMove와 다르게, 파일을 자기 자신에 복사하는 것은 언제나 에러로 간주됩니다. 덮어쓰기 모드가 켜져 있어도 마찬가지입니다.

파일이 발견되면, A_LastError는 0 (0) 또는 마지막 실패 후에 곧바로 운영 체제의 GetLastError() 함수의 결과가 설정됩니다. 그렇지 않으면 A_LastError에는 왜 파일이 발견되지 않았는지 알려주는 에러 코드가 담깁니다.

논평

FileCopy는 파일만 복사합니다. 대신 폴더의 내용을 (그의 모든 파일과 하위 폴더) 복사하려면, 아래 섹션의 예제를 참조하십시오. 단일 폴더 (하위 폴더 포함)를 복사하려면, FileCopyDir을 사용하십시오.

에러를 만나도 연산은 멈추지 않습니다.

관련 항목

FileMove, FileCopyDir, FileMoveDir, FileDelete

예제

FileCopy, C:\My Documents\List1.txt, D:\Main Backup\  ; 사본을 만들지만 원본의 파일 이름을 유지합니다.
FileCopy, C:\My File.txt, C:\My File New.txt  ; 파일에 새 이름을 주고, 같은 폴더 안으로 복사합니다.
FileCopy, C:\Folder1\*.txt, D:\New Folder\*.bkp  ; 새 위치에 복사하고 새 확장자를 부여합니다.

; 다음 예제는 한 폴더 안의 모든 파일과 하위 폴더를 다른 폴더로 복사 합니다:
ErrorCount := CopyFilesAndFolders("C:\My Folder\*.*", "D:\Folder to receive all files & folders")
if ErrorCount <> 0
    MsgBox %ErrorCount% files/folders could not be copied.

CopyFilesAndFolders(SourcePattern, DestinationFolder, DoOverwrite = false)
; SourcePattern에 부합하는 모든 파일과 폴더를 DestinationFolder이라는 이름의 폴더에 복사하고
; 복사할 수 없었던 파일/폴더의 개수를 돌려줍니다.
{
    ; 먼저 모든 파일을 복사합니다 (폴더는 복사하지 않습니다):
    FileCopy, %SourcePattern%, %DestinationFolder%, %DoOverwrite%
    ErrorCount := ErrorLevel
    ; 이제 모든 폴더를 복사합니다:
    Loop, %SourcePattern%, 2  ; 2의 뜻은 "폴더만 열람한다"는 뜻입니다.
    {
        FileCopyDir, %A_LoopFileFullPath%, %DestinationFolder%\%A_LoopFileName%, %DoOverwrite%
        ErrorCount += ErrorLevel
        if ErrorLevel  ; 문제의 폴더를 이름으로 보고합니다.
            MsgBox Could not copy %A_LoopFileFullPath% into %DestinationFolder%.
    }
    return ErrorCount
}


FileCopyDir

폴더를 그의 모든 하위 폴더와 파일과 함께 복사합니다 (xcopy와 비슷함).

FileCopyDir, Source, Dest [, Flag]

매변변수

Source

소스 디렉토리의 이름 (뒤에 역사선 없음), 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 예를 들어: C:\My Folder

Dest

목표 디렉토리의 이름 (뒤에 역사선 없음), 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 예를 들어: C:\My Folder

Flag

(선택적) 이 매개변수는 파일이 이미 존재하면 덮어쓸지 말지 결정합니다:

0 (기본값): 기존의 파일을 덮어쓰지 않습니다. Dest가 이미 파일이나 폴더로 존재하면 연산은 실패하고 아무 효과도 없습니다.

1: 기존의 파일을 덮어씁니다. 그렇지만, Dest 안의 파일이나 폴더가 Source 안에 해당하는 짝이 없으면 삭제되지 않습니다.

이 매개변수는 표현식일 수 있습니다. 심지어 거짓이나 참으로 평가되면 무엇이든 될 수 있습니다 (참과 거짓은 내부적으로 1과 0으로 저장되기 때문입니다).

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다. 그렇지만, 소스 디렉토리에 저장된 웹 페이지가 PageName.htm 파일과 그에 상응하는 디렉토리 이름 PageName_files로 구성되어 있다면, 복사가 성공적이었다 할지라도 에러가 나타날 수 있습니다..

논평

목표 디렉토리 구조가 존재하지 않을 경우, 가능하면 생성합니다.

폴더와 더불어 그의 모든 하위 폴더를 재귀적으로 복사하기 때문에, 폴더를 자기 자신 안의 한 폴더 안에 복사한 결과는 정의되어 있지 않습니다. 이를 우회하려면, 먼저 자기 자신 바깥에다 복사한 다음, FileMoveDir를 사용하여 원하는 위치로 이동하십시오.

FileCopyDir은 단일 폴더를 복사합니다. 대신 폴더의 내용을 (그의 모든 파일과 폴더) 복사하려면, FileCopy 섹션의 예제를 참조하십시오.

관련 항목

FileMoveDir, FileCopy, FileMove, FileDelete, file-loops, FileSelectFolder, SplitPath

예제

FileCopyDir, C:\My Folder, C:\Copy of My Folder

; 예제 #2: 폴더를 복사할지 물어보는 스크립트.
FileSelectFolder, SourceFolder, , 3, 복사할 폴더를 선택하십시오
if SourceFolder =
    return
; 그렇지 않으면, 계속 진행합니다.
FileSelectFolder, TargetFolder, , 3, 복제 폴더를 생성할 폴더를 선택하십시오.
if TargetFolder =
    return
; 그렇지 않으면, 계속 진행합니다.
MsgBox, 4, , "%SourceFolder%" 폴더의 사본이 "%TargetFolder%"으로 들어갑니다.  계속할까요?
IfMsgBox, No
    return
SplitPath, SourceFolder, SourceFolderName  ; 그의 전체 경로에서 폴더 이름만 추출합니다.
FileCopyDir, %SourceFolder%, %TargetFolder%\%SourceFolderName%
if ErrorLevel
    MsgBox 폴더를 복사하지 못했습니다. 같은 이름의 폴더가 이미 "%TargetFolder%"에 존재할 가능성이 있습니다.
return


FileCreateDir

디렉토리/폴더를 만듭니다.

FileCreateDir, DirName

매개변수

DirName

생성할 디렉토리 이름. 절대 경로가 지정되지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조합니다.

ErrorLevel는 문제가 있으면 1 그렇지 않으면 0이 설정됩니다.

A_LastError는 운영 체제의 GetLastError() 함수의 결과에 설정됩니다.

관련 항목

이 명령어는 또 아직 존재하지 않는다면 DirName에 주어진 모든 부모 디렉토리를 생성합니다.

관련 항목

FileRemoveDir

예제

FileCreateDir, C:\Test1\My Images\Folder2


FileCreateShortcut

단축 파일을 만듭니다 (.lnk).

FileCreateShortcut, Target, LinkFile [, WorkingDir, Args, Description, IconFile, ShortcutKey, IconNumber, RunState]

매개변수

Target

단축 파일이 가리키는 파일의 이름. 절대 경로가 포함되어 있어야합니다. 시스템에 통합된 파일을 예외입니다 (예, Notepad.exe). 단축 파일이 만들어지는 순간 해당 파일이 존재하면 안 됩니다; 다른 말로, 무효한 목표를 가리키는 단축 파일이 생성될 수 있습니다.

LinkFile

생성될 단축 파일의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주합니다. .lnk 확장자를 꼭 포함하십시오. 그 파일이 이미 존재하면 덮어쓰기 됩니다.

WorkingDir

단축 파일이 기동할 때 목표의 작업 디렉토리. 비어 있거나 생략되면, 단축 파일은 "시작 디렉토리"가 비어 있고 단축 파일이 기동할 때 시스템이 기본 작업 디렉토리를 제공합니다.

Args

단축 파일이 기동할 때 Target에 건넬 매개변수. 매개변수 사이는 스페이스로 구분합니다. 매개변수에 스페이스가 포함되어 있다면, 겹따옴표로 둘러 싸십시오.

Description

단축 파일을 기술하는 주석 (OS가 툴팁, 등등을 보여 주는 데 사용합니다.)

IconFile

LinkFile에 대하여 아이콘의 이름과 전체 경로. ico 파일이거나 아니면 EXE 또는 DLL의 첫 번째 아이콘입니다.

ShortcutKey

단일 기호, 숫자, 또는 키 리스트의 각 키의 이름 (마우스 버튼과 기타 비-표준 키는 지원하지 않을 수도 있습니다). 수식 심볼을 포함시키지 마십시오. 현재, 모든 단축 키는 CTRL+ALT 단축 키로 생성됩니다. 예를 들어, 기호 B가 이 매개변수에 지정되면, 단축 키는 CTRL-ALT-B가 됩니다.

IconNumber

첫 번째 아이콘이 아니라 IconFile 파일에서 아이콘을 하나 사용하려면, 여기에 그 번호를 지정하십시오 (표현식 가능). 예를 들어, 2는 두 번째 아이콘입니다.

RunState

Target을 최대 또는 최소 상태로 기동하려면, 다음 숫자 중 하나를 지정하십시오:

1 - 정상 (기본값)
3 - 최대화
7 - 최소화

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 자세한 것은 실행 시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

논평

Target을 포함하지 않아도 될 경우가 있습니다. 목표 파일이 시스템의 PATH 환경 변수의 폴더 중 하나에 존재하면 지정하지 않아도 됩니다.

새로 생성된 단축 파일의 ShortcutKey는 그 단축 파일이 시작 메뉴의 어딘가 또는 바탕화면에 거주하지 않으면 아무 효과가 없습니다. 여러분이 고른 ShortcutKey가 이미 사용 중이면, 여러분의 새 단축 파일이 우선합니다.

URL을 가리키는 단축 파일을 생성하는 또다른 방법은 다음 예제입니다. 특별한 URL 단축 파일을 생성합니다. 앞 두개의 매개변수를 여러분 마음대로 바꾸십시오:
IniWrite, http://www.google.com, C:\My Shortcut.url, InternetShortcut, URL.

다음을 선택적으로 추가해 위의 아이콘에 할당할 수 있습니다:

IniWrite, <IconFile>, C:\My Shortcut.url, InternetShortcut, IconFile
IniWrite, 0, C:\My Shortcut.url, InternetShortcut, IconIndex

위에서, 0을 아이콘의 인덱스로 교체하십시오 (0은 첫 아이콘에 사용됩니다) 그리고 <IconFile>를 URL, EXE, DLL, 또는 ICO 파일로 교체하십시오. 예제: C:\Icons.dll, C:\App.exe, http://www.somedomain.com/ShortcutIcon.ico

.LNK 파일이 아니라 평범한 텍스트 파일인데도 운영 체제는 위에서 생성된 .URL 파일을 진짜 단축 파일로 취급합니다.

관련 항목

FileGetShortcut, FileAppend

예제

; 마지막 매개변수에서 기호 "i"는 단축 키를 Ctrl-Alt-I로 만듭니다:
FileCreateShortcut, Notepad.exe, %A_Desktop%\My Shortcut.lnk, C:\, "%A_ScriptFullPath%", My Description, C:\My Icon.ico, i


FileDelete

파일을 삭제합니다.

FileDelete, FilePattern

매개변수

FilePattern

단일 파일의 이름 또는 C:\Temp\*.tmp같은 와일드카드 패턴. FilePattern은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

전체 폴더를, 그의 하위 폴더와 파일을 포함하여 모두 삭제하려면 FileRemoveDir을 사용하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 실패하면 삭제된 파일의 개수가 설정되고 그렇지 않으면 0이 설정됩니다. *.tmp와 같은 와일드카드 패턴을 지우면 파일이 전혀 부합하지 않더라도 성공으로 간주됩니다; 그런 경우 ErrorLevel은 0이 설정됩니다.

파일이 발견되면, A_LastError에 0 (영)이 설정되거나 또는 마지막 실패 직후 운영 체제의 GetLastError() 함수의 결과가 설정됩니다. 그렇지 않으면 A_LastError에는 왜 아무 파일이 발견되지 않았는지 알려주는 에러 코드가 담깁니다.

논평

읽기-전용 파일을 삭제하려면, 먼저 읽기-전용 속성을 지우십시오. 예를 들어: FileSetAttrib, -R, C:\My File.txt.

관련 항목

FileRecycle, FileRemoveDir, FileCopy, FileMove

예제

FileDelete, C:\temp files\*.tmp


FileEncoding

FileEncoding [AHK_L 42+]

다음 명령어에 대하여 기본 인코딩을 설정합니다: FileRead, FileReadLine, Loop Read, FileAppend, 그리고 FileOpen.

FileEncoding [, Encoding]

인코딩은 다음 값 중 하나입니다:

  • UTF-8: Unicode UTF-8, CP65001과 동등.
  • UTF-16: Unicode UTF-16 작은값 종료형. CP1200과 동등.
  • UTF-8-RAW 또는 UTF-16-RAW: 위와 동등, 그러나 새 파일이 작성될 때 바이트 순서 표식을 쓰지 않습니다.
  • CPnnn: 숫치 식별자 nnn이 있는 코드 페이지. 코드 페이지 식별자를 참조하십시오.
  • 비어 있거나 생략하면: 시스템 기본 ANSI 코드 페이지. 이것이 기본 설정값입니다.

논평

A_FileEncoding에 현재 설정이 담겨 있습니다.

관련 항목

FileOpen, StrPut/StrGet, 스크립트 호환성


FileGetAttrib

파일이나 폴더가 읽기 전용인지, 숨어 있는지 등등을 보고합니다.

FileGetAttrib, OutputVar [, Filename]
AttributeString := FileExist(FilePattern)

매개변수

OutputVar

열람된 텍스트를 저장할 변수의 이름.

Filename

목표 파일의 이름, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 생략하면, 가장 안쪽 파일-회돌이에 싸인 현재 파일이 사용됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

A_LastError는 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

반환된 문자열에는 다음 "RASHNDOCT" 문자열의 부문자열이 포함됩니다:

R = READONLY(읽기 전용)
A = ARCHIVE(보관)
S = SYSTEM(시스템)
H = HIDDEN(감춤)
N = NORMAL(정상)
D = DIRECTORY(디렉토리)
O = OFFLINE(오프라인)
C = COMPRESSED(압축)
T = TEMPORARY(임시)

특정 속성이 열람된 문자열에 존재하는지 점검하려면, 다음 예제를 따르십시오:

FileGetAttrib, Attributes, C:\My File.txt
IfInString, Attributes, H
    MsgBox The file is hidden.

관련하여 한 마디 하면, 파일의 8.3 짧은 이름을 열람하려면, 다음 예제를 따르십시오:

Loop, C:\My Documents\Address List.txt
    ShortPathName = %A_LoopFileShortPath%  ; 결과는 다음과 비슷합니다: C:\MYDOCU~1\ADDRES~1.txt

비슷한 방법으로 8.3 짧은 이름의 긴 이름을 얻을 수 있습니다.

관련 항목

FileExist(), FileSetAttrib, FileGetTime, FileSetTime, FileGetSize, FileGetVersion, 파일-회돌이

예제

FileGetAttrib, OutputVar, C:\New Folder


FileGetShortcut

단축 파일 (.lnk)에 관한 정보를 열람합니다. 예를 들어 단축 파일의 목표 파일.

FileGetShortcut, LinkFile [, OutTarget, OutDir, OutArgs, OutDescription, OutIcon, OutIconNum, OutRunState]

매개변수

LinkFile

분석할 단축 파일의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. .lnk 확장자를 꼭 포함하십시오.

OutTarget

단축 파일의 목표를 저장할 변수의 이름 (인자들은 제외). 예를 들어: C:\WINDOWS\system32\notepad.exe

OutDir

단축 파일의 작업 디렉토리를 저장할 변수의 이름. 예를 들어: C:\My Documents. %WinDir% 같은 환경 변수가 문자열 안에 존재하면, StringReplace를 통하여 해결합니다. 예를 들어: StringReplace, OutDir, OutDir, `%WinDir`%, %A_WinDir%.

OutArgs

단축 파일의 매개변수를 저장할 변수의 이름 (없으면 비어 있음).

OutDescription

단축 파일의 주석을 저장할 변수의 이름 (없으면 비어 있음).

OutIcon

단축 파일의 아이콘 파일 이름을 저장할 변수의 이름 (없으면 비어 있음).

OutIconNum

아이콘 파일 안에서의 단축 파일의 아이콘 번호를 저장할 변수의 이름 (없으면 비어 있음). 이 값은 대부분 1입니다. 첫 번째 아이콘이라는 뜻입니다.

OutRunState

단축 파일의 최초 기동 상태를 저장할 변수의 이름. 다음 숫자 중 하나입니다:

1: 정상
3: 최대
7: 최소

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

문제가 있었다면 -- 예를 들어 LinkFile이 존재하지 않는다면 -- 모든 출력 변수는 비워지고 ErrorLevel에 1이 설정됩니다. 그렇지 않으면 0이 설정됩니다.

논평

출력 변수는 상응하는 정보가 필요하지 않으면 생략할 수 있습니다.

관련 항목

FileCreateShortcut, SplitPath

예제

FileSelectFile, file, 32,, Pick a shortcut to analyze., Shortcuts (*.lnk)
if file =
    return
FileGetShortcut, %file%, OutTarget, OutDir, OutArgs, OutDesc, OutIcon, OutIconNum, OutRunState
MsgBox %OutTarget%`n%OutDir%`n%OutArgs%`n%OutDesc%`n%OutIcon%`n%OutIconNum%`n%OutRunState%


FileGetSize

파일의 크기를 열람합니다.

FileGetSize, OutputVar [, Filename, Units]

매개변수

OutputVar

열람된 크기를 저장할 변수의 이름 (가장 가까운 정수로 내림됩니다).

Filename

목표 파일의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 생략하면, 대신에 파일-회돌이 가장 안쪽에 싸여 있는 현재 파일이 사용됩니다.

Units

존재하면, 바이트가 아니라 지정한 단위로 결과를 반환합니다:
K = 킬로바이트
M = 메가바이트

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 문제가 있으면 1 없으면 0이 설정됩니다.

A_LastError는 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

크기에 상관없이 파일을 지원합니다. 심지어 4 기가바이트가 넘어도 지원합니다. 또 Units가 바이트라도 지원합니다.

목표 파일이 디렉토리이면, 그 크기는 OS가 믿는 크기대로 보고됩니다 (대부분은 0이 보고될 것입니다).

폴더의 크기를 그의 모든 파일을 포함하여 계산하려면, 다음 예제를 따르십시오:

SetBatchLines, -1  ; 연산을 최대 속도로 설정합니다.
FolderSize = 0
FileSelectFolder, WhichFolder  ; 사용자에게 폴더를 고르도록 요청합니다.
Loop, %WhichFolder%\*.*, , 1
    FolderSize += %A_LoopFileSize%
MsgBox Size of %WhichFolder% is %FolderSize% bytes.

관련 항목

FileGetAttrib, FileSetAttrib, FileGetTime, FileSetTime, FileGetVersion, File-loop

예제

FileGetSize, OutputVar, C:\My Documents\test.doc  ; 크기를 바이트 단위로 열람합니다.
FileGetSize, OutputVar, C:\My Documents\test.doc, K  ; 크기를 Kbytes 단위로 열람합니다.


FileGetTime

파일이나 폴더의 날짜시간 도장을 열람합니다.

FileGetTime, OutputVar [, Filename, WhichTime]

매개변수

OutputVar

열람된 날짜-시간을 저장할 변수의 이름. 형식은 YYYYMMDDHH24MISS입니다. 시간은 지역 시간이지, UTC/GMT가 아닙니다.

Filename

목표 파일이나 폴더의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주합니다. 생략하면, 파일-회돌이의 가장 안쪽에 싸인 현재 파일이 대신 사용됩니다.

WhichTime
열람할 시간도장:
M = 변경시간 (매개변수를 생략하면 이것이 기본값)
C = 생성 시간
A = 마지막 접근 시간

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

A_LastError는 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

날짜와 시간에 관한 설정은 YYYYMMDDHH24MISS를 참조하십시오.

관련 항목

FileSetTime, FormatTime, If var is [not] type, FileGetAttrib, FileSetAttrib, FileGetSize, FileGetVersion, File-회돌이, EnvAdd, EnvSub

예제

FileGetTime, OutputVar, C:\My Documents\test.doc  ; 기본으로 변경 시간을 열람합니다.
FileGetTime, OutputVar, C:\My Documents\test.doc, C  ; 생성 시간을 열람합니다.


FileGetVersion

파일의 버전을 열람합니다.

FileGetVersion, OutputVar [, Filename]

매개변수

OutputVar

버전 번호/문자열을 저장할 변수의 이름.

Filename

목표 파일의 이름, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 생략되면, 파일-회돌이의 가장 안쪽에 싸인 현재 파일이 대신 사용됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

A_LastError은 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

대부분의 비-실행 파일 (심지어 어떤 EXE 파일)은 버전이 없습니다. 그래서 이런 경우는 OutputVar가 비어 있습니다.

관련 항목

FileGetAttrib, FileSetAttrib, FileGetTime, FileSetTime, FileGetSize, File-회돌이

예제

FileGetVersion, version, C:\My Application.exe
FileGetVersion, version, %A_ProgramFiles%\AutoHotkey\AutoHotkey.exe


FileInstall

지정된 파일을 스크립트의 컴파일 버전에 포함시킵니다.

FileInstall, Source, Dest [, Flag]

매개변수

Source

컴파일된 EXE에 추가할 파일의 이름. 절대 경로를 지정하지 않으면 파일이 스크립트 자신의 디렉토리에 (또는 상대적으로) 있다고 간주됩니다.

파일 이름에는 겹따옴표, 변수 참조 (예, %A_ProgramFiles%) 또는 와일드카드가 포함되면 안 됩니다. 게다가, (모든 다른 명령어의 매개변수와 똑 같이) 글자 그대로의 퍼센트와 쉼표 같은 특수 문자들은 피신 시켜야 합니다. 마지막으로, 이 매개변수는 FileInstall 명령어의 오른쪽에 나열해야 합니다 (즉, 그 아래의 계속 섹션에 나열하면 안 됩니다).

Dest

Source를 EXE로부터 추출할 때, 이것이 생성될 파일의 이름입니다. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 목표 디렉토리는 이미 존재해야 합니다. Source와 다르게, 변수 참조를 사용해도 됩니다.

Flag

(선택적) 이 플래그는 파일이 이미 존재하면 덮어쓸지 말지 결정합니다:

0 = (기본값) 기존의 파일을 덮어쓰지 않습니다
1 = 기존의 파일을 덮어씁니다

이 매개변수는 표현식일 수 있습니다. 심지어 참이나 거짓으로 평가되면 무엇이든 될 수 있습니다 (참과 거짓은 내부적으로 1과 0으로 저장되기 때문입니다).

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 문제가 있으면 1 없으면 0이 설정됩니다.

관련 항목

이 명령어는 Ahk2Exe 컴파일러를 위한 지시어입니다. 파일을 컴파일 스크립트 결과에 추가할 수 있습니다. 나중에, 컴파일 스크립트가 실행되면, 파일이 다시 디스크로 추출됩니다.

이 파일은 스크립트 컴파일 시간에 추가됩니다. 컴파일된 스크립트가 실행될 때 똑 같은 "FileInstall" 명령어를 만나면, 그 파일은 이제 Dest로 추출됩니다.

스크립트에 추가된 파일은 압축되고 또 암호화됩니다.

이 명령어를 정상의 (컴파일 안 된) 스크립트에 사용하면, 대신에 간단한 파일 복사가 수행됩니다 -- 그래서 스크립트가 결국 제대로 컴파일될지 테스트하는 데 도움이 됩니다.

관련 항목

FileCopy, #Include

예외

FileInstall, C:\My Documents\My File.txt, %A_ProgramFiles%\My Application\Readme.txt, 1


FileMove

파일을 이동합니다.

FileMove, SourcePattern, DestPattern [, Flag]

매개변수

SourcePattern

단일 파일의 이름 또는 C:\Temp\*.tmp와 같은 와일드카드 패턴. SourcePattern은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

DestPattern

목표의 이름 또는 패턴. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 간단한 이동을 수행하려면 -- 기존의 파일 이름은 그대로 두고 -- 폴더 이름만 지정하십시오. 다음 두 예제는 기능상 동등합니다:

FileMove, C:\*.txt, C:\My Folder
FileMove, C:\*.txt, C:\My Folder\*.*
Flag

(선택적) 이 플래그는 파일이 이미 존재하면 덮어쓸지 말지 결정합니다:

0 = (기본) 기존의 파일을 덮어쓰지 않습니다
1 = 기존의 파일을 덮어씁니다

이 매개변수는 표현식일 수 있습니다. 심지어 참이나 거짓으로 평가되면 무엇이든 될 수 있습니다. (참과 거짓은 내부적으로 1과 0으로 저장되기 때문입니다).

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 에러 때문에 이동에 실패한 파일의 개수가 설정됩니다. 그렇지 않으면 0이 설정됩니다. 그렇지만, 소스 파일이 단일 파일이고 (와일드카드 없음) 그리고 존재하지 않으면, ErrorLevel은 0이 설정됩니다. 이 상황을 탐지하려면 이동하기 전에 먼저 소스파일에 IfExist 또는 FileExist()를 사용하십시오.

FileCopy와 다르게, 파일을 자신에 이동하면 언제나 성공한 것으로 간주됩니다. 덮어쓰기 모드가 켜져 있지 않아도 마찬가지입니다.

파일이 발견되면, A_LastError는 0 (영)이 설정되거나 또는 마지막 실패후 즉시 운영 체제의 GetLastError() 함수의 결과가 설정됩니다. 그렇지 않으면 A_LastError에는 왜 파일이 발견되지 않았는지 알려주는 에러 코드가 담깁니다.

논평

FileMove는 파일만 이동합니다. 대신 폴더의 내용을 (그의 모든 파일과 하위 폴더를 포함하여) 이동하려면, 아래 섹션의 예제를 참조하십시오. 단일 폴더를 이동하거나 이름을 바꾸려면, FileMoveDir을 사용하십시오.

에러를 만나더라도 이동을 계속 진행합니다.

이 명령어는 파일을 다른 볼륨에 이동시킬 수 있지만, 같은-볼륨 이동보다 시간이 더 걸립니다. 이것은 같은-볼륨 이동은 이름을 바꾸는 것과 비슷하고, 그래서 훨씬 더 빠르기 때문입니다.

관련 항목

FileCopy, FileCopyDir, FileMoveDir, FileDelete

예제

FileMove, C:\My Documents\List1.txt, D:\Main Backup\  ; 이름을 바꾸지 않고 파일을 이동합니다.
FileMove, C:\File Before.txt, C:\File After.txt  ; 단일 파일의 이름을 바꿉니다.
FileMove, C:\Folder1\*.txt, D:\New Folder\*.bkp  ; 파일을 새 확장자로 바꾸고 이동합니다.

; 다음 예제는 한 폴더 안의 모든 파일과 폴더를 다른 폴더로 이동합니다:
ErrorCount := MoveFilesAndFolders("C:\My Folder\*.*", "D:\Folder to receive all files & folders")
if ErrorCount <> 0
    MsgBox %ErrorCount% files/folders could not be moved.

MoveFilesAndFolders(SourcePattern, DestinationFolder, DoOverwrite = false)
; SourcePattern에 부합하는 모든 파일과 폴더를 DestinationFolder 이름의 폴더에 이동하고
; 이동에 실패한 파일/폴더의 개수를 돌려줍니다.
; 이 함수는 FileMoveDir의 모드 2를 사용하기 때문에 v1.0.38+이 필요합니다.
{
    if DoOverwrite = 1
        DoOverwrite = 2  ; mode 2 vs. 1 사이의 설명은 FileMoveDir을 참조하십시오.
    ; 먼저 모든 파일을 이동합니다 (폴더는 이동하지 않습니다):
    FileMove, %SourcePattern%, %DestinationFolder%, %DoOverwrite%
    ErrorCount := ErrorLevel
    ; 이제 모든 폴더를 이동합니다:
    Loop, %SourcePattern%, 2  ; 2는 "폴더만 열람하라"는 뜻입니다.
    {
        FileMoveDir, %A_LoopFileFullPath%, %DestinationFolder%\%A_LoopFileName%, %DoOverwrite%
        ErrorCount += ErrorLevel
        if ErrorLevel  ; 문제의 폴더를 이름으로 보고합니다.
            MsgBox Could not move %A_LoopFileFullPath% into %DestinationFolder%.
    }
    return ErrorCount
}


FileMoveDir

폴더를 그의 모든 하위 폴더를 포함하여 이동합니다. 폴더의 이름을 바꿀 수도 있습니다.

FileMoveDir, Source, Dest [, Flag]

매개변수

Source

소스 디렉토리의 이름 (뒤에 역사선 없음), 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고간주됩니다. 예를 들어: C:\My Folder

Dest

디렉토리의 새로운 경로와 이름 (뒤에 역사선 없음), 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 예를 들어: D:\My Folder. 주의: Dest는 이동한 후에 디렉토리가 갖게 될 실제 경로와 이름입니다; Source가 이동되어 들어 갈 디렉토리가 아닙니다 (아래에 기술한 알려진 한계는 예외입니다).

Flag

(옵션) 다음 단일 문자 중 하나를 지정하십시오:

0 (기본값): 기존의 파일을 덮어쓰지 않습니다. Dest가 이미 파일이나 폴더로 존재하면 이동은 실패합니다.

1: 기존의 파일을 덮어씁니다. 그렇지만, Dest 안의 파일이나 폴더가 Source에 짝이 없으면 삭제되지 않습니다. 알려진 한계: Dest가 이미 폴더로 존재하고 Source와 같은 볼륨에 있다면, Source는 그를 덮어 쓰는게 아니라 그 안으로 이동되어 들어갑니다. 이를 피하려면, 다음 옵션을 참고하십시오.

2: 위의 모드 1과 동일하지만 제한이 없습니다.

R: 디렉토리를 이동하지 않고 그 이름을 변경합니다. 보통 이름을 변경하는 것은 이동한 것과 효과가 같지만, "모두 아니면 모두 아님" 행위를 원할 경우 도움이 됩니다; 즉, Source나 그의 파일 중 하나가 잠겨 있을 때 (사용 중일 때) 이동이 부분적으로만 성공하는 것을 원하지 않을 경우에 도움이 됩니다. 이 방법은 Source를 다른 볼륨으로 이동할 수 없습니다. 오직 자신의 볼륨에 있는 다른 디렉토리로만 이동할 수 있습니다. Dest가 이미 파일이나 폴더로 존재하면 이동에 실패합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

논평

FileMoveDir은 단일 폴더를 새 위치로 이동합니다. 대신 폴더의 내용을 (그의 모든 파일과 하위 디렉토리를 포함하여) 이동하려면, FileMove 섹션의 예제를 참조하십시오.

소스와 목표가 다른 볼륨에 있거나 UNC 경로에 있으면, 이동이 아니라 복사/제거 연산이 수행됩니다.

관련 항목

FileCopyDir, FileCopy, FileMove, FileDelete, File-회돌이, FileSelectFolder, SplitPath

예제

FileMoveDir, C:\My Folder, D:\My Folder  ; 새 드라이브로 이동시킵니다.
FileMoveDir, C:\My Folder, C:\My Folder (renamed), R  ; 간단한 이름 변경.
FileMoveDir, C:\My Folder, C:\New Location\My Folder, R  ; 폴더는 같은 폴더에 있으면 "이름을 바꾸어" 다른 위치로 이동할 수 있습니다.


FileOpen

FileOpen [AHK_L 42+]

파일을 엽니다.

file := FileOpen(Filename, Flags [, Encoding])

매개변수

Filename

열 파일의 경로. 절대 경로를 지정하지 않으면 A_WorkingDir에 있다고 간주됩니다.

[v1.1.17+]: 표준 입력/출력/에러 스트림을 열려면 별표를 (또는 별표 두 개를) 아래에 보여주는 바와 같이 지정하십시오:

FileOpen("*", "r")   ; 표준입력
FileOpen("*", "w")   ; 표준출력
FileOpen("**", "w")  ; 표준에러
Flags

[in AHK_L 54+] 원하는 접근 모드를 가리키는 문자 그리고 다음에 다른 옵션이 따라와 구성된 문자열 (선택적으로 사이에 스페이스 또는 탭); 또는 [ AHK_L 42+] 숫치 플래그의 조합 (합계). 지원되는 값들은 아래 테이블에 기술합니다.

Encoding

파일에 UTF-8 또는 UTF-16 바이트 순서 표식이 없을 때, 또는 h (핸들) 프래그가 사용될 때 텍스트 I/O에 사용할 코드 페이지입니다. 생략되면, A_FileEncoding의 현재 값이 사용됩니다.

Flags

 |  | 접근 모드 (서로-배타적임)
r | 0 | Read: 파일이 존재하지 않으면 실패합니다.
w | 1 | Write: 새 파일을 생성합니다, 기존의 파일을 덮어쓰기 합니다.
a | 2 | Append: 파일이 존재하지 않으면 새 파일을 생성합니다, 그렇지 않으면 파일 포인터를 파일의 끝으로 이동합니다.
rw | 3 | Read/Write: 파일이 존재하지 않으면 새 파일을 생성합니다.
h |  | Filename이 객체 안에 싸 넣을 파일 핸들임을 나타냅니다. 공유 모드 플래그는 무시됩니다. 그리고 이 핸들이 가리키는 파일이나 스트림은 바이트 순서 표식이 점검되지 않습니다. 파일 핸들은 파일 객체가 파괴될 때 자동으로 잠기지 않습니다. 그리고 Close를 호출해 봐야 아무 효과도 없습니다. 주의 하십시오. Filename이 파이프나 통신 장치 같이 위치 지정이 안되는(nonseeking) 장치를 가리키는 핸들이면 Seek, Tell 그리고 Length를 사용하면 안 됩니다.
 |  | 공유 모드 플래그
-rwd |  | 읽기, 쓰기 그리고 지우기 접근을 위해 파일을 잠금니다. r, w 그리고 d을 조합해 사용해도 됩니다. -를 지정하면 -rwd를 지정한 것과 같습니다. 완전히 생략하면, 기본은 모든 접근을 공유하는 것입니다.
 | 0 | Flags가 숫치이면, 공유 모드 플래그가 없을 경우 파일이 잠깁니다.
 | 0x100 | read 접근을 공유합니다.
 | 0x200 | write 접근을 공유합니다.
 | 0x400 | delete 접근을 공유합니다.
 |  | 줄 끝(End of line (EOL)) 옵션
`n | 4 | 읽을 때 `r`n을 `n으로 교체합니다. 그리고 쓸 때 `n을 `r`n으로 교체합니다.
`r | 8 | 읽을 때 나홀로 `r을 `n으로 교체합니다.

반환 값

파일이 성공적으로 열리면, 반환 값은 파일 객체입니다.

함수가 실패하면, 반환 값은 0이고 [in AHK_L 54+] A_LastError는 에러 코드가 담깁니다.

함수가 성공했는지 점검하려면 if file 또는 IsObject(file)를 사용하십시오.

논평

UTF-8 또는 UTF-16 파일이 생성될 때, 바이트 순서 표식이 파일에 씌여집니다. 단, Encoding (또는 Encoding을 생략하면 A_FileEncoding)에 "UTF-8-RAW" 또는 "UTF-16-RAW"이 담겨 있는 경우는 예외입니다.

UTF-8 또는 UTF-16 바이트 순서 표식(byte order mark (BOM))을 담고 있는 파일이 읽기 접근을 위해 열릴 때, BOM은 파일 포인터를 그 다음으로 이동해서 출력으로부터 제외됩니다. 그러므로, File.Position은 파일을 열고 난후 즉시 3 또는 2를 보고합니다.

관련 항목

FileEncoding, File Object, FileRead

예제

; 예제: 다음 스크립트는 텍스트를 파일에 쓴 다음 다시 메모리로 읽어 들입니다.
; 다음 DllCall-예제와 기능이 같습니다.

FileSelectFile, FileName, S16,, Create a new file:
if (FileName = "")
    return
file := FileOpen(FileName, "w")
if !IsObject(file)
{
    MsgBox Can't open "%FileName%" for writing.
    return
}
TestString := "This is a test string.`r`n"  ; 파일을 이런 식으로 쓸 때,  새 줄을 시작하려면 `n 말고 `r`n을 사용하십시오.
file.Write(TestString)
file.Close()

; 이제 파이을 다 썼으므로, 다시 메모리로 그 내용을 읽어 들입니다.
file := FileOpen(FileName, "r-d") ; 파일을 읽습니다 ("r"),  지우기 ("-d")만 빼고 모든 접근을 공유합니다.
if !IsObject(file)
{
    MsgBox Can't open "%FileName%" for reading.
    return
}
CharsToRead := StrLen(TestString)
TestString := file.Read(CharsToRead)
file.Close()
MsgBox The following string was read from the file: %TestString%
; 읽기 전용 모드로 스크립트를 엽니다. 그리고 그의 첫 줄을 읽습니다:
file := FileOpen(A_ScriptFullPath, "r")
MsgBox % file.ReadLine()

; 다음 데모를 보여주기 위해 콘솔 창을 엽니다:
DllCall("AllocConsole")
; 어플리케이션의 stdin/stdout 스트림을 새줄-변환 모드로 엽니다.
stdin  := FileOpen("*", "r `n")  ; Requires v1.1.17+
stdout := FileOpen("*", "w `n")
; 예전 버전에는 다음을 사용합니다:
;   stdin  := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n")
;   stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
stdout.Write("Enter your query.`n\> ")
stdout.Read(0) ; 쓰기 버퍼를 비웁니다.
query := RTrim(stdin.ReadLine(), "`n")
stdout.WriteLine("Your query was '" query "'. Have a nice day.")
stdout.Read(0) ; 읽기 버퍼를 비웁니다.
Sleep 5000


FileRead

파일의 내용을 변수 안으로 읽습니다.

FileRead, OutputVar, Filename

매개변수

OutputVar

열람된 데이터를 저장할 변수의 이름. 문제가 일어나면 예를 들어 파일이 "사용 중"이거나 존재하지 않으면 (이 경우 ErrorLevel은 1로 설정됩니다) OutputVar는 비워집니다. Filename이 빈 파일이어도 비워집니다 (이 경우 ErrorLevel은 0이 설정됩니다).

Filename

읽을 파일의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

Options: 파일의 이름 앞에 바로 0 개 이상의 다음 문자열이 나타날 수도 있습니다. 각 옵션은 옵션 사이에 단일 스페이스 또는 탭으로 분리하십시오. 예를 들어: *t *m5000 C:\Log Files\200601.txt.

*c: ClipboardAll 파일 또는 다른 이진 데이터를 적재합니다. *c 옵션이 존재하면 다른 모든 옵션은 무시됩니다.

*m1024: 이 옵션이 생략되면, 전체 파일은 메모리가 모자라지 않는 한 적재됩니다. 이런 경우 에러 메시지가 나타납니다. 그리고 쓰레드는 종료합니다 (그러나 이를 피하려면 Try를 사용할 수 있습니다). 그렇지 않으면, 1024를 바이트 개수의 십진수 또는 십육진 수로 교체하십시오. 파일이 이 보다 크면, 오직 그의 앞 부분만 적재됩니다. 주의: 이 때문에 마지막 줄은 `r`n이 아니라 캐리지 리턴 홀로 (`r) 끝나는 결과를 초래할 수 있습니다.

*t: 캐리지 리턴 & 라인피드 (`r`n)가 나타나면 모두 라인피드 (`n)로 바꿉니다. 그렇지만, 이 변환은 수행성능을 줄입니다. 그리고 보통 필요하지 않습니다. 예를 들어, `r`n이 포함된 텍스트는 이미 Gui Edit 콘트롤에 추가될 올바른 형식입니다. 비슷하게, FileAppend는 새 파일을 열 때 `r`n이 있는지 탐지합니다; 각 `r`n을 있는 그대로 쓸 줄 압니다. `r`r`n으로 변환하지 않습니다. 마지막으로, 파일 끝이 `r`n로 끝나든 그냥 `n로 끝나든 상관없이 다음 파싱 회돌이는 올바르게 작동할 것입니다: Loop, parse, MyFileContents, `n, `r.

*Pnnn: [AHK_L 42+]: FileEncoding이 설정한 기본 인코딩을 오버라이드 합니다. 여기에서 nnn은 숫치 코드 페이지 식별자입니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 적재가 성공하면 0이 설정됩니다. 문제가 일어나면 1이 설정됩니다. 예를 들면:

  1. 파일이 존재하지 않는다;
  2. 파일이 잠겨 있거나 접근이 불가능하다;
  3. 시스템에 파일을 적재할 메모리가 충분하지 않다

A_LastError는 운영 체제의 GetLastError() 함수의 결과가 담깁니다.

이진 데이터 읽기

파일, 매개변수 그리고 기본 설정에 따라, FileRead는 파일 데이터를 텍스트로 이해하고 그것을 스크립트가 사용하는 고유의 인코딩으로 변환합니다. 이 때문에 파일에 이진 데이터가 들어 있을 경우 문제를 야기할 수 있습니다. 다음 경우는 예외입니다:

  • *C 옵션이 존재하면, 모든 코드 페이지와 줄끝 변환은 무조건 무시됩니다.
  • *Pnnn 옵션이 존재하고 nnn이 고유의 문자열 인코딩에 상응하면, 코드 페이지 변환이 일어나지 않습니다.
  • 현재 파일 인코딩 설정이 고유의 문자열 인코딩에 상응한다면, 코드 페이지 변환은 일어나지 않습니다.

주목하십시오. 일단 데이터를 OutputVar를 읽어 들였다면, 오토핫키 명령어와 함수에 오직 (존재한다면) 첫 이진 0 앞의 텍스트만 "보여집니다". 그렇지만, 전체 내용은 여전히 존재하고 NumGet() 같은 고급 방식으로 접근할 수 있습니다.

마지막으로, FileOpen() 그리고 File.RawRead() 또는 File.ReadNum() 먼저 전체 파일을 메모리로 읽어 들일 필요 없이 이진 데이터를 읽는 데 사용할 수 있습니다.

논평

목적이 파일의 모든 내용 또는 일부를 메모리로 읽어 들이는 것일 때, 파일-읽기 회돌이를 사용하는 것보다 FileRead가 수행성능이 훨씬 더 좋습니다.

크기가 1 GB가 넘는 파일은 ErrorLevel에 1이 설정되고 그리고 OutputVar는 비워집니다. 단, *m 옵션이 존재하면 예외입니다. 이 경우는 파일의 앞부분이 적재됩니다.

FileRead는 #MaxMem을 준수하지 않습니다. 너무 많은 메모리를 사용할까 걱정이 되면, FileGetSize으로 미리 파일 크기를 점검하십시오.

FileOpen()은 FileRead보다 고급 기능을 제공합니다. 예를 들어 파일 전체를 메모리로 읽어 들일 필요 없이 특정한 위치에 데이터를 읽고 쓸 수 있습니다. 함수 리스트는 파일 객체를 참조하십시오.

관련 항목

FileEncoding, FileOpen/File Object, file-reading loop, FileReadLine, FileGetSize, FileAppend, IniRead, Sort, UrlDownloadToFile

예제

; 예제 #1: 텍스트 파일을 OutputVar로 읽어 들입니다.
FileRead, OutputVar, C:\My Documents\My File.txt
; 예제 #2: 파일의 내용을 신속하게 정렬합니다.
FileRead, Contents, C:\Address List.txt
if not ErrorLevel  ; 성공적으로 적재됨.
{
    Sort, Contents
    FileDelete, C:\Address List (alphabetical).txt
    FileAppend, %Contents%, C:\Address List (alphabetical).txt
    Contents =  ; 메모리를 풀어줍니다.
}


FileReadLine

파일로부터 특정 줄을 읽어서 그 텍스트를 변수에 저장합니다.

FileReadLine, OutputVar, Filename, LineNum

매개변수

OutputVar

열람한 텍스트를 저장할 변수의 이름.

Filename

접근할 파일의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. Windows 그리고 Unix 포맷이 지원됩니다; 즉, 파일의 줄은 캐리지 리턴과 라인피드 (`r`n) 또는 그냥 라인피드 (`n)로 끝납니다.

LineNum

읽을 줄 번호 (1이면 첫 줄, 2이면 두 번째, 등등). 이것은 표현식일 수 있습니다.

지정된 줄 번호가 파일의 줄 개수보다 크면, ErrorLevel은 1이 설정되고 OutputVar는 바뀌지 않습니다. 이것은 또한 지정된 줄 번호가 파일의 마지막 줄이지만 그 줄이 비어 있고 새줄/CRLF로 끝나지 않은 경우에도 일어납니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 성공하면 0이 설정됩니다. 그렇지 않으면 1이 설정되고 OutputVar의 원래 내용도 바뀌지 않습니다.

A_LastError는 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

이 명령어는 작은 파일들에만 사용할 것을 강력 권합니다. 또는 한 줄의 텍스트만 필요한 경우에 사용하십시오. 방대한 개수의 줄을 스캔하고 처리하려면 (한 줄씩), 최고의 수행성을 위해 파일-일기 회돌이를 사용하십시오. 전체 파일을 변수 안으로 읽어 들이려면, FileRead를 사용하십시오.

줄에서 선두와 후미의 탭과 스페이스는 OutputVar에 씌여지겠지만, 줄 끝의 라인피드 문자 (`n)는 그렇지 않습니다. 탭과 스페이스는 변수 양끝으로부터 걷어낼 수 있습니다. AutoTrim이 켜져 있는 (기본값) 상태에서 할당하면 됩니다. 예를 들어: MyLine = %MyLine%.

65,534 문자 길이 까지 줄을 읽을 수 있습니다. 줄 길이가 이 제한을 초과하면, 나머지 문자들은 다음 명령어로 열람할 수 없습니다 (대신에 FileRead 또는 파일-읽기 회돌이를 사용하십시오).

관련 항목

FileOpen/File.ReadLine(), FileRead, FileAppend, 파일-읽기 회돌이, IniRead

예제

Loop
{
    FileReadLine, line, C:\My Documents\ContactList.txt, %A_Index%
    if ErrorLevel
        break
    MsgBox, 4, , 줄 #%A_Index%는 "%line%"입니다. 계속하시겠습니까?
    IfMsgBox, No
        return
}
MsgBox, 파일 끝에 도달했습니다. 또는 문제가 있었습니다.
return


FileRecycle

파일이나 디렉토리를 휴지통으로 보냅니다.

FileRecycle, FilePattern

매개변수

FilePattern

파일 이름이거나 C:\Temp\*.tmp와 같은 와일드카드 패턴. FilePattern은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

전체 디렉토리를 버리려면, 뒤에 역사선 없이 이름만 주면 됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패하면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1이 그렇지 않으면 0이 설정됩니다.

논평

SHFileOperation이 실제 작업을 하는데 사용됩니다. 이 함수는 파일이 너무 커서 휴지통에 들어가지 않으면 영구히 지웁니다; v1.0.96 현재 이런 일이 일어나기 전에 경고를 보여줍니다.

관련 항목

FileRecycleEmpty, FileDelete, FileCopy, FileMove

예제

FileRecycle, C:\temp files\*.tmp


FileRecycleEmpty

휴지통을 비웁니다.

FileRecycleEmpty [, DriveLetter]

매개변수

DriveLetter

생략하면, 모든 드라이브에 대하여 휴지통을 치웁니다. 그렇지 않으면, C:\와 같이 드라이브를 지정하십시오

ErrorLevel

[v1.1.04+] 이 명령어는 실패하면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 문제가 있으면 1 그렇지 않으면 0이 설정됩니다.

논평

이 명령어은 MS Internet Explorer 4 이상이 설치되어 있기를 요구합니다.

관련 항목

FileRecycle, FileDelete, FileCopy, FileMove

예제

FileRecycleEmpty, C:\


FileRemoveDir

폴더를 삭제합니다.

FileRemoveDir, DirName [, Recurse?]

매개변수

DirName

삭제할 디렉토리의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주합니다.

하위 폴더까지 삭제할 것인가?

0 (기본값): DirName에 포함된 파일과 하위-디렉토리는 지우지 않습니다. 이 경우, DirName이 비어 있지 않으면, 아무 행위도 일어나지 않으며 ErrorLevel은 1로 설정됩니다.

1: 모든 파일과 하위디렉토리를 삭제합니다 (윈도우즈의 명령어 "rmdir /S").

이 매개변수는 표현식일 수 있습니다. 심지어 참이나 거짓으로 평가되는 것도 가능합니다 (참과 거짓은 내부적으로 1과 0으로 저장되기 때문입니다).

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1, 그렇지 않으면 0이 설정됩니다.

논평

없음

관련 항목

FileCreateDir, FileDelete

예제

FileRemoveDir, C:\Download Temp
FileRemoveDir, C:\Download Temp, 1


FileSelectFile

사용자가 파일을 열거나 저장할 수 있는 표준 대화상자를 보여줍니다.

FileSelectFile, OutputVar [, Options, RootDir\Filename, Prompt, Filter]

매개변수

OutputVar

사용자가 선택한 파일이름을 저장할 변수의 이름. 사용자가 취소를 하면 (즉, 파일을 선택하지 않으면) 이 값은 비워집니다.

옵션

생략하면, 0이 기본값이 됩니다. 아래 옵션을 하나도 지정하지 않은 것과 같습니다.

M: 다중-선택. 기호 M을 지정하면 사용자는 shift-click, control-click, 또는 기타 수단을 통하여 파일을 하나 이상 선택할 수 있습니다. M은 선택적으로 다음에 숫자가 아래와 같이 따라 올 수 있습니다 (예를 들어, M과 M1은 모두 유효합니다). 개별적으로 파일을 추철하려면, 이 페지이 하단의 예제를 참조하십시오.

S: 저장 버튼입니다. 기호 S를 지정하면 대화상자가 언제나 Open 대신에 Save 버튼을 보여줍니다. S는 선택적으로 다음에 숫자가 (또는 숫자들의 합)이 아래에 기술하는 바와 같이 (예를 들어, S와 S24는 모두 유효합니다) 따라 올 수 있습니다.

M과 S가 없더라도, 다음 숫자는 사용할 수 있습니다. 여러 숫자를 지정하려면, 합쳐서 지정하면 됩니다. 예를 들어 8과 16을 지정하려면, 숫자 24를 지정합니다.

1: 파일이 존재해야 함
2: 경로가 존재해야 함
8: 새 파일을 만들 프롬프트
16: 파일을 덮어쓸 프롬프트
32 [v1.0.43.09+]: 단축파일 (.lnk)은 목표로 결정되지 않고 그대로 선택됩니다. 이 옵션은 또 폴더 단축키를 통하여 폴더를 항하지 못하도록 막습니다.

"덮어쓸 프롬프트" 옵션이 "만들 프롬프트" 옵션 없이 존재하면, 대화상자는 Open 버튼이 아니라 Save 버튼이 포함됩니다. 이 행위는 윈도우즈의 괴이한 행위 때문입니다.

RootDir\Filename

존재하면, 이 매개변수는 다음 중 하나를 담고 있습니다:

RootDir: 루트 (시작) 디렉토리, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있는 하위폴더라고 간주합니다. 생략하거나 비어 있으면, 시작 디렉토리는 OS 버전에 따라 기본값이 결정됩니다 (앞에서 FileSelectFile을 사용하는 동안 사용자가 가장 최근에 선택한 디렉토리가 될 가능성이 높습니다). Windows XP/2003 이전의 v1.0.43.10+에서, ::{20d04fe0-3aea-1069-a2d8-08002b30309d} (즉, 내 컴퓨터)와 같은 CLSID도 지정할 수 있습니다. 이 경우 CLSID 뒤에 나타나는 하위디렉토리가 나타나면 모두 역사선으로 끝나야 합니다 (그렇지 않으면, 마지막 역사선 다음의 문자열은 아래와 같이 기본 파일 이름으로 번역됩니다).

Filename: 대화상자의 편집 필드에 처음에 보여줄 기본 파일이름. (경로 없는) 날 파일이름만 보여줍니다. 대화상자가 올바르게 보여지도록 확인하려면, 유효하지 않은 문자들이 나타나지 않도록 확인하십시오 (예를 들어 /<|:").

예제:

C:\My Pictures\Default Image Name.gif  ; RootDir과 Filename 모두 나타납니다.
C:\My Pictures  ; RootDir만 나타납니다.
My Pictures  ; RootDir만 나타나고, 그의 위치는 현재 작업 디렉토리에 상대적입니다.
My File  ; Filename만 나타납니다 (그러나 "My File"이 폴더로 존재하면,  RootDir에 있다고 간주됩니다).
Prompt

사용자에게 무엇을 할지 창에 보여주는 텍스트. 생략하거나 비어 있으면, 기본값은 "Select File - %A_SCRIPTNAME%" (즉, 현재 스크립트의 이름)이 됩니다.

Filter

대화상자에 어떤 유형의 파일을 보여줄지 나타냅니다.

예제: Documents (*.txt)
예제: Audio (*.wav; *.mp2; *.mp3)

생략하면, 필터 기본값은 모든 파일 (*.*)이 됩니다. 텍스트 문서 (*.txt)를 위한 옵션도 대화상자의 "파일의 종류" 메뉴에 사용할 수 있습니다.

그렇지 않으면, 필터는 지시된 문자열을 사용하고 또 대화상자의 "파일 유형" 드롭-다운 리스트에 모든 파일 (*.*)에 대한 옵션도 제공합니다. 필터에 여러 파일 확장자를 포함하려면 위에서 예시한 바와 같이 사이를 쌍반점으로 분리하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 사용자가 파일 선택없이 대화상자를 취소하면 (예를 들어 취소 버튼을 누르면) 1이 설정됩니다. 시스템이 대화상자를 보여주기를 거부하는 경우에도 1이 설정됩니다 (거의 없음). 그렇지 않으면, 0이 설정됩니다.

논평

사용자가 아무 것도 선택하지 않았다면 (예, CANCEL 누름), OutputVar는 비워집니다.

다중-선택이 꺼져 있으면, OutputVar은 사용자가 선택한 단일 파일의 전체 경로와 이름이 설정됩니다.

M 옵션 (다중-선택)이 켜져 있으면, OutputVar는 항목 리스트가 설정됩니다. 마지막을 제외하고 각 항목은 라인피드 (`n) 문자로 끝납니다. 리스트에서 첫 항목은 선택된 모든 파일을 담은 경로입니다 (이 경로는 C:\와 같이 루트 폴더일 때만 역사선으로 끝납니다). 다른 항목은 선택된 파일이름들입니다 (경로 없음). 예를 들어:

C:\My Documents\New Folder [아래의 모든 파일이 거주하는 경로입니다]
test1.txt [맨 파일이름입니다: 경로 없음]
test2.txt
... etc.

(이 페이지 하단의 예제에서 이 파일들을 하나씩 추출하는 법을 보여줍니다.)

다중-선택이 켜져 있으면, 선택된 파일 이름의 길이의 합은 64 KB로 제한됩니다. 이 정도면 보통 수 천 개의 파일을 담을 정도로 충분하지만, 그 한계를 초과하면 OutputVar는 비워집니다.

GUI 창은 Gui +OwnDialogs를 사용하여 모달 파일-선택 대화상자를 보여줄 수도 있습니다. 모달 대화상자는 끝날 때까지 사용자가 GUI 창과 상호작용하는 것을 막습니다.

알려진 한계: FileSelectFile 대화상자를 보여주는 동안에 기동한 타이머는 사용자가 대화상자 안에 클릭한 것을 타이머가 끝날 때까지 연기합니다. 이를 우회하려면, 끝나는데 시간이 많이 걸리는 서브루틴의 타이머를 피하거나, 모든 타이머를 모달 대화상자를 사용하는 동안에는 끄십시오:

Thread, NoTimers
FileSelectFile, OutputVar
Thread, NoTimers, false

폐기된 옵션: v1.0.25.06+에서 다중-선택 옵션 "4"는 폐기되었습니다. 그렇지만, 예전 스크립트와의 호환을 위해, 여전히 예전과 같이 작동합니다. 특히, 사용자가 오직 파일을 하나만 선택하면, OutputVar에 전체 경로와 이름 그리고 다음에 라인피드 문자(`n)가 담깁니다. 사용자가 여러 파일을 선택하면, 그 형식은 위에 기술한 M 옵션을 사용한 것과 같습니다. 단, 마지막 항목도 역시 라인피드로 (`n) 끝나는 점이 다릅니다.

관련 항목

FileSelectFolder, MsgBox, InputBox, ToolTip, GUI, CLSID List, 파싱 회돌이, SplitPath

또한, 운영 체제는 사용자가 글꼴이나 색깔, 또는 아이콘을 선택할 수 있는 표준 대화상자를 제공합니다. 이런 대화상자는 DllCall()을 통하여 보여줄 수 있습니다. 다음에 예시합니다: www.autohotkey.com/forum/topic17230.html.

예제

FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.txt; *.doc)
if SelectedFile =
    MsgBox, 사용자가 아무 것도 선택하지 않았습니다.
else
    MsgBox, 사용자가 다음 파일을 선택했습니다:`n%SelectedFile%

; CLSID 예제 (XP/2003 이전 필요):
FileSelectFile, OutputVar,, ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 휴지통.

; 다중-선택 예제:
FileSelectFile, files, M3  ; M3 = 기존의 파일을 다중 선택합니다.
if files =
{
    MsgBox, 사용자가 취소 버튼을 눌렀습니다.
    return
}
Loop, parse, files, `n
{
    if a_index = 1
        MsgBox, 선택된 파일은 모두  %A_LoopField% 안에 포함되어 있습니다.
    else
    {
        MsgBox, 4, , 다음 파일은 %A_LoopField%입니다. 계속하시겠습니까?
        IfMsgBox, No, break
    }
}
return


FileSelectFolder

사용자가 폴더를 선택할 수 있는 표준 대화상자를 보여줍니다.

FileSelectFolder, OutputVar [, StartingFolder, Options, Prompt]

매개변수

OutputVar

사용자가 선택한 폴더를 저장할 변수의 이름. 사용자가 취소하면 비워집니다 (즉, 폴더를 선택하지 않으면). 사용자가 루트 디렉토리를 선택하면 (예, C:\), OutputVar에는 역사선이 뒤에 포함됩니다. 이것이 싫다면, 다음과 같이 제거하십시오:

FileSelectFolder, Folder
Folder := RegExReplace(Folder, "\\$")  ; Removes the trailing backslash, if present.
StartingFolder

비어 있거나 생략하면, 대화상자의 최초 선택이 사용자의 내문서 폴더가 됩니다 (또는 내컴퓨터도 가능). ::{20d04fe0-3aea-1069-a2d8-08002b30309d} (즉, 내컴퓨터)와 같은 CLSID 폴더를 지정하면 특정한 폴더에서 항해를 지정할 수 있습니다.

그렇지 않으면, 이 매개변수의 가장 흔한 사용법은 별표 다음에 드라이브나 폴더의 절대 경로가 따라와 최초로 선택되는 것입니다. 예를 들어, *C:\은 처음에 C 드라이브를 선택합니다. 비슷하게, *C:\My Folder이면 처음에 그 특정 폴더를 선택합니다.

별표는 사용자에게 시작 폴더로부터 위로 (루트쪽으로) 항해를 허용한다는 뜻입니다. 별표가 없다면, 사용자는 StartingFolder안 (또는 StartingFolder 자체)에서만 선택해야 합니다. 별표를 생략하면 좋은 점은 StartingFolder가 처음에 트리가 확장된 상태로 보여진다는 것입니다. 이 덕분에 사용자는 첫 번째 플러스 사인을 클릭하지 않아도 됩니다.

별표가 존재하면, 위로 항해는 바탕화면 말고 선택적으로 폴더로 제한됩니다. 이렇게 제한하려면 별표를 최상단 폴더의 절대 경로 앞에 두고 다음에 정확하게 스페이스 하나 또는 탭 하나를 배치하면 됩니다. 다음 예제에서 사용자는 C:\My Folder 위로 항해하는 것이 허용되지 않습니다 (그러나 최초 선택은 C:\My Folder\Projects입니다):
C:\My Folder *C:\My Folder\Projects

Options

다음 숫자 중 하나:

0: 아래의 옵션을 모두 비활성화 합니다 (Windows 2000 제외, "새 폴더 만들기" 버튼이 어쨋거나 나타날 수 있습니다).

1 (기본값): 사용자가 새 폴더를 만들 수 있는 버튼이 제공됩니다.

더하기 2 위의 숫자에 더하면 사용자가 폴더의 이름을 타자할 수 있는 편집 필드를 제공합니다. 예를 들어, 이 매개변수에 값을 3을 지정하면 편집 필드와 "새 폴더 만들기" 버튼을 모두 제공합니다.

더하기 4 위의 숫자에 더하면 BIF_NEWDIALOGSTYLE 특성이 생략됩니다. 4를 더하면 WinPE 또는 BartPE와 같은 설치전 환경(Preinstallation Environment)에서도 확실하게 FileSelectFolder가 제대로 작동합니다. 그렇지만, 이렇게 하면 "새 폴더 만들기" 버튼이 나타나지 않습니다. 적어도 Windows XP에서는 확실하게 나타나지 않습니다. ["4"는 v1.0.48+를 요구합니다]

사용자가 편집 필드 안에 무효한 폴더 이름을 타자하면, OutputVar는 사용자가 입력한 이름이 아니라 항해 트리에서 선택된 폴더가 설정됩니다. 적어도 Windows XP에서는 그렇습니다.

이 매개변수는 표현식일 수 있습니다.

Prompt

사용자에게 무엇을 해야 할지 창에 보여주는 텍스트. 생략되거나 비어 있으면, "Select Folder - %A_SCRIPTNAME%" (즉, 현재 스크립트의 이름)이 기본값이 됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 사용자가 폴더를 선택하지 않고 (예를 들어 취소 버튼을 눌러서) 취소하면 1이 설정됩니다. 또 시스템이 대화상자를 보여주기를 거부하는 경우에도 1이 설정됩니다 (거의 없음). 그렇지 않으면 0이 설정됩니다.

논평

GUI 창은 Gui +OwnDialogs를 사용하여 모달 폴더-선택 대화상자를 보여줄 수 있습니다. 모달 대화상자에서 사용자는 대화상자가 끝날 때까지 GUI 창과 상호작용할 수 없습니다.

알려진 한계: FileSelectFolder 대화상자를 보여주는 동안에 기동되는 타이머는 사용자가 대화상자에서 클릭한 효과를 타이머가 끝날 때까지 연기합니다. 이를 우회하려면, 종료에 시간이 걸리는 서브루틴을 가진 타이머의 사용을 피하거나, 또는 대화상자가 있는 동안에 모든 타이머를 끄십시오:

Thread, NoTimers
FileSelectFolder, OutputVar,, 3
Thread, NoTimers, false

관련 항목

FileSelectFile, MsgBox, InputBox, ToolTip, GUI, CLSID List, FileCopyDir, FileMoveDir, SplitPath

또한, 운영 체제는 사용자가 글꼴, 컬러, 또는 아이콘을 선택할 수 있는 표준 대화상자를 제공합니다. 이런 대화상자는 DllCall()을 통하여 보여줄 수 있습니다. 다음에 예시합니다: www.autohotkey.com/forum/topic17230.html.

예제

FileSelectFolder, OutputVar, , 3
if OutputVar =
    MsgBox, 폴더를 선택하지 않았습니다.
else
    MsgBox, "%OutputVar%" 폴더를 선택했습니다.

; CLSID 예제:
FileSelectFolder, OutputVar, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; 내 컴퓨터.


FileSetAttrib

파일이나 폴더의 속성을 변경합니다. 와일드카드를 지원합니다.

FileSetAttrib, Attributes [, FilePattern, OperateOnFolders?, Recurse?]

매개변수

Attributes

변경할 속성 (논평 참조).

FilePattern
단일 파일이나 폴더의 이름, 또는C:\Temp\*.tmp와 같은 와이들카드 패턴. FilePattern은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

생략되면, 파일-회돌이 가장 안쪽에 싸인 현재 파일이 대신 사용됩니다.

OperateOnFolders?

0 (기본값) 폴더는 처리하지 않습니다 (파일만 처리).
1 와일드카드 패턴에 부합하는 모든 파일과 폴더는 처리됩니다.
2 오직 폴더만 처리됩니다 (파일 불가).

주의: FilePattern이 와일드카드 패턴이 아니라 단일 폴더이면, 이 설정에 상관 없이 언제나 처리됩니다.

이 매개변수는 표현식일 수 있습니다.

Recurse?

0 (기본값) 하위폴더에 재귀해 들어가지 않습니다.
1 하위폴더에 재귀해 들어가 거기에서 FilePattern에 부합하는 모든 파일과 폴더를 처리합니다. 모든 하위폴더에 재귀해 들어갑니다. FilePattern에 부합하는 폴더에만 재귀하는 것이 아닙니다. 그렇지만, 파일과 폴더의 완전한 경로가 259 문자를 넘어가면 마치 존재하지 않는 듯 건너 뜁니다. 그런 파일은 거의 없습니다. 왜냐하면, 보통 운영 체제가 그런 파일은 생성을 허용하지 않기 때문입니다.

이 매개변수는 표현식일 수 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 변경에 실패한 파일의 개수가 설정되고 그렇지 않으면 0이 설정됩니다.

파일이 발견되면, A_LastError는 0 (영)이 설정되거나 또는 마지막 실패후 즉시 운영 체제의 GetLastError() 함수의 결과가 설정됩니다. 그렇지 않으면 A_LastError는 왜 파일이 발견되지 않았는지 알려줄 에러 코드가 담깁니다.

논평

Attributes 매개변수는 연산자와 속성 기호의 집단으로 구성됩니다.

연산자:

+ | 속성을 켭니다
- | 속성을 켭니다
^ | 속성을 토글합니다 (현재와 반대 값으로 설정합니다)

속성 기호:
R = READONLY
A = ARCHIVE
S = SYSTEM
H = HIDDEN
N = NORMAL (다른 속성과 사용하지 않을 경우에만 유효)
O = OFFLINE
T = TEMPORARY

주의: 현재, 파일의 압축 상태는 다음 명령어로 바꿀 수 있습니다.

관련 항목

FileGetAttrib, FileGetTime, FileSetTime, FileGetSize, FileGetVersion, File-회돌이

예제

FileSetAttrib, +RH, C:\MyFiles\*.*, 1  ; +RH는 +R+H와 동일합니다.
FileSetAttrib, ^H, C:\MyFiles  ; 폴더의 "hidden" 속성을 토글합니다.
FileSetAttrib, -R+A, C:\New Text File.txt
FileSetAttrib, +A, C:\*.ini, , 1  ; C 드라이브의 모든 .ini 파일을 재귀합니다.


FileSetTime

파일이나 폴더의 날짜시간 도장을 변경합니다. 와일드카드를 지원합니다.

FileSetTime [, YYYYMMDDHH24MISS, FilePattern, WhichTime, OperateOnFolders?, Recurse?]

매개변수

YYYYMMDDHH24MISS

비어 있거나 생략하면, 현재 시간이 기본값입니다. 그렇지 않으면, 연산에 사용할 시간을 지정하십시오 (형식에 관해서는 논평을 참조하십시오). 1601년 미만은 지원하지 않습니다.

이 매개변수는 표현식입니다. 결과적으로, 여러 변수를 결합해서 하나의 시간도장을 형성할 필요가 있다면, 퍼센트 사인 대신에 점 연산자를 사용해야 합니다. 예를 들어: FileSetTime, Year . Month . Day, C:\My File.txt.

FilePattern

파일이나 폴더의 이름. 또는 C:\Temp\*.tmp와 같은 와일드카드 패턴. FilePattern은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

생략하면, 대신에 파일-회돌이 가장 안쪽에 싸인 현재 파일이 사용됩니다.

WhichTime
설정할 시간도장:
M = 수정 시간 (이 매개변수가 생략되거나 비어 있으면 기본값)
C = 생성 시간
A = 마지막 접근 시간
OperateOnFolders?

0 (기본값) 폴더는 처리되지 않습니다 (파일 전용).
1 와일드카드 패턴에 부합하는 모든 파일과 폴더를 처리합니다.
2 폴더만 처리합니다 (파일 불가).

주의: FilePattern이 와일드카드 패턴이 아니라 단일 폴더라면, 언제나 이 설정에 상관없이 처리됩니다.

이 매개변수는 표현식일 수 있습니다.

Recurse?

0 (기본값) 하위폴더 안으로 재귀하지 않습니다.
1 하위폴더 안으로 재귀해 들어가 거기에서 FilePattern에 부합하는 모든 파일과 폴더를 처리합니다. 그렇지만, 파일과 폴더에 259 문자가 넘는 완전 경로가 지정되어 있으면 마치 존재하지 않는 것처럼 무시합니다. 그런 파일은 거의 없습니다. 왜냐하면 보통 운영 체제가 그런 파일은 생성을 허용하지 않기 때문입니다.

이 매개변수는 표현식일 수 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 변경에 실패한 파일의 개수가 설정되고 그렇지 않으면 0이 설정됩니다. 지정된 시간도장이 유효하지 않으면, 또는 FilePattern이 빈 값으로 결정되면, ErrorLevel은 1이 설정됩니다.

파일이 발견되면, A_LastError는 0 (영)이 설정됩니다. 또는 마지막 실패후 즉시 운영 체제의 GetLastError() 함수의 결과가 설정됩니다. 그렇지 않으면 A_LastError에는 파일이 발견되지 않은 이유를 나타내는 에러 코드가 담깁니다.

논평

파일의 마지막 접근 시간은 NTFS 불륨에 비해 FAT16 & FAT32 볼륨에서는 정확하지 않을 수 있습니다.

YYYYMMDDHH24MISS 형식의 요소들은 다음과 같습니다:

YYYY | 4-자리 해
MM | 2-자리 달 (01-12)
DD | 달의 2-자리 날 (01-31)
HH24 | 24-시간 형식의 2-자리 시각(00-23). 예를 들어, 09는 오전 9시이고 21은 오후 9시.
MI | 2-자리 분 (00-59)
SS | 2-자리 초 (00-59)

YYYYMMDDHH24MISS에 대하여 부분적으로 문자열이 주어지면 (예, 200403), 생략된 나머지 요소들은 다음의 기본 값으로 체워집니다:

MM: Month 01
DD: Day 01
HH24: Hour 00
MI: Minute 00
SS: Second 00

내장 변수 A_Now에 현지 지역 시각이 위의 형식으로 담겨 있습니다. 비슷하게, A_NowUTC에는 현재 표준시(Coordinated Universal Time)가 담겨 있습니다.

주의: 날짜-시간 값은 비교하고 더하고 뺄 수 있습니다. EnvAdd와 EnvSub를 사용하면 됩니다. 또, 시간을 비교할 때는 보다 크다와 보다 작다를 사용하지 않는 것이 좋습니다. 왜냐하면 둘 모두 문자열 길이가 같기 때문입니다. 숫자로 비교해야 합니다; 예를 들어, 20040201는 언제나 200401010533보다 숫치상 작습니다 (그러나 년대기 상으로는 더 큽니다). 그래서 대신에 EnvSub를 사용하여 둘 사이의 시간의 양이 음수인지 양수인지 알아내십시오.

관련 항목

FileGetTime, FileGetAttrib, FileSetAttrib, FileGetSize, FileGetVersion, FormatTime, File-loop, EnvAdd, EnvSub

예제

; 부합하는 모든 파일에 대하여 수정 시간을 현재 시간으로 설정합니다:
FileSetTime, , C:\temp\*.txt

; 수정 날짜를 설정합니다 (시간은 자정입니다):
FileSetTime, 20040122, C:\My Documents\test.doc

; 생성 시간을 설정합니다. 시간은 4:55pm으로 설정됩니다:
FileSetTime, 200401221655, C:\My Documents\test.doc, C

; 패턴에 부합하는 모든 파일의 변경-날짜를 변경합니다.
; 마지막 매개 변수 때문에 부합하는 폴더도 모두 변경됩니다:
FileSetTime, 20040122165500, C:\Temp\*.*, M, 1


Finally

Finally [v1.1.14+]

try 서술문의 실행 후에 하나 이상의 서술문 (명령어 또는 표현식)을 항상 실행합니다.

Finally Statement
Finally
{
    Statements
}

논평

finally를 사용할 때마다 위에 있는 try (또는 catch) 서술문에 (연관되어 있어야) 속해야 합니다. finally는 언제나 가장 가까운 위의 try 서술문에 속합니다. block이 사용되어 그 행위가 변경된 경우는 제외합니다.

Try 서술문은 catch 또는 finally가 존재하는가에 따라 다르게 행동합니다. 더 자세한 정보는 Try를 참조하십시오.

Goto, break, continue 그리고 return은 try 블록 안의 제어 흐름 지시어를 억제하려면 꼭 필요하지만 finally 블록을 종료하는 데는 사용할 수 없습니다. 예를 들어, try가 return 42를 사용한다면, finally 블록이 실행된 후 값 42가 반환됩니다. 다음 명령어 중 하나를 사용하여 finally 블록을 빠져 나오려는 시도는 적재 시간에 그렇지 않으면 실행 시간에 가능하면 에러로 탐지됩니다.

v1.1.19.02 이전에서, finally 서술문이 존재하면 try 안의 제어 흐름 서술문이 작동하지 못하는 버그가 있었습니다. Return이 finally 안에서 허용되는 버그가 있었지만, 예외를 던져도 무시되었습니다.

One True Brace (OTB) 스타일은 선택적으로 finally 명령어와 함께 사용할 수 있습니다:

try {
    ...
} finally {
    ...
}

try {
    ...
} catch e {
    ...
} finally {
    ...
}

관련 항목

Try, Catch, Throw, 블록

예제

try
{
    ToolTip, Working...
    Example1()
}
catch e
{
    ; e가 담고 있는 객체에 관한 더 자세한 정보는, Catch를 참조하십시오.
    MsgBox, 16,, % "Exception thrown!`n`nwhat: " e.what "`nfile: " e.file
        . "`nline: " e.line "`nmessage: " e.message "`nextra: " e.extra
}
finally
{
    ToolTip ; 툴팁을 감춥니다
}

MsgBox, Done!

; 이 함수에 있는 Finally 블록은  청소 코드로 행위합니다.
Example1()
{
    try
        Example2()
    finally
        MsgBox, 여기는 예외에 상관없이 언제나 실행됩니다.
}

; 이 함수는 분이 홀수이면 실패합니다.
Example2()
{
    if Mod(A_Min, 2)
        throw Exception("Test exception")
    MsgBox, Example2 did not fail
}


For-loop

For-loop [AHK_L 59+]

일련의 명령어를 객체 안의 각 키-값 쌍마다 한 번씩 반복합니다.

For Key [, Value] in Expression

매개변수

Key

각 반복을 시작할 때 키를 저장할 변수의 이름.

Value

현재 키에 연관된 값을 저장할 변수의 이름.

Expression
객체 또는 객체를 담고 있는 변수로 결과가 되는

표현식.

논평

Expression은 회돌이가 시작되기 전에 한 번만 평가됩니다. 그의 결과가 객체가 아니면, 실행은 즉시 회돌이 몸체 다음 줄로 점프합니다; 그렇지 않으면, 열거(enumerator) 객체를 열람하기 위하여 그 객체의 _NewEnum() 메쏘드가 호출됩니다. 각 반복을 시작할 때, 그 열거 객체의 Next() 메쏘드를 사용하여 다음 키-값 쌍을 열람합니다. Next()가 0 또는 빈 문자열을 돌려주면, 회돌이가 끝납니다.

for-회돌이와 정확하게 동등하지는 않지만, 다음 예제는 이 처리 과정을 시연합니다:

_enum := (Expression)._NewEnum()
if IsObject(_enum)
    while _enum.Next(Key, Value)
    {
        ...
    }

기존의 키-값 쌍은 회돌이 중에 변경할 수 있지만, 그러나 키를 삽입하거나 제거하면 항목을 빼먹거나 여러 번 반복하는 문제를 야기할 수 있습니다. 한 가지 우회책은 제거할 키 목록을 만든 다음, 첫 번째 회돌이가 완료된 후 두 번째 회돌이를 사용하여 키를 제거하는 것입니다. Object.Remove(first, last)를 사용해 회돌이 없이 한 범위의 키를 제거할 수 있다는 것에 주목하십시오.

for-회돌이는 보통 다음에 블록이 따라옵니다. 이 블록은 회돌이의 몸체를 형성하는 서술문의 집단입니다. 그렇지만, 서술문이 하나만 있는 회돌이는 블록을 요구하지 않습니다 ("if" 그리고 그의 "else"는 이런 목적으로 하나의 서술문으로 계수됩니다). One True Brace (OTB) 스타일을 선택적으로 사용할 수 있습니다. 이 스타일은 여는 활괄호를 그 아래가 아니라 같은 줄에 나타나도록 허용합니다. 예를 들어: for x, y in z {.

모든 회돌이와 마찬가지로, Break, Continue 그리고 A_Index를 사용할 수 있습니다.

COM 객체

키(Key)와 값(Value)은 열거자의 Next() 메쏘드에 직접 건네집니다. 거기에 할당되는 값은 어떤 종류의 객체가 열거되고 있는가에 따라 다릅니다. COM 객체라면, Key에는 IEnumVARIANT::Next()가 돌려주는 값이 담기고 Value에는 그의 variant 유형을 가리키는 번호가 담깁니다. 예를 들어, Scripting.Dictionary 객체와 사용될 때, 각 Key는 사전으로부터 온 키가 담기고 Value는 전형적으로 문자열에 8, 정수에 3이 담깁니다. 유형 코드 목록은 ComObjType를 참조하십시오.

[v1.0.96.00+]: SafeArray를 열거할 때, Key에는 현재 원소가 담기고 Value에는 그의 variant 유형이 담깁니다.

관련 항목

열거 객체, Object.NewEnum(), While-회돌이, Loop, Until, Break, Continue, 블록

예제

; 객체의 키-값 쌍을 나열합니다:
colours := Object("red", 0xFF0000, "blue", 0x0000FF, "green", 0x00FF00)
; 위의 표현식은 아래의 "colours" 대신에 직접 사용할 수 없습니다:
for k, v in colours
    s .= k "=" v "`n"
MsgBox % s

; 열린 탐색 창과 인터넷 익스플로러 창을 모두 나열합니다:
for window in ComObjCreate("Shell.Application").Windows
    windows .= window.LocationName " :: " window.LocationURL "`n"
MsgBox % windows
/*
Class: CEnumerator

숫치 키를 반복하는 데 사용할 수 있는 범용 열거 객체.
배열은 반복 중에 변경해서는 안됩니다. 그렇지 않으면, 반복 범위가 유효하지 않게 됩니다.
배열 경계에 대하여 맞춤 MaxIndex() 함수를 정의할 수 있습니다.
1과 최대 인덱스 사이에 빠진 원소가 있다면, 반복되기는 하지만 값은 ""가 됩니다.
이것은 진짜 희소 행열은 이 열거 객체가 설계상 지원되지 않는다는 뜻입니다.
객체가 이 반복자를 사용하게 만들려면, 다음 함수를 클래스 정의에 삽입하십시오:

    _NewEnum()
    {
        return new CEnumerator(this)
    }

Source: http://www.autohotkey.com/board/topic/2667-suggestions-on-documentation-improvements/?p=531509
*/

; 열거 객체를 반복합니다
For k, v in Test
    MsgBox %k%=%v%

; 사용법을 시연하기 위해 클래스를 테스트합니다
class Test
{
    static Data := ["abc", "def", "ghi"]

    _NewEnum()
    {
        return new CEnumerator(this.Data)
    }
}

class CEnumerator
{
    __New(Object)
    {
        this.Object := Object
        this.first := true
        ; 속도를 위해 캐쉬합니다. 맞춤 MaxIndex() 함수가 수행성능이 좋지 않을 경우 유용합니다.
        ; 그 응답은 반복 동안에 키-값 쌍이 삽입되지 않는다는 뜻입니다. 그렇지 않으면 범위가 무효가 되어 버릴 것입니다.
        this.ObjMaxIndex := Object.MaxIndex()
    }

    Next(ByRef key, ByRef value)
    {
        if (this.first)
        {
            this.Remove("first")
            key := 1
        }
        else
            key ++
        if (key <= this.ObjMaxIndex)
            value := this.Object[key]
        else
            key := ""
        return key != ""
    }
}


Format

Format [v1.1.17+]

가변 개수의 입력 값을 형식 문자열에 맞추어 포맷합니다.

String := Format(FormatStr [, Values...])

매개변수

FormatStr

{Index:Format}의 형태로 기호 텍스트와 위치보유자로 구성된 형식 문자열 .

Index는 사용할 입력 값을 가리키는 정수입니다. 1이면 첫 번째 값입니다.

Format은, 아래에 기술하는 바와 같이, 선택적 형식 지정자입니다..

(이전에 문자열에 사용되었을지라도) 다음 입력 값을 연속열로 사용하려면 인덱스를 생략하십시오. 예를 들어, "{2:i} {:i}"는 두 번째와 세 번째 입력 값을 십진 정수로, 스페이스로 분리하여, 포맷합니다. Index를 생략하더라도, Format은 여전히 : 앞에 와야 합니다. 빈 활괄호를 지정하면 다음 입력 값을 기본 형식으로 사용할 수 있습니다: {}

{{}와 {}}를 사용하면 문자열에 문자 그대로의 활괄호를 포함할 수 있습니다. 다른 무효한 위치보유자는 결과에 있는 그대로 포함됩니다.

공백은 활괄호 안에 허용되지 않습니다 (플래그로서 나타나는 것은 예외).

Values

포맷되어 최종 문자열에 삽입될 입력 값들. 각 값은 별도의 매개변수입니다. 첫 값은 인덱스가 1입니다.

값 배열을 건네려면, 가변 함수 호출을 사용하십시오:

arr := [13, 240]
MsgBox % Format("{2:x}{1:02x}", arr*)

형식 지정자

각 형식 지정자는 (스페이스 없이) 순서대로 다음 구성요소를 포함할 수 있습니다:

Flags Width .Precision ULT Type

Flags 출력 정렬과 접두사에 영향을 줍니다: - + 0 space #

Width: 포맷 값의최소 너비를, 문자단위로 제어하는 십진 정수. 기본으로, 값들은 오른쪽에 정렬되고 스페이스가 패딩에 사용됩니다. 이것은- (왼쪽-정렬) 그리고 0 (zero prefix) 플래그를 사용하여 오버라이드 할 수 있습니다.

.Precision: 문자열의 최대 개수, 십진 자리수, 또는 출력될 유효 자리를 제어하는 십진 정수. 출력 유형에 따라 달라집니다. 앞에 반드시 십진 소수점이 있어야 합니다. 정밀도를 지정하면 값이 잘려 나가거나 올림 내림 처리됩니다.

  • f, e, E: Precision는 십진 소수점 다음의 자리수를 지정합니다. 기본 값은 6입니다.
  • g, G: Precision는 유효 자리의 최대 개수를 지정합니다. 기본 값은 6입니다.
  • s: Precision는 인쇄될 문자의 최대 개수를 지정합니다. 이 값을 초과하는 문자들은 인쇄되지 않습니다.
  • 정수 유형에 대하여 (d, i, u, x, X, o), Precision는 접두사가 0인 너비(Width)처럼 행동하고 기본 값은 1입니다.

ULT [v1.1.20+]: 문자열 값에 적용할 대소문자 변환을 지정합니다 -- Upper, Lower 또는 Title. 유형이 s인 경우에만 유효합니다. 예를 들어 {:U} 또는 {:.20Ts}. 소문자 l과 t로 지원하지만, u는 부호없는 정수를 위해 예약되어 있습니다.

Type: 입력 값을 어떻게 번역할지 나타내는 문자. 생략하면, 기본값은 s입니다.

플래그 | 의미 | 기본 행위
- | 주어진 필드 너비 안에서 결과를 왼쪽 정렬합니다 (필요하면 스페이스를 오른쪽에 삽입합니다). | 오른쪽 정렬.
+ | 출력 결과가 부호 있는 유형이면 부호 (+ 또는 -)를 앞에 둘 수 있습니다. | 부호는 음의 부호 값일 경우에만 나타납니다 (-).
0 | width 앞에 0이 있으면, 최소 너비에 도달할 때까지 앞쪽에 0이 추가됩니다. 0과 -가 모두 나타나면, 0이 무시됩니다. 0이 정수 형식으로 지정되고 (i, u, x, X, o, d) 그리고 정밀도도 지정되어 있으면 - 예를 들어, {:04.d} - 이 0은 무시됩니다. | 패딩 없음.
space | 스페이스 하나를 사용하면 출력 결과가 양의 값일 경우 앞에 스페이스를 하나 둘 수 있습니다. 스페이스와 + 플래그가 모두 나타나면 그 스페이스는 무시됩니다. . | 스페이스 나타나지 않음.
# | o, x, or X 형식과 사용될 때, # 플래그는 0이 아닌 출력 값 앞에 0, 0x, 또는 0X를 사용합니다. e, E, f, a 또는 A 형식과 사용될 때, # 프래그는 강제로 출력 값이 소수점을 가지도록 만듭니다. g 또는 G 형식과 사용될 때, # 플래그는 강제로 출력 값에 소수점을 포함하도록 만들고 뒤에 따르는 0을 자르지 못하도록 방지합니다. c, d, i, u, 또는 s와 사용될 때는 무시됩니다. |
문자 | 인자 | 출력 형식
d 또는 i | Integer | 부호 있는 십진 정수.
u | Integer | 부호 없는 십진 정수.
x or X | Integer | 부호 없는 십육진 정수; x의 격에 따라 "abcdef" 또는 "ABCDEF"를 사용합니다. 0x 접두사는 # 플래그가, {:#x}처럼 사용되어야 포함됩니다. SetFormat과 일관성이 있게 십육진 형식을 지정하려면, 0x{:x} 비슷한 형식을 사용하십시오.
o | Integer | 부호 없는 팔진 정수.
f | Floating-point | 부호 있는 값. 형태가 [ - ]dddd.dddd입니다. 여기에서 dddd는 하나 이상의 십진 자리입니다. 십진 소수점 앞의 자리수는 숫자의 크기에 따라 다릅니다. 그리고 십진 소수점 뒤의 자리수는 요청한 정밀도에 따라 달라집니다.
e | Floating-point | 부호 있는 값. 형태가 [ - ]d.dddd e [sign]dd[d] 입니다. 여기에서 d는 하나의 십진 자리이고, dddd는 하나 이상의 십진 자리이며, dd[d]는 두 세 개의 십진 자리로서 출력 형식과 지수의 크기, 그리고 부호가 +인가 - 인가에 따라 달라집니다.
E | Floating-point | e 형식과 동일합니다. 단, e 말고 E는 지수를 초래합니다.
g | Floating-point | 부호 있는 값은 f 또는 e 형식으로 보여집니다. 어느 쪽이든 주어진 값과 정밀도에 대하여 더 간결합니다. e 형식은 값의 지수가 -4보다 작거나 precision 인자보다 크거나 같을 경우에만 사용됩니다. 뒤따르는 0은 잘려 나가고, 십진 소수점은 다음에 하나 이상의 자리가 따라올 때만 나타납니다..
G | Floating-point | g 형식과 동일합니다. 단, e말고 E이면 지수가 초래됩니다.
a | Floating-point | 부호 있는 십육진 배-정밀로 부동 소수점 값. 형태는 [?]0xh.hhhh pdd입니다. 여기에서 h.hhhh는 가수(mantissa)의 십육진 자리입니다 (소문자 기호 사용). 그리고 dd는 지수를 위한 하나 이상의 자리입니다. 정밀도는 소수점 다음의 자리 수를 지정합니다.
A | Floating-point | a 형식과 동일합니다. 단, p 말고 P는 지수를 초래합니다.
p | Integer | 메모리 주소로서의 인자를 십육진 자리수로 표시합니다.
s | String | 문자열을 지정합니다. 입력 값이 숫치이면, 스크립트의 현재 숫자 형식을 사용하여 자동으로 문자열로 변환됩니다. 그 다음에 Width와 Precision 인자가 적용됩니다.
c | Character code | 서수 값으로 문자 하나를 지정합니다. Chr(n)과 비슷합니다. 입력 값이 예상 범위를 벗어나면, 반올림 됩니다.

논평

printf와 다르게, 크기 지정자는 지원되지 않습니다. 모든 정수와 부동 소수점 값은 64-비트입니다.

관련 항목

SetFormat, FormatTime

예제

; 간단한 교체
s .= Format("{2}, {1}!`r`n", "World", "Hello")
; 스페이스로 덧댐
s .= Format("|{:-10}|`r`n|{:10}|`r`n", "Left", "Right")
; 십육진수
s .= Format("{1:#x} {2:X} 0x{3:x}`r`n", 3735928559, 195948557, 0)
; 부동-소수점 수
s .= Format("{1:0.3f} {1:.10f}", 4*atan(1))

ListVars  ; 오토핫키의 메인 창을 사용하여 단일폭 텍스트를 보여줍니다.
WinWaitActive ahk_class AutoHotkey
ControlSetText Edit1, %s%
WinWaitClose


FormatTime

시간도장 YYYYMMDDHH24MISS를 지정된 날짜/시간 형식으로 변환합니다.

FormatTime, OutputVar [, YYYYMMDDHH24MISS, Format]

매개변수

OutputVar

결과를 저장할 변수의 이름.

YYYYMMDD...

이 매개변수를 비워 두면 현재 날짜와 시간을 사용할 수 있습니다. 그렇지 않으면, YYYYMMDDHH24MISS 형식으로 시간도장의 이끄는 부분을 모두 지정하십시오. 시간 도장의 날짜/시간 부분이 유효하지 않다면 -- 윤년이 아닌 해에 2월 29일이라면 -- 그 날짜와 시간은 OutputVar으로부터 제외됩니다. 1601년부터 9999년 까지만 지원합니다. 형식화된 시간은 시간 부분이 유효하기만 하다면 여전히 이전 해에 대하여 만들 수 있습니다.

Format

생략되면, 시간 다음에 긴 날짜가 기본값이 됩니다. 둘 모두 현재 사용자의 로케일에 맞게 포맷됩니다. 예를 들어: 4:55 PM Saturday, November 27, 2004

그렇지 않으면, 아래의 하나 이상의 날짜-시간 형식을 사이에 글자 그대로의 스페이스와 구두점 부호를 두고 지정하십시오. (쉼표는 피신시킬 필요가 없습니다; 보통 그대로 사용할 수 있습니다). 다음 예제에서, M을 대문자로 사용해야 한다는 점에 주의하십시오: M/d/yyyy h:mm tt

날짜 형식 (대소문자 구분)

d | 앞에 0 없이 달의 날짜 (1 - 31)
dd | 앞에 0을 두고 달의 날짜 (01 – 31)
ddd | 현재 사용자의 언어로 주의 날짜의 짧은 이름 (예, Mon)
dddd | 현재 사용자의 언어로 주의 날짜의 완전한 이름 (예, Monday)
M | 앞에 0없이 달 (1 – 12)
MM | 앞에 0을 두고 달 (01 – 12)
MMM | 현재 사용자의 언어로 달의 짧은 이름 (예, Jan)
MMMM | 현재 사용자의 언어로 완전한 달 이름 (예, January)
y | 세기 없는 해, 앞에 0 없음 (0 – 99)
yy | 세기 없는 해, 앞에 0 있음 (00 - 99)
yyyy | 세기 있는 해. 예를 들어: 2005
gg | 현재 사용자의 로케일에 대한 시대 문자열 (없으면 비어 있음)

시간 형식 (대소문자 구분)

h | 앞에 0 없이 시각; 12-시간제 형식 (1 - 12)
hh | 앞에 0 있는 시각; 12-시간제 형식 (01 – 12)
H | 앞에 0 없는 시각; 24-시간제 형식 (0 - 23)
HH | 앞에 0 있는 시각; 24-시간제 형식 (00– 23)
m | 앞에 0 없는 분 (0 – 59)
mm | 앞에 0 있는 분 (00 – 59)
s | 앞에 0 없는 초 (0 – 59)
ss | 앞에 0 있는 초 (00 – 59)
t | 한 개짜리 시간 표식자, 예를 들어 A 또는 P (로케일에 따라 다름)
tt | 다중-문자 시간 표식자, 예를 들어 AM 또는 PM (로케일에 따라 다름)

다음 형식은 반드시 홀로 사용되어야 합니다; 즉, 다른 형식이나 텍스트가 Format 매개변수에 없습니다. 이 형식은 대소문자를 구별하지 않습니다.

(Blank) | Format을 비워 두면 시간과 그리고 다음에 기다란 날짜를 생산합니다. 예를 들어, 어떤 로케일에서는 4:55 PM Saturday, November 27, 2004로 나타날 수 있습니다.
Time | 현재 사용자의 로케일에 대한 시간 표현, 예를 들어 5:26 PM
ShortDate | 현재 사용자의 로케일에 대한 짧은 날짜 표현, 예를 들어 02/29/04
LongDate | 현재 사용자의 로케일에 대한 긴 날짜 표현, 예를 들어 Friday, April 23, 2004
YearMonth | 현재 사용자의 로케일에 대한 해와 달, 예를 들어 February, 2004
YDay | 앞에 0 없이 해의 날짜 (1 – 366)
YDay0 | 앞에 0 이 있는 해의 날짜 (001 – 366)
WDay | 주의 날짜 (1 – 7). Sunday는 1입니다.
YWeek | ISO 8601 완전 해의 개수 그리고 주 개수 : 200453. 1월 1일을 포함한 주가 새 해에서 4 일 이상 포함되어 있으면, 첫 번째 주로 간주됩니다. 그렇지 않으면, 이전 해의 마지막 주로 간주됩니다. 그리고 그 다음 주가 새 해의 첫 주가 됩니다. 결론적으로, 1월 4일과 1월의 첫 번째 목요일은 언제나 1번 주에 있습니다.

추가 옵션

다음 옵션은 시간도장 바로 뒤 YYYYMMDDHH24MISS 매개변수 안에 나타날 수 있습니다 (시간도장이 없다면, 홀로 사용해도 됩니다). 다음 예제에서, 뒤쪽 네 항목 사이에 쉼표가 없는 데 주목하십시오:

FormatTime, OutputVar, 20040228 LSys D1 D4

R: 뒤집습니다. 날짜를 시간 앞에 둡니다 (Format이 비어 있을 경우에만 의미가 있습니다).

Ln: 이 옵션이 없으면, 문자열을 포맷하는 데 현재 사용자의 로케일이 사용됩니다. 대신에 운영 체제의 로케일을 사용하려면, LSys를 지정하십시오. 특정한 로케일을 사용하려면, 기호 L과 다음에 십육진 또는 십진 로케일 식별자 (LCID)를 지정하십시오. LCID를 구성하는 방법에 관한 더 자세한 정보는 www.microsoft.com에서 다음 문구를 검색해 보십시오: Locale Identifiers

Dn: 날짜 옵션. n에 다음 숫자 중 하나를 지정하십시오:
0: 강제로 기본 옵션을 사용하도록 만듭니다. 이는 또한 짧은 날짜가 효력을 발휘하게 만들기도 합니다.
1: 짧은 날짜를 사용합니다 (Format이 비어 있을 경우에만 의미가 있습니다; 2와 8에는 호환되지 않습니다).
2: 긴 날짜를 사용합니다 (Format이 비어 있을 경우에만 의미가 있습니다; 1과 8에는 호환성이 없습니다).
4: 대안 달력을 (있다면) 사용합니다.
8: 해-달 형식을 사용합니다 (Format이 비어 있을 경우에만 의미가 있습니다; 1과 2에는 호환성이 없습니다).
0x10: 좌에서 우로 읽기 순서 레이아웃을 위한 표식을 추가합니다.
0x20: 우에서 좌로 읽기 순서 레이아웃을 위한 표식을 추가합니다.
0x80000000: 사용자가 시스템의 기본 날짜 형식에 대하여 변경해서 오버라이드 하는 것들을 준수하지 않습니다.
0x40000000: 문자열 변환에 로케일의 코드 페이지 대신에 시스템 ANSI 코드 페이지를 사용합니다.

Tn: 시간 옵션. n에 다음 숫자 중 하나를 지정합니다:
0: 기본 옵션을 사용하도록 강제합니다. 이는 또한 분과 초가 보이도록 만듭니다.
1: 분과 초를 생략합니다.
2: 초를 생략합니다.
4: 시간 표식을 생략합니다 (예, AM/PM).
8: 12-시간제가 아니라 언제나 24-시간제를 사용합니다.
12: 위의 두 옵션을 조합.
0x80000000: 사용자가 시스템의 기본 날짜 형식에 가한 변경을 준수하지 않습니다.
0x40000000: 문자열 변환에 로케일의 코드 페이지 대신 시스템 ANSI 코드 페이지를 사용합니다.

주의: Dn과 Tn은 여러 옵션 효과를 위해 반복할 수 있습니다. 예를 들어 다음 예제와 같이: FormatTime, OutputVar, 20040228 D2 D4 T1 T8

논평

기호와 숫자를 글자 그대로 Format으로부터 OutputVar로 변환하고 싶다면 홑따옴표로 다음 예제와 같이 둘러야 합니다: 'Date:' MM/dd/yy 'Time:' hh:mm:ss tt.

대조적으로, 스페이스, 탭, 라인피드 (`n), 정사선, 쌍점, 쉼표, 그리고 기타 구두점 기호와 같이 비-알파숫자 문자는 홑 따옴표 안에 두를 필요가 없습니다. 이에 대한 예외는 홑따옴표 자체입니다: 문자 그대로 사용하려면, 연속적으로 홑따옴표를 사용하거나 (''''), 또는 홑따옴표가 이미 바깥쪽 홑따옴표 안에 있다면 그냥 두 개를 사용하십시오.

Format에 날짜와 시간 요소가 함께 들어 있다면, 서로 섞이면 안됩니다. 다른 말로, 문자열은 두 부분으로 나눌 수 있어야 합니다: 한 부분은 시간 그리고 나머지 반은 날짜로 구분되어야 합니다. 예를 들어, 형식 문자열이 "hh yyyy mm"와 같이 구성되어 있다면 예상한 결과가 나오지 않습니다. 왜냐하면 두 개의 시간 요소 사이에 날짜 요구가 있기 때문입니다.

Format에 달의 숫치 날짜 (d 또는 dd) 그리고 다음에 완전한 달 이름 (MMMM)이 담겨 있다면, (해당 언어가 소유격 형태를 가지고 있다면) 소유격 형태의 달 이름이 사용됩니다.

Format에 2000 문자 이상이 들어 있다면, OutputVar는 비워집니다.

관련하여 말씀드리면, 날짜와 시간의 덧셈과 뺄셈은 EnvAdd 그리고 EnvSub로 수행할 수 있습니다.

관련 항목

반대 방향으로 변환하려면 -- 즉, 형식화된/날짜/시간으로부터 YYYYMMDDHH24MISS 형식으로 바꾸려면 -- 다음을 참조하십시오: www.autohotkey.com/forum/topic20405.html

다음도 참조하십시오: Gui DateTime 콘트롤, SetFormat, Transform, 내장된 날짜 변수와 시간 변수, FileGetTime

예제

FormatTime, TimeString
MsgBox 현재 시간과 날짜는 (시간 먼저) %TimeString%입니다.

FormatTime, TimeString, R
MsgBox 현재 시간과 날짜는 (날짜 먼저) %TimeString%입니다.

FormatTime, TimeString,, Time
MsgBox 현재 시간은 %TimeString%입니다.

FormatTime, TimeString, T12, Time
MsgBox 24-시간제로 현재 시간은 %TimeString%입니다.

FormatTime, TimeString,, LongDate
MsgBox 현재 날짜는 (긴 형식) %TimeString%입니다.

FormatTime, TimeString, 20050423220133, dddd MMMM d, yyyy hh:mm:ss tt
MsgBox 지정된 날짜와 시간은, 포맷하면,  %TimeString%입니다.

FormatTime, TimeString, 200504, 'Month Name': MMMM`n'Day Name': dddd
MsgBox %TimeString%

FormatTime, YearWeek, 20050101, YWeek
MsgBox 2005년 1월 1일의 ISO 년도와 주 번호는 다음과 같습니다: %YearWeek%
; 파일의 날짜-시간 도장을 바꿉니다:
FileSelectFile, FileName, 3,, Pick a file
if FileName =  ; 사용자가 파일을 고르지 않았습니다.
    return
FileGetTime, FileTime, %FileName%
FormatTime, FileTime, %FileTime%   ; 마지막 매개변수가 생략되었기 때문에, 긴 날짜와 시간이 열람됩니다.
MsgBox 선택된 파일은 %FileTime%에 마지막으로 변경되었습니다.
; 다음 함수는 지정된 개수의 초를
; 상응하는 시간, 분, 그리고 초로 변환합니다 (hh:mm:ss 형식).

MsgBox % FormatSeconds(7384)  ; 7384 = 2 hours + 3 minutes + 4 seconds. 결과: 2:03:04

FormatSeconds(NumberOfSeconds)  ; 지정된 개수의 초를  hh:mm:ss 형식으로 변환합니다.
{
    time = 19990101  ; 임의의 날짜의 *자정*.
    time += %NumberOfSeconds%, seconds
    FormatTime, mmss, %time%, mm:ss
    return NumberOfSeconds//3600 ":" mmss
    /*
    ; 위에 사용된 방법과 다르게, 이 방법은 24 시간이 넘는 초의 개수를 지원하지 않습니다:
    FormatTime, hmmss, %time%, h:mm:ss
    return hmmss
    */
}


GetKeyState

키보드 키나 마우스/조이스틱 버튼이 눌려 있는지 여부를 점검합니다. 또 조이스틱 상태를 열람합니다.

GetKeyState, OutputVar, KeyName [, Mode]
KeyIsDown := GetKeyState("KeyName" [, "Mode"])

매개변수

OutputVar

열람된 키 상태를 저장할 변수의 이름. D이면 눌려 있고 U이면 뗀 상태입니다 (그러나 GetKeyState() 함수는 눌려 있으면 true (1)를 그렇지 않으면 false (0)를 돌려줍니다). 키 상태를 결정할 수 없으면 이 변수는 비어 있습니다.

아래의 항목은 조이스틱에만 적용됩니다:

1) JoyX와 같이 조이스틱 축에 대하여, OutputVar는 부동 소수점 수로 설정됩니다. 범위는 0 부터 100 사이이고 조이스틱의 위치를 축의 이동 범위의 백분률로 나타냅니다. 숫자 형식은 SetFormat을 통하여 바꿀 수 있습니다. 다음 테스트 스크립트를 사용하면 조이스틱을 분석할 수 있습니다.

2) KeyName이 JoyPOV이면, 열람된 값은 범위가 0부터 35900 사이 입니다. 많은 조이스틱에 다음에 근접한 POV 값들이 사용됩니다:
-1: 보고할 각도 없음
0: 앞으로 POV
9000 (즉, 90 도): 오른쪽으로 POV
27000 (즉, 270 도): 왼쪽으로 POV
18000 (즉, 180 도): 뒤로 POV

KeyName

단순히 키보드의 문자 하나이거나 또는 마우스/조이스틱 버튼과 같이 키 목록의 키 이름 중 하나일 수 있습니다. 예: B, 5, LWin, RControl, Alt, Enter, Escape, LButton, MButton, Joy1.

대안으로, vkFF와 같은 명시적인 가상 키 코드를 지정해도 됩니다. 아주 희귀한 경우로 키에 이름이 없을 경우 유용합니다. 그런 키의 가상 키코드는 다음 키 리스트 페이지 하단에 있는 단계를 밟아 알아볼 수 있습니다.

알려진 한계: 이 함수는 Left와 NumpadLeft 같이, 같은 가상 키 코드를 공유하면 두 키를 구별하지 못합니다.

Mode

이 매개변수는 조이스틱 상태를 열람할 때 무시됩니다.

생략하면, 모드는 기본으로 키의 논리적 상태를 열람하는 모드가 됩니다. 논리적 상태는 OS와 활성 창이 그 키의 상태라고 믿고 있는 상태를 말합니다. 그러나 반드시 물리적 상태와 같은 것은 아닙니다.

대안으로 다음 기호 중 하나를 지정할 수 있습니다:

P: 물리적 상태를 열람합니다 (즉, 사용자가 물리적으로 키를 누르고 있는지 알아봅니다). 키나 마우스 버튼의 물리적 상태는 보통 논리적 상태와 같습니다. 단 키보드/마우스 갈고리가 설치되어 있어야 합니다. 그래야 (스크립트가 실행 중인 동안 키를 누르기만 한다면) 사용자가 물리적으로 키나 버튼을 누르고 있는지 아닌지 정확하게 반영됩니다. 스크립트가 갈고리를 사용하고 있는지 KeyHistory 명령어나 메뉴 항목을 통하여 알아볼 수 있습니다. 갈고리를 강제로 설치하려면 스크립트에 #InstallKeybdHook 또는 #InstallMouseHook 지시어를 지정해야 합니다.

T: 토글 상태를 열람합니다 (토글이 가능한 키에만 유효합니다. 토글 키로는 Capslock, Numlock, Scrolllock, 그리고 Insert가 있습니다). 열람된 값이 D이면 그 키가 "on"이라는 뜻이고, 반면에 U이면 "off"라는 뜻입니다 (그러나 GetKeyState() 함수는 "on"에 true (1)를 "off" false (0)를 돌려줍니다).

논평

키나 마우스/조이스틱 버튼이 새로운 상태가 되기를 기다리려면 보통 GetKeyState 회돌이 대신에 KeyWait을 사용하는 것이 더 쉽습니다.

비정상적인 키보드 드라이버가 설치된 시스템은 키의 상태를, 특히 Capslock 같은 키의 토글 상태를 느리게 갱신할 가능성이 있습니다. 키의 상태가 변경되면 바로 점검해야 하는 스크립트는 미리 Sleep을 사용해 시스템이 키 상태를 갱신할 시간을 주는 것이 좋습니다.

조이스틱에 GetKeyState를 사용하는 예는 조이스틱 리맵핑 페이지와 Joystick-To-Mouse 스크립트를 참조하십시오.

관련 항목

GetKeyState(), KeyWait, Key List, 조이스틱 리맵핑, KeyHistory, #InstallKeybdHook, #InstallMouseHook

예제

; 기본 예제들:
GetKeyState, state, RButton  ; 우측 마우스 버튼.
GetKeyState, state, Joy2  ; 첫 번째 조이스틱의 두 번째 버튼.

GetKeyState, state, Shift
if state = D
    MsgBox 적어도 하나의 Shift 키가 눌려 있습니다.
else
    MsgBox Shift 키가 어느 쪽도 눌려 있지 않습니다.

GetKeyState, state, CapsLock, T ;  CapsLock이 켜져 있으면 D, 그렇지 않으면 U입니다.
state := GetKeyState("Capslock", "T")  ; CapsLock이 켜져 있으면 참, 그렇지 않으면 거짓입니다.

; 리맵핑 예제 (이 예제는 오로지 보여주기 위한 용도입니다.
; 내장된 리맵핑 특징을 사용하는 편이 더 쉽습니다):
; 다음 핫키에서, NumpadAdd가 눌려 있는 동안 마우스 버튼도 눌려 있습니다.
; NumpadAdd를 마우스 버튼으로 변신시키는 효과가 있습니다. 이 방법을 사용하면
; 사용자가 키나 버튼을 누르고 있는 동안 행위를 반복할 수 있습니다:
*NumpadAdd::
MouseClick, left,,, 1, 0, D  ; 왼쪽 마우스 버튼을 누르고 있습니다.
Loop
{
    Sleep, 10
    GetKeyState, state, NumpadAdd, P
    if state = U  ; 키를 놓았습니다. 그래서 회돌이를 빠져 나옵니다.
        break
    ; ... 여기에 반복하고 싶은 행위를 삽입하십시오.
}
MouseClick, left,,, 1, 0, U  ; 마우스 버튼을 뗍니다.
return

; 예제: 조이스틱 축 위치에 따라 조이스틱 버튼의 행위를 다르게 만듭니다.
joy2::
GetKeyState, joyx, JoyX
if joyx > 75
    MsgBox Action #1 (조이스틱이 오른쪽으로 기운 동안 버튼이 눌렸습니다).
else if joyx < 25
    MsgBox Action #2 (조이스틱이 왼쪽으로 기운 동안 버튼이 눌렸습니다).
else
    MsgBox Action #3 (조이스틱이 수평으로 가운데에 있는 동안 버튼이 눌렸습니다).
return

; 다른 예제들은 조이스틱 리맵핑 페이지와 Joystick-To-Mouse 스크립트를 참조하십시오.


Gosub

지정된 라벨로 점프하여 Return을 만날 때까지 실행을 계속합니다.

Gosub, Label

매개변수

Label

점프해 갈 라벨, 핫키 라벨, 또는 핫스트링 라벨의 이름. 그 결과 Label 아래의 명령어들이 Return이나 Exit을 만날 때까지 실행됩니다. "Return"은 스크립트를 다시 Gosub 아래의 첫 명령어로 점프해서 거기에서 실행을 재개하게 만듭니다. "Exit"은 현재 쓰레드를 종료합니다.

논평

거의 모든 명령어의 매개변수와 마찬가지로, 라벨은 변수 참조일 수 있습니다. %MyLabel%와 같은 경우 변수에 저장된 이름이 목표로 사용됩니다. 그렇지만, 수행성능은 약간 줄어듭니다. 왜냐하면 목표 라벨을 스크립트가 처음 적재될 때 "한 번만 찾아 보는 것이 아니라" 매번 찾아 보아야 하기 때문입니다.

%MyLabel%와 같은 동적 라벨을 사용할 때, 라벨이 존재하지 않으면 에러 대화상자가 나타납니다. 이를 피하려면, 미리 IsLabel()을 호출하십시오. 예를 들어:

if IsLabel(VarContainingLabelName)
    Gosub %VarContainingLabelName%

Gosub가 간단하고 일반적인 목적의 서브루틴에는 유용하지만, 보다 복잡한 목적으로는 함수의 사용을 권장합니다.

관련 항목

Return, 함수, IsLabel(), 블록, Loop, Goto

예제

Gosub, Label1
MsgBox, Label1 서브루틴이 반환되었습니다 (종료됨).
return

Label1:
MsgBox, Label1 서브루틴이 지금 실행 중입니다.
return


Goto

지정된 라벨로 점프해서 실행을 계속합니다.

Goto, Label

매개변수

Label

점프해 갈 라벨 이름.

논평

%MyLabel%와 같은 동적인 라벨을 사용할 때, 라벨이 존재하지 않으면 에러 대화상자가 나타납니다. 이를 피하려면, 미리 IsLabel()를 호출하십시오. 예를 들어:

if IsLabel(VarContainingLabelName)
    Goto %VarContainingLabelName%

Goto는 사용을 권장하지 않습니다. 왜냐하면 일반적으로 스크립트를 더 읽기 어렵고 관리하기 힘들게 만들기 때문입니다. Else, Blocks, Break, 그리고 Continue를 Goto에 대한 대안으로 생각해 보십시오.

관련 항목

Gosub, Return, IsLabel(), Else, 블록, Break, Continue

예제

Goto, MyLabel
...
MyLabel:
Sleep, 100
...


GroupActivate

GroupAdd로 정의된 창 그룹에서 다음 창을 활성화합니다.

GroupActivate, GroupName [, R]

매개변수

GroupName

활성화 할 그룹의 이름, 최초로 GroupAdd로 정의되어 있습니다.

R

이 매개변수는 그룹에서 멤버가 현재 전혀 활성화되어 있지 않을 경우 가장 오래된 창을 활성화할 지 아니면 가장 새로운 창을 활성화할 지 결정합니다. 생략하면, 가장 오래된 창이 언제나 활성화됩니다. 기호 R이라면, 가장 새로운 창 (가장 최근에 활성화 된 창) 이 활성화됩니다. 그러나 명령어가 주어지는 순간 그룹에 아무 멤버도 활성화되어 있지 않을 경우에만 그렇습니다. "R"은 임시로 전혀 관련 없는 작업으로 전환할 경우에 유용합니다. GroupActivate, GroupDeactivate, 또는 GroupClose를 통하여 그룹으로 다시 돌아 오면, 가장 오래된 창이 아니라 여러분이 가장 최근에 작업한 창이 활성화됩니다..

ErrorLevel [AHK_L 54+]

ErrorLevel은 활성화 할 창을 발견할 수 없으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

이 명령어는 그룹의 창 규격에 부합하는 첫 창이 활성화 되도록 만듭니다. 두 번째로 사용하면 순서대로 다음 창이 활성화 됩니다. 등등. 보통, 핫키에 할당되기 때문에 이 창-순회 행위는 그 키를 누르면 자동으로 수행됩니다.

또다른 창이 활성화 되자 마자 그 즉시 또 창이 활성화되면, 어떤 시스템에서는 (OS와 그 설정에 따라) 태스크 바 버튼이 깜빡거릴 수 있습니다. 이를 피하려면 #WinActivateForce를 사용하십시오.

창 그룹에 관한 더 자세한 정보는 GroupAdd를 참조하십시오.

관련 항목

GroupAdd, GroupDeactivate, GroupClose, #WinActivateForce

예제

GroupActivate, MyGroup, R


GroupAdd

창 그룹에 창 규격을 추가합니다. 필요하면 그룹을 생성합니다.

GroupAdd, GroupName [, WinTitle, WinText, Label, ExcludeTitle, ExcludeText]

매개변수

GroupName

이 창 규격에 추가할 그룹의 이름. 그룹이 존재하지 않으면, 생성됩니다. 그룹 이름은 대소문자를 가리지 않습니다.

WinTitle

목표 창을 식별할 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 GroupActivate, GroupDeactivate, and GroupClose가 사용되는 순간에 DetectHiddenText가 켜져 있어야(ON) 탐지됩니다.

Label

GroupActivate명령어가 사용될 때 이 그룹에 부합하는 창이 존재하지 않으면 실행할 서브루틴의 라벨 (또는 AHK_L 54 이전이면 다음 창 규격). 마치 Gosub가 사용된 것처럼 라벨로 점프합니다. 아무것도 없으면 생략하거나 비워 둡니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

논평

이 명령어를 사용할 때마다 새로운 규칙이 그룹에 추가됩니다. 다른 말로 하면, 그룹은 고정된 창 목록이 아니라 기준 집합으로 구성됩니다. 나중에, 그룹을 GroupActivate와 같은 명령어가 사용할 때, 바탕화면 위의 각 창은 이 기준에 맞는지 점검됩니다. 창이 그룹의 기준 중 하나에 부합하면, 부합한 것으로 간주됩니다.

SetTitleMatchMode와 DetectHiddenWindows는 이 명령어의 행위에 직접적으로 영향을 주지는 않지만, GroupActivate와 GroupClose 같은 다른 그룹 명령어에는 영향을 미칩니다. 또 ahk_group을 다른 명령어의 WinTitle에 사용할 때에도 영향을 미칩니다.

창 그룹은 전형적으로 관련 창 집단을 함께 묶는데 사용됩니다. 많은 창이 관련되는 작업에 또는 많은 하위 창을 소유한 어플리케이션에 유용합니다. 예를 들어, 그래픽 프로그램이나 텍스트 편집기의 많은 실체와 자주 작업한다면, GroupActivate를 핫키에 사용해서 그 프로그램의 각 실체를 한 번에 하나씩 방문할 수 있습니다. 창을 찾으려고 알트-탭을 누르거나 태스크 바 버튼을 누를 필요가 없습니다.

각 그룹의 엔트리는 한 번만 추가하면 되기 때문에, 이 명령어는 전형적으로 (스크립트의 상단 부분) 자동 실행 섹션에 사용됩니다. 중복 엔트리를 그룹에 추가하려고 시도하면 무시됩니다.

그룹에 모든 창을 포함하려면 (특별한 프로그램 관리자 창 제외), 다음 예제를 사용하십시오:

GroupAdd, AllWindows

모든 창 명령어는 창 그룹에 작용할 수 있습니다. ahk_group MyGroupName을 WinTitle 매개변수에 지정하면 됩니다. 명령어 WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinClose, 그리고 WinKill은 그룹의 모든 창에 작용할 것입니다. 대신에 최상단 창에만 작용시키고 싶으면, 다음 예제를 따르십시오:

WinHide % "ahk_id " . WinExist("ahk_group MyGroup")

대조적으로, WinActivate와 IfWinExist와 같은 다른 창 명령어는 그룹의 최상위 창에만 작동합니다.

관련 항목

GroupActivate, GroupDeactivate, GroupClose

예제

; 스크립트의 상단 자동 실행 섹션에서:
GroupAdd, MSIE, ahk_class IEFrame ; 이 그룹에 Internet Explorer 창만 추가합니다.
return ; 자동 실행 섹션의 끝.

; 이 그룹을 활성화 할 핫키를 할당합니다. 열린 모든
; MSIE 창을, 한 번에 하나 씩, 순회합니다
; (즉, 핫키를 누를 때마다).
Numpad1::GroupActivate, MSIE, r

; 다음은 MS Outlook 2002에 대한 좀 복잡한 그룹입니다.
; 스크립트의 상단 자동 실행 섹션에서:
SetTitleMatchMode, 2
GroupAdd, mail, Message - Microsoft Word ; 현재 작성 중인 메일을 위한 것입니다
GroupAdd, mail, - Message ( ; 이미 열린 항목들을 위한 것입니다
; 유령 창이 활성화되는 것을 피하려면 추가 텍스트가 필요합니다:
GroupAdd, mail, Advanced Find, Sear&ch for the word(s)
GroupAdd, mail, , Recurrence:
GroupAdd, mail, Reminder
GroupAdd, mail, - Microsoft Outlook
return  ; 자동 실행 섹션의 끝.

Numpad5::GroupActivate, mail ; 각 아웃룩 창을, 한 번에 하나 씩 방문할, 핫키를 할당합니다.


GroupClose

GroupActivate 또는 GroupDeactivate으로 활성화 되었던 활성 창을 닫습니다. 다음 창을 순서대로 활성화합니다. 또한 그룹의 모든 창을 닫을 수도 있습니다.

GroupClose, GroupName [, A|R]

매개변수

GroupName

최초로 GroupAdd이 정의한 그룹의 이름

A|R

기호 A라면, 그룹의 모든 멤버가 닫힙니다. 이것은 효과가 WinClose ahk_group GroupName와 같습니다.

그렇지 않고: 이 명령어가 활성 창을 닫으면, 연속적으로 다음 창을 활성화 합니다. 이 매개변수는 가장 새로운 창을 활성화할지 아니면 가장 오래된 창을 활성화 할지 결정합니다. 생략하면, 가장 오래된 창이 항상 활성화 됩니다. 기호 R이라면, 가장 새로운 창이 (가장 최근에 활성화 된 창이) 활성화 됩니다. 그러나, 명령어가 주어질 때 그룹의 멤버가 하나도 활성화되어 있지 않을 경우에만 그렇습니다. "R"이 유용한 경우는 임시로 관련 없는 작업으로 전환할 경우입니다. GroupActivate, GroupDeactivate, 또는 GroupClose를 통하여 그룹으로 돌아올 때, 가장 오래된 창이 아니라 여러분이 가장 최근에 작업한 창이 활성화 됩니다.

논평

A|R 매개변수가 "A"가 아닐 때, 이 명령어의 행위는 GroupName에 대한 이전 행위가 GroupActivate이었는가 아니면 GroupDeactivate인가에 의해 결정됩니다. GroupDeactivate였다면, 이 명령어는 그룹의 멤버가 아닐 때만 활성 창을 닫습니다 (그렇지 않으면 아무 일도 하지 않습니다). 만약 GroupActivate이었거나 아무것도 없었다면, 이 명령어는 활성창이 그룹의 멤버일 경우에만 닫습니다 (그렇지 않으면 아무일도 하지 않습니다). 이 행위 덕분에 GroupName의 GroupActivate 또는 GroupDeactivate 핫키와 짝이 되게 GroupClose을 핫키에 할당할 수 있습니다.

창 그룹에 관한 더 자세한 정보는 GroupAdd를 참조하십시오.

관련 항목

GroupAdd, GroupActivate, GroupDeactivate

예제

GroupClose, MyGroup, R


GroupDeactivate

GroupActivate와 비슷하지만 그룹에 없는 다음 창을 활성화합니다.

GroupDeactivate, GroupName [, R]

매개변수

GroupName

처음에 GroupAdd에 의해 정의된, 목표 그룹의 이름.

R

이 매개변수는 그룹의 멤버가 현재 활성 상태일 때 가장 오래된 비-멤버가 활성화 될지 아니면 가장 새로운 비-멤버 창이 활성화 될지 결정합니다. 생략하면, 가장 오래된 비-멤버 창이 언제나 활성화됩니다. 기호 R이면, 가장 새로운 비-멤버 창이 (가장 최근에 활성화된 창이) 활성화 됩니다. 그러나 명령어가 주어질 때 그룹의 멤버가 활성화되어 있을 경우에만 활성화 됩니다. "R"은 임시로 관련 없는 작업으로 전환할 경우에 유용합니다. GroupActivate, GroupDeactivate, 또는 GroupClose를 통하여 그룹으로 돌아올 때, 가장 오래된 창이 아니라 가장 최근에 작업한 창이 활성화 됩니다.

논평

GroupDeactivate 때문에 그룹의 창 규격에 부합하지 않는가장 첫 번째 창이 활성화 됩니다. GroupDeactivate를 두 번째 사용하면 연속적으로 다음 창을 활성화합니다. 등등. 보통, GroupDeactivate는 핫키에 할당해서 그 키를 누르면 자동으로 이런 창 행위가 수행되도록 합니다.

이 명령어는 자주 실행해야 해서 거의 언제나 실행 중인 창들이 많을 때 유용합니다. 이 창들을 그룹에 추가하면, GroupDeactivate를 사용해 별로 사용하지 않는 창마다 방문하면서 닫을지 말지 결정할 수 있습니다. 이렇게 하면 손으로 하는 것보다 바탕화면을 훨씬 더 빨리 정리할 수 있습니다.

창 그룹에 관한 더 자세한 정보는 GroupAdd를 참조하십시오.

관련 항목

GroupAdd, GroupActivate, GroupClose

예제

GroupDeactivate, MyFavoriteWindows  ; 바탕화면을 정리하기 위해  별로-사용하지 않은 창을 방문합니다.


GUI

창과 콘트롤을 생성하고 관리합니다. 그런 창은 데이터 엔트리 폼 또는 맞춤 사용자 인터페이스에 사용할 수 있습니다.

Gui, sub-command [, Param2, Param3, Param4]

목차

  • New: 새 창을 만듭니다.
  • Add: 텍스트, 버튼, 또는 체크박스 같은 콘트롤을 생성합니다.
  • Show: 창을 보여줍니다. 또한 창을 최대화, 최소화, 또는 이동할 수 있습니다.
  • Submit: 사용자의 입력을 저장하고 선택적으로 창을 감춥니다.
  • Cancel (또는 Hide): 창을 감춥니다.
  • Destroy: 창을 삭제합니다.
  • Font: 연이어 생성되는 콘트롤에 대하여 글꼴의 모양, 크기, 스타일, 그리고 색을 설정합니다.
  • Color: 창과 그의 콘트롤에 대하여 배경 색을 설정합니다.
  • Margin: 콘트롤에 명시적으로 위치가 지정되어 있지 않으면 여백/공간을 설정합니다.
  • 창에 대한 옵션과 스타일: 창의 모습과 행위에 대하여 다양한 옵션을 설정합니다.
  • Menu: 메뉴 바를 추가하거나 제거합니다.
  • Minimize / Maximize / Restore: 창에 지시된 연산을 수행합니다.
  • Flash: 창과 그의 태스크바 버튼을 깜빡입니다.
  • Default: 현재 쓰레드의 기본 GUI 창 이름을 변경합니다.
  • 콘트롤의 위치 지정과 크기 변경
  • 사용자 입력을 저장하고 그에 응답하기: 변수 그리고 g-labels
  • 콘트롤에 대한 옵션과 스타일
  • 창 이벤트: GuiClose | GuiEscape | GuiSize | GuiContextMenu | GuiDropFiles
  • 여러 GUI 창 만들기
  • GUI 이벤트, 쓰레드 그리고 서브루틴
  • 기타: 키보드 항해 | 창의 겉모습 | 총평
  • 예제: GUI 창과 콘트롤을 시연하는 작동하는 스크립트들.

Gui, New [, Options, Title] [v1.1.04+]

창을 만들고 현재 쓰레드에 대하여 기본 창으로 설정합니다.

Gui, New  ; 이름 없고 번호 없는 GUI를 새로 하나 만듭니다.
Gui, Name: New  ; 새로 GUI를 만듭니다. 같은 이름으로 기존의 GUI가 있으면 제거합니다.

Options 메인 GUI 명령어가 지원하는 옵션을 담을 수 있습니다.

Title이 생략되면, 스크립트 파일의 이름이 사용됩니다.

이 명령어는 다음 약점이 따라 옵니다:

  • 대부분의 경우 창은 요구하면 자동으로 생성됩니다. 그래서 보통 Gui New를 호출할 필요가 없습니다.
  • 새 창을 현재 쓰레드에 대하여 기본 창으로 설정할 수 있지만, 비-GUI 쓰레드도 여전히 GUI 번호 1을 기본값으로 설정할 수 있습니다.
  • GUI에 이름이 없고 기본 GUI가 아니면, 그의 HWND로 식별하여야 합니다. +HwndGuiHwnd 옵션을 사용하여 새 창의 HWND를 GuiHwnd에 저장할 수 있습니다. Gui, %GuiHwnd%:Default를 사용하면 기본값으로 다른 Gui 명령어들을 그 창에 작동시킬 수 있습니다.

긍정적인 면에 관하여:

  • Gui New를 호출하면 스크립트가 기존의 GUI를 변경하는 것이 아니라, 새로 만든다는 것을 확신할 수 있습니다. 또한 코드를 읽는 사람들에게 (또는 미래의 여러분에게) 스크립트의 목적을 더 명료하게 보여줄 수 있습니다.
  • Gui New는 각 GUI에 대하여 유일한 이름 또는 번호를 고를 필요를 제거합니다. 이는 스크립트가 하나 이상의 GUI를 생성할 필요가 있을 때, 또는 다른 스크립트에 포함될 의도가 있을 때 특히 유용할 수 있습니다.
  • GUI가 보여질 때가 아니라 생성될 때 창의 제목을 설정하는 것이 종종 더 직관적인 경우가 있습니다.

이름이 주어지지 않으면, 다음이 적용됩니다:

  • GuiClose와 같이 특별한 라벨은 기본적으로 "Gui"를 접두사로 가집니다. 단, 옵션에서 +LabelPrefix로 오버라이드하는 경우는 예외입니다.
  • GUI기 새 쓰레드를 기동할 때, A_Gui는 이름 대신에 HWND가 담깁니다.

주의: v1.1.08 이전에서, 이 명령어는 이름이 지정되면 기본 Gui를 설정하지 않았습니다.

Gui, Add, ControlType [, Options, Text]

콘트롤을 GUI 창에 추가합니다 (필요하면, 먼저 GUI 창 자체를 생성합니다).

ControlType은 다음 중 하나입니다:

  • Text, Edit, UpDown, Picture
  • Button, Checkbox, Radio
  • DropDownList, ComboBox
  • ListBox, ListView, TreeView
  • Link, Hotkey, DateTime, MonthCal
  • Slider, Progress
  • GroupBox, Tab, StatusBar
  • ActiveX (예, 인터넷 익스플로러 콘트롤)
  • Custom

예를 들어:

Gui, Add, Text,, Please enter your name:
Gui, Add, Edit, vName
Gui, Show

Gui, Show [, Options, Title]

따로 Options에 지정하지 않으면, 이 명령어는 창을 보이게 만들고, (필요하면) 창 크기를 복원하고, 활성화 하며, 그리고 그의 타이틀을 설정합니다. Title이 생략되면, 이전 제목이 유지됩니다 (또는 없으면, 스크립트의 이름이 사용됩니다).

아래의 X, Y, W, 그리고 H 옵션을 생략하면 창의 이전 크기와 위치를 유지할 수 있습니다. 이전의 위치가 없을 경우, 아래에 언급된 X 또는/그리고 Y 옵션이 없다면 창은 두 차원 중 하나에 또는 둘 모두에 맞게 자동 중앙 정렬됩니다. 이전의 크기가 없을 경우, 창은 내용을 가진 콘트롤의 크기와 위치에 맞게 자동 조절됩니다.

다음 문자열이 Options에 존재할 수 있습니다 (각 숫자를 십진수로 지정하십시오. 십육진수가 아닙니다):

Wn: n에 창의 클라이언트 구역의 너비 (픽셀 단위)를 지정합니다 (클라이언트 구역에서 창의 테두리, 제목 바, 그리고 메뉴 바는 제외됩니다).

Hn: n에 창의 클라이언트 구역의 높이를 픽셀 단위로 지정합니다.

Xn: n에 화면에서 창의 X-위치를 픽셀 단위로 지정합니다. 위치가 0이면 화면에서 가장 왼쪽에 보이는 왼쪽의 컬럼 픽셀입니다.

Yn: n에 화면에서 Y-위치를 픽셀 단위로 지정합니다. 위치 0은 화면에서 보이는 가장 위쪽 행의 픽셀입니다.

Center: 창을 화면에서 수평 수직으로 가운데에 정렬합니다.

xCenter: 창을 화면에서 수평으로 중앙 정렬합니다. 예를 들어: Gui, Show, xCenter y0.

yCenter: 화면에서 창을 수직으로 중앙 정렬합니다.

AutoSize: 창의 크기를 현재 보이는 콘트롤에만 맞게 변경합니다. 이것은 새 콘트롤을 추가한 후 창의 크기를 바꿀 때, 또는 기존의 콘트롤이 크기가 바뀌거나, 숨거나, 또는 다시 나타나거나 할 때 유용합니다. 예를 들어:
Gui, Show, AutoSize Center

다음 중 하나가 존재할 수도 있습니다:

Minimize: 창을 최소화하고 그 아래에 있는 창을 활성화 합니다.

Maximize: 창을 최대화하고 활성화합니다.

Restore: 창을 복구합니다. 창을 보여주고 활성화합니다.

NoActivate: 창을 복구합니다. 창을 활성화하지 않고 보여줍니다.

NA: 창을 활성화하지 않고 보여줍니다. 그 창이 최소화되어 있더라도, 그대로 있겠지만 아마도 z-순서는 더 높아질 것입니다 (z-순서란 알트-탭 선택자에 보여지는 순서입니다). 창이 이전에 숨어 있었으면, 이 때문에 아마도 활성 창이 비활성화되지 않았다고 할지라도 그 위에 나타날 것입니다.

Hide: 창을 감추고 그 아래의 창을 활성화 합니다. 이것은 기능상 Gui Cancel과 동일합니다. 단, 숨은 창을 이동하고, 크기 변경을 할 수 있고 또는 보여줄 필요 없이 새 제목을 줄 수 있다는 점은 다릅니다. 예를 들어: Gui, Show, Hide x55 y66 w300 h200, New Title.

Gui, Submit [, NoHide]

각 콘트롤의 내용을 그의 연관 변수에 저장하고 창을 감춥니다. 단, NoHide 옵션이 있는 경우는 예외입니다. 다중-선택 ListBox와 같이 여러 필드의 출력을 생산하는 콘트롤에 대하여, 그 출력은 창의 현재 가름자를 사용합니다. 그 창이 존재하지 않으면 -- 아마도 Gui Destroy를 통하여 사라져 버렸다면 -- 이 명령어는 아무 효과가 없습니다.

Gui, Cancel

그의 연관 변수에 콘트롤의 내용을 저장하지 않고 창을 감춥니다. 창이 존재하지 않으면 -- 아마도 Gui Destroy를 통하여 파괴되어 버렸다면 -- 이 명령어는 아무 효과도 없습니다.

Gui, Destroy

창과 그의 모든 콘트롤을 (존재하면) 제거하고, 상응하는 메모리와 시스템 자원을 풀어줍니다. 나중에 스크립트가 그 창을 다시 만들면, 글꼴과 색깔 같은 창의 모든 특성은 (마치 창이 존재하지 않았던 것처럼) 기본 값으로 시작합니다. Gui Destroy를 사용하지 않더라도, 모든 GUI 창은 스크립트가 종료할 때 자동으로 파괴됩니다.

Gui, Font [, Options, FontName]

창에 추가된 콘트롤에 대하여 이 시점부터 글꼴 모양, 크기, 스타일 그리고/또는 색을 설정합니다. 예를 들어:

gui, font, s10, Verdana  ; Set 10-point Verdana.

마지막 매개변수 두 개를 생략하면 글꼴을 시스템의 기본 GUI 모양, 크기 그리고 색으로 복구할 수 있습니다.

FontName은 글꼴 이름입니다. 예를 들어 글꼴 테이블에서 고를 수 있는 이름입니다. FontName을 생략하거나 시스템에 존재하지 않으면, 이전의 글꼴 모양이 사용됩니다 (또는 없으면, 시스템의 기본 GUI 모양이 사용됩니다). 선호하는 글꼴이 없다고 할지라도 여러 시스템에서 GUI 창이 비슷한 글꼴을 가지게 만드는 데 유용합니다. 예를 들어, 다음 명령어를 순서대로 사용하면, Verdana 글꼴이 Arial보다 우선하고, Arial은 MS sans serif보다 우선 순위가 주어집니다:

gui, font,, MS sans serif
gui, font,, Arial
gui, font,, Verdana  ; 선호하는 글꼴.

Options 매개변수가 비어 있으면, 이전의 글꼴 속성이 사용됩니다. 그렇지 않으면, 다음 옵션 기호들을 대신 지정하십시오:

C: 컬러 이름 (컬러 차트 참조) 또는 RGB 값 -- 또는 단어 Default를 지정하면 시스템의 기본 컬러에 의존할 수 있습니다 (대부분의 시스템에서 검정색). 예를 들어: cRed, cFFFFAA, cDefault. 주의: Buttons은 맞춤 색을 준수하지 않습니다. 또한, C 옵션을 포함함으로써 현재 색 말고 글꼴 색을 가지고 콘트롤을 개별적으로 만들 수 있습니다. 예를 들어: Gui, Add, Text, cRed, My Text.

S: 크기 (포인트 단위). 예를 들어: s12 (십진수로 지정하십시오. 십육진수가 아닙니다)

W: 두께 (두꺼움), 1과 1000 사이의 숫자입니다 (400은 보통이고 700이면 볼드체입다). 예를 들어: w600 (십육진수가 아니라 십진수로 지정하십시오)

다음 단어들을 지원합니다: bold, italic, strike, underline, 그리고 norm. Norm은 글꼴을 보통 두께와/무게로 돌려줍니다. 그리고 이탤릭, 취소선, 그리고 밑줄을 끕니다 (그러나 기존의 색과 크기는 유지합니다). norm을 사용하여 모든 속성을 끈 다음 선택적으로 하나씩 켜는 것이 가능합니다. 예를 들어, norm italic을 지정하면 글꼴을 정상으로 만든 다음 이택릭으로 설정합니다.

여러 옵션을 지정하려면, 각 옵션 사이에 스페이스를 포함시키십시오. 예를 들어: cBlue s12 bold.

스크립트가 여러 GUI 창을 생성하면, 각 창마다 콘트롤을 더 만들 목적으로 자신의 "현재 글꼴"을 기억합니다.

관련하여, 운영 체제는 사용자가 글꼴, 컬러, 또는 아이콘을 고르도록 표준 대화상자를 제공합니다. 이 대화상자는 DllCall()을 통하여 보여줄 수 있습니다. 다음에 예시합니다: www.autohotkey.com/forum/topic17230.html.

Q: [AHK_L 19+]: 텍스트 가공 품질. 예를 들어: q3. Q 다음에 다음 테이블에 있는 숫자가 따라와야 합니다:

0 = DEFAULT_QUALITY | 글꼴의 모습은 상관하지 않습니다.
1 = DRAFT_QUALITY | PROOF_QUALITY를 사용할 때에 비해 글꼴의 모습이 덜 중요합니다.
2 = PROOF_QUALITY | 논리적 글꼴 속성에 정확하게 부합하는 것보다 글꼴의 문자 품질이 더 중요합니다.
3 = NONANTIALIASED_QUALITY | 글꼴을 부드럽게 외곽선 처리하지 않습니다.
4 = ANTIALIASED_QUALITY | 글꼴이 지원하면 글꼴을 부드럽게 외곽선 처리합니다. 그리고 글꼴의 크기는 너무 작지도 너무 크지도 않습니다.
5 = CLEARTYPE_QUALITY | Windows XP 이후: 설정하면, ClearType 외곽선 처리 방법을 사용하여 텍스트를 가공합니다.

이런 값들의 의미에 관한 더 자세한 정보는 MSDN: CreateFont를 참조하십시오.

고품질 설정이 보통 기본값이기 때문에, 이 특징은 주로 앤티-엘리어싱을 끄면 텍스트가 더 선명하게 보일 경우에 사용됩니다.

Gui, Color [, WindowColor, ControlColor]

창의 그의 콘트롤의 배경색을 설정합니다. WindowColor는 GUI 창 자체에 대한 배경색으로 사용됩니다. ControlColor는 창에 존재하는 그리고 존재할 모든 콘트롤에 적용됩니다 (그렇지만 어떤 유형의 콘트롤의 맞춤 색을 지원하지 않습니다). ControlColor을 처음에는 ListViews와 TreeViews가 준수하지만, 연이어서 ControlColor를 변경하면 영향을 미치지 않습니다. 그런 경우, GuiControl +BackgroundFF9977, MyListView를 사용하여 명시적으로 색을 변경하십시오.

두 매개변수 중 하나라도 그대로 두면 현재 색이 유지됩니다. 그렇지 않으면, 16가지 기본 HTML 컬러 이름 또는6-자리 RGB 컬럼 이름 (0x 접두사는 선택적), 또는 단어 Default를 지정하면 그의 기본 값으로 돌아갈 수 있습니다. 예를 들어: Silver, FFFFAA, 0xFFFFAA, Default.

기본값으로, 창의 배경 색은 시스템의 버튼색입니다. 그리고 콘트롤의 배경색은 시스템의 기본 창의 색입니다 (보통 흰색).

메뉴 바와 그의 하위 메뉴 색은 다음 예제와 같이 바꿀 수 있습니다: Menu, MyMenuBar, Color, White.

배경을 투명하게 만들려면 WinSet TransColor를 사용하십시오. 그렇지만, 먼저 Gui, Color을 통하여 맞춤 창을 할당하지 않고 이렇게 하면, 버튼도 투명하게 됩니다. 이를 피하려면, 먼저 맞춤 색을 할당한 다음 그 색을 투명하게 만드십시오. 예를 들어:

Gui, Color, EEAA99
Gui +LastFound  ; GUI 창을 마지막 발견 창으로 만들어 아래 줄에 사용합니다.
WinSet, TransColor, EEAA99

또 테두리와 제목 바를 투명 배경을 가진 창으로부터 제거하려면, 창을 투명하게 만든 후에 다음과 같이 하십시오:

Gui -Caption  ; 또는 기본 창이 아니라면 Gui, GuiName:-Caption을 사용하십시오.

이 페이지의 하단 근처에 위를 시연해주는 화면-위 디스플레이 (OSD)의 예제가 있습니다.

Gui, Margin [, X, Y]

X 그리고 Y는 명시적인 X 또는 Y 좌표가 없는 콘트롤을 자동 배치할 때 창의 상/하/좌/우에 둘 여백의 픽셀의 개수입니다. 또, 자동 배치된 콘트롤들을 서로 분리할 수직 수평 거리를 결정하기 위해 여백이 사용됩니다. 마지막으로, (명시적으로 크기가 주어지지 않을 때) 처음 Gui Show를 사용할 때 창의 크기를 계산하기 위해 여백이 고려됩니다.

Gui, Margin은 기본 창에만 영향을 주는 반면에, Gui, Name:Margin는 이름붙은 창에만 영향을 미칩니다. 이 명령어가 사용되지 않으면, 첫 콘트롤이 창에 추가될 때, 그 창은 현재 선택된 글꼴의 크기에 비례하여 사방에 기본 여백을 얻습니다 (상하로 글꼴 높이의 0.75 배 그리고 좌우로 글꼴 높이의 1.25 배).

콘트롤을 추가하는 동안 여백을 바꿀 수 있지만, 그 때의 변경은 이미 존재하는 콘트롤에는 영향을 주지 않고 앞으로 추가될 콘트롤에만 영향을 줍니다. 마지막으로, Xㄴ Y가 비어 있으면 상응하는 여백은 바뀌지 않습니다.

Gui, +/-Option1 +/-Option2 ...

GUI 명령어 바로 다음에 여러 옵션을 지정할 수 있습니다. 수행성능의 이유로, 모든 옵션을 한 줄에서 설정하는 것이 더 좋습니다. 그리고 창을 만들기 전에 (즉, Gui Add와 같은 다른 하위-명령어들을 사용하기 전에) 그렇게 하는 편이 더 좋습니다.

이 명령어의 효과는 점증적입니다. 즉, 명시적으로 지정된 설정만 변경합니다. 다른 설정들은 그대로 둡니다.

플러스 사인을 지정하면 옵션을 추가할 수 있고 마이너스 사인은 제거할 수 있습니다. 예를 들어:

Gui +Resize -MaximizeBox  ; 기본 GUI 창의 설정을 변경합니다.
Gui MyGui:+Resize -MaximizeBox  ; 이름이 MyGui인 GUI의 설정을 변경합니다.

AlwaysOnTop: 창을 항상 다른 모든 창 위에 있도록 만듭니다. 이 효과는 WinSet AlwaysOnTop과 같습니다.

Border: 가는-줄 테두리를 창 둘레에 두릅니다. 이것은 일반적이지 않습니다.

Caption (기본으로 존재): 제목 바와 두꺼운 창 테두리/모서리를 제공합니다. 창에서 캡션을 제거할 때 WinSet TransColor를 사용하고 있다면, TransColor를 설정한 후에 제거하십시오.

Delimiter: 파이프 (|) 말고 창이 사용해야 하는 필드 가름자를 지정합니다. 이 가름자는 콘트롤의 내용이 Gui Add를 통하여 추가되거나, GuiControl를 통하여 변경되거나, 또는 Gui Submit나 GuiControlGet를 통하여 열람될 때 사용됩니다. 단어 Delimiter 다음에 바로 문자 하나를 지정하십시오. 예를 들어, Gui +Delimiter`n은 라인피드 문자를 사용합니다. 이는 계속 섹션에 특히 적절할 수 있습니다. 비슷하게, Gui +Delimiter|는 기본 가름자로 되돌아 갑니다. 스페이스나 탭을 사용하려면, Gui +DelimiterSpace 또는 Gui +DelimiterTab을 지정하십시오. 구분자가 바뀌면, 이 특정한 창위에서 작동하는 기존의 그리고 잇따르는 모든 쓰레드에 영향을 줍니다.

Disabled: 창을 비활성화 합니다. 사용자가 그의 콘트롤과 상호작용하지 못하게 막습니다. 이는 종종 다른 창을 소유한 창에 사용됩니다 (Owner 참조).

DPIScale [v1.1.11+]: Gui -DPIScale를 사용하면 DPI 스케일링을 끌 수 있습니다. 이는 기본 값으로 켜져 있습니다. 비-표준 DPI 설정의 시스템에 DPI 스케일링이 활성화 되면, 이 Gui 명령어는 자동으로 좌표와 크기를 조절하여 콘트롤에 대략 비슷하게 보이는 크기를 줍니다 (그러나 해상도는 더 높습니다). 예를 들어, DPI가 144 (150%)이면, Gui Show, w100는 Gui를 150 픽셀 너비로 만들지만, A_GuiWidth는 여전히 100을 돌려줍니다. A_ScreenDPI에는 시스템의 현재 DPI가 담겨 있습니다.

Hwnd OutputVar [v1.1.04+]: 이 옵션은 OutputVar에 GUI의 창 핸들 (HWND)을 저장합니다. 예를 들어: Gui +HwndMyGuiHwnd. 함수 안에서 MyGuiHwnd는 함수적 동적 변수로 취급됩니다. GUI의 HWND는 종종 PostMessage, SendMessage, 그리고 DllCall와 함께 사용됩니다. 또한 ahk_id WinTitle로 또는 GUI 이름 대신에 직접적으로 사용되기도 합니다; 예를 들어, Gui %MyGuiHwnd%:Destroy.

Label [v1.0.44.09+]: 이 창의 특별 라벨에 맞춤 이름을 설정합니다. 예를 들어, Gui MyGui:+LabelMyGui_On는 MyGuiGuiClose와 MyGuiGuiSize 대신에 라벨 MyGui_OnClose와 MyGui_OnSize 를 사용합니다. 다른 말로 하면, 모든 특수 라벨의 이름에 문자열 "MyGuiGui"는 "MyGui_On"으로 교체됩니다. 이는 또한 여러 창이 같은 라벨 세트를 공유하도록 만드는 데 사용할 수도 있습니다 (이 경우 스크립트는 A_Gui에 문의해 어느 창이 서브루틴을 기동했는지 결정할 수 있습니다).

LastFound: 마지막 발견 창이 될 창을 설정합니다 (그렇지만 Gui 쓰레드 안에서는 자동으로 처리되기 때문에 불필요 합니다). 이 덕분에 WinSet과 같은 명령어들은 숨어 있을 경우에도 창을 처리할 수 있습니다 (즉, DetectHiddenWindows는 필요하지 않습니다). 이것은 특히 보여주기 전에 창의 특성을 바꾸는 데 유용합니다. 예를 들어:

Gui +LastFound
WinSet, TransColor, %CustomColor% 150
Gui Show

LastFoundExist [v1.0.43.09+]: 다른 옵션과 다르게, LastFoundExist는 같은 줄에 다른 연산이 없을 경우에만 인지됩니다. +LastFoundExist는 +LastFound와 같습니다. 단, 창이 아직 존재하지 않을 경우에도 생성되지 않는다는 점은 다릅니다. 주요 사용법은 특정 GUI 창이 존재하는지 탐지하는 것입니다. 예를 들어:

Gui MyGui:+LastFoundExist
IfWinExist
    MsgBox GUI "MyGui" already exists.

MaximizeBox: 최대화 버튼을 제목 바에 활성화합니다. 이것은 또 아래의 Resize의 일부에 포함될 수도 있습니다.

MinimizeBox (기본 값으로 보여줌): 최소화 버튼을 제목 바에 활성화 합니다.

MinSize 그리고 MaxSize [v1.0.44.13+]: 창의 최대 최소 크기를 결정합니다. 예를 들어, 사용자가 그의 모서리를 끌어 크기를 바꿀 때, 단어 MinSize 그리고/또는 MaxSize를 앞에 접두사 없이 지정하면 창의 현재 크기를 한계 값으로 사용할 수 있습니다 (창에 현재 크기가 없으면, Gui Show를 맨 처음 사용했을 때의 크기를 사용합니다). 대안으로, 너비와 X, 다음에 높이를 사용할 수 있습니다; 예를 들어: Gui +Resize +MinSize640x480. 차원은 픽셀 단위입니다. 그리고 창의 클라이언트 구역을 지정합니다 (이 구역에서 테두리, 제목 바, 그리고 메뉴 바를 제외됩니다). 각 숫자를 십진수로 지정하십시오. 십육진수가 아닙니다.

너비 또는 높이를 생략하면 그대로 둘 수 있습니다 (예, +MinSize640x 또는 +MinSizex480). 게다가, Min/MaxSize는 여러 번 지정해 한 차원에는 창의 현재 크기를 사용하고 다른 차원에는 명시적인 크기를 사용할 수 있습니다. 예를 들어, +MinSize +MinSize640x는 높이에 창의 현재 크기를 사용하고 너비에 640을 사용합니다.

MinSize 그리고 MaxSize가 사용되지 않으면, 운영 체제의 기본 값이 사용됩니다 (비슷하게, Gui -MinSize -MaxSize를 사용하면 기본 값으로 되돌아 갈 수 있습니다). 주의: 창은 +Resize이 있어야 사용자에게 크기 변경을 허용할 수 있습니다.

OwnDialogs: Gui +OwnDialogs는 각 쓰레드마다 지정해야 합니다 (예를 들어 ButtonOK 서브루틴). 연이어 보여지는 MsgBox, InputBox, FileSelectFile, 그리고 FileSelectFolder 대화상자는 그 창이 소유해야 합니다. 그런 대화상자는 모달이 되는데, 취소하기 전까지 사용자가 그 GUI 창과 상호작용할 수 없다는 뜻입니다. 대조적으로, ToolTip, Progress, 그리고 SplashImage 창은 소유되어 있는 경우에도 모달이 되지 않습니다; 그냥 그의 소유자보다 언제나 위에 있을 뿐입니다. 어느 경우든, 소유된 대화상자 또는 창은 소유한 GUI 창이 파괴되면 자동으로 파괴됩니다.

전형적으로 이 설정을 다시 끌 필요는 없습니다. 왜냐하면 다른 쓰레드에는 영향을 주지 않기 때문입니다. 그렇지만, 쓰레드가 소유한 창과 소유된 대화상자를 모두 보여줄 필요가 있다면, 이 설정을 Gui -OwnDialogs를 통하여 끄면 됩니다.

창이름 접두사가 지정되지 않으면 -- 예를 들어 Gui MyGui:+OwnDialogs 대신에 Gui +OwnDialogs와 같이 사용하면 -- 쓰레드의 기본 창이 그 대화상자를 소유합니다.

Owner: +Owner를 사용하면 그 창을 또다른 창에게 귀속시킬 수 있습니다. 소유된 창은 기본으로 태스크바 버튼이 없습니다. 그리고 보이면 언제나 그의 소유 창 위에 나타납니다. 또한 그의 소유 창이 파괴될 때 자동으로 파괴됩니다. +Owner는 창의 소유자를 생성한 후에 사용해야 합니다. 그러나 v1.1.05 이후는 소유된 창이 생성되기 전 또는 후에 사용해도 됩니다. +Owner를 사용하는 방법은 다음 예제와 같이 두 가지가 있습니다:

Gui, MyGui:+OwnerMyOtherGui  ; MyGui를 MyOtherGui에 귀속시킵니다.
Gui, MyGui:+Owner  ; MyGui를 스크립트의 메인 창에 귀속시켜 태스크바 버튼이 나타나지 못하도록 방지합니다.

[v1.1.03+]: +Owner 다음에 바로 기존의 Gui 번호나 이름 또는 최상위 수준 창의 HWND가 따라올 수 있습니다.

호환성 주의: v1.1.03 이후로, +Owner는 WS_CHILD 스타일을 제거하고 WS_POPUP 스타일을 설정합니다. Gui의 부모 창을 설정하려면, 스크립트는 +Parent 옵션을 사용하거나, 아니면 +Owner 옵션을 사용한 후에 적절한 스타일을 오버라이드 해야합니다.

소유된 창 중 하나가 보이는 동안 소유 창과 사용자가 상호작용하지 못하도록 방지하려면, Gui +Disabled를 통하여 소유 창을 비활성화 하십시오. 나중에 (소유된 창을 취소하거나 소유된 창이 파괴되는 순간), Gui -Disabled를 통하여 소유 창을 다시 활성화 하십시오. 취소/파괴 전에 이렇게 하십시오. 그래야 소유 창이 자동으로 다시 활성화 됩니다.

Parent [v1.1.03+]: +Parent 다음에 기존의 Gui 번호나 이름 또는 창이나 콘트롤의 HWND를 지정하면 이 창의 부모 창으로 사용할 수 있습니다. 그 Gui를 다시 최상위 수준 창으로 바꾸려면, -Parent를 사용하십시오. 이 옵션은 창이 생성된 후에도 작동합니다.

Resize: 창의 크기를 변경 가능하도록 만듭니다. 그리고 그의 최대화 버튼을 제목 바에 활성화 합니다. 최대화 버튼의 활성화를 피하려면, +Resize -MaximizeBox를 지정하십시오.

SysMenu (기본으로 존재): -SysMenu (마이너스 SysMenu)를 지정하면 시스템 메뉴와 아이콘을 창의 좌상 모서리에서 생략할 수 있습니다. 뿐만 아니라 제목 바의 최대, 최소, 그리고 닫기 버튼도 생략됩니다.

Theme: -Theme를 지정하면, 그 다음에 창에 생성되는 콘트롤은 모두 Windows XP 이상에서 고전 테마의 모습을 가집니다. 나중에 추가로 현재 테마를 준수하는 콘트롤을 생성하려면, +Theme를 통하여 다시 원래대로 바꿀 수 있습니다. 주의: 이 옵션은 Windows XP보다 오래된 운영 체제에 작동하지 않으며, XP 자체에도 고전 테마가 있으면 아무 효과가 없습니다. 마지막으로, 이 설정은 콘트롤에 개별적으로 바꿀 수 있습니다. 생성될 때 그의 옵션에+Theme 또는 -Theme을 지정하면 됩니다.

ToolWindow: 좁은 제목 바를 제공하지만, 태스크바 버튼은 없습니다.

(Unnamed Style): 플러스나 마이너스 사인 다음에 바로 십진 또는 십육진 스타일 번호를 지정하십시오.

(Unnamed ExStyle): 플러스나 마이너스 사인 다음에 바로 기호 E 그리고 십진 또는 십육진 확장 스타일 번호를 지정하십시오. 예를 들어, +E0x40000는 WS_EX_APPWINDOW 스타일을 추가합니다. 이 스타일은 창에 태스크바 버튼을 제공합니다. 다른 확장 스타일은 (별로 사용되지 않기 때문에) 여기에 문서화되지 않았지만, WS_EX_APPWINDOW를 www.microsoft.com에서 검색해 보면 보실 수 있습니다.

Gui, Menu [, MenuName]

메뉴 바를 창에 추가합니다. Menu 명령어를 사용하면 이 목적으로 평범한 메뉴를 만들 수 있습니다. 예를 들어:

Menu, FileMenu, Add, &Open`tCtrl+O, MenuFileOpen  ; Ctrl+O에 관한 것은 아래의 논평을 참조하십시오.
Menu, FileMenu, Add, E&xit, MenuHandler
Menu, HelpMenu, Add, &About, MenuHandler
Menu, MyMenuBar, Add, &File, :FileMenu  ; 위에서 생성한 두 개의 하위 메뉴를 부착합니다.
Menu, MyMenuBar, Add, &Help, :HelpMenu
Gui, Menu, MyMenuBar

위의 첫 줄에, &Open 다음에 (그 사이에 탭 문자) Ctrl+O가 따라 오는 것을 주목하십시오. 사용자가 메뉴 항목을 선택하는 대신 누를 키보드 단축키를 가리킵니다. [v1.1.04+]: 단축 키가 Ctrl, Alt 그리고 Shift와 같은 표준 수식 키 이름만 사용하면, GUI에 대하여 자동으로 키보드 단축키로 등록됩니다. 식별 키가 없는 단일-문자 단축키는 대소문자를 구별하고 IME 또는 Alt+NNNN 같은 비정상정인 수단으로 촉발시킬 수 있습니다.

특정 키 조합이 자동으로 작동하지 않으면, 문맥-감지 핫키를 사용하는 것이 필요할 수 있습니다. 그렇지만, 그런 핫키는 전형적으로 Send로 촉발되지 않으며 표준 키보드 단축키보다 다른 스크립트와 간섭을 일으킬 가능성이 더 높습니다.

창의 현재 메뉴 바를 제거하려면, Gui Menu를 사용하십시오 (즉, 마지막 매개변수를 생략하십시오).

메뉴가 일단 메뉴 바로 사용된 적이 있다면, 팝업 메뉴나 하위메뉴로 사용해서는 안됩니다. 왜냐하면 메뉴 바는 내부적으로 다른 형식을 요구하기 때문입니다 (그렇지만, 이 제한은 메뉴 바 자체에만 적용되지, 그의 하위 메뉴에는 적용되지 않습니다). 이를 우회할 필요가 있다면, 메뉴 바로 사용할 메뉴를 하나 만들고 다른 목적으로 사용할 메뉴를 하나 더 똑 같이 만드십시오.

현재 메뉴 바로 사용중인 메뉴 바에 Delete와 DeleteAll과 같이 파괴적인 메뉴 부-명령어를 사용하는 것은 지원하지 않으며 그러면 에러 대화상자가 나타납니다 (단, UseErrorLevel가 겨져 있는 경우는 예외입니다). 그런 식으로 변경하려면 다음 단계를 따르십시오:

  1. Gui Menu를 통하여 메뉴 바를 떼어냅니다 (즉, MenuName을 생략하십시오);
  2. 파괴합니다;
  3. Gui, Menu, MyMenuBar를 통하여 메뉴 바를 다시 부착합니다.

Gui, Hide / Minimize / Maximize / Restore

Gui Hide는 Gui Cancel와 동등합니다. 다른 세 가지 명령어는 창을 (필요하면) 다시 보여준 다음 거기에 지정된 연산을 수행합니다. 창이 존재하지 않으면 -- 아마도 Gui Destroy를 통하여 파괴되어 버렸다면 -- 이 명령어들은 아무 효과가 없습니다.

Gui, Flash [, Off]

태스크바의 창 버튼을 깜빡입니다. 창 제목 바와 태스크바 바튼의 색을 뒤집어 깜밖입니다. 선택적인 단어 OFF 는 제목 바와 태스크 바 버튼이 원래의 색으로 돌아오도록 만듭니다 (그러나 실제 행위는 OS 버전에 따라 달라질 수 있습니다). 아래의 예제에서, 창은 세 번 깜빡입니다. 왜냐하면 깜빡임 한 쌍 마다 색이 뒤집어지고 다음 원래의 모습으로 복구되기 때문입니다:

Loop 6
{
    Gui Flash
    Sleep 500  ; 이 값은 굉장히 민감합니다; 이 값을 바꾸면 예상 못한 행위를 야기할 수 있습니다.
}

Gui, GuiName:Default

현재 쓰레드의 기본 GUI 창 이름을 바꿉니다. 이 이름은 창 이름이 GuiControl, GuiControlGet, 그리고 Gui 명령어 자체에 지정되어 있지 않으면 사용됩니다. 다음 예제에서, 기본 창 이름은 "MyGui"로 바뀝니다: Gui MyGui:Default. 기본 창에 관한 더 자세한 정보는 쓰레드의 기본 창을 참조하십시오.

SmartGUI Creator를 통한 위치 배정과 레이아웃

다음 섹션에서 기술하는 옵션들은 간단한 레이아웃에 적당하지만, Rajat의 SmartGUI Creator를 사용하는 편이 더 쉬울 수 있습니다. 왜냐하면 완전히 눈으로 볼 수 있기 때문입니다; 즉,, "눈에 보이는 대로 얻습니다". SmartGUI Creator는 무료이고 www.autohotkey.com/docs/SmartGUI/으로부터 내려 받을 수 있습니다

콘트롤의 위치 배정과 크기 변경

Options으로부터 어떤 차원 그리고/또는 좌표가 생략되면, 그 콘트롤은 이전 콘트롤에 상대적으로 위치가 결정되고 자동으로 그의 내용에 맞게 자연스런 크기로 결정됩니다.

다음 옵션이 지원됩니다:

R: 텍스트 행 (R2.5와 같이 부동 소수점 수를 포함할 수 있습니다). R을 설정하는 것이 H (높이)를 설정하는 것보다 더 선호됩니다. R옵션과 H 옵션이 모두 존재하면, R이 우선 순위를 갖습니다. GroupBox에 대하여, 이 설정은 박스 안의 공간에 예약된 콘트롤의 개수입니다. DropDownLists, ComboBoxes, 그리고 ListBoxes에 대하여, 콘트롤의 리스트 부분 안에 한 번에 보이는 항목의 개수입니다 (그러나 Windows XP 이후에서, 종종 DropDownList와 ComboBoxor에 R 옵션과H 옵션을 모두 생략하는 것이 바람집합니다. 그래야 팝업 리스트가 자동으로 사용가능한 사용자의 바탕화면의 높이를 이용할 수 있습니다). 다른 콘트롤 유형에 대하여, R은 그 콘트롤 안에 시각적으로 딱 맞는 텍스트의 행의 개수입니다.

W: 픽셀 단위 너비. 생략되면, 어떤 콘트롤 유형은 내용에 기반하여 너비를 자동으로 계산합니다. 다른 콘트롤 유형은 다음과 같이 기본 너비가 있습니다:
탭 콘트롤: 현재 글꼴 크기의 30 배, 더하기 X-여백의 세 배.
수직 진도 바: 현재 글꼴 크기의 두 배.
수평 진도 바, 수평 슬라이더, 드롭다운 리스트, 콤보박스, 리스트박스, 편집박스, 그리고 핫키: 현재 글꼴 크기 15배 (단, 그룹박스는 안 여백을 위해 18배이므로 제외).

H: 픽셀 단위 높이. H옵션과 R옵션이 모두 없으면, DropDownLists, ComboBoxes, ListBoxes, 그리고 빈 여러-줄 편집 콘트롤은 기본 값이 3 행입니다; GroupBoxes는 기본 값이 2 행입니다; 수직 슬라이더와 진도 바는 기본 값이 5 행입니다; 수평 슬라이더는 기본 값이 30 픽셀입니다 (단, 두께가 지정되어 있는 경우는 제외); 수평 진도 바는 기본 값이 현재 글꼴의 2배입니다; 핫키 콘트롤은 기본 값이 1 행입니다; 그리고 탭 콘트롤은 기본값이 10 행입니다. 다른 콘트롤 유형에 대하여, 높이는 그의 내용에 기반하여 자동으로 계산됩니다.

DropDownLists 그리고 ComboBoxes에 대하여, H는 콘트롤에서 언제나 보이는 부분과 그의 리스트 부분을 조합해 높이를 결정한다는 것을 주목하십시오. (그러나 높이가 너무 낮게 설정되더라도, 적어도 하나의 항목은 리스트에 언제나 보일 것입니다). 또한, 모든 유형의 콘트롤에 대하여, H 옵션보다 R 옵션을 통하여 숫자를 지정하는 것이 더 좋습니다. 왜냐하면 콘트롤이 부분적으로 불완전하게 텍스트를 보여주지 못하게 방지하기 때문입니다.

wp+n, hp+n, wp-n, hp-n (여기에서 n은 숫자임)를 사용하면 콘트롤의 너비와 높시를 이전에 추가된 콘트롤의 너비와 높이와 같게 설정할 수 있습니다. 선택적으로 플러스나 마이너스 사인을 사용해 조절하면 됩니다. 예를 들어, wp는 이전 콘트롤의 너비로 콘트롤의 너비를 설정합니다. 그리고 wp-50은 이전 콘트롤의 너비보다 50 작게 설정합니다.

X: X-위치. 예를 들어, x0 y0를 지정하면 콘트롤을 창의 클라이언트 구역의 좌상 모서리에 배치합니다. 클라이언트 구역은 제목 바와 메뉴 바 아래에 있습니다. X는 생략되었지만 Y는 지정되었다면, 콘트롤은 이전에 추가된 모든 콘트롤의 오른쪽에 배치됩니다. 이것을 새로운 "열"의 시작으로 간주할 수 있습니다.

Y: Y-위치. Y가 생략되었지만 X는 지정되었다면, 그 콘트롤은 이전에 추가된 모든 콘트롤의 아래에 배치됩니다. 이것을 새 "행"의 시작으로 간주할 수 있습니다.

X나 Y를 생략하면 앞으로 콘트롤의 크기나 글꼴을 바꿀때 그에 딱 맞게 GUI 레이아웃을 지동으로 조절할 수 있으므로 유용합니다. 대조적으로, 매 콘트롤마다 절대 위치를 지정하면 수작업으로 아래에 있는 모든 콘트롤의 위치를 확대된 또는 축소된 콘트롤의 오른쪽으로 이동해야 합니다.

X와 Y가 모두 생략되면, 콘트롤은 표준 패딩 거리를 사용하여 이전 콘트롤의 아래에 배치됩니다.

X와 Y에 대하여, 선택적인 플러스 사인을 포함시키면 이전에 추가된 콘트롤의 오른쪽 또는 아래쪽 가장자리에 (각각) 상대적으로 콘트롤을 배치할 수 있습니다. 예를 들어, Y+10을 지정하면 표준 패딩 거리를 사용하는 대신에 이전 콘트롤의 10 픽셀 아래에 콘트롤을 배치합니다. 비슷하게, X+10을 지정하면 이전 콘트롤의 10 픽셀 오른쪽으로 콘트롤을 배치합니다. X-10과 같은 음수는 절대 위치 지정을 위해 예약되어 있으므로, 음의 오프셋을 사용하려면, 그 앞에 플러스 사인을 포함하십시오. 예를 들어: X+-10.

[v1.1.16+]: X+와 Y+에 대하여, 기호 M을 창의 현재 여백에 대안으로 사용할 수 있습니다. 예를 들어, x+m은 이전 콘트롤의 오른쪽 가장자리에다 표준 패딩 거리를 사용합니다. xp y+m는 이전 콘트롤의 아래에 콘트롤을 배치합니다. 반면에 X 좌표만 지정하면 보통 기본값으로 yp를 뜻합니다.

xp+n, yp+n, xp-n, yp-n (여기에서 n는 숫자임)는 이전 콘트롤의 좌상 모서리에 상대적으로 콘트롤을 배치하는 데 사용할 수 있습니다. 종종 GroupBox 안에 콘트롤들을 싸 넣을 때 유용합니다.

xm과 ym을 사용하면 창의 좌단 그리고 상단 여백에 (각각) 콘트롤을 배치할 수 있습니다 (이 두 옵션 다음에 플러스/마이너스 사인과 숫자가 하나 따라올 수도 있습니다). x-위치 없이 ym을 지정하면, 콘트롤은 수직으로 상단 여백에 배치되지만 수평으로는 이전에 추가된 모든 콘트롤의 오른쪽에 배치됩니다. 이것을 새로운 "열"의 시작으로 간주할 수 있습니다. 그 반대로 역시 마찬가지입니다.

xs 그리고 ys: 이 옵션들은 xm 그리고 ym과 비슷하지만 이전에 그의 옵션에 단어 Section을 가지고 콘트롤을 추가할 때 저장된 좌표를 참조합니다 (창의 첫 번째 콘트롤은 언제나 새 섹션을 시작합니다. 그의 옵션에 그 단어가 지정되어 있지 않아도 상관이 없습니다). x-위치 없이 ys를 지정하면, 콘트롤은 이전에 저장된 y-위치에 배치되지만, 가장 최근에 사용된 단어 Section 때문에, 추가된 모든 콘트롤의 오른쪽에 배치됩니다 ; 이것을 그 섹션 안에서 새 열이 시작한 것으로 간주해도 좋습니다. 예를 들어:

gui, add, edit, w600  ; 상당히 넓은 편집 콘트롤을 창의 상단에 추가합니다.
gui, add, text, section, First Name:  ; 이 콘트롤의 위치를 저장하고 새 섹션을 시작합니다.
gui, add, text,, Last Name:
gui, add, edit, ys  ; 이 섹션 안에서 새 열을 시작합니다.
gui, add, edit
gui, show

위의 반대도 (y-위치를 생략하고 xs만 지정해도) 역시 마찬가지입니다 .

xs와 ys 다음에 선택적으로 플러스/마이너스 사인과 숫자 하나가 따라올 수도 있습니다. 또한, 단어 Section과 xs/ys를 둘 다 콘트롤의 옵션에 지정하는 것도 가능합니다; 이렇게 하면 자기 자신에 대해서는 이전 섹션을 사용하지만 뒤이은 콘트롤에는 새 섹션을 확립합니다.

사용자 입력을 저장하고 그에 반응하기

V: 변수. 변수를 콘트롤에 연관 짓습니다. 기호 V 다음에 바로, 전역 변수의 이름을 지정하십시오 (또는 전역 변수를 가리키는 ByRef 지역 변수, 또는 v1.0.46.01+에서는 정적 변수). 예를 들어, vMyEdit를 지정하면 Gui Submit 명령어가 사용될 때마다 콘트롤의 내용이 변수 MyEdit에 저장됩니다. 콘트롤이 입력이 불가능하더라도 -- Text 콘트롤이나 GroupBox 콘트롤이라도 --변수를 거기에 연관지으면 여전히 도움이 됩니다. 왜냐하면 변수의 이름이 콘트롤의 유일한 식별자로 기여할 수 있어서 GuiControl, GuiControlGet, 그리고 A_GuiControl에 사용할 수 있기 때문입니다. 주의: Gui Submit은 입력 불가능한 콘트롤의 (예를 들어Text 그리고 GroupBox) 변수의 내용은 물론이고, 다음 섹션에 문서화된 것들도 변경하지 못합니다 (예를 들어 ListView 그리고 TreeView).

G: Gosub (g-label). 사용자가 콘트롤을 클릭하거나 변경할 때 함수의 서브루틴을 자동으로 기동합니다. 기호 G 다음에 곧바로, 실행할 라벨의 이름을 지정하십시오. gCancel은 지정하면 묵시적인 Gui Cancel을 실행할 수 있습니다 (그러나 이름이 "Cancel"인 라벨이 스크립트에 존재하면, 대신에 그 라벨이 실행됩니다). 서브루틴은 다음의 내장 변수들을 참조할 수도 있습니다: A_Gui, A_GuiControl, A_GuiEvent, 그리고 A_EventInfo.

[v1.1.20+]:유효한 라벨 이름이 아니면, 함수 이름을 대신 사용할 수 있습니다. 다른 방법으로, GuiControl 명령어를 사용하면 함수 객체를 콘트롤에 연관지을 수 있습니다. 함수는 선택적으로 다음 매개변수를 받을 수 있습니다 (여기에서 gCtrlEvent은 함수를 설정합니다):

CtrlEvent(CtrlHwnd, GuiEvent, EventInfo, ErrorLevel)

매개변수의 의미는 콘트롤의 유형에 따라 다릅니다.

Controls: 공통 스타일과 기타 옵션

주의: 앞에 부호가 없으면, 플러스 사인이 있다고 간주됩니다; 예를 들어, Wrap은 +Wrap와 같습니다. 대조적으로, -Wrap는 단어-넘기기 특성을 제거합니다.

AltSubmit: 보조적인 제출 방법을 사용합니다. DropDownList, ComboBox, 그리고 ListBox에 대하여 이 매개변수는 Gui Submit 명령어가 텍스트가 아니라 선택된 항목의 위치를 저장하도록 만듭니다. 항목이 선택되지 않으면, ComboBox는 여전히 그의 편집 필드에 텍스트를 저장합니다; 비슷하게, DropDownList 또는 ListBox는 여전히 그의 출력 변수를 비웁니다. 주의: AltSubmit는 또 그런 콘트롤의 내용을 열람할 때 GuiControlGet의 행위에도 영향을 미칩니다.

C: 텍스트의 색깔 (버튼에는 아무 영향이 없습니다). 기호 C 다음에 곧바로 색 이름 (컬러 차트 참조) 또는 RGB 값을 지정하십시오 (0x 접두사는 선택적임). 예제: cRed, cFF2211, c0xFF2211, cDefault.

Disabled: 입력 가능한 콘트롤이 비활성 상태로 나타나도록 만듭니다. 그래서 사용자는 그의 내용에 초점을 두거나 변경할 수 없습니다. GuiControl Enable를 사용하면 나중에 활성화 할 수 있습니다. 주의: Edit 콘트롤을 읽기 전용으로 만들려면, 대신에 문자열 ReadOnly를 지정하십시오. 또한, 단어 Disabled는 선택적으로 다음에 바로 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다 (0이면 활성화 1이면 비활성화를 나타냅니다). 다른 말로, Disabled와 Disabled%VarContainingOne%는 같습니다.

Hidden: 콘트롤은 처음에 안 보입니다. GuiControl Show를 사용하면 나중에 보여줄 수 있습니다. 단어 Hidden은 선택적으로 다음에 곧바로 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다 (0이면 보이고 1이면 숨습니다). 다른 말로, Hidden과 Hidden%VarContainingOne%는 같습니다.

Left: 콘트롤의 내용을 그의 가능한 너비 안에서 왼쪽으로 정렬합니다. 이 옵션은 다음 콘트롤에 영향을 미칩니다: Text, Edit, Button, Checkbox, Radio, UpDown, Slider, Tab, Tab2, GroupBox, DateTime.

Right: 콘트롤의 텍스트를 그의 가능한 너비 안에서 오른쪽으로 정렬합니다. 체크박스와 라디오버튼에 대하여, 이는 또 박스 자신을 콘트롤의 왼쪽이 아니라 오른쪽에 배치합니다. 이 옵션은 다음 콘트롤에 영향을 줍니다: Text, Edit, Button, Checkbox, Radio, UpDown, Slider, Tab, Tab2, GroupBox, DateTime, Link.

Center: 콘트롤의 텍스트를 그의 가능한 너비 안에서 가운데로 정렬합니다. 이 옵션은 다음 콘트롤에 영향을 줍니다: Text, Edit, Button, Checkbox, Radio, Slider, GroupBox.

Section: 새 섹션을 시작하고 나중에 위에 기술한 xs와 ys 위치 지정 옵션에 사용하기 위해 이 콘트롤의 위치를 저장합니다.

Tabstop: -Tabstop을 (즉, 마이너스 탭스탑) 사용하면 사용자가 TAB 키를 눌러 항해할 때. 입력 가능 콘트롤을 건너뛸 수 있습니다.

Wrap: 그의 가능한 너비 안에서 콘트롤의 내용에 단어-넘기기를 활성화합니다. 거의 모든 콘트롤 유형이 단어-줄넘기기를 켜고 시작하기 때문에, 단어 넘기기를 끄려면 -Wrap를 사용합시오.

VScroll: 이런 유형의 콘트롤에 적절하면 수직 스크롤 바를 제공합니다.

HScroll: 이런 유형의 콘트롤에 적절하면 수평 스크롤 바를 제공합니다. 이 문단의 나머지는 ListBox에만 적용됩니다. 수평 스크롤 너비는 리스트 박스 너비의 3 배가 기본값입니다. 다른 스크롤 너비를 지정하려면, 숫자를 단어 HScroll 바로 다음에 지정하십시오. 예를 들어, HScroll500은 리스트박스 안에서 500 픽셀의 수평 스크롤을 허용합니다. 그렇지만, 지정된 스크롤 너비가 리스트박스의 너비보다 작으면, 스크롤 바가 보이지 않습니다 (그렇지만 조금이라도HScroll이 보여야 수평 스크롤바를 나중에 GuiControl, +HScroll500, MyScrollBar를 통하여 추가할 수 있습니다. 그렇지 않으면 불가능합니다).

콘트롤: 잘 쓰이지 않는 스타일과 옵션

BackgroundTrans: 투명 배경을 사용합니다. 콘트롤이 텍스트 그림 또는 그룹박스 콘드롤 뒤에 있어도 뚫고 볼 수 있습니다. 예를 들어, 그림 콘트롤 위에 보여지는 투명한 텍스트 콘트롤은 텍스트를 그림의 일부분처럼 보이게 만듭니다. GuiControl +Background를 사용하면 이 옵션을 나중에 제거할 수 있습니다. 투명 이미지에 관한 더 자세한 정보는 Picture 콘트롤의 AltSubmit 섹션을 참조하십시오. 알려진 한계: BackgroundTrans는 ListView가 들어 있는 Tab 콘트롤 안의 콘트롤에는 제대로 작동하지 않을 수 있습니다.

-Background (즉, 마이너스 배경): 표준 배경색을 사용합니다. Gui Color 명령어로 설정된 색을 사용하지 않습니다. 이것은 주로 Tab 콘트롤이 창 색이 아니라 그의 표준 색을 가지도록 만드는 데 사용됩니다. GuiControl +Background를 사용하면 나중에 이 옵션을 제거할 수 있습니다.

Border: 콘트롤 둘레에 얇은 줄 테두리를 두릅니다. 대부분의 콘트롤은 이것이 필요하지 않습니다. 왜냐하면 이미 유형-종속적인 테두리가 있기 때문입니다. 테두리를 기존의 콘트롤에 추가할 때, 콘트롤의 너비와 높이를 각각 1 픽셀씩 증가시킬 필요가 있을 수도 있습니다.

Hwnd OutputVar [v1.0.46.01+]: Gui Add와 함께 사용될 때, 이 옵션은 새로 생성된 콘트롤의 창 핸들 (HWND)을 OutputVar에 저장합니다. 예를 들어: Gui, Add, Edit, vMyEdit HwndMyEditHwnd. 함수 안에 사용될 때, MyEditHwnd은 함수 동적 변수로 취급됩니다. 콘트롤의 HWND는 종종 PostMessage, SendMessage, 그리고 DllCall에 사용됩니다. 또 직접적으로 ahk_id WinTitle로 사용되기도 합니다 (이것은 숨은 콘트롤에도 작동합니다. 심지어 DetectHiddenWindows가 꺼져(Off) 있어도 상관 없습니다). 또는 [in v1.1.04+] GuiControl과 GuiControlGet에 ControlID 매개변수로 사용됩니다. 관련하여 말씀 드리자면, 부모 창의 HWND는 Gui MyGui:+HwndOutputVar를 통하여 열람할 수 있습니다.

Theme: 이 옵션은 새로 생성된 콘트롤에 대하여 창의 현재 테마 설정을 오버라이드 하는 데 사용될 수 있습니다. 기존의 콘트롤에 사용될 때는 아무 효과도 없습니다; 그렇지만, 미래의 버전에서 이 기능은 변경될 수 있습니다. 자세한 것은 Gui +/-Theme를 참조하십시오.

(Unnamed Style): 플러스 또는 마이너스 사인 다음에 바로 십진 또는 십육진 스타일 번호를 지정하십시오. 부호가 생략되면, 플러스 사인이 있다고 간주됩니다.

(Unnamed ExStyle): 플러스나 마이너스 사인 다음에 곧바로 기호 E 그리고 십진 또는 십육진 확장 스타일 번호를 지정하십시오. 사인이 생략되면, 플러스 사인이 있다고 간주됩니다. 예를 들어, E0x200는 WS_EX_CLIENTEDGE 스타일을 추가합니다. 이 스타일은 푹 들어간 사방 테두리를 제공하므로 그림이나 기타 콘트롤에 적절합니다. 다른 확장 스타일은 (거의 사용되지 않으므로) 여기에 문서화되지 않았지만, WS_EX_CLIENTEDGE를 www.microsoft.com에서 검색해 보십시오.

창 이벤트

다음 라벨 (서브루틴)은 스크립트에 존재한다면 자동으로 GUI 창과 연관됩니다:

  • GuiClose
  • GuiEscape
  • GuiSize
  • GuiContextMenu
  • GuiDropFiles

[v1.1.20+]: 주어진 이벤트에 대하여 라벨이 존재하지 않으면, 그 이름의 함수가 대신 호출됩니다. 그 함수는 선택적으로 첫 매개변수로 GUI의 HWND를 받을 수 있습니다. 어떤 이벤트는 추가로 매개변수가 있습니다.

1 번 창을 제외하고 다른 창들에 대하여, 창의 이름이나 번호는 위에 언급된 특수 라벨에 대하여 접두사로 사용됩니다; 예를 들어, 2GuiEscape 그리고 2GuiClose는 2 번 창의 기본 라벨이 됩니다. 반면에 MyGuiGuiEscape 그리고 MyGuiGuiClose는 MyGui에 대하여 기본 라벨이 됩니다. 맞춤 접두사를 설정하려면, Gui +Label를 사용하십시오.

GuiClose: 다음 중 하나로 창이 닫힐 때 기동됩니다: 제목 바에서 X를 누름, 시스템 메뉴에서 "닫기"를 선택함, 또는 WinClose로 닫음. 이 라벨이 없을 경우, 창을 닫으면 그냥 감춥니다. 이 효과는 Gui Cancel과 같습니다. GuiClose에 응답하여 가장 흔한 조치 중 하나는 ExitApp입니다; 예를 들어:

GuiClose:
ExitApp

[v1.1.20+]: GuiClose가 함수이면, GUI는 닫히는 게 기본값입니다. 그 함수는 0 아닌 정수를 돌려주어 닫히지 못하도록 할 수 있습니다. 아래 예제에 보여주는 바와 같습니다:

GuiClose(GuiHwnd) {  ; 이 매개변수를 선언하는 것은 선택적입니다.
    MsgBox 4,, GUI를 정말 닫고 싶습니까?
    ifMsgBox No
        return true  ; true = 1
}

GuiEscape: GUI 창이 활성화 되어 있는 동안에 사용자가 Escape 키를 누를 때 기동됩니다. 라벨이 없으면, Escape를 눌러도 효과가 없습니다. 알려진 한계: 창의 첫 콘트롤이 활성화 되어 있지 않으면 (콘트롤 유형에 따라 다름), GuiEscape 라벨은 기동하지 않습니다. 이런 효과를 생산하는 다른 상황이 있을 수 있습니다.

GuiSize: 창이 크기가 바뀔때, 최대화, 최소화, 또는 복원될 때 기동됩니다. 내장 변수 A_GuiWidth와 A_GuiHeight에 창의 클라이언트 구역의 너비와 높이가 담깁니다. 클라이언트 구역에서 제목 바, 메뉴 바, 그리고 테두리를 제외합니다. 게다가, A_EventInfo 그리고 ErrorLevel는 모두 다음 숫자 중 하나를 담습니다:

0: 창이 복원되었다. 또는 테두리를 끌어서 정상적으로 크기가 변경되었다.
1: 창이 최소화되었다.
2: 창이 최대화되었다.

스크립트는 GuiSize를 사용해 사용자의 창 크기 변경에 응답하여 콘트롤의 크기와 위치를 다시 조절할 수 있습니다. tmplinshi와 toralf가 만든 AutoXYWH() 를 사용하면 더 쉽게 이것을 처리할 수 있습니다.

창이 크기가 바뀔 때 (스크립트가 바꾸어도), GuiSize는 즉시 호출되지 않을 수 있습니다. 다른 창 이벤트와 마찬가지로, 현재 쓰레드가 인터럽트가 불가능하다면, GuiSize는 쓰레드가 인터럽트가 가능해질 때까지 호출되지 않습니다. 스크립트가 방금 창의 크기를 변경했다면, 다음 예제를 따라 GuiSize가 즉시 호출되는 것을 확인하십시오:

Critical Off  ; Critical On이 사용되지 않았더라도.
Sleep -1

[v1.1.22.05+]: Gui Show는 자동으로 Sleep -1을 수행합니다. 그래서 일반적으로 그 경우에는 Sleep을 호출할 필요가 없습니다.

[v1.1.20+]: GuiSize가 함수이면, 그의 매개변수는 다음과 같습니다:

GuiSize(GuiHwnd, EventInfo, Width, Height)

GuiContextMenu: 사용자가 제목 바와 라벨을 제외하고 창을 아무데나 클릭하면 기동됩니다. 또 Apps 키나 Shift-F10 키눌림에 응답하여 기동됩니다. 대부분의 다른 GUI 라벨과 다르게, GuiContextMenu는 동시에 여러 병행 쓰레드를 가질 수 있습니다. 다음 내장 변수를 GuiContextMenu에서 사용할 수 있습니다:

  1. A_GuiControl, 안에 이벤트를 받은 콘트롤의 텍스트나 변수 이름이 들어 있습니다 (없으면 비어 있습니다).
  2. A_EventInfo: ListBox, ListView, 또는 TreeView가 문맥 메뉴의 목표일 때 (위의 A_GuiControl가 결정함), A_EventInfo는 어느 콘트롤의 항목이 목표인지 지정합니다:
    ListBox 또는 ListView: A_EventInfo에는 현재 초점이 있는 행의 번호가 담겨 있습니다 (없으면 0).
    TreeView: 우클릭에 대하여, A_EventInfo에는 클릭된 항목의 ID 번호가 담깁니다 (또는 사용자가 항목 말고 다른 곳을 클릭 했다면 0입니다). AppsKey와 Shift-F10에 대하여, A_EventInfo에는 선택된 항목의 ID 번호가 담깁니다.
  3. A_GuiX 그리고 A_GuiY, 여기에는 스크립트가 메뉴를 보여줄 X 좌표와 Y 좌표가 담깁니다 (예, Menu, MyContext, Show, %A_GuiX%, %A_GuiY%). 좌표는 창의 조상단 모서리에 상대적입니다.
  4. A_GuiEvent, 사용자가 우클릭하면 단어 RightClick이 담기고 메뉴가 Apps 키 또는 Shift-F10에 의하여 촉발되었다면 Normal이 담깁니다.

주의: Edit 그리고 MonthCal 콘트롤은 자신만의 문맥이 있기 때문에, 그 중에 하나에 우클릭하더라도 GuiContextMenu는 기동되지 않습니다.

[v1.1.20+]: GuiContextMenu가 함수이면, 그의 매개변수는 다음과 같습니다:

GuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y)

CtrlHwnd는 콘트롤이 이벤트를 받지 않았으면 비어 있습니다. IsRightClick은 A_GuiEvent가 RightClick이면 참입니다.

GuiDropFiles: 끌어 떨구기 연산의 일부로 파일/폴더가 창에 떨구어질 때마다 기동됩니다 (그러나 라벨이 이미 실행 중이면, 떨구기 이벤트는 무시됩니다). 다음 내장 변수는 GuiDropFiles 안에서 사용가능 합니다:

  1. A_GuiControl, 안에 파일이 떨구어진 콘트롤의 텍스트 또는 변수 이름이 담겨 있습니다 (없으면 비어 있음).
  2. A_EventInfo 그리고 ErrorLevel, 둘 모두 안에 떨구어진 파일의 개수가 담겨 있습니다.
  3. A_GuiX 그리고 A_GuiY, 안에 파일이 떨구어진 곳의 X좌표와 Y 좌표가 각각 담겨 있습니다 (좌표는 창의 좌상 모서리에 상대적입니다).
  4. A_GuiEvent, 안에 떨구어진 파일의 이름이 들어 있습니다. 마지막을 제외하고 각각의 파일이름은 라인피드 (`n)로 끝닙니다.

개별 파일을 추출하려면, 아래에 보여주는 바와 같이 파싱 회돌이를 사용하십시오:

; 예제 #1:
Loop, parse, A_GuiEvent, `n
{
    MsgBox, 4,, File number %A_Index% is:`n%A_LoopField%.`n`nContinue?
    IfMsgBox, No, Break
}

; 예제 #2: 첫 파일만 추출하려면, 다음 예제를 따르십시오:
Loop, parse, A_GuiEvent, `n
{
    FirstFile = %A_LoopField%
    Break
}

; 예제 #3: 알파벳 순으로 파일을 처리하려면, 다음 예제를 따르십시오:
FileList = %A_GuiEvent%
Sort, FileList
Loop, parse, FileList, `n
    MsgBox File number %A_Index% is:`n%A_LoopField%.

창에 대하여 끌어 떨구기를 잠시 끄려면, Gui -E0x10를 통하여 WS_EX_ACCEPTFILES 스타일을 제거하십시오. 나중에 다시 활성화하려면, Gui +E0x10를 사용하십시오.

[v1.1.20+]: GuiDropFiles이 함수이면, 그 매개변수는 아래 예제에 보여주는 바와 같습니다. CtrlHwnd는 파일이 GUI 자체에 떨구어지면 비어 있습니다. FileArray는파일이름의 배열 (객체)입니다. 여기에서 FileArray[1]은 첫 번째 파일이고 FileArray.MaxIndex()는 파일의 개수를 돌려줍니다. for-회돌이를 사용하면 파일을 반복할 수 있습니다:

GuiDropFiles(GuiHwnd, FileArray, CtrlHwnd, X, Y) {
    for i, file in FileArray
        MsgBox File %i% is:`n%file%
}

다른 이벤트를 탐지하고 응답하기: 다른 유형의 GUI 이벤트는 OnMessage()를 통하여 탐지하고 처리할 수 있습니다. 예를 들어, 사용자가 마우스를 창의 특정 콘트롤에 올려 놓을 때마다 스크립트는 문맥-감지 도움말을 툴팁을 통하여 보여줄 수 있습니다. 이것은 GUI ToolTip 예제에서 시연합니다.

여러 GUI 창 만들기

기본 창 말고 다른 창을 처리하려면, 그의 이름 또는 번호 (또는 v1.1.03+이라면, 그의 HWND) 그리고 다음에 쌍점을 두고 부-명령어를 다음 예제와 같이 포함하십시오:

Gui, MyGui:Add, Text,, Text for about-box.
Gui, MyGui:Show

Gui MyGui:Default을 사용하면 위의 "MyGui:" 접두사가 필요 없습니다. 게다가, 이 접두사는 GUI 쓰레드가 그 쓰레드를 기동한 같은 창에 작동하면 필요가 없습니다.

[v1.1.03+]: Gui 이름은 반드시 변수 이름과 같은 규칙을 지겨야 합니다. 1과 99 사이의 숫자가 아닌 숫자 또는 두 자리 문자보다 더 긴 숫자는 (예를 들어 0x01) 반드시 기존의 Gui의 HWND이어야 합니다. 그렇지 않으면 명령어는 실패합니다. 취급할 수 있는 창의 개수는 운영 체제의 자원에만 제한됩니다.

[v1.1.04+]: 이름 없는 GUI 창의 번호는 Gui, New를 사용하여 만들 수 있습니다.

GUI 이벤트, 쓰레드, 그리고 서브루틴

GUI 쓰레드는 GUI 행위의 결과로 기동된 쓰레드로 정의됩니다. GUI 행위에는 GUI 창의 메뉴 바로부터 항목을 선택하는 것, 또는 그의 g-labels중 하나를 (버튼을 눌러서) 촉발시키는 일이 포함됩니다.

GUI 쓰레드의 기본 창 이름은 그 쓰레드를 기동한 창의 이름입니다. 비-GUI 쓰레드는 1을 기본 값으로 사용합니다.

GUI 쓰레드가 기동할 때마다, 그 쓰레드의 마지막 발견 창은 그 GUI 창 자체로 시작합니다. 이 덕분에 창과 콘트롤에 대한 명령어들이 -- 예를 들어 WinMove, WinHide, WinSet, WinSetTitle, 그리고 ControlGetFocus 명령어가 -- GUI 창 자신에게 작동할 때는 WinTitle과 WinText를 생략할 수 있습니다 (심지어 숨어 있어도 작동합니다).

앞에서 클릭해서 그의 g-label이 이미 실행 중인 동안에 콘트롤을 클릭하면 아무 효과도 없고 그 이벤트는 폐기됩니다. 이를 피하려면, Critical을 서브루틴의 첫 줄에 사용하십시오 (그렇지만, 이렇게 하면 핫키 누름과 같이 다른 쓰레드도 버퍼처리 또는 지연될 것입니다.).

내장 변수 A_Gui와 A_GuiControl 안에는 현재 쓰레드를 기동한 창 이름과 콘트롤 ID가 담겨 있습니다. 더 자세한 것은 A_Gui 그리고 A_GuiControl를 참조하십시오.

여러 이벤트가 같은 서브루틴을 수행하도록 만들려면, 라벨들을 연속적으로 서브루틴 위에 지정하십시오. 예를 들어:

GuiEscape:
GuiClose:
ButtonCancel:
ExitApp  ; 위의 모든 라벨은 이것을 수행합니다.

모든 GUI 쓰레드는 SendMode와 같은 설정에 대하여 기본 값을 가지고 새롭게 시작합니다. 이 기본 값은 자동-실행 섹션에서 변경할 수 있습니다.

키보드 항해

GUI 창은 탭 키로 항해할 수 있습니다. 탭 키는 초점을 다음 입력-가능 콘트롤로 이동시킵니다l (Tabstop 스타일이 제거된 콘트롤은 건너 뜁니다). 항해의 순서는 콘트롤이 원래 추가된 순서로 결정됩니다. 창이 처음 보이면, Tabstop 스타일을 가지고 있는 첫 번째 입력-가능 콘트롤이 키보드 초점을 가집니다 (대부분의 콘트롤 유형은 기본으로 탭스탑 스타일을 가지고 있습니다).

어떤 콘트롤은 키보드 단축키를 만드는 앰퍼센드가 포함되어 있을 수 있습니다 (&). 이 단축 키는 콘트롤의 텍스트에 밑줄 문자로 보여집니다 (시스템 설정에 따라 다름). 사용자는 ALT 키를 누른 채로 상응하는 문자를 타자하여 그 단축키를 활성화 합니다. 버튼, 체크박스, 그리고 라디오 버튼에 대하여, 단축키를 누르는 것은 콘트롤을 클릭하는 것과 동일합니다. GroupBoxes와 Text controls에 대하여, 단축키를 누르면 키보드 초점이 첫 번째 입력-가능 tabstop 콘트롤로 점프합니다. 그렇지만 여러 콘트롤이 같은 단축키를 가지고 있는 경우, 단축 키를 누르면 같은 단축키를 가지고 있는 모든 콘트롤 중에 하나를 골라 무작위로 점프합니다.

앰퍼센드를 글자 그대로 위에 언급한 콘트롤 유형에 보여주려면, 두 개의 앰퍼센드를 연속으로 다음 예제와 같이 지정하십시오: Save && Exit.

창의 모습

아이콘에 대하여 GUI 창은 창이 만들어지는 순간 효과가 있던 트레이 아이콘을 사용합니다. 그래서, 다른 아이콘을 가지려면, 트레이 아이콘을 바꾸고 나서 창을 만드십시오. 예를 들어: Menu, Tray, Icon, MyIcon.ico. 또 작은 아이콘 말고 큰 아이콘을 가지는 것도 가능합니다 (큰 아이콘은 알트-탭 태스크 전환기에 보여집니다.). 이것은 DllCall과 SendMessage를 통하여 달성할 수 있습니다; 예를 들어:

hIcon32 := DllCall("LoadImage", uint, 0
    , str, "My Icon.ico"  ; 아이콘 파일 (이 파일에 여러 아이콘이 들어 있을 수 있습니다).
    , uint, 1  ; 이미지의 종류: IMAGE_ICON
    , int, 32, int, 32  ; 이미지의 원하는 너비와 높이 (LoadImage가 어느 아이콘이 제일 좋은지 결정하는 데 도움이 됩니다).
    , uint, 0x10)  ; Flags: LR_LOADFROMFILE
Gui +LastFound
SendMessage, 0x80, 1, hIcon32  ; 0x80는 WM_SETICON입니다; 그리고 1은 ICON_BIG이는 뜻입니다 ( 0이면 ICON_SMALL을 의미함).
Gui Show

OS의 제한 때문에, 비-기본 텍스트 컬러가 지정된 체크박스, 라디오 버튼, 그리고 그룹박스는 Windows XP 이상에서 고전 테마의 겉모습을 가집니다.

관련 주제: 창의 여백.

총평

GuiControl과 GuiControlGet을 사용하면 GUI 창의 콘트롤을 개별적으로 처리할 수 있습니다.

각 GUI 창은 최대 11,000 개의 콘트롤을 가질 수 있습니다. 그렇지만, 5000 개가 넘는 콘트롤을 만들 때 조심하십시오. 왜냐하면 어떤 콘트롤 유형에 대해서는 시스템의 안정성에 문제가 생길 수 있기 때문입니다.

스크립트 어디서든 GUI 명령어를 사용하면 자동으로 영속적이 됩니다 (그 GUI 명령어가 실제로 실행되지 않더라도 상관 없습니다). 또 단일 실체이기도 합니다. 단, #SingleInstance 지시어를 사용해 오버라이드 한 경우는 예외입니다.

관련 항목

GuiControl, GuiControlGet, Menu, 콘트롤 유형, ListView, TreeView, Control, ControlGet, SplashImage, MsgBox, FileSelectFile, FileSelectFolder

예제

; 예제: SplashTextOn과 비슷한 효과를 얻습니다:

Gui, +AlwaysOnTop +Disabled -SysMenu +Owner  ; +Owner를 사용하면 태스크 바 버튼이 보이지 않습니다.
Gui, Add, Text,, Some text to display.
Gui, Show, NoActivate, Title of Window  ; NoActivate는 현재 활성 창을 비활성화하지 못하도록 합니다.

; 예제: 이름과 성을 물어 보는 간단한 입력-박스:

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, Add, Tab2,, First Tab|Second Tab|Third Tab  ; Tab2 vs. Tab는 v1.0.47.05를 요구합니다.
Gui, Add, Checkbox, vMyCheckbox, Sample checkbox
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, Sample radio1
Gui, Add, Radio,, Sample radio2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5  ; r5는 높이가 5 행 이라는 뜻입니다.
Gui, Tab  ; 즉, 이어서 추가되는 콘트롤들은 탭 콘트롤에 속하지 않습니다.
Gui, Add, Button, default xm, OK  ; xm은 버튼을 좌하 모서리에 배치합니다.
Gui, Show
return

ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit  ; 각 콘트롤의 내용을 그의 연관 변수에 저장합니다.
MsgBox You entered:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp

; 예제: 디렉토리에 있는 파일을 담고 있는 ListBox:

Gui, Add, Text,, Pick a file to launch from the list below.`nTo cancel, press ESCAPE or close this window.
Gui, Add, ListBox, vMyListBox gMyListBox w640 r10
Gui, Add, Button, Default, OK
Loop, C:\*.*  ; 이 폴더와 와일드카드 패턴을 여러분의 기호에 맞게 바꾸십시오.
{
    GuiControl,, MyListBox, %A_LoopFileFullPath%
}
Gui, Show
return

MyListBox:
if A_GuiEvent <> DoubleClick
    return
; 그렇지 않으면, 사용자가 리스트 항목을 더블클릭한 것입니다. 그래서 OK를 클릭한 것과 똑같이 취급합니다.
; 그래서 다음 라벨로 빠져 나갑니다.
ButtonOK:
GuiControlGet, MyListBox  ; ListBox의 현재 선택을 열람합니다.
MsgBox, 4,, Would you like to launch the file or document below?`n`n%MyListBox%
IfMsgBox, No
    return
; 그렇지 않으면, 기동을 시도합니다:
Run, %MyListBox%,, UseErrorLevel
if ErrorLevel = ERROR
    MsgBox Could not launch the specified file.  Perhaps it is not associated with anything.
return

GuiClose:
GuiEscape:
ExitApp

; 예제: 사용자가 마우스를 특정 콘트롤에 올려 놓을 때마다 (툴팁을 통하여) 문맥-감지 도움말을 보여줍니다:

Gui, Add, Edit, vMyEdit
MyEdit_TT := "This is a tooltip for the control whose variable is MyEdit."
Gui, Add, DropDownList, vMyDDL, Red|Green|Blue
MyDDL_TT := "Choose a color from the drop-down list."
Gui, Add, Checkbox, vMyCheck, This control has no tooltip.
Gui, Show
OnMessage(0x200, "WM_MOUSEMOVE")
return

WM_MOUSEMOVE()
{
    static CurrControl, PrevControl, _TT  ; _TT는 아래의 ToolTip 명령어에 사용하기 위해 빈 상태를 유지합니다.
    CurrControl := A_GuiControl
    If (CurrControl <> PrevControl and not InStr(CurrControl, " "))
    {
        ToolTip  ; 이전의 툴팁을 모두 끕니다.
        SetTimer, DisplayToolTip, 1000
        PrevControl := CurrControl
    }
    return

    DisplayToolTip:
    SetTimer, DisplayToolTip, Off
    ToolTip % %CurrControl%_TT  ; 앞의 퍼센트 사인은 표현식을 사용하라고 알립니다.
    SetTimer, RemoveToolTip, 3000
    return

    RemoveToolTip:
    SetTimer, RemoveToolTip, Off
    ToolTip
    return
}

GuiClose:
ExitApp

; 예제: 투명 창을 통한 화면-위 디스플레이 (OSD):

CustomColor = EEAA99  ; RGB 색 가능 (아래에서 투명하게 만들 것입니다).
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow  ; +ToolWindow는 태스크바 버튼과 알트-탭 메뉴 항목을 회피합니다.
Gui, Color, %CustomColor%
Gui, Font, s32  ; 커다란 글꼴 크기를 설정합니다 (32-포인트).
Gui, Add, Text, vMyText cLime, XXXXX YYYYY  ; XX & YY는 자동-크기 조절 창으로 기여합니다.
; 이 색을 가진 모든 픽셀을 투명하게 만들고 텍스트 자체는 반투명하게 만듭니다 (150):
WinSet, TransColor, %CustomColor% 150
SetTimer, UpdateOSD, 200
Gosub, UpdateOSD  ; 타이머를 기다리지 않고 먼저 즉시 갱신합니다.
Gui, Show, x0 y400 NoActivate  ; NoActivate는 현재 활성 창을 비활성화하지 못하도록 막습니다.
return

UpdateOSD:
MouseGetPos, MouseX, MouseY
GuiControl,, MyText, X%MouseX%, Y%MouseY%
return

; 예제: 배경 이미지 위에 중첩된 움직이는 진도 바.

Gui, Color, White
Gui, Add, Picture, x0 y0 h350 w450, %A_WinDir%\system32\ntimage.gif
Gui, Add, Button, Default xp+20 yp+250, Start the Bar Moving
Gui, Add, Progress, vMyProgress w416
Gui, Add, Text, vMyText wp  ; wp는 "이전의 너비를 사용하라"는 뜻입니다.
Gui, Show
return

ButtonStartTheBarMoving:
Loop, %A_WinDir%\*.*
{
    if A_Index > 100
        break
    GuiControl,, MyProgress, %A_Index%
    GuiControl,, MyText, %A_LoopFileName%
    Sleep 50
}
GuiControl,, MyText, Bar finished.
return

GuiClose:
ExitApp

; 예제: 간단한 이미지 뷰어:

Gui, +Resize
Gui, Add, Button, default, &Load New Image
Gui, Add, Radio, ym+5 x+10 vRadio checked, Load &actual size
Gui, Add, Radio, ym+5 x+10, Load to &fit screen
Gui, Add, Pic, xm vPic
Gui, Show
return

ButtonLoadNewImage:
FileSelectFile, file,,, Select an image:, Images (*.gif; *.jpg; *.bmp; *.png; *.tif; *.ico; *.cur; *.ani; *.exe; *.dll)
if file =
    return
Gui, Submit, NoHide ; 라디오 버튼의 값을 저장합니다.
if Radio = 1  ; 이미지를 그의 실제 크기로 보여줍니다.
{
    Width = 0
    Height = 0
}
else ; Second radio is selected: 이미지를 화면 크기에 맞게 조절합니다.
{
    Width := A_ScreenWidth - 28  ; 마이너스 28 만큼 테투리와 여백 안에  여유가 있습니다.
    Height = -1  ; "화면 비율 유지"가 가장 좋아 보입니다.
}
GuiControl,, Pic, *w%width% *h%height% %file%  ; 이미지를 적재합니다.
Gui, Show, xCenter y0 AutoSize, %file%  ; 그림 크기에 맞게 창을 조절합니다.
return

GuiClose:
ExitApp

; 예제: 메뉴 바가 있는 간단한 텍스트 편집기.

; 메뉴 바를 위하여 부-메뉴를 생성합니다:
Menu, FileMenu, Add, &New, FileNew
Menu, FileMenu, Add, &Open, FileOpen
Menu, FileMenu, Add, &Save, FileSave
Menu, FileMenu, Add, Save &As, FileSaveAs
Menu, FileMenu, Add  ; Separator line.
Menu, FileMenu, Add, E&xit, FileExit
Menu, HelpMenu, Add, &About, HelpAbout

; 부-메뉴를 메뉴 바에 부착해 메뉴 바를 생성합니다:
Menu, MyMenuBar, Add, &File, :FileMenu
Menu, MyMenuBar, Add, &Help, :HelpMenu

; 메뉴 바를 창에 부착합니다:
Gui, Menu, MyMenuBar

; 메인 편집 콘트롤을 생성하고 그 창을 보여줍니다:
Gui, +Resize  ; 창을 크기가 변경가능하게 만듭니다.
Gui, Add, Edit, vMainEdit WantTab W600 R20
Gui, Show,, Untitled
CurrentFileName =  ; 현재 파일이 없음을 나타냅니다.
return

FileNew:
GuiControl,, MainEdit  ; 편집 콘트들을 비웁니다.
return

FileOpen:
Gui +OwnDialogs  ; 사용자가 FileSelectFile 대화상자를 포기하도록 만들고 나서 메인 창으로 되돌아 옵니다.
FileSelectFile, SelectedFileName, 3,, Open File, Text Documents (*.txt)
if SelectedFileName =  ; No file selected.
    return
Gosub FileRead
return

FileRead:  ; 호출자는 변수 SelectedFileName을 우리 대신에 설정합니다.
FileRead, MainEdit, %SelectedFileName%  ; 파일의 내용을 변수 안으로 읽어 들입니다.
if ErrorLevel
{
    MsgBox Could not open "%SelectedFileName%".
    return
}
GuiControl,, MainEdit, %MainEdit%  ; 텍스트를 콘트롤 안에 넣습니다.
CurrentFileName = %SelectedFileName%
Gui, Show,, %CurrentFileName%   ; 파일 이름을 제목 바에 보여줍니다.
return

FileSave:
if CurrentFileName =   ; 아직 파일이름이 선택되지 않았습니다. 그래서 대신 Save-As를 수행합니다.
    Goto FileSaveAs
Gosub SaveCurrentFile
return

FileSaveAs:
Gui +OwnDialogs  ; 사용자가 FileSelectFile 대화상자를 포기하도록 만들고 메인 창으로 돌아옵니다.
FileSelectFile, SelectedFileName, S16,, Save File, Text Documents (*.txt)
if SelectedFileName =  ; 파일이 선택되지 않았습니다.
    return
CurrentFileName = %SelectedFileName%
Gosub SaveCurrentFile
return

SaveCurrentFile:  ; 호출자는 CurrentFileName이 비어 있지 않음을 확인합니다.
IfExist %CurrentFileName%
{
    FileDelete %CurrentFileName%
    if ErrorLevel
    {
        MsgBox The attempt to overwrite "%CurrentFileName%" failed.
        return
    }
}
GuiControlGet, MainEdit  ; 편집 콘트롤의 내용을 열람합니다.
FileAppend, %MainEdit%, %CurrentFileName%  ; 내용을 파일에 저장합니다.
; 성공하면, 파일 이름을 제목 바에 보여줍니다 (FileSaveAs에 의하여 호출되는 경우):
Gui, Show,, %CurrentFileName%
return

HelpAbout:
Gui, About:+owner1  ; 메인 창을 (Gui #1) "about box"의 소유자로 만듭니다.
Gui +Disabled  ; 메인 창을 비활성화 합니다.
Gui, About:Add, Text,, Text for about box.
Gui, About:Add, Button, Default, OK
Gui, About:Show
return

AboutButtonOK:  ; 이 섹션은 위의 "about box"가 사용합니다.
AboutGuiClose:
AboutGuiEscape:
Gui, 1:-Disabled  ; 메인 창을 다시 활성화 합니다 (다음 단계로 나아가기 전에 반드시 활성화 해야 함).
Gui Destroy  ; about box를 파괴합니다.
return

GuiDropFiles:  ; 끌어 & 떨구기를 지원합니다.
Loop, Parse, A_GuiEvent, `n
{
    SelectedFileName = %A_LoopField%  ; 첫 번째 파일만 얻습니다 (여러 파일이 있을 경우에).
    break
}
Gosub FileRead
return

GuiSize:
if ErrorLevel = 1  ; 창은 최소화되어 있습니다. 아무 필요도 없습니다.
    return
; 그렇지 않으면, 창은 크기가 변경되거나 최대화됩니다. 편집 콘트롤의 크기를을 그에 맞게 조절합니다.
NewWidth := A_GuiWidth - 20
NewHeight := A_GuiHeight - 20
GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight%
return

FileExit:     ; 사용자가 File 메뉴에서 "Exit"을 선택했습니다.
GuiClose:  ; 사용자가 창을 닫았습니다.
ExitApp


GuiControl

GUI 창 안의 콘트롤을 다양하게 변경합니다.

GuiControl, Sub-command, ControlID [, Param3]

매개변수

Sub-command

아래 리스트 참조.

ControlID

목표 콘트롤에 연관 변수가 있다면, 그 변수의 이름을 ControlID로 지정하십시오 (이 방법은 다음에 기술하는 방법보다 우선 순위가 높습니다). 이런 이유 때문에, 보통 변수를 콘트롤에 할당하는 것이 가장 좋습니다. 나중에 그 콘트롤에 GuiControl 또는 GuiControlGet을 통하여 접근합니다. 그 콘트롤이 ((GroupBox나 Text 같이) 입력-가능 유형이 아닐지라도 접근할 수 있습니다.

그렇지만, ControlID는 ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때 부합 행위는 SetTitleMatchMode로 결정됩니다. 주의: 그림 콘트롤의 파일 이름은 (그 콘트롤이 생성되는 순간에 지정된 대로) 그의 ControlID로 사용이 가능합니다.

[v1.1.04+]: ControlID는 콘트롤의 HWND가 될 수 있습니다.

콘트롤이 기본 GUI 위에 있지 않으면, 그 GUI의 이름도 역시 지정해야 합니다 -- 단, [v1.1.20+]에서는 ControlID이 HWND입니다. 각 HWND가 유일하기 때문입니다. 자세한 것은 논평을 참조하십시오.

Param3

이 매개변수는 생략합니다. 단, 아래의 부-명령어 리스트에서 고지한 경우는 예외입니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 지정된 창/콘트롤이 존재하지 않거나 기타 어떤 문제 때문에 명령어가 작동하지 못했다면 1이 설정됩니다. 그렇지 않으면 0이 설정됩니다.

부-명령어

(Blank): Sub-command를 비워두면 Param3을 통하여 새로운 내용을 콘트롤에 넣을 수 있습니다. 구체적으로 말해:

Picture: Param3은 적재할 새 이미지의 파일이름이어야 합니다 (지원되는 파일 유형은 Gui Picture를 참조하십시오). 바로 그 파일이름 앞에 다음 옵션을 지정할 수 있습니다: *wN (너비 N), *hN (높이 N), 그리고 *IconN (DLL 또는 EXE 파일 안에서 아이콘 그룹 번호 N). 다음 예제에서, 두 번째 아이콘 그룹의 기본 아이콘이 너비 100 그리고 높이 자동으로 "화면 비율 유지"를 통하여 적재됩니다: GuiControl,, MyPic, *icon2 *w100 *h-1 C:\My Application.exe. *w0 *h0을 지정하면 그 이미지의 실제 너비와 높이를 사용할 수 있습니다. *w와 *h를 생략하면, 이미지는 콘트롤의 현재 크기에 맞게 조절됩니다. 여러-아이콘 .ICO 파일로부터 적재할 때, 너비와 높이를 지정해도 어느 아이콘을 적재할지 결정됩니다. 주의: 마지막 옵션과 파일이름 사이에 탭이나 스페이스는 하나만 사용하십시오; 나머지 스페이스와 탭은 파일이름의 일부로 간주됩니다.

Text/Button/GroupBox/StatusBar: Param3에 콘트롤의 새 텍스트를 지정하십시오. 콘트롤은 자동으로 확대되지 않기 때문에, 콘트롤의 크기를 키울 필요가 있다면 GuiControl, Move, MyText, W300를 사용하십시오. StatusBar에 대하여, 이렇게 하면 텍스트에서 오직 앞 부분만 설정됩니다 (더 유연하려면 SB_SetText()를 사용하십시오).

Edit: Param3 안에서 앞에 캐리지 리턴이 없는 (`r) 라인피드는 (`n) 자동으로 CR+LF (`r`n)로 변환되어서 올바르게 표시되도록 만듭니다. 그렇지만, 이것은 보통 신경쓸 필요가 없습니다. Gui Submit와 GuiControlGet OutputVar 명령어가 CR+LF를 LF (`n)로 교체해서 자동으로 이 변환을 환원하기 때문입니다.

Hotkey: Param3을 비우면 콘트롤을 청소할 수 있습니다. 즉 수식키와 키 이름을 비울 수 있습니다. 예를 들어: ^!c, ^Numpad1, +Home. 유일하게 지원되는 수식키는 ^ (Control), ! (Alt), 그리고 + (Shift)입니다. 사용 가능한 키 이름은 키 목록을 참조하십시오.

Checkbox: Param3가 0이면 버튼의 체크표식을 지울 수 있습니다. 1이면 체크 표식을 합니다. 또는 -1이면 회색 체크가 표식됩니다. 그렇지 않으면, Param3은 콘트롤의 새 캡션/텍스트로 간주됩니다. 이 행위를 오버라이드 하는 방법은 아래의 Text를 참조하십시오.

Radio: 위의 Checkbox와 동일합니다. 그렇지만, 라디오 버튼이 체크되어 (켜져) 있고 그리고 여러-라디오 그룹의 멤버라면, 그 그룹에서 다른 라디오 버튼은 자동으로 체크 표식이 해제됩니다. 변수가 하나만 있는 라디오 그룹 안에서 새 버튼에 체크 표시를 하려면, ControlID에 버튼의 이름/텍스트를 지정하십시오. 단, 그 변수가 직접적으로 연관되어 있는 버튼이 아니어야 합니다.

DateTime/MonthCal: Param3에 YYYYMMDDHH24MISS 형식으로 날짜-시간 도장을 지정하십시오. %A_Now%를 지정하면 현재 날짜와 시간을 사용할 수 있습니다 (오늘). DateTime 콘트롤에 대하여, Param3을 생략하면 (만약 이 능력을 가지고 생성되었을 경우) 콘트롤에 날짜/시간이 선택되지 않을 수도 있습니다. MonthCal 콘트롤에 대하여, 콘트롤이 다중-선택이 된다면 범위를 지정할 수도 있습니다.

UpDown/Slider/Progress: Param3은 콘트롤의 새 위치가 되어야 합니다. Param3의 첫 문자가 플러스 사인이면, 그 숫자는 현재 위치로부터의 오프셋(상대거리)로 간주됩니다. 예를 들어, +10이면 위치가 10만큼 증가하고 +-10이면 (플러스 마이너스 10) 위치가 10만큼 감소합니다. 새 위치가 콘트롤의 범위 밖이면, 그 콘트롤은 일반적으로 그 근처의 유효한 값이 설정됩니다.

Tab/DropDownList/ComboBox/ListBox: Param3에는 콘트롤의 리스트 끝에 추가될 엔트리 리스트가 파이프 문자로 구분되어 들어 있어야 합니다. 대신에 그 리스트를 교체하려면 (덮어쓰려면) 파이프 문자를 첫 문자로 포함시키십시오 (예, |Red|Green|Blue). 콘트롤을 비우려면, 파이프 문자만 지정하십시오 (|). 미리-선택된 엔트리 중 하나를 얻으려면, 두 개의 파이프를 그 다음에 포함시키십시오 (예, Red|Green||Blue). 필드 사이의 가름자는 파이프 말고 다른 것으로 바꿀 수 있습니다. 예를 들어, Gui +Delimiter`n이면 라인피드로 바뀌고 Gui +DelimiterTab이면 탭으로 바뀝니다 (`t).

Tab controls: 위의 문단에서 기술한 행위 이외에도, 탭의 부-콘트롤은 여전히 자신의 원래의 탭 번호와 연관되어 있습니다; 즉, 절대로 탭의 실제 표시-이름과 연관되지 않습니다. 이런 이유로, 탭의 이름을 바꾸거나 이동을 해도 부-콘트롤이 속한 탭 번호는 바뀌지 않습니다. 예를 들어, 세 개의 탭 "Red|Green|Blue"가 있고 GuiControl,, MyTab, |Red|Blue를 수단으로 두 번째 탭을 제거하면, 원래 Green과 연관되어 있던 부-명령어는 이제 Blue와 연관됩니다. 이런 행위 때문에, 보통 끝에 있는 탭만 제거해야 합니다. 이런 식으로 제거된 탭들은 나중에 다시 추가할 수 있습니다. 그 때 원래 콘트롤 세트를 다시 요구할 것입니다.

ListView 그리고 TreeView: 이것들은 Sub-command가 비어 있을 때 지원되지 않습니다. 대신에, 내장 ListView 함수와 TreeView 함수를 사용하십시오.

GuiControl, Text: 위와 동일하게 행위합니다. 단, 다음은 예외입니다:
Checkbox/Radio: Param3은 새 텍스트/캡션으로 간주됩니다. -1, 0, 또는 1일지라도 마찬가지입니다.
DateTime: Param3은 콘트롤이 보여주는 새 날짜/시간 형식으로 간주됩니다. Param3을 생략하면, 맞춤 포맷은 모두 제거되고 짧은-날짜 형식이 효력을 발휘합니다.
ComboBox: Param3은 ComboBox의 Edit 콘트롤 안에 직접적으로 넣을 텍스트로 간주됩니다.

GuiControl, Move: 콘트롤을 이동하거나 크기를 바꿉니다. 다음 옵션 기호 중 하나 이상을 Param3에 지정하십시오: X (GUI 창의 클라이언트 구역에 상대적인 x-좌표, 클라이언트 구역에서 제목 바, 메뉴 바, 그리고 테두리는 제외됩니다); Y (y-좌표), W (Width), H (Height). (각 숫자는 십육진수가 아니라 십진수로 지정하십시오.) 예를 들어:

GuiControl, Move, MyEdit, x10 y20 w200 h100
GuiControl, Move, MyEdit, % "x" VarX+10 "y" VarY+5 "w" VarW*2 "h" VarH*1.5 ; "% " 접두 심볼을 통하여 표현식을 사용합니다.

GuiControl, MoveDraw: (위의)"Move"와 같습니다. 단, 콘트롤이 점유하고 있는 GUI 창을 다시 칠하기도 합니다. 이 때문에 반복적으로 빨리 호출하면 원하지 않는 깜빡거림이 발생할 수 있지만, GroupBoxes와 같은 콘트룰 유형에 그림 잔상이 남는 문제가 해결됩니다. v1.0.48.04+에서, 마지막 매개변수를 생략하면 이동할 필요 없이 다시 그릴 수 있습니다.

GuiControl, Focus: 키보드 초점을 콘트롤에 설정합니다. 효과가 있으려면, 창은 일반적으로 최소화되어 있거나 숨어 있으면 안됩니다.

GuiControl, Enable / Disable: 콘트롤을 활성화 하거나 불능으로 만듭니다 (회색 처리). 탭 콘트롤에 대하여, 이는 또한 탭의 모든 하위-콘트롤도 켜고 끕니다. 그렇지만, GuiControl Disable을 통하여 명시적으로 꺼진 하위-콘트롤은 그 설정을 기억합니다. 그래서 그의 Tab 콘트롤이 다시 활성화 되어도 여전히 불능 상태로 있습니다. 단어 Disable 또는 Enable 다음에 즉시 선택적으로 0 또는 1이 따라올 수 있습니다. 0이면 반대로 뒤집어지는 효과가 있습니다. 예를 들어, Enable 그리고 Enable%VarContainingOne%이면 둘 모두 콘트롤을 활성화 하지만, Enable%VarContainingZero%는 콘트롤을 불능화 시킵니다.

GuiControl, Hide / Show: 콘트롤을 보여주거나 감춥니다. Tab 콘트롤에 대하여, 이것은 또 탭의 모든 하위 콘트롤도 보여주거나 감춥니다. 또 콘트롤의 단축 키가 (밑줄 기호) 작동하지 못하도록 막고 싶다면, GuiControl Disable를 통하여 그 콘트롤을 끄십시오. 단어 Hide 또는 Show는 다음에 바로 선택적으로 0 또는 1이 따라올 수 있습니다. 0이면 반대로 뒤집어지는 효과가 있습니다. 예를 들어, Show 그리고 Show%VarContainingOne%는 둘 다 콘트롤을 보여주지만, Show%VarContainingZero%는 콘트롤을 감춥니다.

GuiControl, Delete (아직 구현되지 않음): 이 부-명령어는 아직 존재하지 않습니다. 우회책으로서, (위의) Hide 또는 Disable을 사용하거나 또는 Gui Destroy를 통하여 전체 창을 파괴하고 다시 생성하십시오.

GuiControl, Choose, ControlID, N: ListBox, DropDownList, ComboBox, 또는 Tab 콘트롤 안의 선택이 N번 째 엔트리가 되도록 설정합니다. N은 1이면 첫 엔트리, 2이면 두 번째 엔트리, 등등이 되어야 합니다. N이 정수가 아니면, 대신에 아래에 기술한 ChooseString 방법이 사용됩니다. [v1.1.06+]: N이 0이면, ListBox, DropDownList 또는 ComboBox의 현재 선택이 제거됩니다.

Control Choose와 다르게, 이 부-명령어는 콘트롤에 연관된 어떤 g-label도 촉발시키지 않습니다. 단, N 앞에 파이프 문자가 있는 경우는 예외입니다 (그렇다고 하도라도, g-label은 새 선택이 이전 선택과 다를 경우에만 촉발됩니다. 적어도 Tab 콘트롤은 그렇습니다.). 예를 들어: GuiControl, Choose, MyListBox, |3.

또 종료 이벤트를 일어나도록 만들려면 (ListBox의 경우 더블 클릭), 앞에 파이프를 하나 대신에 두 개 포함하십시오 (이것은 Tab 콘트롤에는 지원되지 않습니다).

다중-선택 ListBox에서 모든 항목을 선택하거나 해제하려면, 다음 예제를 따르십시오:

Gui +LastFound  ; 아래에서 WinTitle을 지정할 필요가 없습니다.
PostMessage, 0x185, 1, -1, ListBox1  ; 모든 항목을 선택합니다. 0x185가 LB_SETSEL입니다.
PostMessage, 0x185, 0, -1, ListBox1  ; 모든 항목을 선택 해제합니다.
GuiControl, Choose, ListBox1, 0  ; 모든 항목을 선택 해제합니다 (v1.1.06+ 필요).

GuiControl, ChooseString, ControlID, String: ListBox, DropDownList, ComboBox, 또는 Tab 콘트롤에서 앞쪽 부분이 String에 부합하는 엔트리가 선택이 되도록 설정합니다. 검색은 대소문자를 구분하지 않습니다. 예를 들어, 콘트롤 안에 "UNIX Text" 항목이 담겨 있을 경우, 단어 unix (소문자)만 지정해도 충분히 선택할 수 있습니다. 파이프와 이중-파이프 접두 기호도 지원합니다 (자세한 것은 위의 "Choose"를 참조하십시오).

GuiControl, Font: 콘트롤의 글꼴을 모양, 크기, 색 그리고 현재 효과가 있는 스타일에 대하여 변경합니다. 예를 들어:

Gui, Font, s18 cRed Bold, Verdana  ; 원한다면, 이와 같은 줄을 사용하여 창에 새로운 기본 글꼴을 설정할 수 있습니다.
GuiControl, Font, MyEdit  ; 위의 글꼴을 콘트롤에 적용합니다.

GuiControl, +/-Option1 +/-Option2 ...: 다양한 콘트롤-종속적 또는 일반적 옵션과 스타일을 추가하거나 제거합니다.

다음 예제에서, AltSubmit 옵션은 활성화되지만 콘트롤의 g-label은 제거됩니다:

GuiControl,  +AltSubmit -g, MyListBox

다음 예제에서, OK 버튼에 새 기본 버튼이 주어집니다:

GuiControl, +Default, OK

스타일 그리고 확장 스타일도 인식하지만, 그 중 어떤 것은 콘트롤이 생성된 후에 적용하거나 제거할 수 없습니다. ErrorLevel은 지정된 변경이 적어도 하나라도 성공하면 0이 설정됩니다. 그렇지 않으면, 1로 설정되어 아무 변경도 적용할 수 없었음을 알려줍니다. 변경이 성공적으로 적용되었다 할지라도, 콘트롤은 그 변경을 무시하기로 결정할 수도 있습니다.

[v1.1.20+]: 콘트롤의 이벤트를 처리하기 위해 함수 객체를 설정하려면, Param3은 반드시 다음 두 예 중 하나와 같이하나의 변수 참조가 되어야 합니다. 함수 객체를 돌려주는 다른 표현식은 현재 지원하지 않습니다.

GuiControl +g, ControlID, %FuncObj%
GuiControl +g, ControlID, % FuncObj

논평

기본 창이 아닌 창을 처리하려면 (아래 참조), 그의 이름이나 번호를 지정하고 다음에 쌍점 그리고 부-명령어를 다음 예제와 같이 지정하십시오:

GuiControl, MyGui:Show, MyButton
GuiControl, MyGui:, MyListBox, Item1|Item2

변수 하나가 여러 GUI 창에 사용될 수 있기 때문에 ControlID가 콘트롤의 연관 배열이라고 할지라도 꼭 이렇게 해야 합니다. [v1.1.20+]에서는 GUI 이름을 생략할 수 있습니다. ControlID가 콘크롤의 HWND일지라도 마찬가지입니다.

GUI 쓰레드는 GUI 행위의 결과로 기동된 쓰레드로 정의됩니다. GUI 행위로는 GUI 창의 메뉴 바로부터 항목을 선택하는 것, 또는 (버튼을 눌러서) 그의 g-labels중 하나를 촉발시키는 것이 포함됩니다.

GUI 쓰레드의 기본 창 이름은 그 쓰레드를 기동한 창의 이름입니다. 비-GUI 쓰레드는 1을 기본값으로 사용합니다.

관련 항목

Gui, GuiControlGet, Control

예제

GuiControl,, MyListBox, |Red|Green|Blue  ; 현재 리스트를 새 리스트로 교체합니다.
GuiControl,, MyEdit, New text line 1.`nNew text line 2.
GuiControl,, MyRadio2, 1  ; 이 라디오 버튼을 켜고 이 그룹의 다른 모든 것들은 끕니다.
GuiControl, Move, OK, x100 y200  ; OK 버튼을 새 위치로 이동합니다.
GuiControl, Focus, LastName  ; 변수나 텍스트의 이름이 "LastName".인 콘트롤에 키보드 초점을 설정합니다.


GuiControlGet

GUI 창에 있는 콘트롤에 관하여 다양한 유형의 정보를 열람합니다.

GuiControlGet, OutputVar [, Sub-command, ControlID, Param4]

매개변수

OutputVar

결과를 저장할 변수의 이름. 명령어를 완료하지 못하면 (아래 ErrorLevel 참조), 이 변수는 비워집니다.

Sub-command

아래 리스트 참조.

ControlID

비어 있거냐 생략되면, 마치 출력 변수의 이름이 지정되어 있는 듯이 행위합니다. 예를 들어, GuiControlGet, MyEdit은 GuiControlGet, MyEdit,, MyEdit과 같습니다.

목표 콘트롤에 연관 배열이 있으면, 그 변수의 이름을 ControlID로 지정하십시오 (이 방법은 다음이 기술한 방법보다 우선 순위가 높습니다). 이런 이유로, 보통 나중에 GuiControl 또는 GuiControlGet를 통하여 접근할 콘트롤에 변수를 할당하는 것이 제일 좋습니다. 심지어 그 콘트롤이 입력이 가능하지 않더라도 상관이 없습니다 (GroupBox 또는 Text).

그렇지 않으면, ControlID는 ClassNN (콘트롤의 클래스이름과 실체 번호) 또는 그 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy를 통하여 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는 SetTitleMatchMode에 의하여 결정됩니다. 주의: 그림 콘트롤의 파일 이름이 (그 콘트롤이 생성되는 순간에 지정된 대로 ) 그의 ControlID로 사용될 수도 있씁니다.

[v1.1.04+]: ControlID는 콘트롤의 HWND일 수 있습니다. 다른 ControlID와 마찬가지로, Sub-command는 기본 창이 아닐 경우 그 GUI의 이름과 번호도 포함할 수 있습니다. 예를 들어, GuiControlGet Value, 2:, %Hwnd%.

Param4

이 매개변수는 생략됩니다. 단, 아래 부-명령어 리스트에서 고지한 경우는 예외입니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 지정된 창/콘트롤이 존재하지 않거나 또는 다른 어떤 문제 때문에 명령어가 작동하지 못하면 1이 설정됩니다. 그렇지 않으면 0이 설정됩니다.

Sub-commands

(Blank): Sub-command를 비워 두면 콘트롤의 내용을 열람할 수 있습니다. 모든 콘트롤 유형은 이름 자체로 설명이 됩니다. 하지만 다음은 예외입니다:

Picture: 콘트롤이 생성될 때 지정되어 있는, 그림 파일의 원래 이름을 열람합니다. 이 이름은 새 그림 파일 이름을 지정하더라도 바뀌지 않습니다.

Edit: 내용을 열람합니다. 그러나 텍스트 안의 줄 넘김 문자는 평범한 라인피드 문자(`n)로 표현됩니다. 전통적인 CR+LF (`r`n)로 표시되지 않습니다. 이 줄 끝 모드는ControlGetText 그리고 ControlSetText와 같은 비-GUI 명령어들이 사용합니다. .

Hotkey: 콘트롤에 핫키가 없으면 빈 값이 열람됩니다. 그렇지 않으면 수식키와 키 이름을 열람합니다. 예제: ^!C, ^Home, +^NumpadHome.

Checkbox/Radio: 콘트롤에 체크가 있으면 1이 열람됩니다. 체크 표식이 없으면 0이 열람됩니다. 또는 회색 체크 표식이 있으면 -1이 열람됩니다. 대신에 콘트롤의 텍스트/캡션을 열람하려면, 단어 Text를 Param4에 지정하십시오. 주의: Gui Submit 명령어와 다르게, 라디오 버튼은 언제나 개별적으로 열람됩니다. 라디오 그룹 안에 있든 없든 상관이 없습니다.

UpDown/Slider/Progress: 콘트롤의 현재 위치를 열람합니다.

Tab/DropDownList/ComboBox/ListBox: 현재 선택된 항목/탭의 텍스트를 열람합니다 (또는 콘트롤에 AltSubmit 특성이 있다면 그의 위치를 열람합니다). ComboBox에 대하여, 선택된 항목이 없으면, 콘트롤의 편집 필드에 있는 텍스트가 대신 열람됩니다. 다중-선택 ListBox에 대하여, 그 창의 현재 구분자를 사용하여 출력됩니다.

ListView 그리고 TreeView: 이들은 Sub-command가 비어 있으면 지원되지 않습니다. 대신에 내장 ListView 함수와 TreeView 함수를 사용하십시오.

StatusBar: 텍스트의 앞 부부만 열람합니다.

ActiveX: 콘트롤의 ActiveX 콤포넌트에 대하여 새 포장 객체를 열람합니다.

주의: 콘트롤에서 그의 내용이 아니라 텍스트/캡션을 무조건 열람하려면, 단어 Text를 Param4에 지정하십시오.

GuiControlGet, OutputVar, Pos: 콘트롤의 위치와 크기를 열람합니다. 위치는 GUI 창의 클라이언트 구역에 상대적입니다. 클라이언트 구역에서 제목 바, 메뉴 바, 그리고 테두리는 제외됩니다. 정보는 네 개의 변수 안에 저장됩니다. 네 변수의 이름은 모두 OutputVar로 시작합니다. 예를 들어:

GuiControlGet, MyEdit, Pos
MsgBox The X coordinate is %MyEditX%. The Y coordinate is %MyEditY%. The width is %MyEditW%. The height is %MyEditH%.

함수 안에서, 지역 변수 대신에 전역 변수 집합을 생성하려면, 이 명령어를 사용하기 전에 OutputVar를 전역 변수로 선언하십시오 (전역-간주 함수들에 대하여 그 반대도 마찬가지입니다). 그렇지만, 흔한 혼란의 근원 때문에, 종종 각 변수를 집합 안에 선언하는 것이 필요하기도 합니다.

GuiControlGet, OutputVar, Focus: 현재 키보드 초점이 있는 콘트롤의 식별자를 열람합니다 (ClassNN). 지정된 GUI 창이 활성화되어 있어야 그의 콘트롤들이 초점을 가질 수 있기 때문에, OutputVar는 창이 활성화되어 있지 않으면 비워집니다. 예를 들어: GuiControlGet, focused_control, focus.

GuiControlGet, OutputVar, FocusV [v1.0.43.06+]: (위의) Focus와 같습니다. 단, 초점이 있는 콘트롤의 연관 변수의 이름을 열람합니다. 그 콘트돌에 연관 변수가 없으면, 콘트돌의 텍스트/캡션의 앞쪽 63 글자가 대신 열람됩니다 (이것은 각 버튼에 변수 이름을 부여하는 것을 피하기 위해 아주 자주 사용됩니다).

GuiControlGet, OutputVar, Enabled: 콘트롤이 켜져 있으면 1이 열람되고 꺼져 있으면 0이 열람됩니다.

GuiControlGet, OutputVar, Visible: 콘트롤이 보이면 1을 열람하고 보이지 않으면 0을 열람합니다.

GuiControlGet, OutputVar, Hwnd [v1.0.46.16+]: 콘트롤의 창 핸들(HWND)을 열람합니다. 콘트롤의 HWND는 종종 PostMessage, SendMessage, 그리고 DllCall과 함께 사용됩니다. 주의: HwndOutputVar가 보통 HWND를 얻는 더 간결한 방법입니다.

GuiControlGet, OutputVar, Name [v1.1.03+]: 콘트롤에 연관된 변수의 이름을 열람합니다. 실패하면 OutputVar는 비워집니다.

논평

기본 창이 아닌 창을 처리하려면 (아래 참조), 그의 이름 또는 번호 그리고 쌍점 다음에 부-명령어를 다음 예제와 같이 포함시키십시오:

GuiControlGet, MyEdit, MyGui:
GuiControlGet, MyEdit, MyGui:Pos
GuiControlGet, Outputvar, MyGui:Focus

이것은 ControlID가 콘트롤의 연관 변수 또는 HWND일지라도 필수입니다.

GUI 쓰레드는 GUI 행위의 결과로 기동된 쓰레드로 정의됩니다. GUI 행위에는 GUI 창이 메뉴 바로부터 항목을 선태하는 것, 또는 그의 g-labels중 하나를 (버튼을 눌러서) 촉발 시키는 것이 포함됩니다.

GUI 쓰레드에 대하여 기본 창 이름은 그 쓰레드를 기동한 창의 이름입니다. 비-GUI 쓰레드는 1을 기본값으로 사용합니다.

관련 항목

Gui, GuiControl, ControlGet

예제

GuiControlGet, MyEdit
GuiControlGet, CtrlContents,, MyEdit  ; 위와 같습니다. 단, 기본-아닌 출력 변수를 사용합니다.
GuiControlGet, MyCheckbox1 ; 체크되어 있으면 1, 체크가 없으면 0을 열람합니다.
GuiControlGet, MyCheckbox1,,, Text  ; 체크박스의 캡션/텍스트를 열람합니다.
GuiControlGet, Pic, Pos, Static4  ; 위치/크기는 PicX, PicY, PicW, 그리고 PicH에 저장됩니다.


GUI Control Types

GUI 콘트롤 유형

목차

  • Text, Edit, UpDown, Picture
  • Button, Checkbox, Radio
  • DropDownList, ComboBox
  • ListBox, ListView, TreeView
  • Link, Hotkey, DateTime
  • MonthCal, Slider, Progress
  • GroupBox, Tab2, StatusBar
  • ActiveX (e.g. Internet Explorer Control)
  • Custom

Text

설명: 테두리 없는 텍스트를 포함한 구역. 사용자가 편집할 수 없습니다. 종종 다른 콘트롤에 라벨 용도로 사용됩니다. 예제:

Gui, Add, Text,, 이름을 입력하십시오:

이 경우, 가장 마지막 매개변수는 보여줄 문자열입니다. 라인피드(`n)를 포함해 새 줄을 시작할 수 있습니다. 게다가, 계속 섹션을 수단으로 하여 하나의 기다란 줄을 여러 개의 짧은 줄로 나눌 수 있습니다.

너비 (W)가 Options에 지정되었지만 행 (R)이나 높이 (H)가 지정되지 않았다면, 텍스트는 필요하면 워드랩이 디고, 콘트롤의 높이는 자동으로 설정됩니다.

콘트롤의 내용은 Gui 명령어의 마지막 매개변수에 있으므로, 기호 그대로의 쉼표는 피신시킬 필요가 없습니다. 이 규칙은 다른 모든 명령어의 마지막 매개변수에도 적용됩니다.

gMySubroutine과 같은 g-label은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 텍스트를 클릭할 때마다 MySubroutine 라벨이 자동으로 기동합니다. 이것을 사용하면 다음 예제 스크립트와 같이 푸른색 밑줄 하이퍼링크를 흉내낼 수 있습니다:

Gui, Font, underline
Gui, Add, Text, cBlue gLaunchGoogle, 구글을 기동하려면 여기를 클릭하십시오.

; 대안으로, Link 콘트롤을 사용할 수 있습니다:
Gui, Add, Link,, 구글을 기동하려면 <a href="www.google.com">여기를</a> 클릭하십시오.
Gui, Font, norm
Gui, Show
return

LaunchGoogle:
Run www.google.com
return

더블 클릭은 A_GuiEvent에 단어 DoubleClick이 들어 있는지 점검하여 탐지할 수 있습니다.

앰퍼센드 (&)를 텍스트에 사용하면 문자 중 하나에 밑줄을 그을 수 있습니다. 예를 들어:

Gui, Add, Text,, &First Name:
Gui, Add, Edit

위의 예제에서, 기호 F는 밑줄이 그어집니다. 사용자는 단축키 Alt+F를 눌러 텍스트 콘트롤 다음에 추가된 첫 번째 입력 가능 콘트롤에 키보드 초점을 설정할 수 있습니다. 대신에 기호 그대로 앰퍼센드를 보여주려면, 두 개의 연속 앰퍼센드를 지정하면 됩니다 (&&). 앰퍼센드를 특수 취급하지 않도록 하려면, 콘트롤 옵션에 0x80을 포함시키십시오.

Right, Center, 그리고 Hidden과 같은 다른 옵션은 일반 옵션을 참조하십시오. 다음도 참조하십시오: 콘트롤의 위치 지정과 크기 조절.

Edit

설명: 사용자가 자유롭게 텍스트를 타자할 수 있는 구역. 예제:

Gui, Add, Edit, r9 vMyEdit, 편집 콘트롤 안에 나타날 텍스트 (이 매개변수를 생략하면 빈 채로 시작함).

이 콘트롤은 여러 줄의 텍스트가 있으면 여러 줄 모드가 됩니다. 예를 들어 r3을 Options에 지정하면 3-줄 짜리 편집 콘트롤이 생성됩니다. 기본 특성은 다음과 같습니다: 수직 스크롤바, 단어 줄넘기기 활성화, 그리고 엔터 키를 입력으로 받습니다. 창의 기본 버튼을 촉발시키지 않습니다.

여러-줄 편집 콘트롤에서 새 줄을 시작하면, 마지막 매개변수에 (내용) 라인피드 하나(`n) 또는 캐리지 리턴과 라인피드의 조합 (`r`n)이 포함됩니다. 두 방법 모두 기호 그대로의 `r`n 쌍을 편집 콘트롤 안에 생산합니다. 그렇지만, Gui Submit이나 GuiControlGet를 통하여 콘트롤이 변수로 저장될 때, 각 `r`n은 텍스트에서 언제나 평범한 라인피드로 (`n) 변환됩니다. 그 텍스트를 파일에 쓰려면, 다음 예제를 따르십시오: FileAppend, %MyEdit%, C:\Saved File.txt.

콘트롤에 단어 넘기기가 켜져 있으면 (여러-줄 편집 콘트롤에 기본값), 사용자가 타자할 때 일어나는 줄넘기기는 라인피드 문자를 생산하지 않습니다 (엔터 키를 눌러야만 삽입됩니다).

gMySubroutine과 같은 g-label은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자나 스크립트가 콘트롤의 내용을 변경할 때마다 자동으로 MySubroutine 라벨이 기동합니다.

팁: 텍스트 파일을 편집 콘트롤 안으로 적재하려면 FileRead 그리고 GuiControl을 사용하십시오. 예를 들어:

Gui, Add, Edit, R20 vMyEdit
FileRead, FileContents, C:\My File.txt
GuiControl,, MyEdit, %FileContents%

Edit Options

옵션을 추가하는게 아니라 제거하려면, 앞에다 마이너스 기호를 배치하십시오:

한계: 사용자의 입력은 편집 필드에서 보이는 너비에 제한됩니다. 대안으로, 특정 개수의 문자로 입력을 제한하려면, 바로 다음에 숫자를 지정하십시오. 예를 들어, Limit10는 10 문자가 넘으면 더 이상 입력되지 않습니다.

Lowercase: 사용자가 타자하는 문자들은 자동으로 소문자로 변환됩니다.

Multi: 여러 줄 편집을 허용합니다. 그렇지만, 보통 지정할 필요가 없습니다. 왜냐하면 높이 (H), 행 (R), 또는 내용(Text)에 기반하여 자동으로 탐지하기 때문입니다.

Number: 사용자가 필드에 숫자말고 다른 것은 타자하지 못하도록 막습니다 (그렇지만, 여전히 비-숫자를 안에 붙여 넣는 것은 가능합니다). 숫자 입력을 강제하는 또다른 방법은 UpDown 콘트롤을 Edit 콘트롤에 붙이는 것입니다.

Password: 사용자의 입력을 감춥니다 (예를 들어 암호 입력). 사용자가 타자하는 문자를 은폐 문자로 교체합니다. 맞춤 은폐 문자가 필요하다면, 그 문자를 단어 Password 다음에 배치하십시오. 예를 들어, Password*는 은폐 문자를 검은색 원 (불릿)이 아니라 별표로 만듭니다. 불릿은 Windows XP에서 기본값입니다. 주의: 이 옵션은 여러-줄 편집 콘트롤에 아무 효과가 없습니다.

ReadOnly: 사용자가 콘트롤의 내용을 변경하지 못하도록 막습니다. 그렇지만, 텍스트는 여전히 스크롤할 수 있고, 선택해서 클립보드로 복사할 수 있습니다.

Tn: 기호 T를 사용하면 탭 스탑을 여러-줄 편집 콘트롤 안에 설정할 수 있습니다 (탭 스탑은 기호 그대로의 TAB 문자가 점프해 갈 열 위치를 결정하기 때문에, 텍스트를 열 안으로 포맷해 넣는 데 사용됩니다). 기호 T가 없으면, 탭 스탑은 매 32 대화상자 단위마다 설정됩니다 (각 "대화상자 단위"의 너비는 운영 체제에 의하여 결정됩니다). 기호 T만 사용하면, 탭 스탑은 콘트롤 전체 너비에 걸쳐서 매 n 단위마다 설정됩니다. 예를 들어, Gui, Add, Edit, vMyEdit r16 t64이면 탭 사이의 거리가 두 배가 됩니다. 맞춤 탭 스탑을 지정하려면 기호 T를 다음 예제와 같이 여러 번 지정하십시오: Gui, Add, Edit, vMyEdit r16 t8 t16 t32 t64 t128. 탭 스탑 1번은 리스트의 절대 열 위치에 설정되고, 최대 50개의 탭 스탑까지 설정됩니다. 주의: 탭 스탑은 여러 줄 편집 큰트롤을 요구합니다.

Uppercase: 사용자가 타자한 문자들은 자동으로 대문자로 변환됩니다.

WantCtrlA [v1.0.44+]: WantCtrlA (마이너스 WantCtrlA)를 지정하면 사용자가 Control-A를 눌러서 편집 콘트롤 안의 모든 텍스트를 선택하지 못하도록 막습니다.

WantReturn: -WantReturn (즉, 마이너스 사인 다음에 WantReturn)을 지정하면 여러-줄 편집 콘트롤이 Enter 키눌림을 잡지 못하도록 막습니다. 그러면 Enter를 눌러고 창의 기본 버튼을 누른 것과 같게 됩니다. 이 경우, 사용자는 Control-Enter를 눌러 새 줄을 시작할 수 있습니다.

WantTab: 탭 키눌림이 다음 콘트롤로 항해하는 대신에 탭 문자를 생산하게 만듭니다. 이 옵션이 없다면, 사용자는 Control-Tab을 눌러 탭 문자를 여러-줄 편집 콘트롤 안에 생산할 수 있습니다. 주의: WantTab은 한-줄 편집 콘트롤 안에서도 작동하지만, 각 탭 문자는 빈 네모 문자로 보여집니다 (물론 실제 탭으로 저장되어 있습니다).

-Wrap (마이너스 Wrap): 여러-줄 편집 콘트롤에 단어 넘기기를 끕니다. 이 스타일은 콘트롤이 생성된 후에는 변경할 수 없기 때문에, 다음 중 한 방법을 사용해 변경하십시오: 1) 창과 그의 콘트롤들을 파괴(Destroy)한 다음 다시 생성하십시오; 또는 2) 하나는 단어 넘기기를 활성화하고 다른 하나는 꺼서 두 개의 중첩 편집 콘트롤을 생성하십시오. 현재 사용되지 않는 콘트롤을 비우거나 또는 숨길 수 있습니다.

일반 옵션에서 다른 옵션들 예를 들어 Right, Center, 그리고 Hidden을 참고하십시오. 다음도 참조하십시오: 콘트롤의 위치와 크기 변경.

더 강력한 편집 콘트롤: HiEdit은 멀티 탭을 지원하는 대용량 파일 편집 콘트롤입니다. 무료이며 메모리를 아주 적게 소비합니다. 텍스트와 이진 파일을 모두 편집할 수 있습니다. 더 자세한 정보와 데모는 다음을 참조하십시오: www.autohotkey.com/forum/topic19141.html

UpDown

설명: 사용자가 클릭해 값을 증가시키거나 감소 시킬 수 있는 한 쌍의 화살표 버튼. 기본값으로 UpDown 콘트롤은 자동으로 이전에 추가된 콘트롤에 부착됩니다. 이 이전의 콘트롤을 UpDown의 친구 콘트롤이라고 부릅니다. 가장 흔한 예는 스피너("spinner")인데, UpDown 콘트롤이 Edit 콘트롤에 부착됩니다. 예를 들어:

Gui, Add, Edit
Gui, Add, UpDown, vMyUpDown Range1-10, 5

위의 예제어서, Edit 콘트롤은 UpDown의 친구 콘트롤입니다. 사용자가 화살표 버튼 중 하나를 누를 때마다, Edit 콘트롤 안의 숫자가 자동으로 늘어나거나 줄어듭니다.

UpDown의 친구 콘트롤은 Text 또는 ListBox 콘트롤도 가능합니다. 그렇지만, OS 제한 때문에, 이런 콘트롤 말고 다른 콘트롤들은 (예를 들어 ComboBox와 DropDownList) g-라벨 그리고 기타 특징과 제대로 작동하지 않습니다.

UpDown의 시작 위치를 마지막 매개변수로 지정하십시오 (생략하면, 0에서 시작하거나 허용 범위 안에서 0에 가장 가까운 숫자에서 시작합니다).

Gui Submit 명령어를 사용하면, 콘트롤의 연관 출력 변수가 (있다면) 현재 UpDown의 위치를 숫치로 받습니다. UpDown이 Edit 콘트롤에 부착되어 있고 사용자의 입력을 평가하고 싶지 않다면, Edit의 값 말고 UpDown의 값을 사용하는 것이 좋습니다. 왜냐하면 사용자가 Edit 콘트롤에 비-숫자를 입력하거나 범위를 벗어난 값을 입력하더라도 UpDown은 언제나 범위 안에서 숫자를 산출하기 때문입니다. 관련하여 말하자면, 세 자리 이상의 숫자는 기본값으로 천의 자리 가름자 (예를 들어 쉼표)가 있습니다. 이런 가름자들은 UpDown의 출력 변수가 아니라 Edit의 출력 변수에 저장됩니다.

UpDown에 g-라벨이 있다면, 사용자가 화살표 버튼을 클릭하거나 키보드에서 화살표 키를 누를 때마다 기동됩니다. g-라벨이 기동할 때마다 UpDown의 위치를 그의 연관 출력 변수에 (있다면) 저장합니다.

UpDown 옵션

Horz: 콘트롤의 버튼 방향을 좌/우로 만듭니다. 기본값으로, Horz는 또 콘트롤을 분리시킵니다 (친구 없음). 이 행위는 Horz 16를 콘트롤의 옵션에 지정하면 오버라이드할 수 없습니다.

Left: UpDown을 그의 친구의 왼쪽에 배치합니다.

Range: 범위를 0과 100 말고 지정합니다. 단어 Range 다음에, 최소값, 옆줄, 그리고 최대값을 지정하십시오. 예를 들어 Range1-1000이면 숫자를 1부터 1000까지 선택되도록 허용합니다; Range-50-50이면 숫자를 -50부터 50까지 허용합니다; 그리고 Range-10--5이면 숫자를 -10부터 -5까지 허용합니다. 최소값과 최대값을 바꾸면 화살표가 정상 방향과 반대 방향으로 이동합니다. 최대 허용 범위는 -2147483648-2147483647입니다. 마지막으로, 친구 콘트롤이 ListBox이면, 범위는 기본값이 수직에 32767-0이고 수평에 그 반대입니다 (Horz).

Wrap: 사용자가 최소값 또는 최대값을 넘어서려고 시도하면 콘트롤은 그의 범위 반대 끝으로 돌립니다. Wrap이 없다면, 콘트롤은 최대 최소 값에 도달하면 멈춥니다

-16 (마이너스 16): 수직 UpDown을 분리시킵니다; 즉, 친구가 없습니다. 이렇게 하면 또한 콘트롤이 친구 콘트롤의 크기를 따르지 않고 지정된 너비와 높이 그리고 위치를 준수합니다. 게다가, 분리된 UpDown은 자신만의 위치를 내부적으로 추적 관리합니다. 이 위치는 Gui Submit와 같은 수단을 통하여 정상적으로 열람할 수 있습니다.

0x80: 0x80을 Options에 포함하면 천의 자리 가름자를 생략할 수 있습니다. 이 가름자는 보통 친구 콘트롤의 소수점 세 자리마다 나타납니다. 그렇지만, 이 스타일은 보통 사용되지 않습니다. 왜냐하면 스크립트가 (그의 친구 콘트롤이 아니라) UpDown 콘트롤 자체로부터 열람할 때 가름자를 숫자로부터 제외하기 때문입니다.

1 말고 다른 값 만큼 증가시키기: 이 스크립트에서, NumEric은 UpDown의 증감값을 1 아닌 값으로 (예를 들어 5 또는 0.1) 변경하는 법을 보여줍니다..

다음 참조: 콘트롤의 위치와 크기 변경.

Picture (또는 Pic)

설정: 이미지를 담고 있는 구역 (지원되는 파일 유형은 마지막 두 문단을 참조). 마지막 매개변수는 이미지의 파일이름입니다. 절대 경로를 지정하지 않으면 A_WorkingDir에 있다고 간주됩니다. 예를 들어:

Gui, Add, Picture, w300 h-1, C:\My Pictures\Company Logo.gif

이미지의 실제 너비 그리고/또는 높이를 유지하려면, W 그리고/또는 H 옵션을 생략하십시오. 그렇지 않으면, 이미지는 지정된 너비 그리고/또는 높이도 크기가 조절됩니다 (이 너비와 높이는 또한 어느 아이콘을 다중-아이콘 .ICO 파일로부터 적재할지 결정하기도 합니다). 그의 화면 비율을 유지한 채로 이미지를 늘리거나 줄이려면, -1을 차원 중 하나에 지정하고 양수를 나머지 차원에 지정하십시오. 예를 들어, w200 h-1으로 지정하면 이미지를 200 픽셀 너비로 만들고 높이는 자동으로 설정합니다. 그림을 적재할 수 없거나 보여줄 수 없으면 (예, 파일이 없으면), 콘트롤은 빈 채로 있고 그의 너비와 높이는 0으로 설정됩니다.

gMySubroutine과 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 MySubroutine 라벨이 사용자가 그림을 클릭할 때마다 자동으로 기동됩니다. 더블-클릭은 A_GuiEvent에 단어 DoubleClick이 들어 있는지 점검해 보면 탐지할 수 있습니다.

그림을 다른 콘트롤에 배경으로 사용하려면, 그림은 보통 그런 콘트롤보다 먼저 적재해야 합니다. 그렇지만, 그런 콘트롤이 입력 가능하고 그림은 g-라벨이 있는 경우라면, 다른 콘트롤 뒤에 그림 콘트롤을 생성하고 0x4000000를 (WS_CLIPSIBLINGS임) 그림의 Options에 포함시키십시오. 이 트릭으로 그림은 또한 Tab 콘트롤 또는 ListView 뒤의 배경이 될 수 있습니다.

아이콘, 커서, 그리고 애니메이션 커서: 아이콘과 커서는 다음 유형의 파일로부터 적재할 수 있습니다: ICO, CUR, ANI, EXE, DLL, CPL, SCR, 그리고 아이콘 자원을 담은 기타 유형들. 파일의 첫 번째 아이콘이 아니라 아이콘 그룹을 사용하려면, Options에 단어 Icon과 이어서 바로 그 그룹 번호를 포함시키십시오. 다음 예제에서, 두 번째 아이콘 그룹으로부터 기본 아이콘이 사용됩니다: Gui, Add, Picture, Icon2, C:\My Application.exe.

단어 AltSubmit을 Options에 지정하면 프로그램은 마이크로소프트사의 GDIPlus.dll을 이용하여 이미지를 적재합니다. 이 때문에 GIF, BMP, 그리고 아이콘 이미지에 다른 모습이 생길 수 있습니다. 예를 들어, 투명 배경을 가진 ICO/GIF를 투명 비트맵으로 적재하려고 합니다. 이 때문에 BackgroundTrans 옵션이 켜집니다. GDIPlus를 사용할 수 없으면 (다음 문단 참조), AltSubmit은 무시되고 이미지는 보통의 방법을 사용하여 적재됩니다.

모든 운영 체제는 GIF, JPG, BMP, ICO, CUR, 그리고 ANI 이미지를 지원합니다. Windows XP 이후에, PNG, TIF, Exif, WMF, 그리고 EMF와 같은 이미지를 추가로 지원합니다. XP 보다 오래된 운영 체제는 마이크로소프트사의 무료 GDI+ DLL을 AutoHotkey.exe 폴더 안으로 복사해 지원할 수 있습니다 (그러나 컴파일 스크립트의 경우는, 그 DLL을 스크립트의 폴더 안으로 복사해 넣으십시오). 이 DLL을내려 받으려면, www.microsoft.com에 다음 문구를 검색하십시오: gdi redistributable

애니메이션 GIF: 애니메이션 GIF 파일을 그림 콘트롤에 보여줄 수 있지만, 실제로는 움직이지 않습니다. 이를 해결하려면, AniGIF DLL을 사용하십시오 (비 상업적 목적으로는 무료입니다). 다음에 시연합니다: www.autohotkey.com/forum/topic19264.html

Button

설명: 눌러서 조치를 촉발할 수 있는 푸시버튼. 이 경우, 마지막 매개변수는 버튼의 이름입니다 (버튼 자체에 보여짐). 이름에 라인피드 (`n)를 포함하면 새 줄을 시작할 수 있습니다. 예를 들어:

Gui, Add, Button, Default, OK

위의 예제는 그의 Options에 단어 Default를 포함시켜 "OK"를 기본 버튼으로 만듭니다. 기본 버튼의 행위는 사용자가 ENTER를 누를 때마다 자동으로 촉발됩니다. 단, 키보드 초점이 다른 버튼에 있거나 여러줄 편집 콘트롤에 WantReturn 스타일이 있는 경우는 예외입니다. 나중에 기본 버튼을 다른 버튼으로 바꾸려면, 다음 예제를 따르십시오. Cancel 버튼을 기본 버튼으로 만듭니다: GuiControl, +Default, Cancel. 나중에 창을 기본 버튼이 없도록 변경하려면, 다음 예제를 따르십시오: GuiControl, -default, OK.

앰퍼센드 (&)를 이름 버튼에 사용하면 그의 글자에 밑줄을 그을 수 있습니다. 예를 들어:

Gui, Add, Button,, &Pause

위의 예제에서, 기호 P에 밑줄이 그어집니다. 그러면 사용자는 Alt+P를 눌러서 단축 키로 사용할 수 있습니다. 기호 그대로 앰퍼센드를 보여주려면, 앰퍼센드 두 개를 연속해 지정하십시오 (&&).

버튼에 명시적인 g-라벨이 없다면, 자동 라벨이 있다고 간주됩니다. 예를 들어 첫 번째 GUI 창에 OK 버튼이 있다면, 그 ButtonOK 라벨이 (존재한다면) 그 버튼이 눌릴 때 기동됩니다. 첫 번째 창 말고 다른 GUI 창에 대하여, 창 번호가 버튼의 자동 라벨 앞에 포함됩니다; 예를 들어: 2ButtonOK.

버튼의 텍스트에 스페이스나 &`r`n`t` 집합에 있는 문자가 들어 있다면, 그의 자동 라벨은 그런 문자들을 생략합니다. 예를 들어, 버튼 제목이 "&Pause"이라면 자동 라벨은 ButtonPause가 됩니다. 비슷하게, 버튼 제목 "Save && Exit"이라면 자동 라벨은 ButtonSaveExit이 됩니다 (두 개의 연속 앰퍼샌드는 앰퍼센드 하나를 기호 그대로 나타내는 데 사용됩니다).

알려진 한계: 어떤 바탕화면 테마는 버튼의 텍스트를 제대로 보여주지 못할 수 있습니다. 이런 일이 일어나면, -Wrap (마이너스 Wrap)을 버튼의 옵션에 포함시켜 보십시오. 그렇지만, 이렇게 하면 여러 줄 텍스트는 포기해야 합니다.

Checkbox

설명: 체크하거나 해제해 On/Off, Yes/No, 등등을 표현할 수 있는 작은 박스. 예제:

Gui, Add, Checkbox, vShipToBillingAddress, 청구지 주소로 배송할까요?

마지막 매개변수는 박스 옆에 보여지는 라벨입니다. 전형적으로 프롬프트로 사용되거나 체크박스가 무엇을 하는지 설명하는데 사용됩니다. 라인피드를 (`n) 포함하면 새 줄을 시작할 수 있습니다. 너비 (W)가 Options에 지정되었지만 행(R)이나 높이(H)가 없다면, 콘트롤의 텍스트는 필요하면 단어-넘기기 됩니다. 그리고 콘트롤의 높이는 자동으로 설정됩니다. 체크박스의 연관 출력 변수는 (있다면) 체크되어 있을 경우 1, 해제되어 있으면 0, 그리고 회색처리된/미결정 상태이면 -1을 받습니다.

단어 Check3을 Options에 지정하면 세 번째 상태를 켤 수 있습니다. 이 상태를 까만색이 아니라 회색 체크표식을 보여줍니다 (회색은 체크박스가 체크되지도 해제되지도 않은 상태라는 것을 나타냅니다). 단어 Checked 또는 CheckedGray을 Options에 지정하면 체크박스를 각각 검정색 또는 회색 체크표식을 가지고 시작하도록 만들 수 있습니다. 단어 Checked는 다음에 선택적으로 0, 1, 또는 -1이 따라와 시작 상태를 나타낼 수 있습니다. 다른 말로, Checked 그리고 Checked%VarContainingOne%는 같습니다.

gMySubroutine와 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 체크박스를 클릭하거나 변경할 때마다 MySubroutine 라벨이 지동으로 기동됩니다.

알려진 한계: 어떤 바탕화면 테마는 버튼의 텍스트를 제대로 보여주지 못할 수 있습니다. 이런 일이 일어나면, -Wrap (마이너스 Wrap)을 버튼의 옵션에 포함시켜 보십시오. 그렇지만, 이렇게 하면 여러 줄 텍스트는 포기해야 합니다.

Radio

라디오 버튼은 체크하거나 해제할 수 있는 작은 빈 동그라미입니다. 예를 들어:

Gui, Add, Radio, vMyRadioGroup, 배송하기 전에 모든 물품이 준비되기를 기다립니다.

이 콘트롤은 보통 라디오 그룹 형태로 나타납니다. 각 그룹마다 두 개 이상의 버튼을 담고 있습니다. 사용자가 라디오 버튼을 클릭해 켜면, 그 그룹의 다른 버튼은 자동으로 꺼집니다 (사용자는 화살표 키로 그룹 안을 항해할 수 있습니다). 연이어 추가되는 모든 라디오 버튼에 라디오 그룹이 자동으로 생성됩니다. 새 그룹을 시작하려면, 단어 Group을 새 그룹의 첫 번째 버튼의 Options에 지정하십시오 -- 또는 그냥 비-라디오 콘트롤을 그 사이에 추가하십시오. 그러면 자동으로 새 그룹이 시작하기 때문입니다.

마지막 매개변수에, 라디오 버튼의 오른쪽에 보여 줄 라벨을 지정하십시오. 이 라벨은 전형적으로 프롬프트나 설명으로 사용됩니다. 라인피드를 포함하면 (`n) 새 줄을 시작할 수 있습니다. 너비 (W)가 Options에 지정되었지만 행 (R)도 높이 (H)도 지정되지 않았다면, 콘트롤의 텍스트는 필요하면 단어 넘기기가 되고, 높이는 자동으로 설정됩니다.

단어 Checked를 Options에 지정하면 버튼을 켜진("on") 상태로 시작할 수 있습니다. 단어 Checked 다음에 선택적으로 바로 0 또는 1이 따라와 시작 상태를 알릴 수 있습니다: 0이면 해제되어 있는 것이고 1이면 체크되어 있는 것입니다. 다른 말로, Checked 그리고 Checked%VarContainingOne%는 같습니다.

라디오 버튼의 연관 출력 변수는 (있다면) "on"에 숫자 1을 받고 "off"에 0을 받습니다. 그렇지만, 라디오 그룹에 버튼 하나만 변수가있다면 대신 그 변수가 현재 선택된 버튼의 번호를 받습니다: 1이면 첫 번째 라디오 버튼 (원래 생성 순서대로), 2이면 두 번째 라디오 버튼 등등. 선택된 버튼이 없으면, 0이 저장됩니다.

gMySubroutine와 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 버튼을 켤 때마다 MySubroutine 라벨이 자동으로 기동됩니다. 이전 문단에서 단일-변수 모드와 다르게, g-라벨은 라디오 그룹에서 각 버튼마다 지정해야 기동됩니다. 이렇게 하면 유연하게 어떤 버튼의 클릭은 무시할 수 있습니다. 마지막으로, 더블클릭을 탐지하려면 A_GuiEvent에 단어 DoubleClick이 담겨 있는지 점검하면 됩니다.

알려진 한계: 어떤 바탕화면 테마는 버튼의 텍스트를 제대로 보여주지 못할 수 있습니다. 이런 일이 일어나면, -Wrap (마이너스 Wrap)을 버튼의 옵션에 포함시켜 보십시오. 그렇지만, 이렇게 하면 여러 줄 텍스트는 포기해야 합니다.

DropDownList (또는 DDL)

설명: 작은 버튼을 누르면 응답하여 보여주는 선택 리스트. 이 경우 마지막 매개변수는 파이프로 구분된 선택 리스트입니다. 예, Choice1|Choice2|Choice3. 예제:

Gui, Add, DropDownList, vColorChoice, Black|White|Red|Green|Blue

창이 처음 나타날 때 항목 중에 하나를 미리 선택하려면, 두 개의 파이프 문자를 그 다음에 붙이십시오 (예, Red|Green||Blue). 다른 방법으로, Options에 단어 Choose 와 바로 이어서 미리-선택할 번호를 지정하십시오. 예를 들어, Choose5이면 다섯 번째 항목을 미리 선택합니다 (다른 옵션과 마찬가지로, Choose%Var%와 같은 변수도 가능합니다). 콘트롤이 생성된 이후에 선택을 변경하거나 또는 리스트로부터 항목을 제거하거나/추가하려면, GuiControl를 사용하십시오.

단어 Uppercase 또는 Lowercase를 Options에 지정하면 자동으로 리스트 안의 모든 항목들을 대문자 또는 소문자로 변환합니다. 단어 Sort를 지정하면 리스트의 내용을 자동으로 알파벳 순서로 정렬합니다 (이것은 나중에 GuiControl을 통하여 추가되는 항목들에도 모두 영향을 미칩니다). Sort 옵션은 또한 리스트가 드롭 다운될 때마다 점진 검색을 활성화 합니다; 덕분에 그의 이름 중 앞 몇 글자만 타자해도 항목을 선택할 수 있습니다.

Gui Submit 명령어가 사용될 때, 그 콘틀로의 연관 출력 변수가 (있다면) 현재 선택된 항목의 텍스트를 받습니다. 그렇지만, 콘트롤에 AltSubmit 특성이 있다면, 그 출력 변수는 대신에 그 항목의 위치 번호를 받습니다 (첫 항목은 1이고, 두 번째 항목은 2입니다. 등등).

gMySubroutine와 같은 g-라벨은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 새 항목을 선택할 때마다 자동으로 MySubroutine 라벨이 기동됩니다.

R 또는 H 옵션을 사용하면 팝업 리스트의 높이를 제어할 수 있습니다. 예를 들어 R5를 지정하면 리스트가 5 행 높이가 됩니다. 반면에 H400이면 선택 필드와 리스트의 총 높이가 400 픽셀로 설정됩니다. R과 H를 모두 생략하면, 리스트는 자동으로 확대되어 사용자의 바탕화면 높이를 활용합니다 (그렇지만, Windows XP보다 오래된 운영 체제는 기본으로 3 행을 보여줍니다).

선택 필드나 리스트 항목의 높이를 설정하려면, 아래 예제와 같이 CB_SETITEMHEIGHT 메시지를 사용하십시오:

Gui Add, DDL, vcbx w200 hwndhcbx, One||Two
; CB_SETITEMHEIGHT = 0x153
PostMessage, 0x153, -1, 50,, ahk_id %hcbx%  ; 선택 필드의 높이를 설정합니다.
PostMessage, 0x153,  0, 50,, ahk_id %hcbx%  ; 리스트 항목의 높이를 설정합니다.
Gui Show, h70, Test

필드 사이의 가름자는 파이프 (|) 말고 다른 것으로 바꿀 수 있습니다. 예를 들어 Gui +Delimiter`n이면 라인피드로 바뀌고 Gui +DelimiterTab이면 탭 문자로 바뀝니다 (`t).

ComboBox

설명: DropDownList와 동일하지만 리스트로부터 항목을 고르는 대신에 자유로운 형식의 텍스트 입력을 허용합니다. 예를 들어:

Gui, Add, ComboBox, vColorChoice, Red|Green|Blue|Black|White

위의 DropDownList와 같은 옵션을 모두 허용하는 외에도, 단어 Limit을 Options에 포함하면 사용자의 입력을 ComboBox의 편집 필드의 가시 너비로 제한할 수 있습니다. 또한, 단어 Simple을 지정하면 ComboBox를 마치 그 아래에 ListBox를 가진 편집 필드처럼 행위하도록 만들 수 있습니다.

Gui Submit 명령어를 사용하면, 그 콘트롤의 연관 출력 변수가 (있다면) 현재 선택된 항목의 텍스트를 받습니다. 그렇지만, 콘트롤에 AltSubmit 특성이 있다면, 그 출력 변수는 대신에 항목의 위치 번호를 받습니다 (첫 항목은 1이고, 두 번째 항목은 2이며 등등.). 어느 경우든, 선택된 항목이 없다면, 그 출력 변수는 ComboBox의 편집 필드 내용이 설정됩니다.

gMySubroutine 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 새 항목을 선택할 때마다 MySubroutine 라벨이 자동으로 기동됩니다.

ListBox

설명: 선택이 가능한 리스트를 담고 있는 상대적으로 높은 박스. 이 경우, 마지막 매개변수는 파이프 문자로 구분된 선택 리스트입니다. 예를 들어 Choice1|Choice2|Choice3. 예제:

Gui, Add, ListBox, vColorChoice, Red|Green|Blue|Black|White

창이 처음 나타날 때 미리 리스트의 항목을 선택해 두려면, 두 개의 파이프 문자를 각각의 항목 뒤에 포함시키십시오. (여러 항목을 미리 선택하려면 Multi 옵션이 필요합니다). 대안으로, Options에 단어Choose와 바로 이어서 하나의 항목 번호를 지정하면 미리 선택할 수 있습니다. 예를 들어, Choose5이면 다섯 번째 항목이 미리 선택됩니다. 콘트롤이 생성된 뒤에 리스트로부터 엔트리를 추가/제거하거나 선택을 변경하려면, GuiControl을 사용하십시오.

Gui Submit 명령어를 사용할 때, 콘트롤의 연관 출력 변수가 (있다면) 현재 선택된 항목의 텍스트를 받습니다. 그렇지만, 콘트롤에 AltSubmit 특성이 있다면, 그 출력 변수는 대신에 그 항목의 위치 번호를 받습니다 (첫 번째 항목은 1, 두 번째는 2 등등).

gMySubroutine과 같은 g-라벨은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 새 항목을 선택할 때마다 MySubroutine 라벨이 자동으로 기동됩니다. 사용자가 항목을 더블 클릭하면, 내장 변수 A_GuiEvent에 Normal이 아니라 문자열 DoubleClick이 담깁니다. 또한, 변수 A_EventInfo에는 더블 클릭된 그 항목의 위치가 담깁니다 (1은 첫 항목, 2이면 두 번째 항목 등등.).

방대한 개수의 항목을 ListBox에 추가할 때, 연산 전에 GuiControl, -Redraw, MyListBox를 미리 사용하고 나중에 GuiControl, +Redraw, MyListBox를 사용하면 수행성능 향상을 꾀할 수 있습니다 .

ListBox 옵션

Choose: 위 참조.

Multi: 쉬프트-클릭 또는 콘트롤-클릭을 통하여 여러 항목을 선택하도록 허용합니다 (쉬프트/콘트롤 클릭을 피하려면, 단어 Multi 대신에 숫자 8을 사용하십시오). 이 경우, Gui Submit은 파이프로 구분된 항목-문자열 리스트를 콘트롤의 출력 변수에 저장합니다. 그렇지만, AltSubmit 옵션이 켜져 있으면, Gui Submit은 파이프로 구분된 항목 번호 리스트를 대신 사용합니다. 예를 들어, 1|2|3이라면 앞쪽 세 항목이 선택되었다는 것을 나타냅니다. 개별적으로 항목을 문자열로부터 추출하려면, 다음 예제와 같이 파싱 회돌이를 사용하십시오:

Loop, parse, MyListBox, |
{
    MsgBox Selection number %A_Index% is %A_LoopField%.
}

필드 사이의 가름자는 파이프 문자 (|) 대신 다른 것으로 바꿀 수 있습니다. 예를 들어 Gui +Delimiter`n이면 라인피드로 바꾸고 Gui +DelimiterTab이면 탭 문자 (`t)로 바뀝니다.

ReadOnly: 항목들이 선택될 때 시각적으로 강조되지 못하도록 막습니다 (그러나 Gui Submit는 여전히 그 선택된 항목을 저장합니다).

Sort: 자동으로 리스트의 내용을 알파벳 순서로 정렬합니다 (이것은 또한 나중에 GuiControl을 통하여 추가되는 모든 항목에도 영향을 줍니다). Sort 옵션은 또한 점증 검색을 활성화 합니다. 그 덕분에 항목을 그의 이름 앞 몇 글자만 타자해서 선택할 수 있습니다.

Tn: 기호 T를 사용하면 탭 스탑을 설정할 수 있습니다. 탭 스탑은 텍스트를 열 안으로 포맷해 넣는데 사용됩니다. 기호 T를 사용하지 않으면, 탭 스탑은 매 32 대화상자 단위마다 설정됩니다 (각 "대화상자 단위"의 너비는 운영 체제가 결정합니다). 기호 T를 한 번만 사용하면, 탭 스탑은 콘트롤의 전체 너비에 걸쳐서 매 n 단위마다 설정됩니다. 예를 들어, Gui, Add, ListBox, vMyListBox t64이면 탭 스탑 사이의 기본 거리가 두 배가 됩니다. 맞춤 탭스탑은 다음 예제와 같이 기호 T를 여러 번 지정하십시오: Gui, Add, ListBox, vMyListBox t8 t16 t32 t64 t128. 탭 스탑은 리스트에서 절대 열 위치마다 하나씩 설정되고 최대 50개까지 설정할 수 있습니다.

0x100: 옵션에 0x100을 포함하면 LBS_NOINTEGRALHEIGHT 스타일을 켤 수 있습니다. 이렇게 하면 행이 아래에 부분적으로 나타나지 않도록 강제로 ListBox를 지정된 높이와 정확하게 같게 만듭니다. 이 옵션은 또한 ListBox가 그의 글꼴이 변할 때 줄어들지 못하게 막습니다.

텍스트 행의 개수를 지정하려면 (또는 높이와 너비를 지정하려면), 콘트롤의 위치와 크기 변경을 참조하십시오.

ListView 그리고 TreeView

별도로 ListView 페이지와 TreeView 페이지를 참조하십시오.

Link [v1.1.06+]

설명: 클릭이 가능한 링크들을 담고 있는 텍스트 콘트롤. 링크 콘트롤은 HTML-비슷한 조판 언어를 사용합니다. 그러나 오직 <A> 태그만 지원합니다. 여는 태그 안에, Attribute="value" 형태의 속성을 지정할 수 있습니다. 이것은 전형적으로 ID 또는 HREF 속성입니다. 예를 들어:

Gui, Add, Link,, 다음은 <a href="http://ahkscript.org">링크</a>의 예입니다.
Gui, Add, Link,, 링크는 텍스트 아무데나 <a id="1">이렇게</a> 또는 <a id="2">이렇게</a> 사용할 수 있습니다.

HREF 속성이 설정되어 있고 실행이 가능하다면 (URL이나 명령어처럼) 링크를 클릭하면 자동으로 처리됩니다. HREF 속성이 사용되지 않거나 실행할 수 없다면 gMySubroutine과 같은 g-라벨이 제공되어 있다면 이 라벨이 기동됩니다. 그러면 ErrorLevel 변수에 그 속성의 값이 담깁니다. 그래서 클릭된 링크를 식별할 수 있습니다.

Hotkey

설명: 한 줄짜리 편집 콘트롤처럼 보이지만 대신에 사용자가 누른 키보드 조합을 받는 박스. 예를 들어, 사용자가 Control+Alt+C를 영어 키보드 레이아웃에서 눌렀다면, 박스는 "Ctrl + Alt + C"를 보여줍니다.

Gui, Add, Hotkey, vChosenHotkey

Gui Submit 명령어를 사용하면, 콘트롤의 연관 출력 변수가 (있다면) 핫키 수식키와 이름을 받습니다. Hotkey 명령어와 호환됩니다. 예를 들어: ^!C, +!Home, +^Down, ^Numpad1, !NumpadEnd. 콘트롤에 핫키가 없다면, 그 출력 변수는 비워집니다. 주의: 어떤 키들은 다른 이름으로 열람되었음에도 똑 같이 보입니다. 예를 들어, ^Numpad7와 ^NumpadHome는 둘 다 Ctrl + Num 7로 보입니다.

기본값으로, 콘트롤은 핫키를 지정하지 않고 시작합니다. 대신에 기본값 핫키를 지정하려면, 그의 수식키와 이름을 다음 예제와 같이 마지막 매개변수에 지정하십시오: Gui, Add, Hotkey, vChosenHotkey, ^!p
지원되는 유일한 수식키는 ^ (Control), ! (Alt), 그리고 + (Shift)입니다. 가능한 키 이름은 키 리스트를 참조하십시오.

gMySubroutine와 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 핫키를 변경할 때마다 자동으로 MySubroutine 라벨이 기동됩니다. g-라벨이 기동할 때마다 그 핫키가 콘트롤의 연관 출력 변수에 저장됩니다. 주의: g-라벨은 불완전한 핫키가 존재할 때에도 기동됩니다. 예를 들어 사용자가 Control 키를 누르고 있다면, g-라벨은 한 번 기동되고 그 출력 변수에 오직 윗꺽쇠 (^)만 담깁니다. 사용자가 그 핫키를 완료하면, 라벨이 다시 기동되고 비로서 변수에 완전한 핫키가 담깁니다.

사용자가 입력하는 핫키의 유형을 제한하려면, 단어 Limit 뒤에 다음 숫자 중 하나 또는 그 합을 지정하십시오:

1: 수식키가 없으면 불가
2: Shift-키 단독 불가
4: Control-키 단독 불가
8: Alt-키 단독 불가
16: Shift-Control 키 불가
32: Shift-Alt 키 불가
64: 이 값은 지원하지 않음 (올바르게 작동하지 않을 것임).
128: Shift-Control-Alt 키 불가.

예를 들어, Limit1은 수식키가 없이 숫자나 문자가 입력되지 못하도록 막습니다. Limit15이면 적어도 두 개의 수식 키를 요구합니다. 사용자가 금지 수식 키 조합을 타자하면, Control+Alt 조합이 자동으로 그리고 시각적으로 대신합니다.

핫키 콘트롤은 능력에 제한이 있습니다. 예를 들어, 마우스/조이스틱 핫키를 지원하지 않으며 윈도우즈 키 (LWin 그리고 RWin)를 지원하지 않습니다. 이를 우회하는 한 가지 방법은 여러 체크박스를 수단으로 사용자에게 제공하는 것입니다. 그러면 사용자는 윈도우즈 키와 같은 추가 수식키를 사용할 수 있습니다.

DateTime

설명: 한 줄 편집 콘트롤처럼 보이는 박스. 그러나 날짜와 시간을 받습니다. 드롭-다운 달력도 제공합니다. 예를 들어:

Gui, Add, DateTime, vMyDateTime, LongDate

마지막 매개변수는 다음 중 하나입니다:

(생략): 생략하면, 로케일의 짧은 날짜 형식이 사용됩니다. 예를 들어, 어떤 로케일에서는 다음과 같이 보입니다: 6/1/2005

LongDate: 로케일의 긴 날짜 형식을 사용하니다. 예를 들어, 어떤 로케일에서 다음과 같이 보입니다: Wednesday, June 01, 2005

Time: 로케일의 시간 형식을 사용하여 시간만 보여줍니다. 날짜는 보이지 않지만, 여전히 콘트롤에 존재하며 시간과 함께 YYYYMMDDHH24MISS 형식으로 열람할 수 있습니다.

(맞춤 형식): 날짜와 시간 형식을 조합해 지정하십시오. 예를 들어, M/d/yy HH:mm이면 6/1/05 21:37와 같이 보입니다. 비슷하게, dddd MMMM d, yyyy hh:mm:ss tt이면 "Wednesday June 1, 2005 09:37:45 PM" 처럼 보입니다. 기호와 숫자를 그대로 보여 주려면 홑따옴표로 다음 예제와 같이 둘러 싸야 합니다: 'Date:' MM/dd/yy 'Time:' hh:mm:ss tt. 대조적으로, 비-알파벳숫자는 스페이스, 탭, 정사선, 쌍점, 쉼표, 기타등등의 구두점 기호는 홑따옴표로 둘러쌀 필요가 없습니다. 이에 대한 예외는 홑따옴표 자체입니다: 기호 그대로의 홑따옴표를 사용하려면, 연속해서 홑따옴표를 두개 ('''') 사용하거나, 아니면 그냥 바깥에 따옴표 쌍이 이미 있는 경우 그냥 두 개를 사용하십시오.

DateTime 사용법

오늘 말고 다른 날짜를 미리 선택하려면, Options에 단어 Choose와 그 다음에 바로 날짜를 YYYYMMDD 형식으로 포함시키십시오. 예를 들어,, Choose20050531이면 May 31, 2005를 미리 선택합니다 (다른 옵션과 마찬가지로, Choose%Var%와 같은 변수도 가능하니다). 날짜/시간을 선택하지 않으려면, ChooseNone을 지정하십시오. ChooseNone는 또 콘트롤에 날짜가 없을 때마다 콘트롤 안에 체크가 해제되어 있는 체크박스를 생성합니다. 콘트롤에 날짜가 없을 때마다, Gui Submit 그리고 GuiControlGet은 빈 값을 열람합니다 (빈 문자열).

날짜에 시간은 선택적으로 나타납니다. 그렇지만 콘트롤에서 나오거나 들어갈 때 반드시 날짜가 먼저 와야 합니다. 시간 부분의 형식은 HH24MISS (시간, 분, 초)이고, 여기에서 HH24는 24-시간 형식으로 나타납니다; 예를 들어, 09는 오전 9시이고 21이면 오후 9시입니다. 그래서, 완전한 날짜-시간 문자열은 다음 YYYYMMDDHH24MISS의 형식입니다.

날짜를 YYYYMMDDHH24MISS 형식으로 지정할 때, 오직 앞 부분만 보여줄 필요가 있습니다. 생략된 나머지 부분은 다음의 기본값이 공급됩니다:
MM: Month 01
DD: Day 01
HH24: Hour 00
MI: Minute 00
SS: Second 00

드롭-다운 달력 안에서, 아래에 있는 오늘-문자열을 클릭하면 오늘 날짜를 선택할 수 있습니다. 게다가, 해와 달 이름을 클릭하면 쉽게 해와 달을 항해할 수 있습니다.

키보드 항해: Up/Down 화살표 키, NumpadPlus/Minus, 그리고 Home/End를 사용하면 콘트롤의 값을 늘리거나 줄일 수 있습니다. LeftArrow 그리고 RightArrow를 사용하면 콘트롤 안의 필드에서 필드로 이동할 수 있습니다. 드롭-다운 달력 안에서, 화살표 키를 사용하면 날에서 날로 이동할 수 있습니다; PageUp/Down를 사용하면 한 달씩 뒤로 앞으로 이동할 수 있습니다; Ctrl-PageUp/Down를 사용하면 한 해씩 앞으로 뒤로 이동할 수 있습니다; 그리고 Home/End을 사용하면 그 달의 첫 날과 마지막 날을 선택할 수 있습니다.

Gui Submit을 사용하면, 콘트롤의 연관 출력 변수가 (있다면) 선택된 날짜와 시간을 YYYYMMDDHH24MISS 형식으로 받습니다. 날짜와 시간 모두 나타납니다. 실제로 콘트롤 안에 보이는지 않는지에 상관이 없습니다.

콘트롤에 g-라벨이 있다면, 사용자가 날짜나 시간을 변경할 때마다 그 라벨이 기동됩니다. 기동될 때마다, 그 콘트롤의 연관 출력 변수가 (있다면) 자동으로 현재 선택된 날짜/시간으로 자동 업데이트 됩니다.

DateTime 옵션

Choose: 위 참조.

Range: 선택된 날짜의 범위를 제한합니다. 단어 Range 다음에, 최소 날짜와 최대 날짜를 YYYYMMDD 형식으로 지정하십시오 (그 사이에 옆줄). 예를 들어, Range20050101-20050615이면 날짜를 2005년의 전반 5.5 달로 제한합니다. 최소 날짜 또는 최대 날짜를 생략하면 그 방향으로 콘트롤을 제어하지 않고 그대로 둡니다. 예를 들어, Range20010101이면 날짜를 2001년 미만이 선택되지 못하도록 막고 Range-20091231 (앞에 옆줄)이면 날짜를 2009년을 초과하여 선택되지 못하게 막습니다. Range 옵션이 없다면, 1601과 9999 사이의 날짜를 얼마든지 선택할 수 있습니다. 날짜 안의 시간은 제한할 수 없습니다.

Right: 캘린더가 콘트롤에 오른쪽에 드롭 다운됩니다.

1: 숫자 1을 Options에 지정하면 업-다운 콘트롤을 콘트롤의 오른쪽에 제공해 날짜-시간 값을 변경할 수 있습니다. 그러면 드롭-다운 달력이 교체됩니다. 이것은 위에 기술한 긴 날짜(LongDate) 옵션 형식과 작동하지 않습니다.

2: 숫자 2를 Options에 지정하면 체크박스를 콘트롤 안에 제공할 수 있습니다. 그러면 사용자는 체크 표식을 해제해 날짜/시간이 선택되지 않았음을 알릴 수 있습니다.

MonthCal

설명: 달력 형식으로 한 달의 모든 날짜를 보여주는 높고 넓은 콘트롤. 사용자는 날짜 또는 한 범위의 날짜를 선택할 수 있습니다. 예를 들어:

Gui, Add, MonthCal, vMyCalendar

오늘 말고 다른 날짜를 미리 선택하려면, 마지막 매개변수에 YYYYMMDD 형식으로 지정하십시오 (예, 20050531). 한 범위의 날짜도 미리 선택할 수 있습니다. 사이에 옆 줄을 두고 두 날짜를 포함하면 됩니다 (예, 20050525-20050531).

MonthCal에 대하여 보통 너비 (W)와 높이 (H)를 생략하는 것이 좋습니다. 왜냐하면 한 달에 정확하게 맞도록 자동으로 크기가 조절되기 때문입니다. 수직으로 여러 달을 보여주려면, specify R2 이상을 Options에 지정하십시오. 여러 달을 수평으로 보여주려면, W-2 (W 음수 2) 이상을 지정하십시오. 이 옵션들은 모두 양 방향으로 확대하기 위해 존재합니다.

콘트롤 아래의 오늘-문자열을 클릭하면 오늘 날짜를 선택할 수 있습니다. 게다가, 해와 달 이름을 클릭하면 쉽게 새 해와 달을 선택할 수 있습니다.

DateTime의 캘린더와 다르게, 키보드 항해는 보통 MonthCal에 지원되지 않습니다.

Gui Submit 명령어를 사용하면, 콘트롤의 연관 출력 변수가 (있다면) 선택된 날짜를 YYYYMMDD 형태로 받습니다 (시간 부분 없이). 그렇지만, 다중-선택 옵션이 켜져 있다면, 최소 날짜와 최대 날짜가 사이에 옆줄을 두고 열람됩니다 (예, 20050101-20050108). 다중-선택 달력에서 하나의 날짜만 선택되었다면, 최대 날짜와 최소 날짜는 동일합니다. StringSplit을 사용하면 날짜를 분해할 수 있습니다. 예를 들어, 다음은 최소 날짜를 Date1에 최대 날짜를 Date2에 배정합니다: StringSplit, Date, MyMonthCal, -.

MonthCal에 g-라벨이 있다면, 기동할 때마다 콘트롤의 연관 출력 변수가 (있다면) 현재 선택된 날짜 또는 범위로 업데이트 됩니다. 기본값으로, g-라벨은 다음과 같은 경우에만 기동합니다: 1) 사용자가 선택을 변경한 경우; 또는 2) 2 분마다 새 날짜가 도착하는 경우 (이 행위는 OS의 기묘한 행위입니다). 그렇지만, 단어 AltSubmit가 콘트롤의 Options에 있다면, g-라벨이 더 자주 기동됩니다. 그리고 내장 변수 A_GuiEvent에 날짜를 변경하면 단어 Normal이 담깁니다. 날짜를 클릭하면 숫자 1이 담기고, MonthCal이 "마우스 나포"를 놓으면 숫자 2가 담깁니다. 예를 들어, 사용자가 새 날짜를 더블 클릭하면, 지-라벨이 다섯 번 기동됩니다: 한번은 Normal로, 두 번째는 1, 그리고 세 번째는 2입니다. 이를 이용하면 더블 클릭을 탐지할 수 있습니다. 숫자가 1인 실체 사이의 시간을 측정하면 됩니다.

날짜를 YYYYMMDD 형식으로 지정할 때, MM 그리고/또는 DD 부분은 생략이 가능합니다. 이 경우 1이라고 간주됩니다. 예를 들어, 200205는 20020501로 간주되고, 2005는 20050101로 간주됩니다.

MonthCal Options

Multi: 다중-선택. 사용자는 쉬프트 클릭이나 클릭 끌기로 한 범위의 인접한 날짜들을 선택할 수 있습니다 (사용자는 여전히 하나의 날짜를 선택할 수 있습니다). 이 옵션을 명시적으로 지정하거나 자동으로 켤 수 있습니다 콘트롤이 생성될 때 선택 범위를 지정하면 됩니다. 예를 들어: Gui, Add, MonthCal, vMyCal, 20050101-20050108. 콘트롤이 생성되면, 이 옵션은 바꿀 수 없습니다.

Range: 달력이 이동할 수 있는 범위를 제한합니다. 단어 Range 다음에, YYYYMMDD 형식으로 최소 날짜와 (사이에 옆줄) 최소 날짜를 지정하십시오. 예를 들어, Range20050101-20050615이면 선택이 2005 년의 전반 5.5 달로 제한됩니다. 최소 날짜나 최대 날짜를 생략하면 달력을 그 방향으로 제한하지 않고 그대로 둡니다. 예를 들어, Range20010101이면 2001 미만의 날짜는 선택하지 못합니다. 그리고 Range-20091231이면 (앞에 옆줄) 2009년을 초과한 날짜는 선택하지 못합니다. Range 옵션이 없다면, 1601과 9999 사이의 날짜를 얼마든지 선택할 수 있습니다.

4: 숫자 4를 Options에 지정하면 각각의 날짜 행 왼쪽에 주 번호를 보여줄 수 있습니다 (1-52) . 주 1은 첫 주에 적어도 4일 이상 있어야 합니다.

8: 숫자 8을 Options에 지정하면 오늘 날짜에 동그라미를 치지 않습니다.

16: 숫자 16을 Options에 지정하면 오늘 날짜가 콘트롤 아래에 나타나지 않습니다.

Slider

설명: 사용자가 수직 또는 수평으로 트랙을 따라가며 이동할 수 있는 슬라이딩 바. 태스크바 트레이에 있는 표준 볼륨 콘트롤이 슬라이더의 한 예입니다. 예제:

Gui, Add, Slider, vMySlider, 50

슬라이더의 시작 위치를 마지막 매개변수로 지정하십시오. 마지막 매개변수를 생략하면, 슬라이더는 0에서 시작하거나 허용 가능한 범위에서 0에 가까운 수에서 시작합니다.

사용자는 콘트롤을 다음과 같은 수단을 사용하여 슬라이드할 수 있습니다: 1) 바를 마우스로 끌어서; 2) 바의 트랙 구역에 클릭해서; 3) 콘트롤에 초점이 있는 동안 마우스 휠을 돌려서; 또는 4) 콘트롤에 초점이 있는 동안 다음 키를 눌러서: Arrow keys, Page-up, Page-down, Home, 그리고 End.

Gui Submit 명령어를 사용하면, 콘트롤의 연관 출력 변수가 (있다면) 슬라이더의 현재 위치를 받습니다. 그 위치는 또한 콘트롤의 g-라벨이 기동될 때마다 출력 변수에 저장됩니다.

슬라이더에 g-라벨이 있다면, 기본값으로 오직 사용자가 슬라이더 이동을 멈추었을 경우에만 (예를 들어 마우스를 끌다가 버튼을 놓은 경우) 기동됩니다. 그렇지만, 단어 AltSubmit이 콘트롤의 Options에 있다면, g-라벨은 모든 슬라이더 이벤트에 기동됩니다. 그리고 내장 변수 A_GuiEvent에 다음 숫자 또는 문자열 중 하나가 담깁니다:

0: 사용자가 왼-화살표 키 또는 위-화살표 키를 눌렀습니다.
1: 사용자가 우-화살표 키 도는 아래-화살표 키를 눌렀습니다.
2: 사용자가 페이지-업 키를 눌렀습니다.
3: 사용자가 페이지-다운 키를 눌렀습니다.
4: 사용자가 마우스 휠을 사용하여 슬라이더를 이동시켰습니다. 또는 새로운 위치에 끌어 떨구기를 끝냈습니다.
5: 사용자가 현재 마우스로 슬라이더를 끌고 있습니다; 즉, 마우스 버튼이 현재 눌려 있습니다.
6: 사용자가 홈키를 눌러 슬라이더를 왼쪽 또는 위쪽으로 보냈습니다.
7: 사용자가 엔드 키를 눌러 슬라이더를 오른쪽이나 아랫쪽으로 보냈습니다.
Normal: 사용자가 마우스나 키보드를 통하여 슬라이더 이동을 마쳤습니다. 주의: 마우스 휠 이동의 예외로 (#4), 위의 숫자-이벤트 중 하나에 이미 기동되었음에도 불구하고 g-라벨이 "정상" 이벤트에 대하여 다시 기동합니다.

슬라이더 옵션

Buddy1 그리고 Buddy2: 최대 두 개의 기존의 콘트롤을 지정하면 자동으로 슬라이더의 양 끝에 재배치됩니다. Buddy1은 좌변 또는 상변에 보여집니다 (Vertical 옵션 여부에 따라 달라짐). Buddy2는 우변 또는 하변에 보여집니다. 단어 Buddy1 또는 Buddy2 다음에, 기존의 콘트롤의 변수 이름을 지정하십시오. 예를 들어, Buddy1MyTopText이라면 변수 이름이 MyTopText인 콘트롤을 할당합니다.

Center: 엄지 손잡이는 (사용자가 이동하는 막대) 양쪽이 뾰족하지 않고 뭉뚱해집니다.

Invert: 콘트롤을 뒤집습니다. 낮은 값이 좌/상이 아니라 우/하에 있다고 간주됩니다. 이것은 전형적으로 수직 슬라이더를 전통적인 볼륨 콘트롤의 방향으로 이동시키는데 사용됩니다. 주의: 아래에 기술한 ToolTip 옵션은 뒤집기를 준수하지 않습니다. 그러므로 이 경우는 사용하면 안 됩니다.

Left: 엄지 손잡이는 (사용자에 의하여 이동되는 막대) 아래가 아니라 위쪽으로 뾰족합니다. 그러나 Vertical 옵션을 켜면, 엄지 손잡이는 오른쪽이 아니라 왼쪽으로 뾰족합니다.

Line: 사용자가 화살표 키를 누를 때 이동할 위치 번호를 지정합니다. 단어 Line 다음에, 이동할 위치 번호를 지정하십시오. 예를 들어: Line2.

NoTicks: 트랙을 따라 틱표식을 생략합니다.

Page: 사용자가 Page-up 또는 Page-down 키를 누를 때 이동할 위치의 번호를 지정합니다. 단어 Page 다음에, 이동할 위치의 번호를 지정하십시오. 예를 들어: Page10.

Range: 범위를 0부터 100말고 다르게 지정합니다. 단어 Range 다음에, 최소값, 옆 줄, 최대값을 지정하십시오. 예를 들어, Range1-1000이면 숫자를 1부터 1000까지 선택할 수 있습니다; Range-50-50이면 숫자를 -50부터 50까지 선택할 수 있습니다; 그리고 Range-10--5이면 숫자를 -10부터 -5까지 허용합니다.

Thick: 엄지 네모의 길이를 지정합니다 (사용자가 이동하는 사각형 막대). 단어 Thick 다음에, 픽셀 단위로 두께를 지정하십시오 (예, Thick30). Windows XP 이상에서 일정 두께를 넘어서면, 아마도 Center 옵션을 지정하거나 아니면 콘트롤에서 제거할 필요가 있을 것입니다 (콘트롤 옵션에 -Theme을 지정하면 해결할 수 있습니다).

TickInterval: 지정된 간격으로 트랙을 따라 틱표식을 제공합니다. 단어 TickInterval 다음에, 추가 틱 표식을 보여줄 간격을 지정합니다 (간격을 생략하면, 1이라고 간주합니다). 예를 들어, TickInterval10이면 틱표식이 매 10 위치마다 하나씩 보입니다.

ToolTip: 사용자가 슬라이더를 끄는 동안 위치를 숫자로 보고하는 툴팁을 생성합니다. 툴팁을 기본 위치 아닌 곳에 보여주려면, 대신 다음 중 하나를 지정하십시오: ToolTipLeft 또는 ToolTipRight (수직 슬라이더 용); ToolTipTop 또는 ToolTipBottom (수평 슬라이더 용).

Vertical: 콘트롤을 위 아래로 움직입니다.

위의 옵션들은 콘트롤이 생성된 후에 GuiControl을 통하여 바꿀 수 있있습니다.

Progress

설명: 전형적으로 연산의 완성을 향해 얼마나 많이 진도가 나갔는지 나타내는 데 사용되는 이중 컬러 바. 예제:

Gui, Add, Progress, w300 h20 cBlue vMyProgress

바의 시작 위치를 마지막 매개변수에 지정하십시오 (생략하면, 바는 0에서 시작하거나 허용하는 범위 내에서 0에 가장 까까운 숫자에서 시작합니다). 나중에 바의 위치를 바꾸려면, 다음 예제를 따르십시오. 모든 예제가 연관 변수 이름이 MyProgress인 프로그레스 바에 작동합니다:

GuiControl,, MyProgress, +20  ; 현재 위치를 20만큼 증가시킵니다.
GuiControl,, MyProgress, 50  ; 현재 위치를 50으로 설정합니다.

수평 프로그레스 바에 대하여, 바의 두께는 그 콘트롤의 높이와 같습니다. 수직 스크롤 바에 대하여, 바의 너비는 그 콘트롤의 너비와 같습니다.

Progress 옵션

Cn: 바의 컬러를 바꿉니다. n에 16가지 기본 HTML 컬러 이름중 하나 또는 6-자리 RGB 컬러 값을 지정하십시오. 예제: cRed, cFFFF33, cDefault. C 옵션을 사용하지 않으면 (또는 cDefault를 지정하면), 시스템의 기본 바 컬러가 사용됩니다.

BackgroundN: 바의 배경색을 변경합니다. n에 16가지 기본 HTML 컬러 이름중 하나 또는 6-자리 RGB 값을 지정하십시오. 예제: BackgroundGreen, BackgroundFFFF33, BackgroundDefault. Background 옵션을 사용하지 않으면 (또는 BackgroundDefault를 지정하면), 배경색은 그 뒤에 있는 창의 배경색 또는 탭 콘트롤의 배경색이 사용됩니다.

Range: 범위를 0부터 100말고 다른 값으로 바꿀 수 있습니다. 단어 Range 다음에, 최소값, 옆줄 하나, 그리고 최대 값을 지정하십시오. 예를 들어, Range0-1000이면 숫자르 0부터 1000까지 지원합니다; Range-50-50이면 숫자를 -50부터 50까지 허용합니다; 그리고 Range-10--5이면 -10부터 -5 까지의 숫자를 사용할 수 있습니다.

-Smooth (마이너스 Smooth): 부드럽게 연속된 바가 아니라 세크먼트의 길이를 보여줍니다. -Smooth를 지정해야만 Windows XP 이후에서 테마 프로그레스 바를 보여줄 수 있습니다. 다른 조건으로는 바에 맞춤 컬러가 없어야 한다는 것입니다; 즉, C 그리고 Background 옵션은 생략해야 합니다.

Vertical: 바를 세우거나 수직으로 늘어뜨립니다.

위의 옵션은 콘트롤이 생성된 후에 GuiControl를 통하여 바꿀 수 있습니다.

GroupBox

설명: 사각 테두리/프레임, 종종 다른 콘트롤 둘레에 서로 관련이 있음을 나타내는 데 사용됨. 이 경우, 마지막 매개변수는 박스의 제목이고, 존재한다면, 좌상 모서리에 보여집니다. 예제:

Gui, Add, GroupBox, w400 h300, Geographic Criteria

기본값으로 GroupBox의 제목은 오직 한줄의 텍스트만 가질 수 있습니다. 이는 옵션에 Wrap 을 지정하면 바꿀 수 있습니다.

콘트롤 안에 행의 개수를 지정하려면 (또는 그의 너비와 높이를 지정하려면), 콘트롤의 위치와 크기 변경을 참조하십시오.

Tab2

설명: 여러 페이지를 담고 있는 커다란 콘트롤. 각 페이지에 다른 콘트롤이 담겨 있습니다. 이 관점에서 한 발 더 나아가 이런 페이지들을 "탭"이라고 부릅니다.

Tab2 vs. Tab: v1.0.47.05에서 "Tab2" 콘트롤이 추가되었습니다. 원래 "Tab" 콘트롤의 희귀한 재그리기 문제를 해결하였습니다 (예, 그의 콘트롤의 어떤 부분을 예를 들어 스크롤바를 클릭하여 GUI를 활성화 하면 제대로 다시 그리지 못했습니다). 원래의 탭 콘트롤은 하위 호환을 위해 유지됩니다. 왜냐하면 Tab2는 자신의 탭 콘트롤을 자신에게 포함된 콘트롤들 다음에 탭-키 항해 순서로 배치하기 때문입니다. 새 스크립트는 가능하면 Tab2를 사용해야 합니다. 예제:

Gui, Add, Tab2,, General|View|Appearance|Settings

위의 마지막 매개변수는 파이프로 구분된 탭 이름 리스트입니다. 창이 처음 나타날 때 탭 중에 하나를 미리 선택하려면, 두 개의 파이프 문자를 그 다음에 포함하십시오 (예, Red|Green||Blue). 다른 방법으로, Options에 단어 Choose와 바로 다음에 미리 선택할 숫자를 지정할 수있습니다. 예를 들어, Choose5는 다섯 번째 탭을 미리 선택합니다 (다른 옵션들처럼, Choose%Var%와 같은 변수가 될 수도 있습니다). 콘트롤이 생성된 다음에 선택된 탭을 변경하려면, 또는 탭을 추가하거나 제거하려면, GuiControl을 사용하십시오.

탭 콘트롤을 만들고 난 후, 이어서 추가되는 콘트롤들은 자동으로 그의 첫 번째 탭에 속합니다. 이것은 다음 예제를 따라 언제든지 바꿀 수 있습니다:

Gui, Tab  ; 미래의 콘트롤들은 탭 콘트롤의 일부가 아닙니다.
Gui, Tab, 3  ; 미래의 콘트롤들은 현재 탭 콘트롤의 세 번째 탭에 속합니다.
Gui, Tab, 3, 2  ; 미래의 콘트롤들은 두 번째 탭 콘트롤의 세 번째 탭이 소유합니다.
Gui, Tab, Name  ; 미래의 콘트롤들은 이름이 Name (대소문자 구분 없음)으로 시작하는 탭이 소유합니다.
Gui, Tab, Name,, Exact  ; 위와 동일하지만 정확하게 부합해야 합니다 (대소문자도 구분).

위의 예제를 사용해 아직 존재하지 않는 탭이나 탭 콘트롤에 할당하는 것도 가능합니다 (Name 방법은 예외임). 그러나 그 경우, 아래에 기술된 상태적인 위치 지정 옵션을 지원하지 않습니다.

배치: 탭 콘트롤의 각 탭이 그의 첫 부-콘트롤을 받을 때, 그 부-콘트롤은 특수한 기본 위치가 있습니다. 기본 위치는 다음 조건에 따릅니다:

  1. X와 Y 좌표가 둘 다 생략되면, 그 첫 부-콘트롤은 (표준 여백을 가진) 탭 콘트롤 내부의 좌상 모서리에 배치됩니다. 그리고 첫 부콘트롤 외의 부콘트롤들은 그 아래로 배치됩니다;
  2. X+n 그리고/또는 Y+n 옵션이 지정되었으면, 그 첫 부 콘트롤은 탭 콘트롤 내부의 좌상 모서리에 상대적으로 배치됩니다. 예를 들어, x+10 y+10을 지정하면 그 부콘트롤이 좌상 모서리로부터 10 픽셀 오른쪽 그리고 10 픽셀 아래쪽에 자리를 잡습니다.

부-콘트롤들은 반드시 탭 콘트롤의 경계 안에 존재해야 할 필요는 없습니다: 탭이 선택되거나 해제될 때 여전히 숨거나 보여집니다. 이 행위는 특히 아래에 기술된 "버튼" 스타일의 행위에 적합합니다.

Gui Submit 명령어를 사용하면, 콘트롤의 연관 출력 변수가 (있다면) 현재 선택된 탭의 이름을 받습니다. 그렇지만, 그 콘트롤에 AltSubmit 특성이 있다면, 그 출력 변수는 대신에 탭의 위치를 받습니다 (첫번째 탭은 1이고, 두 번째는 2이고, 등등.).

gMySubroutine과 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 MySubroutine 라벨이 사용자가 새 탭으로 변경할 때마다 자동으로 기동됩니다. 탭 콘트롤에 g-라벨과 출력 변수가 둘 다 있다면, 사용자가 새 탭으로 전환할 때마다, 출력 변수는 이전에 선택된 탭 이름이 설정됩니다 (또는 AltSubmit의 경우라면 번호가 설정됩니다).

키보드 항해: 사용자는 Control-PageDown/PageUp을 눌러 탭 콘트롤의 페이지에서 페이지로 항해할 수 있습니다; 키보드 초점이 탭 콘트롤에 속하지 않는 콘트롤에 있다면, 그 창의 첫 탭 콘트롤로 초점이 이동합니다. Control-Tab 그리고 Control-Shift-Tab을 사용할 수도 있습니다. 단, 현재 초점이 있는 콘트롤이 여러-줄 편집 콘트롤이라면 잘 작동하지 않습니다.

각 창은 최대 255 탭 콘트롤을 가질 수 있습니다. 각 탭 콘트롤은 256 탭 (페이지) 이상을 가질 수 없습니다. 게다가, 탭 콘트롤은 또다른 탭 콘트롤을 담을 수 없습니다.

Tab 옵션

Choose: 위 참조.

-Background (마이너스 다음에 단어 Background): 창의 맞춤 배경색을 오버라이드 하고 시스템의 기본 탭 콘트롤을 사용합니다. +Theme -Background를 지정하면 탭 콘트롤이 현재 바탕화면 테마를 준수하도록 만들 수 있습니다. 그렇지만, 대부분의 콘트롤 유형은 그런 탭 콘트롤 안에서 이상하게 보일 것입니다. 왜냐하면 배경색이 탭 콘트롤의 배경색과 어울리지 않기 때문입니다. 어떤 콘트롤 유형에 대해서는 BackgroundTrans을 옵션에 추가하면 이 문제를 해결할 수 있습니다 (예를 들어 Text).

Buttons: 일련의 탭이 아니라 일련의 버튼들을 콘트롤 상단에 생성합니다 (이 경우, 기본적으로 테두리가 없습니다. 왜냐하면 보여주기 구역에 전형적으로 콘트롤이 들어 있지 않기 때문입니다).

Left/Right/Bottom: 다음 단어 중 하나를 지정하면 탭을 상단 대신에 왼쪽, 오른쪽, 아래쪽에 배치할 수 있습니다. Left와 Right의 한계에 관한 것은 TCS_VERTICAL를 참조하십시오.

-Wrap: 탭이 한 행을 넘게 차지하지 못하도록 막습니다 (이 경우 탭이 너무 많이 맞출 수 없으면, 화살표 버튼이 나타나 사용자는 그를 열어 더 많은 탭을 볼 수 있습니다).

콘트롤 안에 텍스트 행의 개수를 (또는 그의 높이와 너비를) 지정하려면, 콘트롤의 위치와 크기 변경을 참조하십시오.

탭 안의 아이콘: SendMessage를 통하여 아이콘을 각 탭의 이름/텍스트 옆에 보여줄 수 있습니다. 이것은 포럼 주제 탭 안의 아이콘에서 다룹니다.

StatusBar[v1.0.44+]

설명: 창의 하단에 부착되는 한 행의 텍스트 그리고/또는 아이콘들, 전형적으로 상황 변화를 보고하는 데 사용됩니다. 예제:

Gui, Add, StatusBar,, 상태 바의 시작 텍스트 (생략하면 빈 채로 시작함).
SB_SetText("현재 " . RowCount . " 행이 선택되었습니다.")

상태바의 가장 간단한 사용법은 무언가 바뀔 때마다 사용자에게 보고해야 한다면 SB_SetText()를 호출하는 것입니다. 여러 정보를 보고해야 한다면, SB_SetParts()를 통하여 바를 여러 구역으로 나누십시오. 아이콘을 바에 보여주려면, SB_SetIcon()를 호출하십시오.

다음의 모든 StatusBar 함수들은 현재 쓰레드의 기본 GUI 창에 작동합니다 (이는 Gui, 2:Default를 통하여 바꿀 수 있습니다). 기본 창이 존재하지 않거나 상태 바가 없으면, 모든 SB 함수들은 0을 돌려주어 문제가 있음을 알립니다.

SB_SetText(NewText [, PartNumber, Style])

상태 바의 지정된 부분에 NewText를 보여줍니다. PartNumber를 생략하면, 기본값은 1입니다. 그렇지 않으면, 1과 256 사이의 정수를 지정하십시오. Style을 생략하면, 기본값은 0입니다. 기본으로 바가 들어가 보이게 만드는 전통적인 테두리를 사용합니다. 그렇지 않으면, 1을 지정하면 테투리가 없고 2를 지정하면 바가 튀어 나오게 보이게 만드는 테투리를 가집니다. 마지막으로, NewText의 어디에나 최대 두 개의 탭 문자 (`t)가 나타날 수 있습니다: 첫 번째 탭의 오른쪽에 있는 것들은 모두 그 부분 안에서 중앙에 정렬됩니다. 그리고 두 번째 탭 오른쪽으로 있는 것들은 모두 오른쪽에 정렬됩니다. SB_SetText()는 성공하면 1 실패하면 0을 돌려줍니다.

SB_SetParts([Width1, Width2, ... Width255])

바를 지정된 너비에 맞게 여러 부분으로 나눕니다 (픽셀 단위). 모든 매개변수를 생략하면, 바는 한 개짜리 긴 부분으로 복구됩니다. 그렇지 않으면, 마지막은 제외하고 각 부분의 너비를 지정하십시오 (마지막은 바의 나머지 너비가 채웁니다). 예를 들어, SB_SetParts(50, 50)는 세 부분을 생성합니다: 앞쪽 두 분은 각각 너비가 50픽셀이고 마지막은 나머지 너비가 다 채웁니다. 주의: SB_SetParts()로 "삭제된" 부분은 다음에 보여질 때 텍스트 없이 시작합니다. (또, 그의 아이콘들은 자동으로 파괴됩니다). 성공하면, SB_SetParts()는 0 아닌 값을 돌려줍니다 (상태 바의 HWND). 실패하면 0을 돌려줍니다.

SB_SetIcon(Filename [, IconNumber, PartNumber])

작은 아이콘을 지정된 부분에 있는 텍스트 왼쪽에 보여줍니다 (PartNumber를 생략하면, 기본값은 1입니다). Filename은 아이콘 (.ICO), 커서 (.CUR), 또는 에니메이션 커서 (.ANI) 파일의 이름입니다 (애니메이션 커서는 실제로 바에서 움직임이 없습니다). 다른 아이콘 자원으로는 다음 유형의 파일이 포함됩니다: EXE, DLL, CPL, SCR, 그리고 기타 아이콘 자원을 보유한 유형들. 파일에 있는 첫 번째 아이콘 말고 아이콘 그룹을 사용하려면, 그의 번호를 IconNumber에 지정하십시오. 예를 들어, SB_SetIcon("Shell32.dll", 2)이면 두 번째 아이콘 그룹의 기본 아이콘을 사용합니다. IconNumber가 음수이면, 그의 절대값이 실행 파일 안에 있는 아이콘의 자원 ID라고 간주됩니다. SB_SetIcon()는 성공하면 그 아이콘의 HICON를 돌려줍니다. 실패하면 0을 돌려줍니다. HICON은 대부분의 스크립트에서 무시해도 안전한 시스템 자원입니다. 왜냐하면 상태 바 창이 파괴될 때 자동으로 파괴되기 때문입니다. 비슷하게, SB_SetIcon()이 예전 아이콘을 새 아이콘으로 교체하면 자동으로 예전 아이콘이 파괴됩니다. 이는 다음과 같이 피할 수 있습니다:

Gui +LastFound
SendMessage, 0x40F, part_number - 1, my_hIcon, msctls_statusbar321  ; 0x40F is SB_SETICON.

SB_SetProgress()

상태 바 안에 프로그레스 바를 만들고 제어합니다. 이 기능은 다음에서 얻을 수 있습니다: www.autohotkey.com/forum/topic37754.html

G-Label 고지

gMySubroutine과 같은 g-라벨을 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 바를 클릭할 때마다 MySubroutine 라벨이 자동으로 기동됩니다. 이 서브루틴은 내장 변수 A_Gui와 A_GuiControl를 참고할 수 있습니다. 더욱 중요한 것은 A_GuiEvent를 참고할 수 있다는 것인데, 이 안에 다음 문자열 중 하나가 들어 있습니다 (미래 버전과의 호환을 위해, 스크립트는 이 값들만이 가능한 유일한 값이라고 간주하면 안 됩니다):

  • Normal: 사용자가 바를 왼클릭 했습니다. 변수 A_EventInfo에 그 부분 번호가 담깁니다 (그렇지만, 부분 번호는 사용자가 바의 오른쪽 변에 있는 크기 조절 손잡이 근처를 클릭하면 아주 큰 정수일 수 있습니다).
  • RightClick: 사용자가 바를 우클릭 했습니다. 변수 A_EventInfo에 부분 번호가 담깁니다. 주의: GuiContextMenu는 상태 바에 g-라벨이 있더라도 호출되지 않습니다. 또한 사용자가 어느 부분을 클릭했는지 스크립트가 알아야 할 필요가 있을 때 (A_EventInfo) GuiContextMenu 대신에 g-라벨의 RightClick 이벤트를 사용해야 합니다.
  • DoubleClick: 사용자가 바를 더블클릭 했습니다. 변수 A_EventInfo에 그 부분 번호가 담깁니다.
  • R: 사용자가 바를 더블-우클릭 했습니다. 변수 A_EventInfo에 그 부분 번호가 담깁니다.

글꼴 그리고 색

글꼴 크기, 모양, 그리고 스타일을 (다른 보통의 콘트롤처럼) Gui Font를 통하여 설정할 수 있지만, 텍스트 컬러는 바꿀 수 없습니다. 또한, Gui Color를 준수하지 않습니다; 대신에, Options에 단어 Background와 즉시 컬러 이름 (컬러-차트 참조) 또는 RGB 값을 지정하면 (0x 접두사는 선택적) 상태 바의 배경 색을 바꿀 수 있습니다. 예제: BackgroundSilver, BackgroundFFDD99, BackgroundDefault.

StatusBar 감추기

상태 바는 생성시 Gui, Add, StatusBar, Hidden vMyStatusBar를 통하여 숨을 수 있습니다. 생성 후에 숨기려면 GuiControl, Hide, MyStatusBar를 사용하십시오. 보여주려면, GuiControl, Show, MyStatusBar를 사용하십시오. 주의: 상태바를 숨겨도 창의 높이는 줄지 않습니다. 줄이고 싶다면, 다음 방법이 쉽습니다: Gui, Show, AutoSize.

스타일 (별로 사용 안됨)

StatusBar 스타일 테이블 참조.

알려진 한계

1) 상태 바와 중첩되는 콘트롤은 종종 상태 바 위에 그려질 수 있습니다. 이를 피하는 한 가지 방법은 GuiSize label을 통하여 동적으로 그런 콘트롤을 줄이는 것입니다. 2) 창 당 상태 바가 하나 뿐이라는 제한이 있습니다.

예제

TreeView 페이지 아래에 여러 부분 상태 바를 시연합니다.

ActiveX [v1.1.03+]

ActiveX 컴포넌트는 MSIE 브라우저 콘트롤 같이 다음 예제를 따라 GUI 창에 내장할 수 있습니다:

Gui Add, ActiveX, w980 h640 vWB, Shell.Explorer  ; 마지막 매개변수는 ActiveX 컴포넌트의 이름입니다.
WB.Navigate("http://ahkscript.org/boards/")  ; 이것은 웹 브라우저 콘트롤에 종속적입니다.
Gui Show

콘트롤이 생성될 때, ActiveX 객체는 콘트롤의 연관 변수에 저장됩니다. GuiControlGet을 사용하면 그 객체를 열람할 수도 있습니다.

이 객체가 노출하는 이벤트를 처리하려면, 아래에 보여주는 바와 같이 ComObjConnect를 사용하십시오:

Gui Add, Edit, w930 r1 vURL, http://ahkscript.org/boards/
Gui Add, Button, x+6 yp w44 Default, Go
Gui Add, ActiveX, xm w980 h640 vWB, Shell.Explorer
ComObjConnect(WB, WB_events)  ; WB의 이벤트를 WB_events 클래스 객체에 연결합니다.
Gui Show
; 계속해서 최초의 페이지를 적재합니다:
ButtonGo:
Gui Submit, NoHide
WB.Navigate(URL)
return

class WB_events
{
    NavigateComplete2(wb, NewURL)
    {
        GuiControl,, URL, %NewURL%  ; URL 편집 콘트롤을 업데이트 합니다.
    }
}

GuiClose:
ExitApp

ComObjType을 사용하면 콘트롤의 변수에 저장된 객체의 유형을 알아낼 수 있습니다.

Custom [v1.1.10+]

AutoHotkey가 직접적으로 지원하지 않는 콘트롤도 GUI 창 안에 임베드할 수 있습니다. 임베드 하려면, Gui, Add에 Class 옵션을 통하여 Win32 클래스 이름을 지정해야 합니다. 예제:

Gui, Add, Custom, ClassComboBoxEx32  ; ComboBoxEx 콘트롤을 추가합니다.
Gui, Add, Custom, ClassScintilla  ; Scintilla 콘트롤을 추가합니다.  SciLexer.dll 라이브러리를 먼저 적재한 후에 콘트롤을 추가할 수 있습니다.

Gui, Add 또는 GuiControl/Get를 통하여 텍스트를 콘트롤에서 열람하거나 교체할 때 오토핫키는 표준 윈도우즈 콘트롤 텍스트 루틴을 사용합니다.

G-라벨 고지: gMySubroutine와 같은 g-라벨을 콘트롤의 옵션에 나열하면 그 콘트롤으로부터 들어오는 이벤트들을 나포할 수 있습니다. 이 서브루틴은 내장 변수 A_Gui와 A_GuiControl를 참고할 수 있습니다. 더욱 중요한 것은 A_GuiEvent도 참고할 수 있다는 것인데, 그 안에 다음 문자열 중 하나가 들어 있습니다 (미래 버전과의 호환을 위해, 스크립트는 이 값들만이 유일한 값이라고 간주하면 안 됩니다):

  • Normal: WM_COMMAND 메시지를 받았습니다. A_EventInfo에 콘트롤에-정의된 고지 코드가 담깁니다 ( C/C++에서 HIWORD(wParam)와 동등).
  • N: WM_NOTIFY 메시지를 받았습니다. A_EventInfo에 콘트롤 고지 구조체를 가리키는 포인터가 담깁니다 (NMHDR). ErrorLevel에 할당해서 32-비트 부호 있는 정수 값이 콘트롤에 반환될 수 있습니다. (기본값으로, g-라벨 쓰레드의 ErrorLevel은 0으로 설정됩니다). 무효한 값은 0으로 간주됩니다.

다음 예제는 IP 주소 콘트롤을 추가하고 사용하는 법을 보여줍니다:

Gui, Add, Custom, ClassSysIPAddress32 r1 w150 hwndhIPControl gIPControlEvent
Gui, Add, Button, Default, OK
IPCtrlSetAddress(hIPControl, A_IPAddress1)
Gui, Show
return

GuiClose:
ExitApp

ButtonOK:
Gui, Hide
ToolTip
MsgBox % "You chose " IPCtrlGetAddress(hIPControl)
ExitApp

IPControlEvent:
if A_GuiEvent = Normal
{
    ; WM_COMMAND 메시지를 받았습니다.

    if (A_EventInfo = 0x0300)  ; EN_CHANGE
        ToolTip Control changed!
}
else if A_GuiEvent = N
{
    ; WM_NOTIFY 메시지를 받았습니다.

    ; 고지 코드를 얻습니다. 보통 이 필드는 UInt이지만  IP 주소 콘트롤은
    ; 음수 코드를 사용합니다. 그래서 편의상 부호있는 정수로 읽습니다.
    nmhdr_code := NumGet(A_EventInfo + 2*A_PtrSize, "int")
    if (nmhdr_code != -860)  ; IPN_FIELDCHANGED
        return

    ; NMIPADDRESS 구조체로부터 정보를 추출합니다
    iField := NumGet(A_EventInfo + 2*A_PtrSize + 4, "int")
    iValue := NumGet(A_EventInfo + 2*A_PtrSize + 8, "int")
    if iValue >= 0
        ToolTip Field #%iField% modified: %iValue%
    else
        ToolTip Field #%iField% left empty
}
return

IPCtrlSetAddress(hControl, ipaddress)
{
    static WM_USER := 0x400
    static IPM_SETADDRESS := WM_USER + 101

    ; SendMessage에 사용하기 위해 IP 주소를 32-비트 워드로 팩합니다.
    ipaddrword := 0
    Loop, Parse, ipaddress, .
        ipaddrword := (ipaddrword * 256) + A_LoopField
    SendMessage IPM_SETADDRESS, 0, ipaddrword,, ahk_id %hControl%
}

IPCtrlGetAddress(hControl)
{
    static WM_USER := 0x400
    static IPM_GETADDRESS := WM_USER + 102

    VarSetCapacity(addrword, 4)
    SendMessage IPM_GETADDRESS, 0, &addrword,, ahk_id %hControl%
    return NumGet(addrword, 3, "UChar") "." NumGet(addrword, 2, "UChar") "." NumGet(addrword, 1, "UChar") "." NumGet(addrword, 0, "UChar")
}

관련 항목

ListView, TreeView, Gui, GuiControl, GuiControlGet, Menu


Hotkey

스크립트가 실행되는 동안에 핫키를 만들고, 변경하고, 켜고 끕니다.

Hotkey, KeyName [, Label, Options]
Hotkey, IfWinActive/Exist [, WinTitle, WinText]
Hotkey, If [, Expression]

매개변수

KeyName

핫키 활성화 키의 이름, 수식 심볼을 포함. 예를 들어, Win+C 핫키라면 #c를 지정합니다.

KeyName이 이미 핫키로 존재하면, 그 핫키는 그 명령어의 다른 매개변수들의 값을 가지고 갱신됩니다.

KeyName은 기존의 핫키 라벨의 이름이 될 수도 있습니다 (즉, 겹-쌍점 라벨). 그런 경우 핫키는 그 명령어의 다른 매개변수들의 값을 가지고 갱신됩니다.

기존의 핫키를 지정할 때, KeyName은 대소문자를 구분하지 않습니다. 그렇지만, 키의 이름은 반드시 기존의 핫키와 철자가 같아야 합니다 (예,. 이런 목적으로 Esc는 Escape와 같지 않습니다). 또, ^!+#와 같은 수식 심볼 순서는 문제가 되지 않습니다. GetKeyName을 사용하면 키 이름의 표준 철자를 열람할 수 있습니다.

핫키가 처음 만들어질 때 -- Hotkey 명령어 또는 겹-쌍점 라벨을 사용하여 -- 그의 키 이름과 그의 수식 심볼의 순서는 그 핫키의 영구한 이름이 되어 A_ThisHotkey에 반영됩니다. 이 이름은 그 핫키의 모든 변형이 공유하고, 바뀌지 않습니다. 나중에 Hotkey 명령어가 그 핫키에 다른 심볼 순서를 가지고 접근해도 마찬가지입니다.

[v1.1.15+]: 핫키 변형이 이미 존재하면, 그의 행위는 KeyName에 틸드 (~) 접두사가 있는가 없는가에 맞게 갱신됩니다. 그렇지만, v1.1.19 이전에서, 핫키는 Label이 생략되면 갱신되지 않았습니다.

[v1.1.19+]: 갈고리 사용 ($) 접두 심볼을 기존의 핫키에 추가할 수 있습니다. 이 접두 심볼은 핫키의 모든 변형에 영향을 주며 제거가 불가능합니다. v1.1.19이전에서, 기존 핫키의 변형을 변경할 때 이 접두 심볼은 무시되었습니다.

Label

핫키가 눌릴 때 그의 내용이 (새로운 쓰레드로) 실행될 라벨의 이름. 정상 라벨과 핫키/핫스트링 라벨을 모두 사용할 수 있습니다. 뒤에 따라오는 쌍점은 포함하면 안됩니다. Label이 동적이면 (예, %VarContainingLabelName%), IsLabel(VarContainingLabelName)을 미리 호출해 그 라벨이 존재하는지 확인할 수 있습니다.

[v1.1.20+]: 유효하지 않은 라벨 이름이라면, 이 매개변수는 함수의 이름, 또는 (함수 객체를 담고 있는) 단일 변수 참조일 수 있습니다. 예를 들어, Hotkey %funcobj%, On 또는 Hotkey % funcobj, On. 객체를 돌려주는 다른 표현식은 현재 지원되지 않습니다. 핫키가 실행될 때, 함수는 매개변수 없이 호출됩니다. 핫키는 함수로 정의될 수 있습니다. Hotkey 명령어가 필요없습니다.

이 매개변수는 KeyName이 이미 핫키로 존재하면 빈 채로 있을 수 있습니다. 그런 경우, 그의 라벨은 바뀌지 않습니다. 이것은 핫키의 옵션만 바꿀 때 유용합니다.

라벨 또는 함수가 지정되어 있지만 핫키는 이전에 이 명령어 때문에 꺼져 있다면, 그 핫키는 여전히 꺼진 채로 있을 것입니다. 이를 피하려면 단어 ON을 Options에 포함시키십시오.

이 매개변수는 다음 특수 값들 중 하나가 될 수도 있습니다:

On: 핫키가 활성화 됩니다. 핫키가 이미 켜져 있다면 아무 조치도 없습니다.

Off: 핫키가 비활성화 됩니다. 핫키가 이미 꺼져 있다면 아무 조치도 없습니다.

Toggle: 핫키를 반대 상태로 설정합니다 (enabled 또는 disabled).

AltTab (기타 등등): 이것들은 특수한 Alt-Tab 핫키 초치들로서 여기에 기술되어 있습니다.

주의: 이름이 On, Off, Toggle 또는 AltTab으로 (또는 이 명령어로 인지되는 기타 변형으로) 라벨을 정의하면 일관성 없는 행위를 야기할 수 있습니다. 이런 값들은 절대로 라벨 이름으로 사용하지 않기를 바랍니다.

Options

다음 기호들과 선택적으로 그 사이에 스페이스가 있는 문자열. 예를 들어: UseErrorLevel B0.

UseErrorLevel: 명령억 문제를 만나면, 이 옵션은 경고 대화상자를 건너뛰고, ErrorLevel에 아래 테이블의 코드 중 하나를 설정한 다음, 현재 쓰레드를 계속 실행시킵니다.

On: 핫키가 현재 꺼져 있으면 켭니다.

Off: 핫키가 현재 켜져 있으면 끕니다. 이는 전형적으로 처음에 끈 상태로 시작하는 핫키를 만드는 데 사용됩니다.

B 또는 B0: 기호 B를 지정하면 핫키를 #MaxThreadsBuffer에 기술된 대로 버퍼 처리합니다. B0 (B 다음에 영)을 지정하면 이 유형의 버퍼 처리를 끌 수 있습니다.

Pn: 기호 P 다음에 핫키의 쓰레드 우선 순위를 지정하십시오. 핫키를 만들 때 P 옵션을 생략하면, 0이 사용 됩니다.

Tn: #MaxThreadsPerHotkey에 기술된 것처럼 기호 T 다음에 이 핫키에 허용할 쓰레드의 개수를 지정합니다. 예를 들어: T5.

B나 T 옵션 기호가 생략되고 그리고 핫키가 이미 존재하면, 그런 옵션은 바뀌지 않습니다. 그러나 핫키가 아직 존재하지 않으면 -- 즉, 이 명령어로 생성될 예정이라면 -- 옵션은 최근에 효과가 있던 옵션이 기본값이 됩니다. 예를 들어, 스크립트 아래에 최대한 가깝게 나타나는 #MaxThreadsBuffer의 실체가 사용됩니다. #MaxThreadsBuffer가 스크립트에 나타나지 않으면, 그의 기본 설정이 (이 경우에는 OFF가) 사용됩니다. 이 행위는 #IfWin에도 적용됩니다: 가장 아래쪽에 나타나는 실체가 새로 생성된 핫키에 적용됩니다. 단, 스크립트가 시작된 이후로 "Hotkey IfWin"이 실행된 경우는 예외입니다.

IfWinActive
IfWinExist

(IfWinNotActive 그리고 IfWinNotExist도 지원합니다). 이부-명령어들은 연이어 생성되는 모든 핫키가 문맥을 감지하게 만듭니다. 자세한 것은 아래 참조.

WinTitle
WinText

이 매개변수들 안에서, %var%와 같은 변수 참조는 모두 명령어가 완료되는 순간 영속적이 됩니다. 다른 말로, 그 다음부터 변수의 내용에 가하는 변경을 기존의 IfWin 핫키들은 보지 못합니다.

#IfWinActive/Exist처럼, WinTitle 그리고 WinText는 SetTitleMatchMode 그리고 DetectHiddenWindows에 자동-실행 섹션에 설정된 대로 기본 설정을 사용합니다. 더 자세한 것은 #IfWinActive/Exist를 참조하십시오.

If, Expression

[AHK_L]: #If Expression의 상대편. Expression은 기존의 #If Expression에서 "#If" 또는 "#If,"를 제외한 텍스트에 정확하게 부합해야 합니다. Hotkey 명령어에 사용될 때, 쉼표가 "If"가 뒤에 필요합니다. 이 명령어는 새 표현식을 만들 수 없지만, 기존의 표현식을 사용하여 핫키를 새로 만들 수 있습니다. #If 예제 4를 참조하십시오.

알려진 한계: Expression에 and/or 연산자가 포함되어 있으면, 기존의 표현식으로 인지되지 않습니다. 우회책으로, 동등한 &&/|| 연산자를 원래의 #If 표현식과 Hotkey 명령어에 건넨 표현식에 모두 사용하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 다음과 같을 경우에만 바뀝니다: 1) 첫 번째 매개변수가 IfWin[Not]Active/Exist인 경우 문제 있으면 1이 설정되고 그렇지 않으면 0이 설정됩니다; 또는 2) 단어 UseErrorLevel이 Options 매개변수에 존재하는 경우입니다.

에러 | 설명
1 | Label 매개변수가 존재하지 않는 라벨 이름을 지정합니다.
2 | KeyName 매개변수는 현재 키보드 레이아웃/언어가 인지하지 못하거나 지원하지 않는 하나 이상의 키를 지정합니다.
3 | 지원되지 않는 접두 키. 예를 들어, WheelDown & Enter과 같이 마우스 휠을 핫키에 접두 키로 사용하는 것은 지원되지 않습니다.
4 | KeyName 매개변수가 AltTab 또는 ShiftAltTab 조치와 함께 사용하기에 적합하지 않습니다. 두 키의 조합이 필요합니다. 예를 들어: RControl & RShift::AltTab.
5 | 명령어가 존재하지 않는 핫키를 변경하려고 시도했습니다.
6 | 명령어가 존재하지 않는 기존 핫키의 변형을 변경하려고 시도했습니다. 이를 해결하려면, Hotkey IfWin를 사용해 변경될 그 핫키의 변형이 부합할 기준을 설정하십시오.
98 | 이 핫키를 생성하면 스크립트-당-1000-핫키 제한을 초과합니다 (그렇지만, 각 핫키는 무한 개수의 변형을 가질 수 있으며, 핫스트링의 개수에도 제한이 없습니다).
99 | 메모리 고갈. 아주 희귀한 경우이며 보통 운영 체제가 불안정한 상태가 될 경우에만 일어납니다.

팁: UseErrorLevel 옵션은 핫키 변형의 존재를 테스트 하는 데 사용할 수 있습니다. 예를 들어:

Hotkey, ^!p,, UseErrorLevel
if ErrorLevel in 5,6
    MsgBox 핫키가 존재하지 않습니다. 아니면 현재 IfWin 기준에 맞는 변형이 없습니다.

논평

현재의 IfWin 설정은 Hotkey 명령어가 처리할 핫키의 변형을 결정합니다.

선택된 핫키와 핫스트링을 현재 활성 창의 유형에 기반하여 자동으로 끄는 것이 목적이라면, Hotkey, ^!c, Off보다 보통 #IfWinActive/Exist를 (또는 동적인 상대인 아래의 "Hotkey IfWinActive/Exist"를) 사용하는 것이 더 편리합니다.

겹-쌍점 라벨을 통하여 핫키를 만드는 것이 Hotkey 명령어를 사용하는 방법보다 더 수행성능이 좋습니다. 왜냐하면 스크립트가 시작할 때 핫키를 (하나 씩이 아니라) 모두 일괄적으로 켤 수 있기 때문입니다. 그러므로, 스크립트가 실행을 시작해야만 이름을 알 수 있는 키들을 생성하는 데에만 이 명령어를 사용하는 것이 제일 좋습니다. 그런 경우 한 가지는 다양한 행위에 대한 스크립트의 핫키를 INI 파일을 통하여 환경구성할 때입니다.

주어진 라벨은 여러 핫키의 목표가 될 수 있습니다. 라벨이 핫키에 호출되었다면, 내장 변수 A_ThisHotkey를 점검하면 어느 핫키인지 알아낼 수 있습니다.

스크립트가 보류(suspended) 중이라면, 새로 추가된/활성화된 핫키도 보류가 꺼질 때까지 함께 보류됩니다 (단, Suspend 섹션에 기술된 대로 면제된 경우는 예외입니다).

이 명령어가 가한 변경 때문에 정당성을 얻으면 키보드 그리고/또는 마우스 갈고리가 설치되거나 제거됩니다.

Hotkey 명령어는 자신의 소유가 아닌 스크립트에서 직접적으로 핫키를 켜거나 끌 수 없지만, 대부분의 경우 같은 핫키들을 만들거나 활성화 함으로써 오버라이드 할 수 있습니다. 이것의 작동 여부는 다음 요인의 조합에 따라 다릅니다:

  1. 오버라이드 될 핫키가 다른 스크립트에서 갈고리 핫키인가 (비-갈고리 핫키는 언제나 오버라이드할 수 있습니다);
  2. 최근에 시작된 스크립트의 핫키가 일반적으로 다른 스크립트의 핫키보다 우선 순위가 높다는 사실 (그러므로, 오버라이드 할 스크립트가 최근에 시작되었다면, 그의 오버라이드는 언제나 성공합니다);
  3. 이 핫키를 활성화 하거나 생성하면 새로 키보드 또는 마우스 갈고리가 활성화 되는가 (그렇다면, 오버라이드는 언제나 성공합니다).

스크립트에 하나의 핫키만 있어도, 스크립트는 영속적이 됩니다. Exit이 아니라 ExitApp를 사용해야 종료할 수 있다는 뜻입니다. 핫키 스크립트는 또 자동으로 #SingleInstance가 됩니다. 단, #SingleInstance Off가 지정된 경우는 예외입니다.

Hotkey, IfWinXX [, WinTitle, WinText]에 관한 논평

"Hotkey IfWin" 명령어는 스크립트가 실행중인 동안에 문맥 감지 핫키를 생성하도록 허용합니다 (대조적으로, #IfWinActive/Exist 지시어는 위치에 민감하고 스크립트가 실행을 시작하기 전에 효과가 있습니다). 예를 들어:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!e, MyLabel  ; 노트패드에서만 작동하는 핫키를 생성합니다.

"Hotkey IfWin"를 사용하면 뒤이어 생성되거나 변경되는 모든 핫키에 문맥 감지가 영향을 미칩니다. 게다가, IfWin 부-명령어는 서로 배타적입니다; 즉, 최근의 부-명령어만 효과가 있습니다.

문맥 감지를 끄려면 (즉, 이어서 생성되는 핫키를 모든 창에 작동시키려면), IfWin 부-명령어를 지정하되 WinTitle/Text 매개변수를 생략하십시오. 예를 들어: Hotkey, IfWinActive.

"Hotkey IfWin"가 스크립트에서 사용되지 않으면, 최근에 사용한 #IfWin 지시어가 (있다면) 그 Hotkey 명령어에 대하여 영향을 미칩니다.

마우스나 키보드 핫키가 IfWin에 의하여 꺼질 때, 자신의 고유 함수를 수행합니다; 즉, 마치 그런 핫키가 전혀 없는 것처럼 활성창까지 건네집니다. 한 가지 예외가 있습니다: 조이스틱 핫키는 예외입니다: IfWin이 작동하더라도, 버튼을 누르는 것을 다른 프로그램이 보지 못하도록 막지 않습니다.

변형 (중복) 핫키

특정 핫키는 각 정의마다 IfWin 기준이 다르다면 한 번 이상 만들 수 있습니다. 이런 것들을 핫키 변형이라고 부릅니다. 예를 들어:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MyLabelForNotepad
Hotkey, IfWinActive, ahk_class WordPadClass
Hotkey, ^!c, MyLabelForWordPad
Hotkey, IfWinActive
Hotkey, ^!c, MyLabelForAllOtherWindows

핫키의 변형이 하나 이상 촉발할 수 있다면, 가장 일찍 만들어진 변형만 촉발됩니다. 이에 대한 예외는 전역 변형입니다 (IfWin 기준이 없는 변형): 항상 우선 순위가 낮습니다. 그래서 다른 변형이 전혀 촉발될 수 없을 때만 촉발됩니다.

중복 핫키를 생성할 때, ^!+#와 같은 수식 심볼의 순서는 문제가 되지 않습니다. 예를 들어, ^!c는 !^c와 같습니다. 그렇지만, 키는 일관성있게 철자를 써야 합니다. 예를 들어, Esc는 이런 목적으로 Escape와 같지 않습니다 (그렇지만 대소문자는 문제가 되지 않습니다). 마지막으로, 와일드카드 접두 심볼 (*)을 가진 핫키는 모두 비-와일드카드 핫키와 완전히 다릅니다; 예를 들어, *F1과 F1는 각각 자신의 변형을 가집니다.

IfWin 핫키에 관한 더 자세한 정보는 #IfWin의 총평을 참조하십시오.

관련 항목

핫키 심볼, #IfWinActive/Exist, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, IsLabel(), Threads, Thread, Critical, Gosub, Return, Menu, SetTimer

예제

Hotkey, ^!z, MyLabel
return

MyLabel:
MsgBox You pressed %A_ThisHotkey%.
return

; 기타 예제들:
Hotkey, RCtrl & RShift, AltTab ; RCtrl & RShift를 Alt-Tab 처럼 작동하도록 만듭니다.
Hotkey, #c, On  ; Win-C 핫키를 재활성화합니다.
Hotkey, $+#c, Off  ; Shift-Win-C 핫키를 끕니다.
Hotkey, ^!a, , T5  ; 핫키가 다섯 개의 쓰레드를 허용하도록 바꿉니다.

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MyLabelForNotepad  ; 노트패드에서만 작동하는 핫키로 Ctrl-Alt-C를 생성합니다..


If var [not] between LowerBound and UpperBound

변수의 내용이 숫치적으로 또는 알파벳 순으로 두 값(포함) 사이에 있는지 점검합니다.

if Var between LowerBound and UpperBound
if Var not between LowerBound and UpperBound

매개변수

Var

점검할 변수의 이름.

LowerBound

지정한 범위 안에 있으려면, Var는 이 문자열보다, 숫자보다 또는 변수 참조보다 크거나 같아야 합니다.

UpperBound

지정한 범위 안에 있으려면, Var는 이 문자열보다, 숫자 보다, 또는 변수 참조보다 작거나 같아야 합니다.

논평

매개변수 세 개가 모두 순수하게 숫치이면, 문자열이 아니라 숫자로 비교됩니다. 그렇지 않으면, 문자열처럼 알파벳 순으로 비교됩니다 (즉, 알파벳 순서로 Var가 지정한 범위 안에 있는지 결정됩니다). 그 경우, StringCaseSense On을 사용하면 대소문자를 구분해 비교할 수 있습니다.

연산자 "between", "is", "in", 그리고 "contains"는 표현식 안에 지원되지 않습니다.

관련 항목

IfEqual/Greater/Less, if var in/contains MatchList, if var is type, IfInString, StringCaseSense, EnvAdd , 블록, Else

예제

if var between 1 and 5
    MsgBox, %var%는 범위가 1 이상 5 이하입니다.

if var not between 0.0 and 1.0
    MsgBox %var%는 범위가 0.0 이상 1.0 이하입니다.

if var between %VarLow% and %VarHigh%
    MsgBox %var%는 %VarLow%과 %VarHigh% 사이에 있습니다.

if var between blue and red
    MsgBox %var%는 알파벳 순서로 단어 blue와 red 사이에 있습니다.

LowerLimit = 1
UpperLimit = 10
InputBox, UserInput, %LowerLimit%과 %UpperLimit% 사이의 숫자를 입력하십시오.
if UserInput not between %LowerLimit% and %UpperLimit%
    MsgBox 입력이 유효한 범위 안에 있지 않습니다.


If/IfEqual/IfNotEqual/IfLess/IfLessOrEqual/IfGreater/IfGreaterOrEqual

변수를 변수해 비교해 TRUE로 평가될 경우 수행할 명령어(들)을 지정합니다. 명령어가 여럿 존재하면, 블록 (활괄호) 안에 둘러 싸십시오.

IfEqual, var, value (same: if var = value)
IfNotEqual, var, value (same: if var <> value) (!= can be used in place of <>)
IfGreater, var, value (same: if var > value)
IfGreaterOrEqual, var, value (same: if var >= value)
IfLess, var, value (same: if var < value)
IfLessOrEqual, var, value (same: if var <= value)
If var ; 변수의 내용이 비어 있거나 0이면, 거짓으로 간주됩니다. 그렇지 않으면 참입니다.

다음도 참조: IfInString

매개변수

var

변수 이름.

value

기호 문자열, 숫자 또는 변수 참조 (예, %var2%). var를 빈 문자열에 비교하고 싶다면 값을 생략할 수 있습니다.

논평

변수(var)와 값(value)이 순수하게 숫치라면, 문자열이 아니라 숫자로 비교됩니다. 그렇지 않으면, 문자열로 알파벳 순으로 비교됩니다 (즉, 알파벳 숫서로 var가 value보다 큰지 작은지 같은지 결정합니다).

IF 또는 ELSE가 여러 줄을 소유하면, 그런 줄들은 활괄호로 둘러 싸야 합니다. 예를 들어:

if count <= 0
{
    WinClose Untitled - Notepad
    MsgBox 어떤 항목도 존재하지 않습니다.
}

그렇지만, 한 줄만 IF 또는 ELSE에 속한다면, 활괄호는 선택적입니다.

명령어-이름 스타일을 사용한다면, 또다른 명령어는 IF 서술문과 같은 줄에만 나타날 수 있습니다. 다른 말로, 다음은 유효합니다:

IfEqual, x, 1, Sleep, 1
IfGreater, x, 1, EnvAdd, x, 2

그러나 다음은 유효하지 않습니다:

if x = 1 Sleep 1
IfGreater, x, 1, x += 2

One True Brace (OTB) 스타일은 이런 유형이 if 서술문에 사용하면 안 됩니다. 오직 표현식 if-서술문에만 사용할 수 있습니다.

관련하여 말씀드리자면, 다음 명령어 if var [not] between LowerBound and UpperBound는 변수가 두 값 사이에 있는지 점검합니다. 그리고 if var [not] in value1,value2는 변수의 내용이 값 목록 안에 존재하는지 점검하는 데 사용할 수 있습니다.

관련 항목

IF (expression), StringCaseSense, 할당 표현식 (:=), if var in/contains MatchList, if var between, IfInString, 블록, Else

예제

if counter >= 1
    Sleep, 10

if counter >=1   ; 만약 IF에 여러 줄이 있다면, 그 줄들은 활괄호 안에 싸 넣으십시오:
{
    WinClose, Untitled - Notepad
    Sleep 10
}

if MyVar = %MyVar2%
    MsgBox MyVar와 MyVar2의 내용은 동일합니다.
else if MyVar =
{
    MsgBox, 4,, MyVar가 비어 있습니다. 계속하시겠습니까?
    IfMsgBox, No
        Return
}
else if MyVar <> ,
    MsgBox MyVar의 값은 쉼표가 아닙니다.
else
    MsgBox MyVar의 값은 쉼표입니다.

if Done
    MsgBox 변수 Done은 비어 있지도 않고 0도 아닙니다.


IfExist / IfNotExist

파일이나 폴더의 존재 여부를 점검합니다.

IfExist, FilePattern
IfNotExist, FilePattern
AttributeString := FileExist(FilePattern)

매개변수

FilePattern

점검할 경로, 파일이름 또는 파일 패턴. 절대 경로를 지정하지 않으면 FilePattern은 %A_WorkingDir%에 있을 것이라고 간주됩니다.

관련 항목

FileExist(), 블록, Else, File-회돌이

예제

IfExist, D:\
    MsgBox, 드라이브가 존재합니다.
IfExist, D:\Docs\*.txt
    MsgBox, 적어도 하나의 .txt 파일이 존재합니다.
IfNotExist, C:\Temp\FlagFile.txt
    MsgBox, 목표 파일이 존재하지 않습니다.


if (expression)

if (표현식)

표현식이 TRUE로 평가되면 수행할 명령어(들)을 지정합니다.

if (expression)

논평

표현식이 있는 if-서술문은 전통적인-if와 다릅니다. If FoundColor <> Blue와 같은 경우 단어 "if" 다음 문자가 여는 활괄호가 아닙니다. 보통 전체 표현식을 활괄호 안에 싸 넣으면 이렇게 할 수 있지만, if (x > 0) and (y > 0)와 같이 해도 달성할 수 있습니다. 게다가, 단어 "if" 다음의 첫 항목이 함수 호출이거나 또는 "not"이나 "!"와 같은 연산자일 경우 여는-활괄호는 완전히 생략해도 됩니다.

if-서술문의 표현식이 참으로 평가되면 (빈 문자열 또는 숫자 0만 아니면 어떤 결과도 참이므로), 그 줄 또는 그 밑의 블록이 실행됩니다. 그렇지 않고, 상응하는 ELSE가 있다면, 실행은 그 줄 또는 그 밑의 블록으로 점프합니다.

IF 또는 ELSE가 여러 줄을 소유하면, 그런 줄들은 반드시 활괄호 안에 둘러싸야 합니다. 그렇지만, 한 줄만 IF나 ELSE에 속한다면, 활괄호는 없어도 됩니다. 이 페이지 아래의 예제들을 참조하십시오.

One True Brace (OTB) 스타일은 선택적으로 표현식 if-서술문과 함께 사용할 수 있습니다 (그러나 전통적인 if-서술문은 안 됩니다). 예를 들어:

if (x < y) {
    ...
}
if WinExist("Untitled - Notepad") {
    WinActivate
}
if IsDone {
    ...
} else {
    ...
}

"else" 서술문과 다르게 -- 그의 오른쪽에 오기만 하면 서술문에 종류에 상관없이 지원하는 -- if-서술문은 오직 그의 오른쪽에 오는 "{"만 지원합니다.

관련하여, 명령어 if var [not] between LowerBound and UpperBound 는 변수가 두 변수 사이에 있는지 점검합니다. 그리고 if var [not] in value1,value2는 변수의 내용이 값 목록 안에 존재하는지 점검하는 데 사용할 수 있습니다.

관련 항목

표현식, 할당 표현식 (:=), if var in/contains MatchList, if var between, IfInString, 블록, Else, While-회돌이

예제

if (A_Index > 100 or Done)
    return

if (A_TickCount - StartTime > 2*MaxTime + 100)
{
    MsgBox 너무 많은 시간지 경과하였습니다.
    ExitApp
}

if (Color = "Blue" or Color = "White")
{
    MsgBox 컬러는 허용된 값 중 하나입니다.
    ExitApp
}
else if (Color = "Silver")
{
    MsgBox 회색은 허용하지 않는 색입니다.
    return
}
else
{
    MsgBox 이 색은 인지할 수 없습니다.
    ExitApp
}


If var [not] in/contains value1,value2,...

변수의 내용이 목록에 있는 항목 중 하나에 일치하는지 점검합니다.

if Var in MatchList
if Var not in MatchList

if Var contains MatchList
if Var not contains MatchList

매개변수

Var

내용을 점검할 변수의 이름. "in" 연산자는 정확하게 리스트 항목에 부합하기를 요구합니다. "contains" 연산자는 부합이 더 쉽게 일어납니다: Var에 리스트 항목 중 하나가 부문자열로 포함되어 있기만 하면 부합합니다.

MatchList

쉼표로-가른 문자열 리스트. 각 문자열은 Var의 내용과 비교해 부합합니다. 가르는 쉼표 둘레의 스페이스나 탭은 의미가 있습니다. 부합 문자열의 일부가 된다는 뜻입니다. 예를 들어, MatchList에 ABC , XYZ가 설정되면 Var에는 반드시 ABC와 뒤에 하나의 스페이스가 담기거나 또는 XYZ와 그 앞에 스페이스 하나가 들어 있어야 부합할 수 있습니다.

연속적인 두 개의 쉼표는 글자 그대로의 쉼표 하나가 결과입니다. 예를 들어, 다음은 글자 그대로의 쉼표 하나를 string1의 끝에 생산합니다: If Var In string1,,,string2. 비슷하게, 다음 목록에는 항목 하나가 들어 있고 그 안에 글자 그대로의 쉼표가 하나 들어 있습니다: If Var In single,,item. 목록 안에 빈 항목을 포함하려면, 첫 문자를 다음 예제와 같이 쉼표로 만드십시오: If Var In ,string1,string2 ("contains" 연산자를 사용할 때, 빈 항목은 언제나 부합합니다. 왜냐하면 빈 문자열은 모든 문자열에 있기 때문입니다).

MatchList 안의 항목들은 개별적인 매개변수로 취급되지 않기 때문에, 리스트는 변수 안에 완전히 포함될 수 있습니다. 실제로, 그의 길이가 16383 문자를 넘어서면 변수 안에 일부만 포함됩니다. 그 길이가 스크립트 줄의 최대 길이이기 때문입니다. 예를 들어, MatchList는 %List1%,%List2%,%List3%으로 구성될 수 있습니다 -- 여기에서 각각의 부목록은 부합할 방대한 리스트가 포함되어 있습니다.

목록에서 16384 문자보다 긴 항목은 초과된 문자들을 새로운 리스트 항목으로 취급합니다. 그래서, 보통 그런 항목은 피하는 것이 가장 좋습니다.

논평

언제나 숫자순이 아니라 알파벳 순으로 비교됩니다. 예를 들어, 문자열 "11"는 리스트 항목 "11.0"과 일치하지 않습니다.

"contains" 연산자는 IfInString/IfNotInString를 사용한 것과 같습니다. 단, 다중 검색 문자열은 지원하지 않습니다 (무엇이든 부합합니다).

StringCaseSense On을 사용하면 대소문자를 구분해 비교할 수 있습니다.

MatchList가 길면, 여러 개의 짧은 줄로 나눌 수 있습니다. 계속 섹션을 사용하면 되는데, 이는 가독성과 유지관리성도 향상시켜 줍니다.

연산자 "between", "is", "in", 그리고 "contains"은 표현식에 지원되지 않습니다.

관련 항목

if var between, IfEqual/Greater/Less, IfInString, StringCaseSense, 블록, Else

예제

if var in exe,bat,com
    MsgBox 파일 확장자가 실행 유형입니다.

if var in 1,2,3,5,7,11 ; 리스트 안에 스페이스를 회피합니다.
    MsgBox %var%는 소수입니다.

if var contains 1,3  ; 값들을 문자열로 비교한다는 것을 주목하십시오. 숫자로 비교하지 않습니다.
    MsgBox Var에 1 또는 3이 담겨 있습니다 (Var는 1, 3, 10, 21, 23, 등등이 될 수 있습니다.)

if var in %MyItemList%
    MsgBox %var%는 목록 안에 있습니다.

InputBox, UserInput, Enter YES or NO
if UserInput not in yes,no
    MsgBox 입력이 유효하지 않습니다.

WinGetTitle, active_title, A
if active_title contains Address List.txt,Customer List.txt
    MsgBox 원하는 창 중 하나가 활성화 상태입니다.
if active_title not contains metapad,Notepad
    MsgBox 그러나 메타패드에도 노트패드에도 파일이 열려 있지 않습니다.


IfInString / IfNotInString

변수에 지정된 문자열이 담겨 있는지 점검합니다.

IfInString, var, SearchString
IfNotInString, var, SearchString
Position := InStr(Haystack, Needle [, CaseSensitive?, StartingPos]]) ; 자세한 것은 InStr() function를 참조합니다.

매개변수

var
부합을 위해 그의 내용을 검색할

변수의 이름.

SearchString

검색할 문자열. 부합은 대소문자를 구분하지 않습니다. 단, StringCaseSense가 켜져 있는 경우는 예외입니다.

논평

내장 변수 %A_Space%와 %A_Tab%는 안에 스페이스 하나와 탭 문자 하나가 각각 들어 있습니다. 이런 문자들을 단독으로 검색할 때 유용할 수 있습니다.

또다른 명령어는 이 명령어와 같은 줄에 나타날 수 있습니다. 다른 말로 하면, 다음은 둘 다 동등합니다:

IfInString, MyVar, abc, Gosub, Process1
IfInString, MyVar, abc
    Gosub, Process1

그렇지만, 이름있는 명령어 말고 다른 항목은 같은 줄에 지원하지 않습니다. 예를 들어:

IfInString, MyVar, abc, found := true  ; 유효하지 않음.

관련 항목

InStr(), RegExMatch(), StringGetPos, StringCaseSense, IfEqual, if var in/contains MatchList, if var between, if var is type, 블록, Else

예제

Haystack = abcdefghijklmnopqrs
Needle = abc
IfInString, Haystack, %Needle%
{
    MsgBox, 문자열이 발견되었습니다.
    return
}
else
    Sleep, 1


If var is [not] type

변수의 내용이 숫치인지, 대문자인지 등등을 점검합니다.

if var is type
if var is not type

매개변수

var

변수 이름.

type

아래의 논평 참조.

논평

지원되는 유형:

integer | var가 비어 있지 않고 그리고 순수하게 (소수점 없는) 숫치 문자열 (십육진수 또는 십진수)이면 참입니다. 선두와 후미에 스페이스와 탭을 허용합니다. 이 문자열은 플러스 또는 마이너스 사인으로 시작할 수도 있습니다.
float | var기 비어 있지 않고 그리고 부동 소수점 수를 포함하고 있으면 참입니다; 즉, 소수점이 있는 순수 숫치 문자열이면 참입니다. 선두와 후미에 스페이스와 탭을 허용합니다. 이 문자열을 플러스 또는 마이너스 사인으로 시작할 수도 있습니다.
number | var에 정수나 부동 소수점 수가 담기면 참입니다 (각각의 조건은 위의 기술을 따릅니다).
digit | var가 비어 있거나 오직 숫자만 담고 있으면 참입니다. 즉, 0에서 9까지로 구성되면 참입니다. 다른 문자들은 다음과 같이 허용되지 않습니다: 스페이스, 탭, 플러스 사인, 마이너스 사인, 소수 점, 십육진 수, 그리고 0x 접두사.
xdigit | 십육진 자리: digit와 동일하지만 A 부터 F (대문자 또는 소문자))도 허용합니다. v1.0.44.09+에서는 접두사 0x도 허용합니다.
alpha | var가 비어 있거나 알파벳만 포함하고 있으면 참입니다. 문자열에 숫자, 스페이스, 탭, 구두점 또는 기타 비-알파벳 문자를 담고 있으면 거짓입니다. 예를 들어, var에 스페이스가 있고 다음 기호가 따라오면, 알파벳으로 간주하지 않습니다.
upper | var가 비어 있거나 또는 오직 대문자만 담고 있으면 참입니다. 문자열에 숫자, 스페이스, 탭, 구두점 또는 기타 비-대문자를 담고 있으면 거짓입니다.
lower | var가 비어 있거나 오직 소문자만 담고 있으면 참입니다. 숫자가 있거나, 스페이스, 탭, 구두점, 또는 기타 비-소문자가 문자열에 있으면 거짓입니다.
alnum | alpha와 동일하지만 0 부터 9 사이의 문자도 허용합니다.
space | var가 비어 있거나 공백 문자만 담고 있으면 참입니다. 공백 문자는 다음과 같이 구성됩니다: 스페이스 (%A_Space%), 탭 (%A_Tab% or `t), 줄넘김 (`n), 리턴 (`r), 수직 탭 (`v), 그리고 장피드 (`f).
time | var에 유효한 날짜-시간 도장이 들어 있으면 참입니다. 형식이 YYYYMMDDHH24MISS이거나 아니면 앞쪽 부분만이라도 됩니다. 예를 들어, 2004와 같은 4-자리 문자열은 유효로 간주합니다. StringLen을 사용하면 추가로 시간 구성 부분이 존재하는지 알아낼 수 있습니다. 1601년 미만은 유효로 간주하지 않습니다. 운영 체제가 보통 지원하지 않기 때문입니다. 최대 해는 9999년입니다. 단어 DATE를 단어 TIME 대신 사용해도, 결과는 같습니다.

주의: 연산자 "between", "is", "in", 그리고 "contains"는 표현식에 지원하지 않습니다.

[AHK_L 42+]: 시스템 로케일은 StringCaseSense Locale이 사용되지 않는 한 무시됩니다.

관련 항목

%A_YYYY%, SetFormat, FileGetTime, IfEqual, if var in/contains MatchList, if var between, StringLen, IfInString, StringUpper, EnvAdd , 블록, Else

예제

if var is float
    MsgBox, %var%는 부동 소수점 수입니다.
else if var is integer
    MsgBox, %var%는 정수입니다.
if var is time
    MsgBox, %var%는 또한 유효한 날짜-시간이기도 합니다.


IfMsgBox

가장 최근에 MsgBox 명령어가 작동 중인 동안 어느 버튼을 사용자가 눌렀는지 점검합니다.

IfMsgBox, ButtonName

매개변수

ButtonName

사용자가 누른 버튼은 다음 문자열 중 하나입니다:

Yes
No
OK
Cancel
Abort
Ignore
Retry
Continue [v1.0.44.08+]
TryAgain [v1.0.44.08+]
Timeout (즉, MsgBox가 시간제한에 걸렸다면 단어 "timeout"이 존재합니다.)

관련 항목

MsgBox

예제

MsgBox, 4, , 계속하시겠습니다?, 5  ; 5-초로 시간 제한.
IfMsgBox, No
    Return  ; 사용자가 "No" 버튼을 눌렀습니다.
IfMsgBox, Timeout
    Return ; 즉, 생략하면 "No"라고 간주합니다.
; 그렇지 않으면, 계속합니다:
...


ImageSearch

화면 한 구역에서 이미지를 검색합니다.

ImageSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ImageFile

매개변수

OutputVarX/Y

화면에서 이미지가 발견된 좌상 픽셀의 X와 Y 좌표를 저장할 변수의 이름 (일치가 발견되지 않으면, 변수는 비워집니다). 좌표는 활성창에 상대적입니다. 단, CoordMode가 사용되는 좌표 체계를 바꾼 경우는 예외입니다.

이 매개변수가 비어 있는 경우가 있습니다. 그러면 ErrorLevel (아래 참조)를 사용하여 일치가 발견되었는지 알아낼 수 있습니다.

X1,Y1

검색할 사각형의 좌상 X와 Y 좌표, 표현식 가능. 좌표는 활성 창에 상대적입니다. 단, CoordMode가 사용되어 좌표 체계를 바꾼 경우는 예외입니다.

X2,Y2

검색할 사각형의 우하 모서리 X와 Y 좌표, 표현식 가능. 좌표는 활상 창에 상대적입니다. 단, CoordMode가 사용되어 좌표 체계를 바꾼 경우는 예외입니다.

ImageFile

이미지의 파일 이름, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 모든 운영 체제는 GIF, JPG, BMP, ICO, CUR, 그리고 ANI 이미지를 지원합니다 (BMP 이미지는 반드시 16-비트 이상이어야 합니다). 다른 아이콘 자원으로는 다음 파일 유형이 포함됩니다: EXE, DLL, CPL, SCR, 그리고 기타 아이콘 자원을 포함한 유형들. Windows XP 이상에서, 추가 이미지 포맷으로 PNG, TIF, Exif, WMF, 그리고 EMF가 지원됩니다. 운영 체제가 XP 미만이면 Microsoft사의 무료 GDI+ DLL을 AutoHotkey.exe 폴더 안으로 복사해 넣을 수 있습니다 (그러나 컴파일된 스크립트의 경우라면, 그 DLL을 스크립트의 폴더 안으로 복사해 넣으십시오). 그 DLL을 내려 받으려면, 다음 문구를 www.microsoft.com에 넣고 검색해 보십시오: gdi redistributable

Options: 다음 문자열이 오고 다음에 바로 이미지 파일 이름이 따라옵니다. 각 옵션은 다음 옵션과 사이에 하나의 스페이스나 탭으로 구분하십시오. 예를 들어: *2 *w100 *h-1 C:\Main Logo.bmp.

*IconN: 파일에서 첫 번째 아이콘 말고 아이콘 그룹을 사용하려면, *Icon과 다음에 바로 그룹의 번호를 지정하십시오. 예를 들어, *Icon2이면 두 번째 아이콘 그룹으로부터 기본 아이콘이 적재됩니다.

*n (변형): n에 0부터 255 (포함) 사이의 숫자를 지정하면, 차원에 상관없이 각 필셀 컬러의 적녹청 요소의 채도에 대하여 허용된 쉐이드 변형의 개수를 나타낼 수 있습니다. 예를 들어, *2이면 두 개의 쉐이드 변형을 허용합니다. 이 매개변수는 이미지의 컬러가 조금씩 바뀔 경우 또는 ImageFile이 GIF나 JPG 같은 포맷을 사용할 경우 도움이 됩니다. 이 포맷은 화면에 이미지를 정확하게 나타내지 못합니다. 255 쉐이드 변형을 지정하면, 모든 색이 부합합니다. 기본 값은 0 쉐이드입니다.

*TransN: 이 옵션을 이용하면 더 쉽게 부합을 찾아낼 수 있습니다. 이미지 안에서 화면 안의 어느 컬러에도 부합할 한 컬러를 지정하면 됩니다. 투명 구역이 있는 PNG, GIF, 그리고 TIF 파일을 찾는 데 아주 자주 사용됩니다 (그렇지만, 아이콘은 이 옵션이 필요 없습니다. 왜냐하면 아이콘의 투명색은 자동으로 지원되기 때문입니다). GIF 파일에 대하여, *TransWhite이면 거의 대부분 작동할 것입니다. PNG와 TIF 파일에 대하여, *TransBlack가 제일 좋을 것입니다. 그렇지 않으면, N에 다른 어떤 컬러 이름 또는 RGB 값을 지정하십시오 (가이드는 컬러 차트를 참조하십시오. 아니면 RGB 모드로 PixelGetColor를 사용하십시오 ). 예제: *TransBlack, *TransFFFFAA, *Trans0xFFFFAA.

*wn and *hn: 이미지 크기를 조절할 너비와 높이 (이 너비와 높이는 또 여러-아이콘 .ICO 파일로부터 어느 아이콘을 적재할지 결정하기도 합니다.). 이 두 옵션을 모두 생략하면, ICO, DLL, 또는 EXE 파일로부터 적재된 아이콘은 시스템의 기본 소형-아이콘 크기로 조절됩니다. 보통 이는 16 x 16 입니다 (*w0 *h0를 지정하면 강제로 실제의/내부의 크기를 사용하도록 만들 수 있습니다.). 아이콘이 아닌 이미지는 그의 실제 크기로 적재됩니다. 이 이미지를 그의 가로 세로 비율을 유지한 채 늘리거나 줄이려면, 한 차원에 -1을 지정하고 다른 차원에는 양수를 지정하십시오. 예를 들어, *w200 *h-1을 지정하면 이미지가 200 픽셀 너비가 되며 그의 높이는 자동으로 설정됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 검색하는 동안 문제가 있다면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 이미지를 지정된 구역 안에서 발견하면 0이 설정되고, 발견하지 못하면 1이 설정됩니다. 아니면 이 명령어가 검색을 수행하지 못하도록 막는 문제가 있었다면 2가 설정됩니다 (예를 들어 이미지 파일을 열지 못하거나 포맷 옵션이 심하게 잘못되었을 경우).

논평

ImageSearch를 사용하면 화면에서 그래픽 객체를 탐지할 수 있습니다. 그래픽 객체는 텍스트가 없으며 있다고 하더라도 쉽게 탐지하기가 어렵습니다. 예를 들어, 그림 버튼, 아이콘, 웹 페이지 링크, 또는 게임 객체의 위치를 알아내는 데 사용할 수 있습니다. 일단 발견되면, 그런 객체는 Click을 통하여 클릭할 수 있습니다.

종종 유용한 전략이 있습니다. 전체 이미지보다 이미지의 작은 구역만 떼어내 검색하는 것이 더 유용합니다. 이렇게 하면 이미지가 전체적으로 바뀌지만, 그 안에서 어떤 부분은 언제나 같은 경우, 신뢰성을 개선할 수 있습니다. 클립핑 구역을 추출하는 한 가지 방법은 다음과 같습니다:

  1. 이미지가 활성 창에 보이는 동안 Alt+PrintScreen를 누릅니다. 이렇게 하면 화면의 찰칵그림이 클립보드에 저장됩니다.
  2. Paint와 같은 이미지 처리 프로그램을 엽니다.
  3. 클립보드의 내용을 붙여 넣습니다 (즉, 위의 찰칵그림).
  4. 그 이미지만 가지는 변하지 않고 유일한 구역을 선택합니다.
  5. 그 구역을 새 이미지 문서에 복사해 붙여 넣습니다.
  6. ImageSearch에 사용하기 위해 작은 파일로 저장합니다.

일치가 되려면, 화면 위의 이미지는 ImageFile 매개변수와 그의 옵션을 통하여 적재된 이미지와 크기가 같아야 합니다.

검색될 구역은 반드시 보여야 합니다; 다른 말로, 다른 창 뒤에 가려진 창의 구역은 검색할 수 없습니다. 대조적으로, 마우스 커서 아래에 부분적으로 가려진 이미지는 보통 탐지가 가능합니다. 이에 대한 예외는 게임 커서입니다. 게임 커서는 대부분의 경우 그 아래에 있는 이미지를 덮어버립니다.

검색은 구역의 위쪽에서 시작해 아래로 내려오므로, 여러 개가 부합할 경우, 위쪽에 가까운 부합이 발견됩니다.

투명색을 포함한 아이콘은 자동으로 그 투명 컬러가 화면 위의 어떤 컬러와도 부합하도록 허용합니다. 그러므로, 아이콘 뒤에 있는 색은 문제가 되지 않습니다.

ImageSearch는 8-비트 컬러 화면 (256-컬러) 이상을 지원합니다.

검색 행위는 디스플레이 어댑터의 컬러 깊이에 따라 달라질 수 있습니다 (특히 GIF 파일과 JPG 파일). 그러므로, 스크립트를 다중 컬러 깊이에서 실행하려면, 각각의 깊이 설정에 테스트해 보는 것이 제일 좋습니다. 쉐이드 변형 옵션 (*n)을 사용하면 다중 컬럼 깊이에 걸쳐서 그 행위를 일관성이 있게 만드는 데 도움이 됩니다.

화면 위에서 이미지가 반투명이라면, 아마도 ImageSearch는 그것을 찾는 데 실패할 것입니다. 이를 우회하려면, 쉐이드 변형 옵션 (*n)을 사용하거나 WinSet, Transparent, Off를 사용하여 그 창을 임시로 불투명하게 만드십시오.

관련 항목

PixelSearch, PixelGetColor, CoordMode, MouseGetPos

예제

ImageSearch, FoundX, FoundY, 40,40, 300, 300, C:\My Images\test.bmp

CoordMode Pixel  ; 아래의 좌표를 활성 창이 아니라 화면에 상대적으로 번역합니다.
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *Icon3 %A_ProgramFiles%\SomeApp\SomeApp.exe
if ErrorLevel = 2
    MsgBox 검색을 수행할 수 없었습니다.
else if ErrorLevel = 1
    MsgBox 아이콘을 화면에서 발견할 수 없었습니다.
else
    MsgBox 아이콘을 %FoundX%x%FoundY%에서 발견하였습니다.


Alphabetical Command and Function Index

명령어와 함수 인덱스

더 자세한 정보는 함수나 명령어 이름에 클릭하십시오. 자주 사용하는 엔트리들은 큰 글꼴로 표시했습니다.

엔트리 | 설명
{ ... } (블록) | 한 쌍의 반괄호는 블록을 나타냅니다. 블록은 전형적으로 함수, Else, Loop, While-loop, 그리고 IF-명령어와 함께 사용됩니다.
{ ... } / Object() | 스크립트가 가능한 연관 배열을 생성합니다.
[ ... ] / Array() | 스크립트가 가능한 연관 배열을 정수 키로 생성합니다.
Abs() | 숫자의 절대값을 돌려줍니다.
AutoTrim | Var1 = %Var2% 서술문에서 Var2의 처음과 끝에서 탭과 스페이스를 걷어낼지 말지 결정합니다.
ASin() | 아크사인을 라디안 단위로 돌려줍니다 (Number는 사인 값).
ACos() | 아크코사인을 라디안 단위로 돌려줍니다 (Number는 코사인 값).
ATan() | 아크탄젠트를 라디안 단위로 돌려줍니다 (Number는 탄젠트 값).
BlockInput | 사용자가 키보드와 마우스를 통하여 컴퓨터와 대화하도록 켜거나 끕니다.
Break | 회돌이를 빠져 나옵니다. 모든 종류의 회돌이 안에서 유효합니다.
Catch | try 서술문을 실행하는 동안에 에러가 일어나면 실행할 코드를 지정합니다.
Ceil() | Number는 가장 가까운 정수로 올림됩니다 (.00 버림).
Click | 지정된 좌표에 마우스 버튼을 클릭합니다. 마우스 버튼을 누르거나, 마우스 휠을 돌리거나, 또는 마우스를 이동할 수 있습니다.
ClipWait | 클립보드에 데이터가 들어올 때까지 기다립니다.
ComObjActive() | 등록된 COM 객체를 열람합니다.
ComObjArray() | COM에 사용할 SAFEARRAY를 생성합니다.
ComObjConnect() | COM 객체의 이벤트 소스를 주어진 접두사를 가진 함수들에 연결합니다.
ComObjCreate() | COM 객체를 생성합니다.
ComObjEnwrap() / ComObjUnwrap() | COM 객체를 싸거나 풉니다.
ComObjError() | COM 에러의 고지를 켜거나 끕니다.
ComObjFlags() | COM 포장자 객체의 행위를 제어하는 플래그를 열람하거나 변경합니다.
ComObjGet() | COM 컴포넌트가 제공하는 객체의 참조 주소를 돌려줍니다.
ComObjMissing() | COM 메쏘드에 건넬 "missing parameter" 객체를 만듭니다.
ComObjParameter() | 값과 유형을 싸서 매개변수로 COM 메쏘드에 건넵니다.
ComObjQuery() | COM 객체에 인터페이스나 서비스를 질의합니다.
ComObjType() | COM 객체에서 유형 정보를 열람합니다.
ComObjValue() | COM 포장자 객체에 저장된 값이나 포인터를 열람합니다.
Continue | 현재 남아 있는 회돌이 반복을 건너뛰고 다시 새로 회돌이를 시작합니다. 어떤 종류의 회돌이 안에서도 유효합니다.
Control | 콘트롤에 다양한 변경을 합니다.
ControlClick | 마우스 버튼 이벤트나 마우스 휠 이벤트를 콘트롤에 보냅니다.
ControlFocus | 창위의 콘트롤에 입력 초점을 설정합니다.
ControlGet | 콘트롤에 관하여 다양한 유형 정보를 열람합니다.
ControlGetFocus | 목표 창에서 어느 콘트롤이 입력 초점을 가지고 있는지 열람합니다.
ControlGetPos | 콘트롤의 위치와 크기를 열람합니다.
ControlGetText | 콘트롤에서 텍스트를 열람합니다.
ControlMove | 콘트롤을 이동하거나 크기를 바꿉니다.
ControlSend / ControlSendRaw | 시뮬레이트 키를 창이나 콘트롤에 전송합니다.
ControlSetText | 콘트롤의 텍스트를 바꿉니다.
CoordMode | 다양한 명령어에 대하여 좌표 모드를 활성 창이나 화면에 상대적으로 설정합니다.
Cos() | 숫자의 삼각함수 코사인을 돌려줍니다 .
Critical | 현재 쓰레드가 다른 스레드에 인터럽트를 당하지 않도록 방지하거나, 인터럽트 되도록 허용합니다.
DetectHiddenText | 창에서 보이지 않는 텍스트를 "보여줄지 말지" 결정합니다. 창을 찾는 목적에 사용할 수 있습니다. 이 명령어는 IfWinExist와 WinActivate 같은 명령어에 영향을 미칩니다.
DetectHiddenWindows | 보이지 않은 창을 스크립트에 "보여줄지 말지" 결정합니다.
DllCall() | 표준 Windows API 함수와 같은, DLL 안의 함수를 호출합니다.
Drive | CD 드라이브나 DVD 드라이브의 트레이를 꺼내거나 넣습니다. 또는 드라이브의 볼륨 라벨을 설정합니다.
DriveGet | 컴퓨터의 드라이브에 관하여 다양한 유형의 정보를 열람합니다.
DriveSpaceFree | 드라이브의 여유 공간을 메가 바이트 단위로 열람합니다.
Edit | 현재 스크립트를 편집하기 위해 연관 편집기에 엽니다.
Else | IF-서술문이 FALSE로 평가되면 수행할 명령어(들)을 지정합니다. 명령어가 두 개 이상 존재하면, 블록 (괄호)에 둘러 싸 넣으십시오.
EnvAdd | 주어진 값을 변수에 더해 자기 자신에 할당합니다. (날짜-시간 값에서 더하거나 뺄 수도 있습니다). 다음과 동등합니다: Var += Value.
EnvDiv | 변수를 주어진 값으로 나누어서 자기 자신에 할당합니다: Var /= Value.
EnvGet | 환경 변수를 열람합니다.
EnvMult | 변수를 주어진 값만큼 곱해서 자기 자신에 할당합니다. 다음과 동등합니다: Var *= Value.
EnvSet | 환경에 담긴 변수에 값을 씁니다.
EnvSub | 주어진 값을 변수에서 빼서 자기 자신에 할당합니다 (날짜-시간 값을 비교하는 데에도 사용할 수 있습니다). 다음과 동등합니다: Var -= Value.
EnvUpdate | OS는 물론 실행 중인 모든 어플리케이션에 환경 변수가 바뀌었음을 고지합니다.
Exit | 현재 쓰레드를 빠져 나오거나 (스크립트가 영속적이 아니고 핫키도 전혀 없다면) 전체 스크립트를 끝냅니다.
ExitApp | 스크립트를 무조건 종료합니다.
Exp() | e (대략 2.71828182845905)를 N 만큼 제곱해서 돌려줍니다.
FileAppend | 텍스트를 파일 끝에 씁니다 (필요하면, 먼저 파일을 생성합니다).
FileCopy | 파일을 복사합니다.
FileCopyDir | 폴더를 복사합니다. 그의 하위 폴더와 파일도 함께 복사됩니다 (xcopy와 유사).
FileCreateDir | 폴더를 생성합니다.
FileCreateShortcut | 단축 파일을 생성합니다 (.lnk).
FileDelete | 파일을 삭제합니다.
FileEncoding FileRead, FileReadLine, Loop Read, FileAppend, 그리고 FileOpen에 대하여 기본 파일 인코딩을 설정합니다.
다음도 참조하십시오: 텍스트 인코딩
FileInstall | 지정한 파일을 스크립트의 컴파일 버전에 포함시킵니다.
FileGetAttrib | 파일이나 폴더가 읽기 전용인지, 숨은 파일인지 등등의 속성을 보고합니다.
FileGetShortcut | 단축 파일에 관한 정보를 열람합니다(.lnk). 예를 들어 그의 목표 파일.
FileGetSize | 파일의 크기를 열람합니다.
FileGetTime | 파일이나 폴더의 날짜시간 도장을 열람합니다.
FileGetVersion | 파일의 버전을 열람합니다.
FileMove | 파일을 이동하거나 이름을 바꿉니다.
FileMoveDir | 폴더를 그의 하위 폴더 파일과 함께 이동합니다. 폴더 이름을 바꿀 수도 있습니다.
FileOpen | 객체-지향적 파일 I/O를 제공합니다.
FileRead | 파일의 내용을 변수 안으로 읽어 들입니다.
FileReadLine | 지정된 줄을 파일로부터 읽어 그 텍스트를 변수에 저장합니다.
FileRecycle | 파일이나 디렉토리를 휴지통으로 보냅니다.
FileRecycleEmpty | 휴지통을 비웁니다.
FileRemoveDir | 폴더를 삭제합니다.
FileSelectFile | 사용자가 파일을 열거나 저장할 수 있도록 표준 대화상자를 보여줍니다.
FileSelectFolder

사용자가 폴더를 선택할 수 있도록 표준 대화상자를 보여줍니다.
FileSetAttrib | 파일이나 폴더의 속성을 변경합니다. 와일드카드를 지원합니다.
FileSetTime | 파일이나 폴더의 날짜시간 도장을 변경합니다. 와일드카드를 지원합니다.
Finally | Try 서술문이 끝나면, 한 블록의 코드가 언제나 확실하게 실행되도록 합니다.
Floor() | 숫자를 가장 가까운 정수로 버림한 다음 돌려줍니다 ( .00을 버림).
For | 객체 안의 키-값 한 쌍마다 일련의 명령어를 반복합니다.
Format | 가변 개수의 입력 값을 포맷 문자열에 맞게 포맷합니다.
FormatTime | YYYYMMDDHH24MISS 타임스탬프를 지정된 날짜/시간 형식으로 변형합니다.
Func() | 함수를 가리키는 참조주소를 열람합니다.
GetKeyName()
GetKeyVK()
GetKeySC() 		가상 키 코드 또는 키의 스캔 코드의 이름 또는 텍스트를 열람합니다.
GetKeyState | 키보드 키나 마우스/조이스틱 버튼이 눌러 있는지 뗀 상태인지 점검합니다. 또 조이스틱의 상태를 열람합니다.
Gosub | 지정된 라벨로 점프해서 Return을 만날 때까지 실행을 계속합니다.
Goto | 지정된 라벨로 점프해 실행을 계속합니다.
GroupActivate | GroupAdd로 정의된 창 그룹에서 다음 창을 활성화합니다.
GroupAdd | 창을 창 그룹에 추가합니다. 필요하면 창 그룹을 생성합니다.
GroupClose | 바로 전에 GroupActivate나 GroupDeactivate에 의하여 활성화되었던 활성 창을 닫습니다 . 그 다음에 연속적으로 그 다음 창을 활성화합니다. 그룹에 있는 모든 창을 닫을 수도 있습니다.
GroupDeactivate | GroupActivate와 비슷합니다. 단 그룹에 없는 다음 창을 활성화한다는 점이 다릅니다.
Gui | 창과 콘트롤을 생성하고 관리합니다. 만든 창은 데이터 입력 폼이나 맞춤 사용자 인터페이스에 사용할 수 있습니다.
GuiControl | 구이 창의 콘트롤에 다양한 변경을 합니다.
GuiControlGet | 구이 탕의 콘트롤에 관하여 다양한 유형의 정보를 열람합니다.
Hotkey | 스크립트가 실행 중인 동안, 핫키를 생성, 변경, 활성화, 또는 불능화합니다.
if | 변수를 변수에 비교해 TRUE로 평가되면 수행할 명령어(들)을 지정합니다. 두 개 이상 명령어가 존재하면, 블록 (반괄호) 안에 싸 넣으십시오.
if (expression) | 표현식이 TRUE로 평가될 때 수행할 명령어(들)을 지정합니다.
If var [not] between | 변수의 내용이 숫자 순서로 또는 알파벳 순서로 두 값 사이에 (포함) 있는지 점검합니다.
If var [not] in/contains MatchList | 변수의 내용이 리스트 안의 항목에 부합하는지 점검합니다.
If var is [not] type | 변수의 내용이 숫자인지, 대문자인지 등등을 점검합니다.
IfEqual / IfNotEqual | 변수가가 값과 같은지 비교합니다. 다음과 동등합니다: if Var = Value | if Var <> Value.
IfExist / FileExist() | 파일이나 폴더가 존재하는지 점검합니다.
IfGreater / IfGreaterOrEqual | 변수를 값에 비교합니다. 다음과 동등합니다: if Var > Value | if Var >= Value.
IfInString / InStr() | 변수에 지정된 문자열이 포함되어 있는지 점검합니다.
IfLess / IfLessOrEqual | 변수를 값에 비교합니다. 다음과 동등합니다: if Var < Value | if Var <= Value.
IfMsgBox | 가장 최근의 MsgBox 명령을 수행하는 동안 사용자가 어느 버튼을 눌렀는지 점검합니다.
IfWinActive / IfWinNotActive
 지정된 창이 존재하는지 그리고 현재 활성 상태 (전경)인지 점검합니다.
IfWinExist / IfWinNotExist
 지정된 창이 존재하는지 점검합니다.
ImageSearch | 화면에서 이미지를 검색합니다.
IniDelete | 표준 형식의 .ini 파일로부터 값을 지웁니다.
IniRead | 표준 형식의 .ini 파일로부터 값을 읽습니다.
IniWrite | 표준 형식의 .ini 파일에 값을 씁니다.
Input | 사용자가 문자열을 타자하기를 기다립니다.
InputBox | 입력 박스를 보여주고 사용자가 문자열을 타자해 넣기를 요구합니다.
InStr() | 주어진 문자열이 나타나는지 왼쪽에서 오른쪽으로 검색합니다.
IsByRef() | ByRef 매개변수에 값이 주어졌는지 결정합니다.
IsFunc() | 함수를 동적으로 호출할 수 있는지 알려줍니다.
IsLabel() | 주어진 값이 라벨에 존재하는지 점검합니다.
IsObject() | 값이 객체인지 결정합니다.
KeyHistory | 스크립트 정보 그리고 가장 최근의 키눌림과 마우스 클릭의 이력을 보여줍니다.
KeyWait | 키나 마우스/조이스틱 버튼을 누를 때까지 또는 뗄 때까지 기다립니다.
ListHotkeys | 현재 스크립트가 사용 중인 핫키들을 화면에 보여줍니다. 그들의 서브루틴이 현재 실행 중인지, 그리고 키보드 갈고리나 마우스 갈고리를 사용중인지 아닌지 알려줍니다.
ListLines | 가장 최근에 실행된 스크립트 줄을 화면에 보여줍니다.
ListVars | 스크립트의 변수들을 보여줍니다: 이름과 현재 내용.
Log() | 숫자의 상용 로그를 돌려줍니다 (밑수 10).
Ln() | 숫자의 자연 로그를 돌려줍니다 (밑수 e).
Loop (보통) | 일련의 명령어들을 반복적으로 수행합니다: 지정된 횟수만큼 또는 break를 만날 때까지.
Loop (파일 & 폴더) | 지정된 파일이나 폴더를 한 번에 하나씩 열람합니다.
Loop (문자열 파싱) | 문자열로부터 서브스트링(필드)를 한 번에 하나씩 파싱합니다.
Loop (파일 내용 읽기) | 텍스트 파일에서 줄을 한 번에 한 줄씩 열람합니다 (FileReadLine보다 수행성능이 더 좋습니다).
Loop (레지스트리) | 지정된 레지스트리 서브키의 내용을 한 번에 하나씩 열람합니다.
Menu | 메뉴와 메뉴 항목을 생성, 삭제, 변경 그리고 보여줍니다. 트레이 아이콘과 그의 툴팁을 변경합니다. 컴파일된 스크립트의 메인 창을 열지 말지 제어합니다.
Mod() | 나머지(Modulo) 연산입니다. 피젯수(Dividend)를 젯수(Divisor)로 나누고 나머지를 돌려줍니다.
MouseClick | 마우스 버튼을 클릭하거나 누릅니다. 또는 마우스 휠을 돌립니다. 주의: Click 명령어가 일반적으로 더 유연하고 사용하기가 더 쉽습니다.
MouseClickDrag | 지정된 마우스 버튼을 클릭하고 누릅니다. 마우스를 목표 좌표로 이동합니다. 그리고 마우스를 뗍니다.
MouseGetPos | 마우스 커서의 현재 위치를 열람합니다. 그리고 선택적으로 어느 창과 콘트롤 위에 있는지 열람합니다.
MouseMove | 마우스 커서를 이동합니다.
MsgBox | 지정된 텍스트를 작은 창 안에 보여줍니다. 안에 버튼이 들어 있습니다 (예를 들어 Yes 그리고 No).
NumGet() | 지정된 주소+오프셋에 저장된 이진 숫자를 열람합니다.
NumPut() | 지정된 주소+오프셋에 이진 형태의 숫자를 저장합니다.
OnExit | 스크립트가 종료할 대 자동으로 실행할 서브루틴을 지정합니다.
OnMessage() | 스크립트가 지정된 메시지를 받을 때 자동으로 호출할 함수를 지정합니다.
OutputDebug | 문자열을 (있다면) 디버거에 보내 보여줍니다.
Pause | 스크립트의 현재 쓰레드를 정지합니다.
PixelGetColor | 지정된 좌표에서 픽셀의 색을 열람합니다.
PixelSearch | 화면 구역을 검색해 지정된 색을 가진 픽셀을 찾습니다.
PostMessage | 메시지를 창이나 콘트롤의 메시지 큐에 넣습니다.
Process | 프로세스에 다음 연산 중 하나를 수행합니다: 존재하는지 점검합니다; 우선순위를 변경합니다; 닫습니다; 끝나기를 기다립니다.
Progress | 진척 사항 바를 담고 있는 창을 생성하거나 갱신합니다.
Random | 의사-무작위 수를 생성합니다.
RegExMatch() | 문자열에 패턴(정규 표현식)을 담을지 말지 결정합니다.
RegExReplace() | 문자열 안에서 패턴 (정규 표현식)에 부합하는 것들을 교체합니다.
RegDelete | 레지스트리에서 서브키나 값을 삭제합니다.
RegRead | 값을 레지스트리에서 읽습니다.
RegWrite | 값을 레지스트리에 씁니다.
RegisterCallback() | 호출 될 때 머신-코드 주소를 생성해서, 그 호출을 스크립트의 함수로 방향전환합니다.
Reload | 현재 실행중인 스크립트의 실체를 새로운 실체로 교체합니다.
Return | 서브루틴으로부터 이전에 실행을 점프했던 곳으로 돌아갑니다. 함수-호출, Gosub, 핫키 활성화, GroupActivate, 기타 등등의 방법으로 점프했던 곳으로 돌아갑니다.
Round() | N이 생략되거나 0이면, Number는 가장 가까운 정수로 버림됩니다. N이 양수이면, Number는N개의 십진 자리로 버림됩니다. N이 음수이면, Number는 소수점 왼쪽으로 N 자리수 만큼 버림됩니다.
Run | 외부 프로그램을 실행합니다.
RunAs | 이 다음부터 Run과 RunWait를 사용하기 위해 사용자 신용장 세트를 지정합니다.
RunWait | 외부 프로그램을 실행하고 끝날 때까지 기다립니다.
Send / SendRaw / SendInput / SendPlay | 시률레이트된 키눌림과 마우스 클릭을 활성 창에 전송합니다.
SendLevel | 인위적인 키눌림과 마우스 이벤트를 핫키와 핫스트링이 무시할지 말지 제어합니다.
SendMessage | 메시지를 창이나 콘트롤에 전송하고 승인을 기다립니다.
SendMode | 기본 (SendEvent) 값이 아니라, Send를 SendInput이나 SendPlay와 동일하게 만듭니다. 또Click 그리고 MouseMove/Click/Drag가 지정된 메쏘드를 사용하도록 만듭니다.
SetBatchLines | 얼마나 빨리 스크립트를 실행할지 결정합니다 (CPU 이용에 영향을 미칩니다).
SetCapslockState | Capslock 키의 상태를 설정합니다.강제로 온 또는 오프 상태를 유지할 수 있습니다.
SetControlDelay | 각 콘트롤-변경 명령어 다음에 지연 시간을 설정합니다.
SetDefaultMouseSpeed | 마우스 속도를 설정합니다. Click 그리고 MouseMove/Click/Drag에 지정되어 있지 않을 경우 유용합니다.
SetEnv (Var = Value) | 지정된 값을 변수에 할당합니다.
SetFormat | 수학 연산으로 생산돈 정수와 부동 소수점 수의 형식을 설정합니다.
SetKeyDelay | Send나 ControlSend로 키를 누른 후에 지연될 시간을 설정합니다.
SetMouseDelay | 마우스 이동이나 클릭 후에 지연될 시간을 설정합니다.
SetNumlockState | Numlock 키의 상태를 설정합니다. 강제로 온 또는 오프 상태를 유지할 수 있습니다.
SetScrollLockState | Scrolllock 키의 상태를 설정합니다. 강제로 온 또는 오프 상태를 유지할 수 있습니다.
SetRegView | 32-비트 스크립트에서 레지스트리 명령어가 64-비트 레지스트리 뷰에 접근하는 것을 그리고 그 반대를 허용합니다.
SetStoreCapslockMode | Send 후에 CapsLock의 상태를 복구할지 말지 결정합니다 .
SetTimer | 서브루틴이 자동으로 그리고 반복적으로 지정된 시간 간격마다 기동되도록 만듭니다.
SetTitleMatchMode | WinWait와 같은 명령어와 같이, WinTitle 매개변수의 부합 행위를 설정합니다.
SetWinDelay | WinActivate와 같이, 각 창 명령어 다음에 지연 시간을 설정합니다.
SetWorkingDir | 스크립트의 현재 작업 디렉토리를 변경합니다.
Shutdown | 시스템을 닫거나, 재시작하거나 또는 로그오프 합니다.
Sin() | Number의 삼각 사인 값을 돌려줍니다.
Sleep | 지정된 시간 동안 기다린 다음 계속 진행합니다.
Sort | 변수의 내용을 알파벳, 숫자, 또는 무작위 순서로 정렬합니다 (선택적으로 중복을 제거합니다).
SoundBeep | PC 스피커로 톤을 방출합니다.
SoundGet | 사운드 장치로부터 다양한 설정을 열람합니다 (마스터 음소거, 마스터 볼륨 등등.)
SoundGetWaveVolume | 사운드 장치로부터 웨이브 출력 볼륨을 열람합니다.
SoundPlay | 사운드, 비디오, 또는 기타 지원되는 파일 유형을 연주합니다.
SoundSet | 사운드 장치의 다양한 설정을 변경합니다 (마스터 음소거, 마스터 볼륨 등등.)
SoundSetWaveVolume | 사운드 장치를 위해 웨이브 출력 볼륨을 변경합니다.
SplashImage | JPG, GIF, 또는 BMP 이미지를 담고 있는 창을 만들거나 갱신합니다.
SplashTextOn | 맞춤 가능한 텍스트 팝업 창을 생성합니다.
SplashTextOff | 위의 창을 닫습니다.
SplitPath | 파일 이름이나 URL을 이름, 디렉토리, 확장자, 그리고 드라이브로 가릅니다.
Sqrt() | Number의 평방근을 돌려줍니다.
StatusBarGetText | 표준 상태 바 콘트롤으로부터 텍스트를 열람합니다.
StatusBarWait | 차의 상태 바에 지정된 문자열이 들어올 때까지 기다립니다.
StrPut() / StrGet() | 문자열을 메모리 주소로 복사하거나 복사해 옵니다. 선택적으로 코드 페이지에 맞게 변환합니다.
StringCaseSense | 문자열 비교에 대소문자를 구분할지 결정합니다. (기본값은 "대소문자를 구별하지 않습니다").
StringGetPos / InStr() | 문자열 안에서 지정된 부분문자열의 위치를 열람합니다.
StringLeft | 문자열의 왼쪽으로부터 여러 문자를 열람합니다.
StringLen / StrLen() | 문자열에 들은 문자의 갯수를 열람합니다.
StringLower | 문자열을 소문자로 변환합니다.
StringMid / SubStr() | 문자열에서 지정된 위치로부터 하나 이상이 문자를 열람합니다.
StringReplace | 지정된 부분문자열을 새 문자열로 교체합니다.
StringRight | 문자열의 오른쪽으로부터 문자들을 열람합니다.
StringSplit | 문자열을 지정된 가름자를 사용하여 부분 문자열 배열로 가릅니다.
StringTrimLeft | 문자열의 왼쪽으로부터 문자들을 제거합니다.
StringTrimRight | 문자열의 오른쪽으로부터 문자들을 제거합니다.
StringUpper | 문자열을 대문자로 변환합니다.
Suspend | 선택된 또는 모든 핫키와 핫스트링을 켜고 끕니다.
SysGet | 화면 해상도, 다중-모니터 정보, 시스템 객체의 크기, 그리고 기타 시스템 특성을 열람합니다.
Tan() | Number의 삼각 탄젠트를 돌려줍니다.
Thread | 쓰레드의 우선순위 또는 인터럽트 허용 여부를 설정합니다. 임시로 모든 타이머를 끌 수도 있습니다.
Throw | 에러가 일어났다는 신호를 보냅니다. 이 신호는 try-catch 서술문으로 잡을 수 있습니다.
ToolTip | 언제나 최상위에 있는 창을 화면 어디든지 만듭니다.
Transform | 잡다한 수학 기능, 비트별 연산, 그리고 ASCII/유니코드 변환 같은 작업을 수행합니다.
TrayTip | 풍선 메시지를 트레이 아이콘 근처에 만듭니다.
Trim | 문자열의 앞/뒤에서 문자들을 걷어냅니다.
Try | 하나 이상의 서술문 (명령어나 표현식)을 throw 명령어가 던지는 실행시간 에러와 예외로부터 보호합니다.
Until | Loop 또는 For-회돌이에 조건을 적용합니다.
UrlDownloadToFile | 인터넷으로부터 파일을 내려받습니다.
Var = value | 지정된 값을 변수에 할당합니다.
Var := expression | 표현식을 평가해서 그 결과를 변수에 저장합니다.
VarSetCapacity() | 변수의 가용 능력을 확대하거나 그의 메모리를 풀어줍니다. 보통, 이것은 DllCall과 같이 비정상적인 상황에서만 필요합니다.
While-loop | 지정된 표현식이 거짓으로 평가될 때까지 일련의 명령어를 반복적으로 실행합니다.
WinActivate | 지정된 창을 활성화합니다 (전경 화면으로 만듭니다).
WinActivateBottom | WinActivate와 동일합니다. 단 최상단 창이 아니라 (가장 최근까지도 활성화되지 않은) 최하단 창을 활성화한다는 점이 다릅니다.
WinActive() | 활성창이 지정된 기준에 부합하면 그 유일한 ID (HWND)를 돌려줍니다.
WinClose | 지정된 창을 닫습니다.
WinExist() | 제일 처음 부합한 창의 유일한 ID (HWND)를 돌려줍니다.
WinGetActiveStats | WinGetActiveTitle 기능과 WinGetPos기능을 하나의 명령어로 결합합니다.
WinGetActiveTitle | 활성 창의 제목을 열람합니다.
WinGetClass | 지정된 창의 클래스 이름을 열람합니다.
WinGet | 지정된 창의 유일한 ID, 프로세스 ID, 프로세스 이름, 또는 그의 콘트롤 목록을 열람합니다. 또 지정된 기준에 부합하는 모든 창의 목록을 열람할 수도 있습니다.
WinGetPos | 지정된 창의 크기와 위치를 열람합니다.
WinGetText | 지정된 창으로부터 텍스트를 열람합니다.
WinGetTitle | 지정된 창의 제목을 열람합니다.
WinHide | 지정된 창을 감춥니다.
WinKill | 지정된 창을 강제로 닫습니다.
WinMaximize | 지정된 창을 최대 크기로 확대합니다.
WinMenuSelectItem | 지정된 창의 메뉴 바에서 메뉴 항목을 요청합니다.
WinMinimize | 지정된 창을 태스크 바의 버튼으로 축소합니다.
WinMinimizeAll | 모든 창을 최소화합니다.
WinMinimizeAllUndo | 이전 WinMinimizeAll의 효과를 언두합니다.
WinMove | 지정된 창의 위치 / 크기를 변경합니다.
WinRestore | 지정된 창이 최대화 또는 최소화 상태이면 원래대로 복구합니다.
WinSet | 지정된 창에 다양한 변경을 가할 수 있습니다. 예를 들어 "항상 위에" 그리고 투명도.
WinSetTitle | 지정된 창의 제목을 바꿉니다.
WinShow | 지정된 창을 보여줍니다.
WinWait | 지정된 창이 끝날 때까지 기다립니다.
WinWaitActive | 지정된 창이 활성화될 때까지 기다립니다.
WinWaitClose | 지정된 창이 존재하지 않을 때까지 기다립니다.
WinWaitNotActive | 지정된 창이 활성화되지 않을 때까지 기다립니다.
#ClipboardTimeout | 첫 시도가 실패할 때 클립보드에 얼마나 오랫 동안 접근을 시도할지 변경합니다.
#CommentFlag | 스크립트의 주석 심볼을 쌍반점에서 다른 문자열로 바꿉니다.
#ErrorStdOut | 스크립트의 기동을 방해하는 구문 에러를 대화상자에 보여주는 대신에 표준 출력(stdout)으로 보냅니다.
#EscapeChar | 스크립트의 피신 문자를 바꿉니다 (예를 들어: 역사선 vs. 액센트).
#HotkeyInterval | #MaxHotkeysPerInterval과 함께, 핫키 활성화 비율을 지정합니다. 이를 넘어서면 경고 대화상자가 나타납니다.
#HotkeyModifierTimeout | 핫키 수식자의 행위에 영향을 미칩니다: CTRL, ALT, WIN, 그리고 SHIFT.
#Hotstring | 핫스트링 옵션이나 종료 문자를 바꿉니다.
#If | #IfWinActive와 비슷하지만, 어떤 표현식에도 작동합니다.
#IfTimeout | #If 표현식 한 줄을 평가하는 데 소비할 최대 시간을 설정합니다.
#IfWinActive / #IfWinExist | 문맥-감지 핫키와 핫스트링을 생성합니다. 문맥 감지 핫키는 활성화되어 있는 창의 종류에 따라 또는 존재 여부에 따라 다른 행위를 수행합니다.
#Include | 스크립트는 마치 지정된 파일의 내용이 지정한 위치에 정확하게 존재하는 듯 행동합니다.
#InputLevel | 핫키와 핫스트링이 어느 인위적인 키보드와 마우스 이벤트를 무시할지 제어합니다.
#InstallKeybdHook | 키보드 갈고리를 무조건 설치합니다.
#InstallMouseHook | 마우스 갈고리를 무조건 설치합니다.
#KeyHistory | KeyHistory 창에 보여주는 키보드와 마우스 이벤트의 최대 개수를 설정합니다. 0으로 설정하면 키 이력을 보여주지 않습니다.
#LTrim | 계속 섹션에서 들여쓰기를 다듬을지 여부를 설정합니다.
#MaxHotkeysPerInterval | #HotkeyInterval과 함께, 핫키의 활성화 비율을 설정합니다. 이 비율을 넘어서면 경고 대화상자가 나타납니다.
#MaxMem | 각 변수의 최대 메모리를 지정된 개수의 메가바이트로 설정합니다.
#MaxThreads | 동시 쓰레드의 최대 갯수를 설정합니다.
#MaxThreadsBuffer | #MaxThreadsPerHotkey 한계에 도달했을 때 키눌림을 무시하지 않고핫키가 버퍼 처리됩니다.
#MaxThreadsPerHotkey | 핫키 또는 핫스트링당 동시 쓰레드의 최대 개수를 설정합니다.
#MenuMaskKey | Win 또는 Alt 키업 이벤를 마스크하는데 사용할 키를 변경합니다.
#NoEnv | 환경 변수인지 알아보기 위해 빈 문자열을 점검하지 않습니다 (새로운 모든 스크립트에 권장합니다).
#NoTrayIcon | 트레이 아이콘을 보여주지 않습니다.
#Persistent | 스크립트를 영구히 실행되도록 유지합니다 (즉, 사용자가 닫을 때까지 또는 ExitApp를 만날 때까지).
#SingleInstance | 스크립트가 이미 실행 중일 때 다시 실행하는 것을 허용할지 여부를 결정합니다.
#UseHook | 갈고리를 사용해 키보드 핫키를 구현하도록 강제합니다.
#Warn | 보통 개발자쪽 에러임을 나타내는 선택된 조건에 대하여 경고를 켜거나 끕니다.
#WinActivateForce | 부드럽게 창을 활성화하지 않고 직접 강제로 활성화합니다.


IniDelete

표준 포맷의 .ini 파일로부터 값을 하나 삭제합니다.

IniDelete, Filename, Section [, Key]

매개변수

Filename

.ini 파일의 이름, 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주합니다.

Section

.ini 파일의 섹션 이름. 각괄호 안에 나타나는 제목 문구입니다. (각괄호는 이 매개변수 안에 포함시키지 마십시오).

Key

.ini 파일의 키 이름. 생략하면, 전체 Section이 삭제됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 많은 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1로 설정됩니다. 그렇지 않으면 0이 설정됩니다

논평

표준 ini 파일은 모습이 다음과 같습니다:

[SectionName]
Key=Value

관련 항목

IniRead, IniWrite, RegDelete

예제

IniDelete, C:\Temp\myfile.ini, section2, key


IniRead

표준 형식의 .ini 파일로부터 섹션 이름의 리스트 또는 섹션, 값을 읽습니다.

IniRead, OutputVar, Filename, Section, Key [, Default]
IniRead, OutputVarSection, Filename, Section
IniRead, OutputVarSectionNames, Filename

매개변수

OutputVar

열람된 값을 저장할 변수의 이름. 변수를 열람할 수 없으면, 변수는 Default 매개변수가 가리키는 값이 설정됩니다 (아래에 기술함).

OutputVarSection

[AHK_L 57+]: Key 매개변수를 생략하면 전체 섹션을 읽을 수 있습니다. 주석과 빈 줄은 생략됩니다. 오직 섹션에서 앞 쪽 65,533 문자만 열람됩니다.

OutputVarSectionNames

[AHK_L 57+]: Key와 Section 매개변수를 모두 생략하면 섹션 이름을 라인피드로 (`n) 구분한 리스트를 열람할 수 있습니다.

Filename

.ini 파일의 이름, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

Section

.ini 파일에 있는 섹션 이름, 각 괄호 안에 나타나는 제목 문구 (이 매개변수에 각괄호는 포함되지 않습니다).

Key

.ini 파일에 있는 키 이름.

Default

요청된 키가 발견되지 않으면 OutputVar에 저장할 값. 생략되면, 단어 ERROR가 기본값입니다. 빈 값 (빈 문자열)을 저장하려면, %A_Space%를 지정하십시오.

[AHK_L 57+]: Key가 생략되면 이 매개변수는 사용되지 않습니다.

ErrorLevel

ErrorLevel는 이 명령어로 설정되지 않습니다. 문제가 있었다면, OutputVar에는 위에 기술한 바와 같이 Default 값이 설정됩니다.

논평

운영 체제는 자동으로 열람된 문자열에서 앞 뒤 스페이스/탭을 생략합니다. 이를 방지하려면, 문자열을 홑따옴표 또는 겹따옴표로 둘러 싸십시오. 가장 바깥쪽 홑따옴표 또는 겹따옴표도 생략됩니다. 그러나 따옴표 안의 스페이스는 유지됩니다.

65,535 문자보다 긴 값은 결과가 일관성이 없을 가능성이 높습니다.

표준 ini 파일의 모습은 다음과 같습니다:

[SectionName]
Key=Value

유니코드: IniRead와 IniWrite는 외부 함수 GetPrivateProfileString와 WritePrivateProfileString에 의존해 값을 읽고 씁니다. 이런 함수들은 유니코드를 UTF-16 파일만 지원합니다; 다른 모든 파일은 시스템의 기본 ANSI 코드 페이지를 사용한다고 간주됩니다.

관련 항목

IniDelete, IniWrite, RegRead, 파일-읽기 회돌이, FileRead

예제

IniRead, OutputVar, C:\Temp\myfile.ini, section2, key
MsgBox, 값은 %OutputVar%입니다.


IniWrite

값이나 섹션을 표준 형식의 .ini 파일에 씁니다.

IniWrite, Value, Filename, Section, Key
IniWrite, Pairs, Filename, Section

매개변수

Value

Key의 등호 사인 (=)의 오른쪽에 씌여질 문자열이나 숫자.

텍스트가 길면, 여러 짧은 줄로 자를 수 있습니다. 계속 섹션을 사용하면 되는데, 이렇게 하면 가독성과 유지관리성이 향상됩니다.

Pairs

[AHK_L 57+]: .ini 파일에 쓸 섹션의 완전한 내용, [SectionName] 헤더는 제외. Key는 생략해야 합니다. Pairs은 빈 줄이 들어 있으면 안 됩니다. 섹션이 이미 존재하면, 마지막 키=값 쌍까지 모조리 덮어쓰기 됩니다. Pairs에는 등호 사인 (=) 없는 줄이 들어 있을 수 있지만, 이렇게 되면 결과는 일관성이 없습니다. 주석을 파일에 쓸 수 있지만, IniRead이 다시 읽을 때 다 걷어내 버립니다.

Filename

.ini 파일의 이름, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

Section

.ini 파일에 있는 섹션의 이름, 각 괄호 안에 나타나는 제목 문구입니다 (이 매개변수에 각괄호는 포함하지 않습니다).

Key

.ini 파일에 있는 키 이름.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1 없었으면 0이 설정됩니다.

논평

65,535 문자가 넘는 값을 파일에 쓸 수는 있지만, 그 결과는 일관성이 없으므로 보통 IniRead 또는 다른 어플리케이션에서 올바르게 읽어 들일 수 없습니다.

표준 ini 파일의 모습은 다음과 같습니다:

[SectionName]
Key=Value

새 파일은 AutoHotkey 버전에 따라 시스템의 기본 ANSI 코드페이지 또는 UTF-16으로 생성됩니다. UTF-16 파일은 빈 줄로 시작하는 듯 보일 수 있습니다. 첫 줄에 UTF-16 바이트 순서 표식이 들어 있기 때문입니다. 우회책은 아래를 참조하십시오.

유니코드: IniRead와 IniWrite는 외부 함수 GetPrivateProfileString와 WritePrivateProfileString에 의존하여 값을 읽고 씁니다. 이 함수들은 유니코드를 오직 UTF-16 파일만 지원합니다; 다른 모든 파일은 시스템의 기본 ANSI 코드 페이지를 사용한다고 간주합니다. 유니코드 스크립트에서, IniWrite은 각 새 파일에 UTF-16을 사용합니다. 이게 싫다면, IniWrite를 호출하기 전에 파일이 존재하는지 먼저 확인하십시오. 예를 들어:

FileAppend,, NonUnicode.ini, CP0 ; 마지막 매개변수는 대부분의 경우 선택적입니다.

관련 항목

IniDelete, IniRead, RegWrite

예제

IniWrite, 이것이 새 값입니다, C:\Temp\myfile.ini, section2, key


Input

사용자가 문자를 타자하기를 기다립니다.

Input [, OutputVar, Options, EndKeys, MatchList]

매개변수

OutputVar

사용자가 입력한 텍스트를 저장할 변수의 이름 (기본값으로, 인위적 입력도 나포됩니다).

이 매개변수 그리고 다른 매개변수들이 생략되면, 또다른 쓰레드에서 진행 중인 Input이 즉시 종료됩니다. 그리고 그의 ErrorLevel은 단어 NewInput이 설정됩니다. 대조적으로, 현재 명령어의 ErrorLevel은 이전 Input이 종료되었으면 0이 설정됩니다. 또는 종료할 이전 Input이 없었으면 1이 설정됩니다.

OutputVar는 사실상 키눌림을 저장하지 않습니다. 대신에, 키눌림으로 생산되는 문자들을 활성 창의 키보드 레이아웃/언어에 맞게 저장합니다. 결과적으로, 문자를 생산하지 않는 키눌림은 (예를 들어 PageUp 그리고 Escape) 저장되지 않습니다 (그렇지만 아래의 EndKeys 매개변수를 통하여 인지할 수 있습니다).

TAB (`t)과 같은 공백 문자들은 문자 그대로 저장됩니다. ENTER는 라인피드 (`n)로 저장됩니다.

Options

다른 기호로 구성되는 문자열 (순서에 상관없이, 사이에 선택적으로 스페이스 허용):

B: 백스페이스는 무시됩니다. 보통, Input 동안에 백스페이스를 누르면 최근에 눌린 문자가 문자열 끝으로부터 제거됩니다. 주의: (편집기에서) 입력 텍스트가 보이고 그리고 화살표 키나 기타 수단을 사용하여 그 안을 항해하면, 백스페이스는 캐럿 앞의 문자가 아니라 마지막 문자를 제거해 버립니다 (삽입 지점).

C: 대소문자 구분. 보통, MatchList는 대소문자를 구분하지 않습니다 (1.0.43.03 이전에서는 오직 A-Z 기호만 대소문자로 변화된다고 인지합니다. ü/Ü와 같은 기호는 인지하지 않습니다).

I: 오토핫키 스크립트가 생산하는 입력을 무시합니다. 예를 들어 SendEvent 명령어. 그렇지만 SendInput 그리고 SendPlay 방법은 이 설정에 상관 없이 언제나 무시됩니다.

L: 길이 제한 (예, L5). 최대로 허용되는 입력 길이. 텍스트가 이 길이에 도달하면, Input은 종료하고 ErrorLevel은 단어 Max가 설정됩니다. 단, 텍스트가 MatchList 문구 중 하나에 부합하는 경우는 예외입니다. 이 경우 ErrorLevel은 단어 Match가 설정됩니다. 길이를 지정하지 않으면, 16383 길이로 제한됩니다. 이 값은 절대 최대치이기도 합니다.

M: Control-A부터 Control-Z까지의 변형 키눌림은 실제 ASCII 문자가그에 상응한다면 인지되고 변환됩니다. 다음 예제를 연구해 보십시오. Control-C를 인지합니다:

Transform, CtrlC, Chr, 3 ; Ctrl-C에 대한 문자를 CtrlC 변수에 저장합니다.
Input, OutputVar, L1 M
if OutputVar = %CtrlC%
    MsgBox, Control-C를 눌렀습니다.
ExitApp

주의: Ctrl-A부터 Ctrl-Z까지의 문자는 Chr(1)부터 Chr(26)에 상응합니다. 또한, M 옵션 때문에 Ctrl-LeftArrow와 같이 어떤 키보드 단축키는 Input이 진행 중인 동안 잘못된 행위를 할 수 있습니다.

T: Timeout (예, T3). 입력을 종료하고 ErrorLevel에 단어 Timeout을 설정하기 전에 기다릴 초의 개수. 입력 시간이 초과하면, OutputVar는 사용자가 그 동안 타자한 모든 것들이 설정됩니다. 이 값은 부동 소수점 수일 수 있습니다. 예를 들어 2.5.

V: Visible. 보통, 사용자의 입력을 막습니다 (시스템으로부터 숨습니다). 이 옵션을 사용하면 사용자의 키눌림을 활성 창에 전달할 수 있습니다.

*: Wildcard (아무데나 찾음). 보통, 사용자가 타자한 것은 정확하게 MatchList 문구 중 하나에 부합해야 일치가 일어납니다. 이 옵션을 사용하면 입력 테스트의 전체 길이를 검색해서 부합을 좀 더 많이 찾을 수 있습니다.

E [v1.1.20+]: 키 코드가 아니라 문자 코드로 한-문자 종료 키를 처리합니다. 이렇게 하면 활성 창의 키보드 레이아웃이 스크립트의 키보드 레이아웃과 다를 경우 결과가 더 일관성이 있습니다. 또한 실제로 주어진 종료 문자를 생성하지 않는 키 조합이 입력을 종료하지 못하도록 막습니다; 예를 들어, @가 종료 키이면, (E 옵션이 사용될 경우) US 레이아웃에서 Shift+2는 촉발되지만 Ctrl+Shift+2는 촉발되지 않습니다. C 옵션도 사용된다면, 종료 키는 대소문자를 구분합니다.

EndKeys

키로 구성된 리스트, 그 중에 하나가 눌리면 입력을 종료합니다 (EndKey 자체는 OutputVar에 씌여지지 않습니다). 입력이 이런 식으로 종료될 때, ErrorLevel은 단어 EndKey 다음에 쌍점 그리고 EndKey이름이 설정됩니다. 예를 들어: EndKey:., EndKey:Escape.

EndKey 리스트는 Send 명령어와 비슷한 형식을 사용합니다. 예를 들어, {Enter}.{Esc}를 지정하면 ENTER, period (.), 또는 ESCAPE가 입력을 종료시킵니다. 활괄호 자체를 종료 키로 사용하려면, {{} 그리고/또는 {}}을 지정하십시오.

Control, Alt, 또는 Shift를 종료 키로 사용하려면, 그 키의 중립 버전이 아니라, 좌/우 버전을 사용하십시오. 예를 들어, {Control}가 아니라 {LControl}{RControl}로 지정하십시오.

Control-C (^c)와 같은 수식 키는 지원되지 않지만, 쉬프트 키를 함께 눌러야 하는 다른 문자들은 -- 즉, ?!:@&{}와 같은 구두점 -- v1.0.14+부터 지원됩니다. 다른 문자들은 v1.1.20+부터 위에 기술된 E 옵션으로 지원합니다. .

{vkFF}와 같이 명시적인 가상 키 보드도 역시 지정할 수 있습니다. 이것은 키에 이름도 없고 건네질 때 보이는 문자도 생산하지 않는 아주 희귀한 경우에 유용합니다. 그의 가상 키 코드는 다음과 같이 종료할 수 있습니다. 아래 키 리스트 페이지에 있는 단계를 따르십시오.

MatchList

키 문구를 쉼표로-가른 리스트. 이 문구에 부합하면 Input은 종료됩니다 (그 경우 ErrorLevel은 단어 Match가 설정됩니다). 사용자가 타자한 모든 것은 정확하게 이 문구 중 하나에 부합해야 일치가 일어납니다 (단, * 옵션이 있는 경우는 예외입니다). 게다가, 구분 쉼표 둘레에 있는 스페이스나 탭은 의미가 있습니다. 즉, 부합 문자열의 일부가 됩니다. 예를 들어, MatchList가 "ABC , XYZ "이라면, 사용자가 ABC 뒤에 또는 XYZ 앞에 스페이스를 타자해야 부합이 일어납니다.

연속적으로 쉼표 두 개는 문자 그대로의 쉼표 하나가 결과입니다. 예를 들어, 다음은 문자열의 끝에 문자 그대로의 쉼표 하나를 생산합니다: "string1,,,string2". 비슷하게, 다음 리스트는 오직 안에 문자 그대로의 쉽표를 가진 하나의 항목만 담습니다: "single,,item".

MatchList 안의 항목들은 개별적으로 취급하지 않기 때문에, 이 리스트를 완전히 한 변수 안에 담을 수 있습니다. 실제로, 그의 길이가 16383을 초과하면 전부 또는 일부를 변수에 담아야 합니다. 스크립트 줄의 최대 길이이기 때문입니다. 예를 들어, MatchList는 %List1%,%List2%,%List3%으로 구성될 수 있습니다 -- 여기에서 각 변수는 부합 문구의 방대한 부-리스트를 담고 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 아무 매개변수 없이 호출되었는데 Input이 진행 중이지 않으면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

1 또는 0

이 명령어가 매개변수 없이 사용될 때마다, ErrorLevel은 이전 입력이 성공적으로 종료하면 0이 설정되고, 아무 Input도 진행되지 않고 있으면 1이 설정됩니다.
NewInput | Input이 Input 명령어를 사용하는 또다른 쓰레드에 의하여 인터럽트 되었습니다.
Max | Input이 허용된 최대 길이에 도달하였습니다. 그리고 MatchList 안의 항목에 부합하지 못했습니다.
Timeout | Input 시간 제한 초과.
Match | Input이 MatchList 안의 항목 중 하나에 부합합니다.
EndKey:name

EndKeys 중 하나가 눌렸습니다. Input을 종료합니다. 이 경우, ErrorLevel에 단어 EndKey가 담기고 다음에 쌍점 하나와 활괄호 없이 종료 키의 이름이 따라옵니다. 예, "EndKey:Enter", "EndKey:Escape", 등등.

name이 키의 "정규화 된" 이름임을 주목하십시오. EndKeys에 어떻게 씌여져 있는지는 상관이 없습니다. 예를 들어, {Esc} 그리고 {vk1B}는 모두 "ErrorLevel:Escape"를 생산합니다. GetKeyName()를 사용하면 정규화된 이름을 열람할 수 있습니다.

E 옵션이 사용되었다면, name은 타자되어 들어 온 실제 문자입니다. 그렇지 않으면, 키 이름은 스크립트의 활성 키보드 레이아웃에 따라 결정됩니다.

[v1.1.20] 이전에서, 종료 키의 VK 코드가 0x41 (A)부터 0x5A (Z) 까지의 범위에 있다면, ErrorLevel은 보통 그에 상응하는 ASCII 문자를 담았습니다. 현재 키보드 레이아웃에 올바른가 아닌가는 상관이 없었습니다. v1.1.20 이후로, 올바른 문자가 사용됩니다. A부터 Z 범위의 문자가 사용되면, 하위 호환을 위해 대문자가 사용됩니다; 그렇지 않으면 보통 소문자입니다.

논평

Input이 이미 또다른 쓰레드에서 진행 중인 동안 이 명령어가 사용되면, 그 Input은 종료되고 그의 ErrorLevel에 단어 NewInput이 설정됩니다. 그 이후 (매개변수가 주어지면), 새 Input이 시작됩니다.

Input이 진행 중인 동안에, 맞춤 메뉴 항목과 타이머 서브루틴과 같은 새 쓰레드를 여전히 생성할 수 있습니다. 비슷하게, Input이 보여도 키보드 핫키도 여전히 효과가 있습니다. Input이 보이지 않는다면, 오직 갈고리 핫키만 촉발시킬 수 있습니다.

스크립트가 처음으로 이 명령어를 사용할 때, (아직 설치되지 않았다면) 키보드 갈고리가 설치됩니다. 게다가, 이 스크립트는 영속적이 됩니다. 즉, ExitApp를 사용해야 종료할 수 있다는 뜻입니다. 키보드 갈고리는 다음 Suspend 명령어나 Hotkey 명령어를 사용할 때까지 여전히 설치되어 있을 것입니다. 그 순간 핫키가 핫키가 요구하지 않으면 제거됩니다.

여러 언어나 키보드 레이아웃을 사용한다면, Input은 스크립트가 아니라 활성 창의 키보드 레이아웃을 사용합니다 (Input이 보이는지 여부에 상관이 없습니다). 그렇지만, 1.0.44.03 이전은 스크립트 자신의 라이아웃이 사용됩니다.

그렇게 유연하지는 못하지만, 핫스트링이 일반적으로 Input 명령어보다 더 사용하기 쉽습니다.

관련 항목

KeyWait, 핫스트링, InputBox, #InstallKeybdHook, 쓰레드, if var in/contains MatchList

예제

; 사용자가 키를 누르기를 기다립니다. 보이지 않는 문자를 생산하는 키들도
;  -- 예를 들어 수식 키, 함수 키 그리고 화살표 키도 --
; 종료 키(end keys)에 나열되므로 역시 탐지됩니다.
Input, SingleKey, L1, {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}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}

; 다음은 작동하는 핫키 예제입니다.
; 핫키에 틸드 (~) 접두 심볼이 있으므로, 키 눌림이 활성 창까지 뚫고 전달됩니다.
; 그래서, 편집기 안에서 [btw를 타자하면 (또는 기타 다른 부합하는 문구를 타자하면)
; 스크립트는 자동으로 여러분이 지정한 행위를 수행합니다.
; (예를 들어 타자된 텍스트를 교체합니다):

~[::
Input, UserInput, V T5 L4 C, {enter}.{esc}{tab}, btw,otoh,fl,ahk,ca
if (ErrorLevel = "Max")
{
    MsgBox, You entered "%UserInput%", which is the maximum length of text.
    return
}
if (ErrorLevel = "Timeout")
{
    MsgBox, You entered "%UserInput%" at which time the input timed out.
    return
}
if (ErrorLevel = "NewInput")
    return
If InStr(ErrorLevel, "EndKey:")
{
    MsgBox, You entered "%UserInput%" and terminated the input with %ErrorLevel%.
    return
}
; 그렇지 않으면, 부합이 발견되었습니다.
if (UserInput = "btw")
    Send, {backspace 4}by the way
else if (UserInput = "otoh")
    Send, {backspace 5}on the other hand
else if (UserInput = "fl")
    Send, {backspace 3}Florida
else if (UserInput = "ca")
    Send, {backspace 3}California
else if (UserInput = "ahk")
    Run, http://ahkscript.org
return


InputBox

사용자가 문자열을 입력하도록 요구하는 입력 박스를 보여줍니다.

InputBox, OutputVar [, Title, Prompt, HIDE, Width, Height, X, Y, Font, Timeout, Default]

매개변수

OutputVar

사용자가 입력한 텍스트를 저장할 변수의 이름.

Title

입력 박스의 제목. 비어 있거나 생략하면, 스크립의 이름이 기본값입니다.

Prompt

입력 박스의 텍스트, 보통 어떤 종류의 입력을 예상하고 있는지 사용자에게 보여주는 메시지입니다. Prompt가 길면, 계속 섹션을 수단으로 하여 더 짧은 줄들로 분리할 수 있습니다. 그러면 가독성과 유지관리성이 향상됩니다.

HIDE

이 매개변수가 단어 HIDE이면, 사용자의 입력이 가려집니다. 패스워드를 입력할 때 유용합니다.

Width

이 매개변수가 비어 있거나 생략하면, 창의 시작 너비는 375입니다. 이 매개변수는 표현식일 수 있습니다.

Height

이 매개변수가 비어 있거나 생략되면, 창의 시작 너비는 189가 됩니다. 이 매개변수는 표현식일 수 있습니다.

X, Y

창의 X 좌표와 Y 좌표 (0,0을 사용하면 바탕화면의 좌상 모서리로 이동합니다), 표현식 가능. 좌표가 비어 있거나 생략하면, 대화상자는 해당 차원의 가운데에 정렬됩니다. 좌표가 음수이면 그 창을 부분적으로 배치하거나 완전히 바탕화면 밖으로 배치할 수 있습니다.

Font

아직 구현되지 않았습니다 (빈 채로 두십시오). 앞으로 verdana:8와 같은 것을 받게 될 것입니다.

Timeout

초 단위 시간제한 (소수점을 포함할 수 있고 표현식 가능). 이 값이 2147483 (24.8 일)을 초과하면, 2147483으로 설정됩니다. 시간제한을 경과하면, InputBox 창이 자동으로 닫히고 ErrorLevel에 2가 설정됩니다. OutputVar는 여전히 사용자가 입력한 것이 설정됩니다.

Default

InputBox 대화상자가 처음 시작할 때 편집 필드에 나타날 텍스트. 사용자는 백스페이스나 기타 수단으로 변경할 수 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

아래 참조.

논평

이 대화상자로 사용자는 텍스트를 입력하고 OK 또는 CANCEL를 누를 수 있습니다. 사용자는 대화상자의 테두리를 끌어 크기를 조절할 수 있습니다.

ErrorLevel는 사용자가 CANCEL 버튼을 누르면 1이 설정되고 OK 버튼을 누르면 0이 설정됩니다. 아니면 대화상자가 시간 제한에 걸리면 2가 설정됩니다. 세 경우 모두 OutputVar에는 사용자가 입력한 값이 설정됩니다. 이렇게 하면 CANCEL 버튼은 CANCEL말고 스크립트 디자이너가 원하는 함수를 수행할 수 있습니다.

GUI 창은 Gui +OwnDialogs를 사용하여 모달 InputBox를 보여줄 수도 있습니다. 모달 InputBox를 사용하면 사용자는 InputBox를 끝낼 때까지 GUI 창과 상호작용할 수 없습니다.

관련 항목

GUI, Input, MsgBox, FileSelectFile, FileSelectFolder, SplashTextOn, ToolTip

예제

InputBox, password, 암호를 입력하십시오, (입력은 보이지 않을 겁니다), hide
InputBox, UserInput, Phone Number, 전화 번호를 입력하십시오., , 640, 480
if ErrorLevel
    MsgBox, CANCEL을 눌렀습니다.
else
    MsgBox, "%UserInput%"을 입력했습니다.


KeyHistory

스크립트 정보를 보여주고 최근의 키눌림과 마우스 클릭의 이력을 보여줍니다.

KeyHistory

논평

이 명령어는 메인 창에서 "View->Key history" 메뉴 항목을 선택한 것과 동등합니다.

키 이력을 끄려면, 다음 줄을 스크립트 아무데나 지정하십시오:

#KeyHistory 0

#KeyHistory는 또 보여줄 이벤트의 개수를 바꾸는 데에도 사용할 수 있습니다.

이 특징은 목적이 스크립트와 핫키의 디버그를 돕는 데 있습니다. 또한 비-표준 키보드 키의 스캔 코드를 탐지하는 데에도 사용할 수 있습니다. 키 리스트 페이지 아래에 기술된 단계를 사용하면 됩니다 (스캔 코드를 알면 그런 키를 핫키로 만들 수 있습니다).

휠 이벤트의 가상 키 (VK) (WheelDown, WheelUp, WheelLeft, 그리고 WheelRight)는 값 보유자로서 오토핫키의 바깥에서는 아무 의미가 없습니다. 또한 휠 이벤트의 스캔 코드는 실제로는 휠을 돌리는 눈금의 개수입니다 (보통 1).

스크립트에 키보드 갈고리가 설치되어 있지 않으면, KeyHistory 창은 스크립트 자체에서 만들어내는 키보드 이벤트만 보여줍니다 (즉, 사용자의 이벤트는 보여주지 않습니다). 스크립트에 마우스 갈고리가 설치되어 있지 않으면, 마우스 버튼 이벤트는 보이지 않습니다. 스크립트가 갈고리를 사용하는 지 그 여부는 스크립트의 메인 창에서 "View->Key History"를 통하여 볼 수 있습니다 (트레이 아이콘의 "Open"을 통하여 접근이 가능합니다). 강제로 갈고리를 설치할 수 있습니다. 스크립트에 다음 줄을 추가하면 됩니다:

#InstallKeybdHook
#InstallMouseHook

관련 항목

#KeyHistory, #InstallKeybdHook, #InstallMouseHook, ListHotkeys, ListLines, ListVars, GetKeyState, KeyWait, A_PriorKey

예제

KeyHistory ; 이력 정보를 창 안에 보여줍니다.


KeyWait

키나 마우스/조이스틱 버튼이 눌리거나 떼어지기를 기다립니다.

KeyWait, KeyName [, Options]

매개변수

KeyName

이것은 키보드로부터 문자 하나 또는 키 리스트로부터의 이름 중 하나가 될 수 있습니다. 마우스/조이스틱 버튼과 같은 경우, 조이스틱 속성은 버튼 지원합니다.

명시적인 가상 키 코드도 vkFF와 같이 역시 지정할 수 있습니다. 희귀한 경우이기는 하지만 키에 이름이 없거나 눌릴 때 보이지 않는 문자를 생산하는 경우에 유용합니다. 그의 가상 키 코드는 다음 키 리스트 페이지 아래에 있는 단계를 밟아 알아낼 수 있습니다 .

Options

이 매개변수가 비어 있으면, 명령어는 지정된 키나 마우스/조이스틱 버튼을 물리적으로 사용자가 떼기를 무한정 기다립니다. 그렇지만, 키보드 갈고리가 설치되어 있지 않고 KeyName이 Send 명령어와 같은 수단으로 인위적으로 뗀 키보드 키이면, 그 키는 물리적으로 뗀 것처럼 보일 것입니다. 마우스 갈고리가 설치되어 있지 않을 때 마우스 버튼도 마찬가지입니다.

Options: 다음 기호로 구성되는 문자열 (순서대로, 선택적으로 사이에 스페이스 허용):

D: 키가 눌리기를 기다립니다.

L: 키의 논리적 상태를 점검합니다. 이는 OS와 활성 창이 믿고 있는 키의 상태입니다 (반드시 물리적 상태와 같은 것은 아닙니다). 이 옵션은 조이스틱 버튼에 대해서는 무시됩니다.

T: 시간제한 (예, T3). 시한 종료를 선언하기 전에 기다릴 초의 개수. 시한이 지나면 ErrorLevel에 1이 설정됩니다. 키나 버튼이 지정된 상태를 이루면, 이 명령어는 시한이 지나기를 기다리지 않습니다. 대신에, 즉시 ErrorLevel에 0을 설정하고 스크립트는 실행을 계속합니다.

시간제한 값은 2.5와 같이 부동 소수점 수가 될 수 있습니다. 그러나 0x03와 같은 십육진 수는 안됩니다.

ErrorLevel

명령어가 시한제한에 걸리면 ErrorLevel에 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

키나 마우스 버튼의 물리적 상태는 보통 논리적 상태와 같습니다. 단, 키보드/마우스 갈고리가 설치되어 있지 않아야 합니다. 설치가 되어 있으면, 사용자가 물리적으로 키를 누르고 있는지 아닌지 정확하게 반영합니다. 여러분의 스크립트가 갈고리를 사용하고 있는지 알고 싶으면 KeyHistory 명령어 또는 메뉴를 사용할 수 있습니다. 두 갈고리를 모두 강제로 설치하려면 스크립트에 #InstallKeybdHook 지시어와 #InstallMouseHook 지시어를 추가하면 됩니다.

이 명령어가 대기 상태에 있는 동안, 새 쓰레드를 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 기동할 수 있습니다.

두 개 이상의 키가 떼어지기를 기다리려면, KeyWait를 연속적으로 사용하십시오. 예를 들어:

KeyWait Control  ; Control과 Alt가 모두 떼어지기를 기다립니다.
KeyWait Alt

키 집합 중의 한 키가 떼어지기를 기다리려면, Input 명령어의 예제 섹션을 참조하십시오.

관련 항목

GetKeyState, Key List, Input, KeyHistory, #InstallKeybdHook, #InstallMouseHook, ClipWait, WinWait

예제

; 예제 #1: 기본 사용법:
KeyWait, a  ; A 키가 떼어지기를 기다립니다.
KeyWait, LButton, D  ; 왼쪽 마우스 버튼이 눌리기를 기다립니다.
KeyWait, Joy1, D T3  ; 첫 번째 조이스틱 버튼이 눌리기를 3 초까지 기다립니다.
KeyWait, LAlt, L  ; 왼쪽 Alt 키가 논리적으로 떼어지기를 기다립니다.

; 예제 #2: 간단한 핫키:
~Capslock::
KeyWait, Capslock  ; 사용자가 물리적으로 떼기를 기다립니다.
MsgBox Capslock 키를 누르고 뗐습니다.
return

; 예제 #3: 키 또는 마우스 버튼 리맵핑하기
; (이것은 오직 시연용입니다. 내장된 리맵핑 특징을 사용하는 것이 더 쉽습니다):
; 왼버튼이 눌려 있는 동안 NumpadAdd를 눌렀습니다.
; 그 효과로 NumpadAdd가 왼 버튼으로 변신합니다.
*NumpadAdd::
MouseClick, left,,, 1, 0, D  ; 왼버튼을 누르고 있습니다.
KeyWait, NumpadAdd  ; 키가 떼어지기를 기다립니다.
MouseClick, left,,, 1, 0, U  ; 마우스 버튼을 뗍니다.
return

; 예제 #4: 키가 두 번 눌릴 때를 탐지합니다 (더블 클릭과 유사).
; KeyWait는 키보드의 자동 반복 특징 때문에 RControl 키를 누른 채 또다른 키를 변경할 때
; 원하지 않는 이중-눌림이 되지 않도록 방지하는 데 사용됩니다.
; 핫키의 쓰레드를 계속 실행되도록 유지해 자동-반복을 막고,
; #MaxThreadsPerHotkey이 기본 설정으로 1을 유지하도록 함으로써 이 기능을 구현합니다.
; 주의:  SetTimer 페이지 하단에 1, 2, 3-클릭을 구별하는
; 더 정교한 스크립트가 있습니다.

~RControl::
if (A_PriorHotkey <> "~RControl" or A_TimeSincePriorHotkey > 400)
{
    ; 눌림 사이에 너무 시간이 많습니다. 그래서 이것은 더블 클릭이 아닙니다.
    KeyWait, RControl
    return
}
MsgBox 오른쪽 콘트롤 키를 두 번 눌렀습니다.
return


ListHotkeys

현재 스크립트가 사용 중인 핫키를 보여줍니다. 그들의 서브루틴이 현재 실행중인지 그리고 그들이 키보드 또는 마우스 갈고리를 사용하는지 여부를 보여줍니다.

ListHotkeys

이 명령어는 메인 창의 View->Hotkeys 메뉴 항목을 선택한 것과 동일합니다.

핫키가 Hotkey 명령어를 통하여 꺼져 있으면, OFF 또는 PART로 나열될 것입니다("PART"란 핫키의 변형중 일부만 꺼져 있다는 뜻입니다).

[v1.1.16+]: 핫키의 변형중 하나라도 0-아닌 #InputLevel을 가지고 있다면, 그 레벨 (또는 최소 그리고 최대 레벨)을 보여줍니다.

핫키의 서브 루틴 중 하나라도 현재 실행 중이면, 그 핫키에 대하여 쓰레드의 전체 개수를 보여줍니다.

마지막으로, 핫키의 유형도 보여줍니다. 핫키의 유형은 다음 중 하나입니다:

reg: 핫키가 운영 체제의 RegisterHotkey() 함수를 통하여 구현되었습니다.
reg(no): 위와 동일하지만 이 핫키는 비활성 상태입니다 (지원되지 않거나 또는 보류(suspended) 되었기 때문).
k-hook: 핫키가 키보드 갈고리를 통하여 구현되었습니다.
m-hook: 핫키가 마우스 갈고리를 통하여 구현되었습니다.
2-hooks: 핫키가 위에 언급된 두 갈고리를 모두 요구합니다.
joypoll: 핫키가 조이스틱을 규칙적인 간격으로 폴링해서 구현되었습니다.

관련 항목

#InstallKeybdHook, #InstallMouseHook, #UseHook, KeyHistory, ListLines, ListVars, #MaxThreadsPerHotkey, #MaxHotkeysPerInterval

예제

ListHotkeys


ListLines

최근에 실행된 스크립트 줄들을 보여줍니다.

ListLines [, On|Off]

매개변수

On|Off

비어 있거나 생략하면, 최근에 실행된 줄 이력을 보여줍니다. v1.0.48.01+에서, 선택적인 첫 번째 매개변수를 추가했는데, 이것은 On 또는 Off일 수 있습니다. 다음과 같이 현재 쓰레드의 행위에만 영향을 줍니다:

On: 잇따라-실행되는 줄들을 이력에 포함합니다. 이것은 모든 스크립트가 시작할 때 기본값입니다.

Off: 잇따라-실행되는 줄들을 이력으로부터 제외합니다.

논평

(매개변수 없이) ListLines는 메인 창에서 "View->Lines most recently executed" 메뉴 항목을 선택한 것과 동등합니다. 스크립트를 디버그하는 데 도움을 줄 수 있습니다.

ListLines Off/On를 사용하면 선택적으로 어떤 줄들을 이력으로부터 제외할 수 있습니다. 그러면 이력이 너무 빠르게 꽉 차는 것을 막는데 도움이 될 수 있습니다 (예를 들어 빠르고 많은 반복이 있는 회돌이 같은 경우). ListLines Off도 몇 퍼센트는 수행성능 향상에 도움이 됩니다.

새로 기동된 쓰레드는 모두 (핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴은) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본 값은 자동 실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하여 바꿀 수 있습니다.

내장 변수 "A_ListLines"같은 것은 없지만, 비슷한 기능을 얻을 수 있습니다. 스크립트에 다음을 포함하십시오:

ListLines(PassTrueToTurnOnOrFalseToTurnOff)  ; ListLines의 이전 설정을 돌려줍니다 (다음을 호출하기 전에).
{
    static sListLines := true  ; 모든 스크립트가 시작할 때 기본값은 "ListLines On"입니다.
    ListLines % PassTrueToTurnOnOrFalseToTurnOff ? "On" : "Off"  ; 이 아래로 실행되는 줄들을 로그로부터 제외하기 위해 ListLines를 무조건 실행합니다.
    ListLines_prev := sListLines
    sListLines := PassTrueToTurnOnOrFalseToTurnOff
    return ListLines_prev
}

; 위의 함수를 사용하려면:
prev_ListLines := ListLines(false)  ; ListLines를 임시로 끕니다.
; ...
ListLines(prev_ListLines)  ; ListLines를 이전의 설정으로 복구합니다.

관련하여 한 마디 하면, 내장 변수 A_LineNumber와 A_LineFile에느 각각 현재 실행 중인 줄 번호와 자신이 속한 파일 이름이 담깁니다.

관련 항목

KeyHistory, ListHotkeys, ListVars

예제

ListLines
ListLines Off


ListVars

스크립트의 변수들을 보여줍니다: 이름과 현재 내용.

ListVars

논평

이 명령어는 메인 창에서 "View->Variables" 메뉴 항목을 선택한 것과 동등합니다. 스크립트를 디버그할 때 도움이 됩니다.

리스트의 각 줄은 다음과 같이 구성됩니다:
1) 변수의 이름.
2) 변수 내용의 길이와 변수의 가용능력. 예를 들어: [50 of 63]
3) 변수 내용의 앞쪽 문자 60개.

이 명령어가 함수 안에 사용되면, 그 함수의 지역 변수들이 (스크립트의 전역 변수들보다) 먼저 화면에 보여집니다.

알려진 한계: 함수에 (또는 전역 변수 리스트에) 10,000개가 넘게 변수가 들어 있다면, 이 명령어는 정확하게 알파벳 순서로 보여주지 못할 수 있습니다; 즉, 어떤 것은 빼고 보여줄 가능성이 있습니다.

관련 항목

KeyHistory, ListHotkeys, ListLines

예제

ListVars


ListView (GUI)

ListView

목차

  • 소개와 간단한 예제
  • 옵션과 스타일
  • 보기 모드: (기본), 아이콘, 타일, 소형-아이콘, 그리고 리스트를 보고합니다.
  • 내장 함수:
    • 행 함수 (추가, 변경, 그리고 삭제)
    • 열 함수
    • ListView로부터 데이터 얻기
  • G-라벨 고지
  • ImageLists (아이콘을 ListView에 추가하는 수단)
  • ListView 논평
  • 예제

소개와 간단한 예제

List-View는 운영 체제가 제공하는 대단히 정교한 콘트롤 중 하나입니다. 자주 보는 형태로는, 행과 열을 테이블 방식으로 보여주는 것이 있습니다. 그 예로는 윈도우즈 탐색기에서 파일과 폴더를 (자세히 보기) 나열해 보여줍니다.

정교하기는 하지만, 기본적인 특징은 사용하기 쉽습니다. ListView를 생성하는 구문은 다음과 같습니다:

Gui, Add, ListView, Options, ColumnTitle1|ColumnTitle2|...

다음은 작동하는 스크립트입니다. 사용자의 "My Documents" 폴더에 든 파일 목록을 담은 ListView를 만들고 보여줍니다:

; ListView를 두 개의 열, 이름과 크기로 해서 만듭니다:
Gui, Add, ListView, r20 w700 gMyListView, Name|Size (KB)

; 폴더로부터 파일 이름 목록을 수집해 그것을 ListView에 넣습니다:
Loop, %A_MyDocuments%\*.*
    LV_Add("", A_LoopFileName, A_LoopFileSizeKB)

LV_ModifyCol()  ; 그의 내용에 맞게 각 열은 자동으로 크기가 조절됩니다.
LV_ModifyCol(2, "Integer")  ; 정렬의 목적으로, 2 번 열은 정수라는 것을 나타냅니다.

; 창을 보여주고 돌아갑니다. 사용자가 행을 더블 클릭할 때마다 스크립트에 고지됩니다.
Gui, Show
return

MyListView:
if A_GuiEvent = DoubleClick
{
    LV_GetText(RowText, A_EventInfo)  ; 행의 첫 필드로부터 텍스트를 얻습니다.
    ToolTip You double-clicked row number %A_EventInfo%. Text: "%RowText%"
}
return

GuiClose:  ; 창이 닫히면 스크립트가 자동으로 종료해야 한다고 알립니다.
ExitApp

"Gui, Add, ListView, Options"에 대한 옵션과 스타일

AltSubmit: 스크립트에게 정상보다 더 많은 유형의 ListView 이벤트를 고지합니다. 다른 말로 하면, g-라벨이 더 자주 기동됩니다. 자세한 것은ListView 고지를 참조하십시오.

Background: 단어 Background 다음에 바로 색 이름 (컬러 차트 참조) 또는 RGB 값을 지정하십시오 (0x 접두사는 선택적입니다). 예를 들어: BackgroundSilver, BackgroundFFDD99. 이 옵션이 존재하지 않으면, ListView는 처음에 기본값이 Gui Color의 마지막 매개변수로 설정된 배경색으로 시작합니다. (없다면, 시스템의 기본 배경색이 사용됩니다). BackgroundDefault를 지정하면 시스템의 기본 배경색에 적용됩니다 (보통 흰색). 예를 들어, GuiControl, +BackgroundDefault, MyListView를 통하여 ListView를 기본값으로 복구할 수 있습니다.

C: 텍스트 컬러. 기호 C 다음에 바로 컬러 이름 (컬러 차트 참조) 또는 RGB 값을 지정하십시오 (0x 접두사는 선택적입니다). 예를 들어: cRed, cFF2211, c0xFF2211, cDefault.

Checked: 각 행의 왼쪽에 체크박스를 제공합니다. 행을 추가할 때, 단어 Check를 그의 옵션에 지정하면 박스를 체크표식된 상태로 시작할 수 있습니다. 사용자는 그 체크박스를 클릭하거나 스페이스바를 눌러 행을 체크하거나 해제할 수 있습니다.

Count: 단어 Count 다음에 바로 ListView가 궁극적으로 담을 행의 총 개수를 지정하십시오. 제한은 없습니다: 이 한계를 넘어서도 행은 여전히 추가할 수 있습니다. 대신에, 이 옵션은 행을 추가할 때마다 메모리를 할당하기 보다 한 번만 할당할 수 있도록 제어하기 위한 힌트로 기여합니다. 그러면 행-추가 수행성능이 크게 개선됩니다 (또한 정렬 수행성능도 향상됩니다). 수행성능을 더욱 개선하려면, 방대한 개수의 행을 추가하기 전에 GuiControl, -Redraw, MyListView를 사용하십시오. 이후로, GuiControl, +Redraw, MyListView를 사용하면 다시 그리기를 다시 켤 수 있습니다 (또한 콘트롤도 다시 칠합니다).

Grid: 수직 수평 줄을 시각적으로 제공해 행와 열 사이의 경계를 나타냅니다.

Hdr: -Hdr (마이너스 Hdr)을 지정하면 열 제목이 담긴 특별한 최상위 행을 생략할 수 있습니다. 나중에 다시 보이게 하려면, GuiControl, +Hdr, MyListView를 사용하십시오.

LV: 문자열 LV 다음에 바로 확장 ListView 스타일 번호를 지정하십시오. 이런 스타일들은 완전히 총칭 확장 스타일과 다릅니다. 예를 들어, -E0x200를 지정하면 콘트롤의 기본 테두리를 없애기 위해 총칭 확장 스타일 WS_EX_CLIENTEDGE가 제거됩니다. 대조적으로, -LV0x20를 지정하면 LVS_EX_FULLROWSELECT이 제거됩니다.

LV0x10: -LV0x10을 지정하면 사용자가 열 헤더를 왼쪽이나 오른쪽으로 끌어서 재정렬할 수 없습니다. 그렇지만, 이렇게 하는 것은 보통 불필요합니다. 왜냐하면 열을 물리적으로 재배치하는 것은 스크립트에 보여지는 열 순서에 영향을 미치지 않기 때문입니다. 예를 들어, 첫 번째 열은 스크립트의 관점에서 언제나 열 1입니다. 사용자가 물리적으로 그 열을 왼쪽이나 오른쪽 다른 열로 이동했다고 할지라도 마찬가지입니다.

LV0x20: -LV0x20을 지정하면 행에서 첫 번째 필드를 클릭해야만 선택됩니다 (보통, 필드 아무데나 클릭해도 선택됩니다). 이렇게 하면 사용자가 행 그룹 둘레의 사각 박스를 끌어서 행들을 더 쉽게 선택할 수 있습니다.

Multi: -Multi (마이너스 Multi)를 지정하면 사용자가 한 번에 하나씩만 선택할 수 있습니다.

NoSortHdr: 헤더를 클릭해도 선택되지 않습니다. 보통의 버튼처럼 보이지 않고 납짝 눌린 모습입니다. 대부분의 다른 ListView 스타일과 다르게, 이 스타일은 ListView가 생성된 후에 변경할 수 없습니다.

NoSort: 사용자가 열 헤더를 클릭하면 일어나는 자동 정렬을 끕니다. 그렇지만, 그 헤더는 여전히 시각적으로 버튼처럼 행위합니다 (단, NoSortHdr가 지정된 경우는 예외입니다). 게다가, g-라벨은 여전히 ColClick notification을 받아서, 거기에 맞춤 정렬 또는 기타 조치로 응답할 수 있습니다.

ReadOnly: -ReadOnly (마이너스 ReadOnly)를 지정하면 각 행의 첫 열에 있는 텍스트를 편집할 수 있습니다. 행을 편집하려면, 선택한 다음, F2 키를 누르십시오. 다른 방법으로, 행을 한 번 클릭해서 선택한 다음, 0.5 초를 기다린 다음, 같은 행을 다시 클릭하면 편집할 수 있습니다.

R: 행의 높이 (생성시). 기호 R 다음에 바로 콘트롤 안에 여유를 주기 위해 허용할 행의 개수를 지정하십시오. 예를 들어, R10는 콘트롤에 10 행 높이를 만듭니다. ListView가 보고 모드가 아니라 보기 모드로 생성되었다면, 콘트롤은 크기가 텍스트 행이 아니라 아이콘 행에 맞추어 조절됩니다. 주의: 아이콘을 ListView의 행에 추가하면 각 행의 높이가 증가합니다. 그래서 이 옵션이 부정확하게 됩니다.

Sort: 콘트롤이 첫 열의 내용에 맞추어 알파벳 순서로 정렬을 유지합니다.

SortDesc: 위와 같지만 내림 차순입니다.

WantF2 [v1.0.44+]: -WantF2 (마이너스 WantF2)를 지정하면 F2 키로 현재 초점이 있는 행을 편집할 수 없습니다. 이 설정은 -ReadOnly도 켜져 있어야 효과가 있습니다. 이 설정에 상관 없이, g-라벨은 여전히 F2 고지를 받습니다.

(이름 없는 번호 스타일): 위의 스타일 말고는 자주 사용되지 않기 때문에, 나머지 스타일은 이름이 없습니다. 목록은 ListView 스타일 테이블을 참조하십시오.

보기 모드

ListView는 다섯가지 보기 모드가 있습니다. 그 중에 가장 많이 사용되는 보기는 보고 모드입니다 (이것이 기본값). 다른 보기 모드 중 하나를 사용하려면, 그 이름을 옵션 목록에 지정하십시오. 보기 모드는 콘트롤이 생성된 후에도 바꿀 수 있습니다. 예를 들어: GuiControl, +IconSmall, MyListView.

Icon: 큰-아이콘 보기로 보여줍니다. 이 보기 모드 그리고 Report를 제외하고 다른 모든 모드에서, 첫 열이 아닌 다른 컬럼에 있는 텍스트는 보이지 않습니다. 이 모드에서 아이콘을 보여주려면, ListView는 큰-아이콘 ImageList를 거기에 할당해야 합니다.

Tile: 큰-아이콘 보기로 보여줍니다. 그러나 각 항목의 텍스트를 아래가 아닌 오른쪽에 보여준다거나 하는 인체공학적 차이가 있습니다. Checkboxes는 이 보기 모드에서 작동하지 않습니다. 또한, Windows XP 미만이 운영 체제에서 이 모드로 보여주기를 시도해 봐야 아무 효과도 없습니다.

IconSmall: 작은-아이콘 보기로 보여줍니다.

List: 리스트 형태로 작은-아이콘 보기로 보여줍니다. 아이콘을 열에 보여줍니다. 열의 개수는 콘트롤의 너비와 그 안에 든 가장 넓은 텍스트의 너비에 따라 다릅니다

Report: 다시 보고 모드로 전환합니다. 이것이 원래 초기값입니다. 예를 들어: GuiControl, +Report, MyListView.

ListView용 내장 함수

모든 ListView 함수는 현재 쓰레드의 기본 GUI 창에 작동합니다 (이는 Gui, 2:Default를 통하여 바꿀 수 있습니다). 기본 창이 존재하지 않거나 ListView 콘트롤이 없으면, 모든 함수는 0을 돌려주어 문제를 알립니다.

창에 하나 이상의 ListView 콘트롤이 있으면, 기본값으로 함수들은 최근에 추가된 콘트롤에 작동합니다. 이를 바꾸려면, Gui, ListView, ListViewName를 지정하십시오. 여기에서 ListViewName은 ListView의 연관 변수의 이름이거나, Window Spy가 보여주는 ClassNN 또는(v1.1.04+에서) 그의 HWND일 수 있습니다. 일단 변경되면, 모든 기존의 그리고 미래의 쓰레드는 지정된 ListView를 사용합니다.

문구 "row number"가 이 페이지에 사용되면, ListView 안에서 행의 현재 위치를 참조합니다. 최상위 행은 1이고, 두 번째 행은 2이며, 그리고 등등. 한 행이 추가된 후에, 그의 행 번호는 다른 행을 정렬하고 지우며 그리고 삽입하기 때문에 바뀌는 경향이 있습니다. 그러므로, 그의 내용에 기반하여 특정한 행(들)을 찾으려면, 보통 회돌이 안에서 LV_GetText()를 사용하는 것이 가장 좋습니다.

행 함수

LV_Add([Options, Field1, Field2, ...])

새 행을 리스트 아래에 추가합니다. 매개변수 Field1과 기타는 새 행의 열로서, 텍스트 또는 숫치일 수 있습니다 (숫치 표현식 결과 포함). 필드를 모드 비우려면, "" 비슷한 것을 지정하십시오. 모든 열을 채우기에 필드가 부족하면, 마지막 열은 빈채로 남습니다. 필득 너무 많다면, 마지막 필드들은 완전히 무시됩니다.

실패시, LV_Add()는 0을 돌려줍니다. 성공하면, 새 행 번호를 돌려줍니다. ListView가 Sort 또는 SortDesc 스타일을 가지고 있다면 반드시 미자막 행 번호일 필요는 없습니다.

행 옵션

Options 매개변수는아래 리스트의 단어로 구성되는 문자열입니다 (대소문자 구문 없음). 각 단어를 다름 단어와 사이에 스페이스나 탭으로 구분하십시오. 옵션을 제거하려면, 앞에 마이너스 사인을 추가하십시오. 옵션을 추가하려면, 플러스 사인을 허용하지만 필수는 아닙니다.

Check: 체크표식을 행에 보여줍니다 (ListView가 체크박스를 가지고 있다면). 나중에 해제하려면, LV_Modify(RowNumber, "-Check")를 사용하십시오.

Col: 단어 Col 다음에 바로 열 번호를 지정하십시오. 거기부터 매개변수 Col1과 기타를 적용하기 시작합니다. 이것은 한 행에서 왼쪽에 있는 필드에 영향을 주지 않고 개별 필드를 변경하는 데 LV_Modify()와 아주 자주 사용됩니다.

Focus: 키보드 초점을 행에 설정합니다 (종종 Select와 함께 사용됩니다). 나중에 초점을 해제하려면, LV_Modify(RowNumber, "-Focus")을 사용하십시오.

Icon: 단어 Icon 다음에 바로 이 행의 아이콘 번호를 지정합니다. 이 아이콘은 첫 열의 왼쪽에 보여집니다. 이 옵션이 없으면, ImageList에서 첫 아이콘이 사용됩니다. 빈 아이콘을 보여주려면, ImageList의 아이콘의 번호보다 더 큰 번호를 지정하십시오. 콘트롤에 작은-아이콘 ImageList가 없다면, 보고 모드에서 아이콘도 보이지 않고 아이콘을 위해 스페이스도 보존되지 않습니다.

Select: 행을 선택합니다. 나중에 해제하려면, LV_Modify(RowNumber, "-Select")를 사용하십시오. 행들을 선택할 때, 보통 적어도 한 행은 언제나 초점 특성을 가지는지 확인하는 것이 가장 좋습니다. 왜냐하면 그래서 Apps 키가 그의 문맥 메뉴를 (있다면) 초점 행 근처에 보여줄 수 있기 때문입니다. 단어 Select는 선택적으로 다음에 바로 0 또는 1이 따라와 시작 상태를 알려줄 수 있습니다. 다른 말로, "Select" 그리고 "Select" . VarContainingOne는 같습니다 (여기에서 점은 결합 연산자입니다). 이 테크닉은 또한 위의 Focus 그리고 Check에도 작동합니다

Vis [v1.0.44+]: 지정된 행이 필요하면 ListView를 스크롤해서 완전히 보이도록 확인합니다. 이것은 LV_Modify()에만 영향을 줍니다; 예를 들어: LV_Modify(RowNumber, "Vis").

LV_Insert(RowNumber [, Options, Col1, Col2, ...])

LV_Add()와 동일하게 행위합니다. 단, 첫 번째 매개변수가 다릅니다. 이 매개변수는 새로 삽입된 행의 행 번호를 지정합니다. RowNumber 이하의 행은 모두 아래로 이동해 새 행을 위해 자리를 내 줍니다. RowNumber가 리스트의 행 갯수보다 더 크면 (그렇지만 2147483647 높이까지 허용됨), 그 새 행은 리스트 끝에 추가됩니다. Options에 관한 것은, 행 옵션을 참조하십시오.

LV_Modify(RowNumber, Options [, NewCol1, NewCol2, ...])

행의 텍스트와 속성을 변경합니다. 성공하면 1 실패하면 0을 돌려줍니다.RowNumber가 0이면, 콘트롤 안의 모든 행이 변경됩니다 (이 경우 함수는 완전히 성공하면 1을 돌려주고 부분적으로도 실패하면 0을 돌려줍니다). 첫 두 개의 매개변수만 존재하면, 그 행의 속성만 변경되고 그의 텍스트는 변경되지 않습니다. 비슷하게, 너무 매개변수가 적어서 모든 열을 처리할 수 없으면, 마지막에 있는 열들은 바뀌지 않습니다. ColN option를 사용하면 다른 열을 건드리지 않고 특정한 열을 업데이트할 수 있습니다. 다른 옵션으, 행 옵션을 참조하십시오.

LV_Delete([RowNumber])

이 매개변수를 생략하면, ListView 안의 모든 행이 삭제됩니다. 그렇지 않으면, 오직 지정된 RowNumber만 삭제됩니다. 성공하면 1 실패하면 0을 돌려줍니다.

열 함수

LV_ModifyCol([ColumnNumber, Options, ColumnTitle])

지정된 열의 텍스트와 속성 그리고 헤더를 변경합니다. 첫 열은 번호가 1입니다 (0 아님). 모든 매개변수를 생략하면, 모든 열의 너비가 행의 내용에 맞게 조절됩니다. 첫 매개변수만 존재하면, 오직 지정된 컬럼만 자동으로 크기가 조절됩니다. 자동 크기 조절은 보고서 (자세하게) 보기 모드에서만 효과가 있습니다. 이 함수는 성공하면 1 실패하면 0을 돌려줍니다.

열 옵션

Options 매개변수는 아래 리스트의 단어로 구성된 문자열입니다 (대소문자 구분 안함). 각 단어를 다음 단어와 스페이스나 탭으로 가르십시오. 옵션을 제거하려면, 그 앞에 마이너스 사인을 추가합니다. 옵션을 추가하려면 그 앞에 플러스 사인을 허용하지만 필수는 아닙니다.

열 옵션: 일반

N: N 에 열의 새 너비를 픽셀 단위로 지정하십시오. 이 번호는 옵션이 하나만 있다면 따옴표 처리하지 않아도 됩니다. 예를 들어 다음 두 예제는 모두 유효합니다: LV_ModifyCol(1, 50) 그리고 LV_ModifyCol(1, "50 Integer").

Auto: 열의 너비를 그의 내용에 맞게 조절합니다. 이것은 보고서 (자세하게) 보기 모드가 아니면 아무 영향이 없습니다.

AutoHdr: 열의 너비를 그의 내용과 헤더 텍스트의 너비에 맞게 더 큰쪽으로 조절합니다. 마지막 열에 적용되면, ListView에서 나머지 모든 스페이스의 너비만큼 넓어집니다. 보통 행들을 추가한 후에만 이 설정을 적용하는 것이 좋습니다. 왜냐하면 그래야 마지막 열의 크기를 조절할 때 새로 도착한 수직 스크롤바를 고려할 수 있기 때문입니다. 이 옵션은 보고서 (자세하게) 보기 모드가 아니면 아무 효과가 없습니다.

Icon: 단어 Icon 다음에 바로 ImageList의 아이콘 번호를 지정하면 열 헤더의 텍스트 옆에 보여줄 수 있습니다. -Icon (마이너스 icon)을 지정하면 기존의 아이콘을 제거할 수 있습니다.

IconRight: 아이콘을 왼쪽이 아니라 열의 오른쪽에 배치합니다.

열 옵션: 데이터 유형

Float: 정렬의 목적으로, 이 열에 부동 소수점 수가 들어 있다는 것을 나타냅니다 (십육진 형식은 지원하지 않습니다). Float와 Text 열에 대하여 정렬의 수행성능은 정수에 비해 최대 25 배까지 느릴 수 있스니다.

Integer: 정렬의 목적으로, 이 열에 정수가 들어 있다는 것을 나타냅니다. 적절하게 정렬되려면, 각 정수는 32-비트여야 합니다; 즉, 범위가 -2147483648에서 2147483647 이내여야 합니다. 값이 정수가 아니라면, 정렬할 때 0으로 간주됩니다 (단, 숫자로 시작하는 경우는 예외입니다. 이 경우 그 숫자가 사용됩니다). 숫자는 십육진 형식 또는 십진 형식으로 나타날 수 있습니다 (예, 0xF9E0).

Text: 열을 다시 텍스트-모드 정렬로 바꿉니다. 이것이 모든 열에 기본값입니다. 오직 텍스트의 앞쪽 8190 글자만 정렬의 목적으로 의미가 있습니다 (단, Logical 옵션은예외인데, 이 경우 제한 4094 글자입니다).

열 옵션: 정렬 / 정돈

Center: 텍스트를 열 가운데로 정렬합니다. 정수 또는 부동 소수점 수 열을 중앙 정렬하려면, 단어 Center를 단어 Integer 또는 Float 뒤에 놓으십시오.

Left: 열의 텍스트를 왼쪽에 정렬합니다. 이것이 모든 열의 기본 값입니다. 예전 운영체제에서, 첫 열은 강제로 왼쪽 정렬될 수 있습니다.

Right: 열의 텍스트를 오른쪽에 정렬합니다. 이 속성은 Integer 그리고 Float 열에는 지정할 필요가 없습니다. 왜냐하면 기본적으로 우측 정렬이기 때문입니다. 기본 값은 "Integer Left" 또는 "Float Center"와 같이 지정해 바꿀 수 있습니다.

열 옵션: 정렬

Case: 열의 정렬은 대소문자를 구분합니다 (only 텍스트 열에만 영향을 미칩니다). 옵션 Case, CaseLocale, 그리고 Logical이 모두 생략되면, 대문자 A-Z를 정렬의 목적으로 소문자와 동일하게 취급합니다.

CaseLocale [v1.0.43.03+]: 열의 정렬은 현재 사용자의 로케일에 기반하여 대소문자를 구분하지 않습니다 (텍스트 컬럼에만 영향을 미칩니다). 예를 들어, 대부분의 영어와 서구 유럽 로케일은 기호 A-Z 그리고 Ä와 Ü 같은 ANSI 기호들을 소문자로 취급합니다. 이 방법은 또한 "word sort"를 사용하는데, 이것은 "coop" 그리고 "co-op"와 같은 단어들이 함께 있는 것처럼 하이픈과 어포스트로피를 취급합니다.

Desc: 내림 차순입니다. 사용자가 정렬을 시작하면 열을 내림 차순으로 시작합니다.

Logical [v1.0.44.12+]: CaseLocale과 같습니다. 단, 텍스트에서 숫자 연속은 단순히 문자가 아니라 순수한 숫자로 취급됩니다. 예를 들어, 문자열 "T33"은 "T4"보다 크다고 간주됩니다. Logical 은 Windows XP 이상을 요구합니다 (이전 운영체제에서는 CaseLocale이 대신 자동으로 사용됩니다). 게다가, Logical과 Case는 현재 서로 배타적입니다: 둘 중에 최근에 지정된 것만 효과가 있습니다.

NoSort: 사용자가 이 열을 클릭하더라도 자동으로 정렬하지 못하도록 막습니다. 모든 열에 정렬을 끄려면 NoSort를 ListView의 옵션에 포함시키십시오. ListView에 g-라벨이 있다면, 사용자가 정렬-불가 컬럼을 클릭할 때 ColClick 고지를 여전히 받습니다.

Sort: 즉시 오름 차순으로 열을 정렬합니다 (Desc 옵션이 지정되어 있더라도 오름차순으로 정렬합니다).

SortDesc: 즉시 열을 내림 차순으로 정렬합니다.

Uni: 단방향으로 정렬합니다. 이렇게 하면 같은 열에 두 번 클릭하더라도 정렬 방향이 바뀌지 않습니다.

LV_InsertCol(ColumnNumber [, Options, ColumnTitle])

새 열을 생성해서 그것을 지정된 ColumnNumber로 삽입합니다 (다른 열은 오른쪽으로 이동해서 들어가 공간을 만듭니다). 첫 열은 1입니다 (0이 아님). ColumnNumber이 현재 콘트롤에 있는 열의 총 개수보다 크면, 그 새 열은 리스트 끝에 추가됩니다. 새로 삽입된 열은 그 아래에 빈 내용을 가지고 시작합니다. 단, 첫 열인 경우는 제외합니다. 이 경우는 앞의 첫 열의 내용을 상속받고 그 첫 열은 빈 내용을 얻습니다. 새 열의 속성은 -- 예를 들어 정수 정렬인가 아닌가 하는 속성은 -- 언제나 기본값을 가지고 시작합니다. 단, Options을 통하여 바꾼 경우는 예외입니다. 이 함수는 새 열의 위치 번호를 돌려줍니다 (실패하면 0). ListView에의 열의 최대 개수는 200입니다.

LV_DeleteCol(ColumnNumber)

지정된 열과 그 아래의 모든 내용을 삭제합니다. 성공하면 1 실패하면 0을 돌려줍니다. 열이 일단 삭제되면, 그 오른쪽에 있는 열들의 번호는 1 만큼씩 줄어듭니다. 결과적으로, LV_DeleteCol(2)를 두 번 호출하면 두 번째 세 번째 열이 삭제됩니다. Windows XP보다 오래된 운영 체제에서, 원래의 첫 열을 삭제하려고 시도하면 실패하고 0을 돌려줍니다.

ListView로부터 데이터 얻기

LV_GetCount(["Selected | Column"])

매개변수를 생략하면, 함수는 콘트롤에 있는 행의 총 개수를 돌려줍니다. 매개변수가 "S" 또는 "Selected"이면, 선택된/강조된 행들만 계산에 포함됩니다. 매개변수가 "Col" 또는 "Column"이면, 함수는 콘트롤에 있는 열의 총 개수를 돌려줍니다. 이 함수는 언제나 순간적입니다. 왜냐하면 콘트롤이 이런 계수들을 추적관리하고 있기 때문입니다.

이 함수는 종종 Loop의 최상단에 사용되며, 이 경우 함수는 (첫 반복이 시작하기 전에) 오직 한 번만 호출됩니다. 예를 들어:

Loop % LV_GetCount()
{
    LV_GetText(RetrievedText, A_Index)
    if InStr(RetrievedText, "some filter text")
        LV_Modify(A_Index, "Select")  ; 첫 필드에 여과 텍스트가 들어 있는 행을 선택합니다.
}

ListView의 열 너비를 열람하려면 -- INI 파일에 저장해서 세션 사이에 기억하는 데 사용하기 위해 -- 다음 예제를 따르십시오:

Gui +LastFound
Loop % LV_GetCount("Column")
{
    SendMessage, 4125, A_Index - 1, 0, SysListView321  ; 4125 is LVM_GETCOLUMNWIDTH.
    MsgBox Column %A_Index%'s width is %ErrorLevel%.
}

LV_GetNext([StartingRowNumber, "Checked | Focused"])

다음으로 선택된, 체크된 또는 초점이 있는 행의 번호를 열람합니다. 아무것도 발견되지 않으면, 0이 반환됩니다. StartingRowNumber가 생략되거나 1 보다 작으면, 검색은 리스트의 상단에서 시작합니다. 그렇지 않으면 검색은 StartingRowNumber 다음 행부터 시작합니다. 두 번째 매개변수가 생략되면, 함수는 다른 선택된/강조된 행을 검색합니다. 그렇지 않으면 "C" 또는 "Checked"를 지정해 다음 체크된 행을 검색하십시오; 아니면 "F" 또는 "Focused"를 지정해 초점이 있는 행을 찾으십시오 (전 리스트를 통틀어 초점이 있는 행은 절대 하나 밖에 없습니다. 그리고 종종 전혀 없을 수도 있습니다). 다음 예제는 ListView에서 선택된 모든 행들을 보고 합니다:

RowNumber = 0  ; 이렇게 하면 첫 회돌이 반복이 리스트의 최상단에서 검색을 시작합니다.
Loop
{
    RowNumber := LV_GetNext(RowNumber)  ; 앞의 반복에서 발견한 행 바로 다음부터 검색을 재개합니다.
    if not RowNumber  ; 위에서 0을 돌려주었고, 그래서 더 이상 선택된 행이 없습니다.
        break
    LV_GetText(Text, RowNumber)
    MsgBox The next selected row is #%RowNumber%, whose first field is "%Text%".
}

특정 행 번호가 체크되어 있는지 알아 내는 또다른 방법은 다음과 같습니다:

Gui +LastFound
SendMessage, 4140, RowNumber - 1, 0xF000, SysListView321  ; 4140는 LVM_GETITEMSTATE.입니다. 0xF000는 LVIS_STATEIMAGEMASK입니다.
IsChecked := (ErrorLevel >> 12) - 1  ; RowNumber가 체크되어 있으면 IsChecked에 참이 설정되고,그렇지 않으면 거짓이 설정됩니다.

LV_GetText(OutputVar, RowNumber [, ColumnNumber])

지정된 RowNumber와 ColumnNumber에서 텍스트를 찾아 OutputVar에 저장합니다. ColumnNumber를 생략하면, 기본값은 1입니다 (첫 열에 있는 텍스트). RowNumber가 0이면, 열 헤더 텍스트가 열람됩니다. 텍스트가 8191자 보다 길면, 앞쪽 8191 글자만 열람됩니다. 성공하면 1을 돌려주고 실패하면 0을 돌려줍니다. 실패시, OutputVar도 비워집니다.

스크립트에 보여지는 열 번호는 사용자가 열을 끌어 떨구어도 영향을 받지 않습니다. 예를 들어 원래의 첫 열이 번호는 1입니다. 사용자가 그 열을 끌어 오른쪽 다른 열에 떨구어도 마찬가지입니다.

G-라벨 고지 (Primary)

gMySubroutine과 같은 g-라벨은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 콘트롤에 어떤 조치를 수행할 때마다 MySubroutine 라벨이 자동으로 기동됩니다. 이 서브루틴은 내장 변수 A_Gui와 A_GuiControl를 참고해 어느 창 어느 ListView가 그 이벤트를 발생시켰는지 알아낼 수 있습니다. 더 중요한 것은, A_GuiEvent를 참고할 수 있다는 것인데, 여기에 다음 문자열이나 기호 중 하나가 담겨 있습니다 (미래 버전과의 호환을 위해, 스크립트는 이것만이 가능한 유일한 값들이라고 간주하면 안됩니다):

DoubleClick: 사용자가 콘트롤 안에서 더블클릭 했습니다. 변수 A_EventInfo에 초점 행 번호가 담깁니다. LV_GetNext()를 대신 사용하면 첫 번째로 선택된 행 번호를 알 수 있습니다. 사용자가 빈 곳에 더블클릭 했다면 0입니다.

R: 사용자가 콘트롤 안에서 더블-우클릭 했습니다. 변수 A_EventInfo 안에 초점 행 번호가 담깁니다.

ColClick: 사용자가 열 헤더를 클릭 했습니다. 변수 A_EventInfo에 그 열 번호가 담깁니다. 이것은 그 열이 생성될 때 할당된 원래의 열 번호입니다; 즉, 사용자에 의한 끌기와 떨구기는 전혀 반영하지 않습니다. 열 클릭에 한 가지 가능한 반응은 숨은 열 기분으로 정렬하는 것입니다 (너비가 0). 안에 정렬에 적합한 형식으로 데이터가 들어 있습니다 (예를 들어 YYYYMMDD 정수 날짜). 그런 숨은 열은 좀 더 친숙한 형식으로 같은 데이터를 보여주는 다른 컬럼을 미러할 수 있습니다 (예를 들어 MM/DD/YY). 예를 들어, 스크립트는 LV_ModifyCol(3, 0)를 통하여 열 3을 숨길 수 있습니다. 다음 LV_ModifyCol(2, "NoSort")를 통하여 눈에 보이는 2 번 열에 자동 정렬을 꺼버립니다. 다음, 2 번 열에 대한 ColClick 고지에 대한 응답으로, 스크립트는 LV_ModifyCol(3, "Sort")를 통하여 숨은 열을 기준으로 ListView를 정렬할 것입니다.

D: 사용자가 행이나 아이콘을 끌려고 시도했습니다 (현재 행이나 아이콘 끌기는 내부적으로 지원하지 않습니다). 변수 A_EventInfo에 초점 행 번호가 담깁니다. v1.0.44+에서, 이 고지는 심지어 AltSubmit이 없어도 일어납니다.

d (소문자 D): 왼클릭 끌기가 아니라 우클릭 끌기라는 점만 제외하면 위와 같습니다.

e (소문자 E): 사용자가 행의 첫 필드 편집을 마쳤습니다 (사용자는 ListView의 옵션에 -ReadOnly가 있을 경우에만 편집할 수 있습니다). 변수 A_EventInfo에 그 행 번호가 담깁니다.

G-라벨 고지 (Secondary)

ListView가 옵션에 단어 AltSubmit을 가지고 있다면, 그의 g-라벨은 훨씬 더 자주 기동되고 A_GuiEvent에 다음 추가 값이 담길 수 있습니다:

Normal: 사용자가 행을 왼클릭 했습니다. 변수 A_EventInfo에 초점 행 번호가 담깁니다.

RightClick: 사용자가 행을 우클릭 했습니다. 변수 A_EventInfo에 초첨 행 번호가 담깁니다. 대부분의 경우, 이에 응답하여 메뉴를 보여주는 것이 좋습니다. 대신에, GuiContextMenu label를 사용하십시오. 왜냐하면 Apps 키도 인지하기 때문입니다. 예를 들어:

GuiContextMenu:  ; 우클릭 또는 Apps 키의 누름에 응답하여 기동됩니다.
if A_GuiControl <> MyListView  ; 이 점검은 선택적입니다. ListView 안에 클릭했을 경우에만 메뉴를 보여줍니다.
    return
; 메뉴를 주어진 A_GuiX 그리고 A_GuiY 좌표에 보여줍니다. 이것을 사용해야 합니다
; 왜냐하면 사용자가 Apps 키를 누르더라도 올바른 좌표를 제공하기 때문입니다:
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return

A: 한 행이 활성화되었습니다. 기본으로 더블 클릭되면 활성화됩니다. 변수 A_EventInfo에 그 행 번호가 담깁니다.

C: ListView가 마우스 마우스 나포를 놓았습니다.

E: 사용자가 한 행의 첫 필드 편집을 시작했습니다 (사용자는 ListView가 옵션에 -ReadOnly를 가지고 있을 경우에만 편집이 허용됩니다). 변수 A_EventInfo에 행 번호가 담깁니다.

F: ListView가 키보드 초점을 받았습니다.

f (소문자 F): ListView가 키보드 초점을 잃었습니다.

I: 항목이 변경됨. 선택/체크/해제 등등으로 인해 한 행이 변경되었습니다. 사용자가 새 행을 선택하면, 적어도 그런 고지를 두 개 받습니다: 하나는 이전 행의 해제이고 다른 하나는 새 행의 선택에 고지가 옵니다. v1.0.44+에서, 변수 A_EventInfo에 그 행 번호가 담깁니다. v1.0.46.10+에서, ErrorLevel에 다음 기호 중 하나가 담겨 어떻게 항목이 변경되었는지 알려줍니다: S (select) 또는 s (de-select), 그리고/또는 F (focus) 또는 f (de-focus), 그리고/또는 C (checkmark) 또는 c (uncheckmark). 예를 들어, SF는 행이 선택되어 있꼬 초점이 있다는 뜻입니다. 특정 기호가 존재하는지 탐지하려면 파싱 회돌이 또는 대소문자 구분 옵션으로 InStr()을 사용하십시오; 예를 들어: InStr(ErrorLevel, "S", true). 주의: 미래 버전과의 호환을 위해, 스크립트는 "SsFfCc"만이 유일하게 가능하니 기호라고 간주하면 안됩니다. 또한, Critical을 g-라벨의 첫 줄에 지정하면 모든 "I" 고지를 받을 수 있다는 것을 확신할 수 있습니다 (그렇지 않으면, 스크립트가 따라 가지 못할 경우 어떤 고지는 잃어 버릴 수 있습니다).

K: ListView에 초점이 있는 동안에 사용자가 키를 눌렀습니다. A_EventInfo에 그 키의 가상 키코드가 담깁니다. 이 숫자는 범위가 1과 255 사이입니다. 이것을 GetKeyName을 통하여 키 이름이나 문자로 변환할 수 있습니다. 예를 들어, key := GetKeyName(Format("vk{:x}", A_EventInfo)). 대부분의 키보드 레이아웃에서 A-Z 키는 Chr(A_EventInfo)를 통하여 그에 상응하는 문자로 변환할 수 있습니다. F2 키눌림은 WantF2에 상관 없이 받습니다. 그렇지만, Enter 키눌림은 받지 않습니다; 그를 받으려면, 아래에 기술하는 것처럼 기본 버튼을 사용하십시오.

M: Marquee. 사용자가 한 그룹의 행이나 아이콘 둘레의 선택 사각형을 끌기 시작했습니다.

S: 사용자가 ListView를 스크롤하기 시작했습니다.

s (소문자 S): 사용자가 ListView 스크롤을 끝냈습니다.

ImageList (아이콘을 ListView에 추가하는 수단)

이미지-리스트는 한 그룹의 동일한 크기의 아이콘으로서 메모리에 저장되어 있습니다. 생성될 때, 각 ImageList는 비어 있습니다. 스크립트는 IL_Add()를 반복적으로 호출해 아이콘을 그 리스트에 추가합니다. 각 아이콘은 순서대로 번호가 1 부터 할당됩니다. 스크립트는 이 번호를 참조해 특정 아이콘을 행이나 열 헤더에 보여줍니다. 다음 예제는 아이콘을 ListView의 행에 삽입하는 방법을 보여줍니다:

Gui, Add, ListView, h200 w180, Icon & Number|Description  ; ListView를 생성합니다.
ImageListID := IL_Create(10)  ; ImageList를 만들어 10 개의 작은 아이콘을 보유합니다.
LV_SetImageList(ImageListID)  ; 위의 ImageList에 현재 ListView를 할당합니다.
Loop 10  ; ImageList에 일련의 아이콘을 DLL로부터 적재합니다.
    IL_Add(ImageListID, "shell32.dll", A_Index)
Loop 10  ; 행들을ListView에 추가합니다 (보여주기 위한 목적으로, 각 아이콘 당 한 행씩).
    LV_Add("Icon" . A_Index, A_Index, "n/a")
LV_ModifyCol("Hdr")  ; 열 너비를 자동-조절합니다.
Gui Show
return

GuiClose:  ; 사용자가 ListView의 GUI 창을 닫으면 스크립트를 종료합니다.
ExitApp

IL_Create([InitialCount, GrowCount, LargeIcons?])

새로 ImageList를 만듭니다. 처음에는 비어 있고, ImageList의 유일한 ID를 돌려줍니다 (실패하면 0을 돌려줍니다). InitialCount는 리스트에 즉시 삽입할 것이라고 예상하는 아이콘의 개수입니다 (생략하면, 기본값은 2입니다). GrowCount는 아이콘의 개수입니다. 이 값을 기준으로 현재 리스트가 가용 능력을 초과할 때마다 리스트가 증가합니다 (생략하면, 기본값은 5입니다). LargeIcons는 숫치 값이어야 합니다: 0이 아니면, ImageList는 큰 아이콘을 담습니다. 0이면 작은 아이콘을 담습니다 (생략하면 이것이 기본값입니다). 리스트에 추가된 아이콘들은 작고 큰 아이콘에 대한 시스템의 크기를 준수하여 맞게 자동으로 크기가 조절됩니다.

LV_SetImageList(ImageListID [, 0|1|2])

이 함수는 보통 행을 ListView에 추가하기 이전에 호출됩니다. 아이콘이 ListView의 행 옆에 (선택적으로 그의 열에) 보여지도록 ImageList를 설정합니다. ImageListID는 이전에 IL_Create()를 호출해 반환된 번호입니다. 두 번째 매개변수를 생략하면, ImageList에서 아이콘의 유형이 큰지 작은지 자동으로 탐지됩니다. 그렇지 않으면, 큰 아이콘에 0을 지정하고, 작은 아이콘에 1을 지정하며, 그리고 상태 아이콘에는 2를 지정하십시오 (상태 아이콘은 아직 직접적으로 지원하지 않지만, SendMessage를 통하여 사용할 수 있습니다).

ListView는 최대 두 개의 ImageList를 가질 수 있습니다: 작은 아이콘 / 큰 아이콘. 스크립트에서 사용자가 큰 아이콘 보기에서 작은 아이콘 보기로 전환할 수 있도록 해 주므로 유용합니다. 여러 ImageList를 ListView에 추가하려면, LV_SetImageList()를 두 번 호출하고, 두 번째 리스트의 ImageListID를 지정합니다. ListView가 큰-아이콘과 작은-아이콘 ImageList를 모두 갖고 있다면 두 리스트에 같은 순서로 아이콘이 들어 있는지 확인해야 합니다. 왜냐하면 같은 ID 번호를 사용하여 특정 아이콘의 큰 아이콘과 작은 아이콘을 참조하기 때문입니다.

아이콘과 타일을 제외하고 모든 보기 모드에 작은 아이콘을 보여주는 것이 전통적인 방식이지만, 이 행위는 큰 아이콘 리스트를 LV_SetImageList에 건네고 1 (작은-아이콘)을 두 번째 매개변수에 지정하면 바꿀 수 있습니다. 이렇게 하면 또한 큰 아이콘에 맞게 ListView에서 각 행의 높이가 증가합니다.

성공하면, LV_SetImageList()는 이전에 ListView에 연관되어 있던 ImageListID를 돌려줍니다 (없으면 0). 그렇게 떼어낸 ImageList는 IL_Destroy(ImageListID)를 통하여 정상적으로 파괴됩니다.

IL_Add(ImageListID, Filename [, IconNumber, ResizeNonIcon?])

아이콘이나 그림을 지정된 ImageListID에 추가합니다. 그리고 그 새로운 아이콘의 인덱스를 돌려줍니다 (1은 첫 번째 아이콘, 2는 두 번째 아이콘이고 그리고. 등등). Filename은 아이콘 (.ICO), 커서 (.CUR), 또는 애니메이션 커서 (.ANI) 파일의 이름입니다 (애니메이션 커서는 실제로는 ListView에 보여질 때 움직이지 않습니다).다른 아이콘 소스로는 다음 유형의 파일이 포함됩니다: EXE, DLL, CPL, SCR, 그리고 기타 아이콘 자원을 포함한 유형들. 파일에 첫 번째 아이콘 말고 아이콘 그룹을 사용하려면, 그의 번호를 IconNumber에 지정하십시오. IconNumber가 음수이면, 그의 절대 값은 실행 파일 안의 아이콘의 자원 ID로 간주됩니다. 다음 예제에서, 두 번째 그룹으로부터 기본 아이콘이 사용됩니다: IL_Add(ImageListID, "C:\My Application.exe", 2).

BMP, GIF 그리고 JPG 같은 비-아이콘 이미지도 적재가 가능합니다. 그렇지만, 이 경우 두 개의 매개변수를 지정해야 올바른 행위를 확인할 수 있습니다: IconNumber는 마스크/투명 색 번호이어야 합니다 (0xFFFFFF [흰색]는 대부분의 그림에 가장 좋은 선택입니다); 그리고 ResizeNonIcon는 0이 아니어야 합니다. 그래야 그림 크기를 조절하여 아이콘 하나가 될 수 있거나, 아니면 그 이미지를 분해하여 그의 실제 크기에 맞게 얼마든지 많은 아이콘을 만들어 낼 수 있습니다.

모든 운영 체제는 GIF, JPG, BMP, ICO, CUR, 그리고 ANI 이미지를 지원합니다. Windows XP 이후로, PNG, TIF, Exif, WMF, 그리고 EMF 같은 이미지 형식을 추가로 지원합니다. XP보다 오래된 운영 체제는 마이크로소프트사의 무료 GDI+ DLL을 AutoHotkey.exe 폴더 안으로 복사해 넣어 지원할 수 있습니다 (그러나 컴파일된 스크립트의 경우, DLL을 스크립트의 폴더 안으로 복사해 넣으십시오). DLL을 내려 받으려면, www.microsoft.com에서 다음 구절을 검색하십시오: gdi redistributable

IL_Destroy(ImageListID)

지정된 ImageList를 삭제합니다 그리고 성공하면 1을 돌려주고 실패하면 0을 돌려줍니다. 보통 ImageList를 파괴할 필요가 없습니다. 왜냐하면 일단 ListView에 부착되면, ListView나의 그의 부모 창이 파괴될 때 자동으로 같이 파괴되기 때문입니다. 그렇지만, ListView가 (그의 옵션에 0x40를 가져서) ImageList를 다른 ListView와 공유하면, 스크립트는 그를 사용하는 모든 ListView를 파괴한 후에 명시적으로 그 ImageList를 파괴해야 합니다. 비슷하게, 스크립트가 ListView의 예전 ImageList중 하나를 새 것으로 교체하면, 명시적으로 그 예전 리스트를 파괴해야 합니다.

ListView 총평

Gui Submit 명령어는 ListView 콘트롤에 아무 영향이 없습니다. 그러므로, 스크립트는 ListView의 연관 변수를 사용하여 (있다면) 덮어쓸 걱정없이 다른 데이터를 저장할 수 있습니다.

컬럼이 정렬된 후에 -- 사용자가 그의 헤더를 클릭했거나 스크립트가 LV_ModifyCol(1, "Sort")를 호출함으로써 -- 이후에 추가되는 행들은 정렬 순서를 준수하지 않고 리스트에 끝에 나타납니다. 이에 대한 예외는 Sort와 SortDesc 스타일인데, 새로 추가된 행들을 올바른 위치로 이동시킵니다.

ListView에 초점이 있는 동안 사용자가 Enter를 누를 때를 탐지하려면 을 때 기본 버튼을 사용하십시오 (원하면 감출 수 있습니다). 예를 들어:

Gui, Add, Button, Hidden Default, OK
...
ButtonOK:
GuiControlGet, FocusedControl, FocusV
if FocusedControl <> MyListView
    return
MsgBox % "Enter was pressed. The focused row number is " . LV_GetNext(0, "Focused")
return

키보드로 행에서 행으로 항해하는 일 외에도, 사용자는 첫 열의 한 항목의 첫 문자를 타자하면 점증 검색을 수행할 수도 있습니다. 이렇게 하면 선택이 가장 가깝게 부합하는 행으로 점프합니다.

길이에 상관없이 텍스트를 ListView의 각 필드에 저장할 수 있지만, 앞쪽 260 글자만 화면에 보여집니다.

ListView에서 최대 행의 개수는 오직 시스템 메모리에만 제한되지만, Count 옵션에 기술한 것처럼 행-추가 수행성능을 크게 개선할 수 있습니다.

ListView 둘레에 그림을 배경으로 사용할 수 있습니다 (즉, ListView를 액자틀에 넣을 수 있습니다). 이렇게 하려면, ListView 뒤에 그림 콘트롤을을 생성하고 그림의 Options에 0x4000000를 포함시키십시오 (WS_CLIPSIBLINGS임).

스크립트를 창 당 여러 ListView를 생성할 수 있습니다. 기본 리스트뷰 말고 다른 ListView를 처리하려면, 내장 함수를 참조하십시오.

SendMessage로 열을 직접 삭제하거나 삽입하지 않는 것이 좋습니다. 왜냐면 프로그램은 각 열에 선호하는 정렬 기준이 다 따로 있어서, 동기화가 안될 수 있기 때문입니다. 대신에, 내장 열 함수를 사용하십시오.

ListView의 크기를 바꾸거나 숨기거나 글꼴을 바꾸는 것과 같은 조치들을 수행하려면 GuiControl을 사용하십시오.

텍스트를 (스크립트가 소유한 것이 아닌) 외부 ListView로부터 추출하려면, ControlGet List를 사용하십시오.

관련 항목

TreeView, Other Control Types, Gui, GuiContextMenu, GuiControl, GuiControlGet, ListView 스타일 테이블

예제

; 0을 첫 행 번호로 지정해 모든 행을 선택하거나 해제합니다:
LV_Modify(0, "Select")   ; 모두 선택합니다.
LV_Modify(0, "-Select")  ; 모두 해제합니다.
LV_Modify(0, "-Check")  ;  모든 체크박스를 해제합니다.

; 모든 열을 그의 내용에 맞게 자동 크기 조절합니다:
LV_ModifyCol()  ; 이 모드에는 매개변수가 없습니다.

; MAIN EXAMPLE
; 다음 스크립트는 이 페이지 위에 있는 예제에 비해 더 정교합니다.
; 사용자가 선택한 폴더 안의 각 파일들을 그의 유형에 맞게 아이콘을 연관지어 보여줍니다.
; 사용자는 파일을 더블클릭 하거나 하나 이상의 파일을 우클릭해 문맥 메뉴를 보여줄 수 있습니다.

; 사용자에게 창을 끌어 크기를 변경하도록 허용합니다:
Gui +Resize

; 버튼을 만듭니다:
Gui, Add, Button, Default gButtonLoadFolder, Load a folder
Gui, Add, Button, x+20 gButtonClear, Clear List
Gui, Add, Button, x+20, Switch View

; ListView와 그의 컬럼을 생성합니다:
Gui, Add, ListView, xm r20 w700 vMyListView gMyListView, Name|In Folder|Size (KB)|Type
LV_ModifyCol(3, "Integer")  ; 정렬을 위해, Size 열이 정수임을 나타냅니다.

; ListView가 아이콘을 보여줄 수 있도록 ImageList를 만듭니다:
ImageListID1 := IL_Create(10)
ImageListID2 := IL_Create(10, 10, true)  ; 작은 아이콘과 함께할 큰 아이콘 리스트.

; ImageList를 ListView에 붙여서 나중에 아이콘을 보여줄 수 있도록 합니다:
LV_SetImageList(ImageListID1)
LV_SetImageList(ImageListID2)

; 문맥 메뉴로 사용될 팝업 메뉴를 만듭니다:
Menu, MyContextMenu, Add, Open, ContextOpenFile
Menu, MyContextMenu, Add, Properties, ContextProperties
Menu, MyContextMenu, Add, Clear from ListView, ContextClearRows
Menu, MyContextMenu, Default, Open  ; Make "Open" a bold font to indicate that double-click does the same thing.

; 창을 보여주고 돌아옵니다. OS는 스크립트에게
; 사용자가 적법한 행위를 수행할 때마다 고지합니다:
Gui, Show
return

ButtonLoadFolder:
Gui +OwnDialogs  ; 메인 창을 사용하기 전에 사용자에게 다음 대화상자를 강제로 취소하도록 만듭니다..
FileSelectFolder, Folder,, 3, Select a folder to read:
if not Folder  ; 사용자가 대화상자를 취소했습니다.
    return

; 폴더 이름의 마지막 글자자 역사선인지 점검합니다. 혹시 루트 디렉토리 일 수 있습니다.
; 만약 C:\와 같다면, 그것을 제거해 나중에 두개의 역사선이 되는 것을 막습니다.
StringRight, LastChar, Folder, 1
if LastChar = \
    StringTrimRight, Folder, Folder, 1  ; 뒤에 따르는 역사선을 제거합니다.

; SHFILEINFO 구조에 필요한 버퍼 크기를 계산합니다.
sfi_size := A_PtrSize + 8 + (A_IsUnicode ? 680 : 340)
VarSetCapacity(sfi, sfi_size)

; 선택된 폴더로부터 파일 이름 목록을 수집해 그것을 ListView에 추가합니다:
GuiControl, -Redraw, MyListView  ; 적재하는 동안 다시 그리기를 꺼서 수행성능을 향상시킵니다.
Loop %Folder%\*.*
{
    FileName := A_LoopFileFullPath  ; 아래에 사용하기 위해 반드시 쓰기 가능한 변수에 저장해야 합니다.

    ; 유일한 확장 ID를 구성해 변수 이름에 불법인 예를 들어 대시 같은 문자들을 피합니다.
    ; 이 유일한 ID 방법은 수행성능도 좋습니다.
    ; 왜냐하면 배열에서 항목을 찾으면 검색-회돌이가 필요없기 때문입니다.
    SplitPath, FileName,,, FileExt  ; 파일의 확장자를 얻습니다.
    if FileExt in EXE,ICO,ANI,CUR
    {
        ExtID := FileExt  ; 특수한 ID를 위치 보유자로 사용합니다.
        IconNumber = 0  ; 발견하지 못한 것으로 표식을 붙여서 이런 유형이 각각 유일한 아이콘을 가지도록 합니다.
    }
    else  ; 어떤 다른 확장자/파일-유형입니다. 그래서 그의 유일한 ID를 계산합니다.
    {
        ExtID = 0  ; 다른 확장자보다 더 짧은 확장자를 처리하기 위해 초기화합니다.
        Loop 7     ; 확장자 길이를 7 문자로 제한합니다. 그래서 64-비트 값에 맞습니다.
        {
            StringMid, ExtChar, FileExt, A_Index, 1
            if not ExtChar  ; 더 이상 문자가 없습니다.
                break
            ;  각 문자마다 다른 비트 위치를 할당해서 유일한 ID를 추출합니다.:
            ExtID := ExtID | (Asc(ExtChar) << (8 * (A_Index - 1)))
        }
        ; 이 파일 확장자가 이미 ImageList에 아이콘이 있는지 점검합니다.
        ; 그렇다면, 여러 호출을 하지 않아도 되고 수행성능이 크게 개선됩니다,
        ; 특히, 수 백개의 파일이 들은 폴더라면 특히 그렇습니다:
        IconNumber := IconArray%ExtID%
    }
    if not IconNumber  ; 아직 이 확장자에 아이콘이 없습니다. 그래서 적재합니다.
    {
        ; 이 파일 확장에 연관된 고품질의 작은 아이콘을 얻습니다:
        if not DllCall("Shell32\SHGetFileInfo" . (A_IsUnicode ? "W":"A"), "str", FileName
            , "uint", 0, "ptr", &sfi, "uint", sfi_size, "uint", 0x101)  ; 0x101 is SHGFI_ICON+SHGFI_SMALLICON
            IconNumber = 9999999  ; 빈 아이콘을 보여주기 위해 범위를 벗어나도록 설정합니다.
        else ; 아이콘이 성공적으로 적재되었습니다.
        {
            ; 구조로부터 hIcon 멤버를 추출합니다:
            hIcon := NumGet(sfi, 0)
            ; HICON을 직접 작은-아이콘 그리고 큰-아이콘 리스트에 추가합니다.
            ; 아래는 +1을 사용해, 반환된 인덱스트를 0 기반에서 1 기반으로 변환합니다:
            IconNumber := DllCall("ImageList_ReplaceIcon", "ptr", ImageListID1, "int", -1, "ptr", hIcon) + 1
            DllCall("ImageList_ReplaceIcon", "ptr", ImageListID2, "int", -1, "ptr", hIcon)
            ; 이제 ImageList 안으로 복사되었으므로, 원본은 파괴해야 합니다:
            DllCall("DestroyIcon", "ptr", hIcon)
            ; 아이콘을 캐쉬해 메모리를 절약하고 적재 수행성능을 개선합니다:
            IconArray%ExtID% := IconNumber
        }
    }

    ; ListView에 새 행을 만들고 그것을 위에서 결정된 아이콘 번호에 할당합니다:
    LV_Add("Icon" . IconNumber, A_LoopFileName, A_LoopFileDir, A_LoopFileSizeKB, FileExt)
}
GuiControl, +Redraw, MyListView  ; (위에서 꺼 버린) 다시 그리기를 다시 켭니다.
LV_ModifyCol()  ; 그의 내용에 맞게 각 열의 크기를 자동 조절합니다.
LV_ModifyCol(3, 60) ;그의 헤더를 노출시키기 위해 Size 열을 약간 더 넓게 합니다.
return

ButtonClear:
LV_Delete()  ; ListView를 지우지만, 간단하게 하기위해 아이콘 캐쉬는 그대로 유지합니다.
return

ButtonSwitchView:
if not IconView
    GuiControl, +Icon, MyListView    ; 아이콘 보기로 전환합니다.
else
    GuiControl, +Report, MyListView  ; 자세히 보기로 다시 전환합니다.
IconView := not IconView             ; 다음을 대비해 뒤집습니다.
return

MyListView:
if A_GuiEvent = DoubleClick  ; 스크립트가 점검할 수 있다는 다른 값들이 많이 있습니다.
{
    LV_GetText(FileName, A_EventInfo, 1) ; 첫 필드의 텍스트를 얻습니다.
    LV_GetText(FileDir, A_EventInfo, 2)  ; 두 번째 필드의 텍스트를 얻습니다.
    Run %FileDir%\%FileName%,, UseErrorLevel
    if ErrorLevel
        MsgBox Could not open "%FileDir%\%FileName%".
}
return

GuiContextMenu:  ; 우클릭이나 Apps 키 누름에 응답하여 기동됩니다.
if A_GuiControl <> MyListView  ; ListView 안을 클릭할 때만 메뉴를 보여줍니다.
    return
; 메뉴를 제공된 A_GuiX와 A_GuiY 좌표에 보여줍니다. 이것을 써야 합니다.
; 왜냐하면 사용자가 Apps 키를 누르더라도 올바를 좌표를 제공하기 때문입니다:
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return

ContextOpenFile:  ; 사용자가 문맥 메뉴에서 "Open"을 선택했습니다.
ContextProperties:  ; 사용자가 문맥 메뉴에서 "Properties"를 선택했습니다.
; 간단하게 하기 위해, 선택된 모든 행이 아니라 오직 초점 행만 처리합니다:
FocusedRowNumber := LV_GetNext(0, "F")  ; 초점 행을 찾습니다.
if not FocusedRowNumber  ; 초점 행이 없습니다.
    return
LV_GetText(FileName, FocusedRowNumber, 1) ; 첫 필드의 텍스트를 얻습니다.
LV_GetText(FileDir, FocusedRowNumber, 2)  ; 두 번째 필드의 텍스트를 얻습니다.
IfInString A_ThisMenuItem, Open  ; 사용자가 문맥 메뉴에서 "Open"을 선택했습니다.
    Run %FileDir%\%FileName%,, UseErrorLevel
else  ; 사용자가 문맥 메뉴에서 "Properties"를 선택했습니다.
    Run Properties "%FileDir%\%FileName%",, UseErrorLevel
if ErrorLevel
    MsgBox Could not perform requested action on "%FileDir%\%FileName%".
return

ContextClearRows:  ; 사용자가 문맥 메뉴에서 "Clear"를 선택했습니다.
RowNumber = 0  ; 이렇게 하면 첫 반복이 최상단에서 검색을 시작합니다.
Loop
{
    ; 행을 삭제하면 그 아래의 모든 다른 행의 RowNumber가 줄어 들기 때문에,
    ; 1을 빼서 이전에 발견된 행 번호와 같은 번호를 검색에 포함시킵니다
    ; (인접 행들이 선택된 경우):
    RowNumber := LV_GetNext(RowNumber - 1)
    if not RowNumber  ; 위에서 0을 돌려주었습니다. 그래서 더 이상 선택된 행이 없습니다.
        break
    LV_Delete(RowNumber)  ; ListView로부터 해당 행을 제거합니다.
}
return

GuiSize:  ; 사용자의 창 크기 조절에 응답하여 ListView를 키우거나 줄입니다.
if A_EventInfo = 1  ; 창이 최소화되었습니다. 더 이상 조치가 필요 없습니다.
    return
; 그렇지 않으면, 창이 크기가 바뀌었거나 최대화되었습니다. 그에 맞도록 ListView의 크기를 조절합니다.
GuiControl, Move, MyListView, % "W" . (A_GuiWidth - 20) . " H" . (A_GuiHeight - 40)
return

GuiClose:  ; 창이 닫힐 때, 자동으로 스크립트를 종료합니다:
ExitApp


Loop

Loop (normal)

일련의 명령어들을 반복적으로 실행합니다: 지정된 횟수 만큼 반복하거나 아니면 break를 만날 때까지 반복합니다.

Loop [, Count]

매개변수

Count

회돌이를 수행할 (반복) 횟수. 생략되면, 회돌이는 break 또는 return을 만날 때까지 무한히 계속됩니다.

Count가 %ItemCount%와 같은 변수 참조이면, 회돌이는 변수가 비거나 1보다 작은 숫자를 포함할 때 완전히 건너 뜁니다.

파일-패턴 회돌이를 지원할 필요가 있기 때문에, Count는 표현식이 되면 안됩니다. 그렇지만, 모든 비-표현식 매개변수처럼, 앞에다 %와 스페이스 하나를 두면 강제로 표현식처럼 사용할 수 있습니다. 예를 들어: Loop % Count + 1. 그런 경우, 표현식은 회돌이가 시작되기 전에 오직 한 번만 평가됩니다.

논평

회돌이 명령어는 보통 다음 블록이 따라옵니다. 블록은 회돌이의 몸을 형성하는 서술문 집단입니다. 그렇지만, 서술문이 하나만 있는 회돌이는 블록이 필요하지 않습니다 (이런 목적으로 "if"와 그의 "else"는 하나의 서술문으로 간주됩니다).

이 명령어의 일반적인 사용법은 무한 회돌이입니다. break 명령어를 회돌이의 몸 어딘가에 사용해 회돌이를 끝낼 때를 결정합니다.

회돌이 안에 break와 continue를 사용하는 것을 적극 권장합니다. goto는 자제하십시오. 왜냐하면 일반적으로 스크립트를 더 이해하기 어렵게 만들고 유지관리하기도 더 힘들게 만들기 때문입니다. "Do...While" 회돌이를 만들려면, 회돌이 몸체의 마지막 서술문을 IF 서술문으로 만들어서 조건적으로 break 명령어를 실행하도록 만드십시오. 같은 테크닉을 사용하면 "While" 회돌이를 만들 수 있습니다. 그러나 그 대신에 While 명령어를 사용해야 합니다.

내장 변수 A_Index에는 현재 회돌이 반복 횟수가 담깁니다. 회돌이의 몸체가 처음 실행될 때 1이 담기고, 그 다음 실행 때 2가 담깁니다; 등등. 내부 회돌이가 외부 회돌이로 둘러 싸여 있다면, 내부 회돌이가 우선 순위가 있습니다. A_Index는 모든 유형의 회돌이에 작동합니다. 여기에는 파일-회돌이와 레지스트리-회돌이가 포함됩니다; 그러나 A_Index는 회돌이 밖이면 0이 담깁니다.

One True Brace (OTB) 스타일을 선택적으로 정상 회돌이에 사용할 수 있습니다 (그러나 특별한 회돌이에는 안됩니다. 예를 들어 파일-패턴 회돌이 그리고 파싱 회돌이). 예를 들어:

Loop {
    ...
}
Loop %RepeatCount% {
    ...
}

특수 회돌이: 회돌이를 사용해 자동으로 파일, 폴더, 레지스트리 항목을 (한 번에 하나씩) 열람할 수 있습니다. 자세한 것은 파일-회돌이 그리고 레지스트리-회돌이를 참조하십시오. 게다가, 파일-읽기 회돌이는 파일의 전체 내용을 한 번에 한 줄씩 처리할 수 있습니다. 마지막으로, 파싱 회돌이는 가름자로 구분된 문자열 안에 포함된 개별 필드들을 처리할 수 있습니다.

관련 항목

Until, While-회돌이, For-회돌이, 파일과 폴더 회돌이, 레지스트리 회돌이, 파일-읽기 회돌이, 파싱 회돌이, Break, Continue, 블록

예제

Loop, 3
{
    MsgBox, 반복 숫자는 %A_Index%입니다.  ; A_Index는 1, 2, 그 다음에 3이 됩니다
    Sleep, 100
}

Loop
{
    if a_index > 25
        break  ; 회돌이를 종료합니다
    if a_index < 20
        continue ; 아래를 건너 뛰고 새 반복을 시작합니다
    MsgBox, a_index = %a_index% ; 이 곳은 숫자를 20부터 25 까지만 보여줍니다.
}


Loop (files & folders)

지정된 파일이나 폴더를 , 한 번에 하나씩 열람합니다.

Loop, Files, FilePattern [, Mode]  ; v1.1.21+ (권장)
Loop, FilePattern [, IncludeFolders?, Recurse?]

매개변수

Files [v1.1.21+]

문자 그대로 Files (대소문자-구별). 변수나 표현식 불가능.

FilePattern

파일이나 폴더의 이름, 또는 C:\Temp\*.tmp와 같은 와일드카드 패턴. FilePattern은 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

별표와 물음표 표식 모두 와일드카드로 지원됩니다. 패턴이 파일의 긴/보통 이름에 또는 그의 8.3 짧은 이름에 나타나면 일치가 일어납니다.

이 매개변수가 단일 파일이나 폴더이고 (즉, 와일드카드가 아니고) Recurse가 1로 설정되었거나 Mode에 R이 포함되어 있으면, 부합하는 것이 여럿일 수 있습니다. 지정된 파일 이름이 검색되는 여러 폴더에 나타나기 때문입니다.

Mode [v1.1.21+]

다음 기호들로 구성됩니다:

D: 디렉토리 포함 (폴더).
F: 파일 포함. F와 D를 모두 생략하면 파일도 포함됩니다.
R: 서브디렉토리 안으로 재귀합니다 (서브폴더). R이 생략되면, 서브디렉토리의 파일과 폴더 포함되지 않습니다.

IncludeFolders?

다음 숫자 중 하나, 또는 비어 있으면 기본값 사용:
0 (기본값) 폴더는 열람하지 않습니다 (파일만 열람).
1 와일드카드 패턴에 부합하는 모든 파일과 폴더를 열람합니다.
2 폴더만 열람합니다 (파일 열람 안함).

Recurse?
다음 숫자 중 하나, 또는 비어 있으면 기본값을 사용합니다:
0 (기본값) 서브폴더 안으로 재귀하지 않습니다.
1 서브폴더 안으로 재귀해 들어가 거기에서 FilePattern에 부합하는 모든 파일과 폴더를 열람합니다. 이름이 FilePattern에 부합하지 않아도 모든 서브폴더를 재귀해 들어갑니다.

파일-회돌이 안에서 사용할 수 있는 특별한 변수

다음 변수들은 파일-회돌이라면 모두 존재합니다. 안쪽 파일-회돌이가 바깥 파일-회돌이에 둘러 싸여 있다면, 안쪽 파일 회돌이가 우선권이 있습니다:

A_LoopFileName | 현재 열람된 파일이나 폴더의 이름 (경로 없음).
A_LoopFileExt | 파일 확장자 (예, TXT, DOC, 또는 EXE). 마침표 (.)는 포함되지 않습니다.
A_LoopFileFullPath | 현재 열람된 파일/폴더의 전체 경로와 이름. FilePattern에 절대 경로가 아니라 상대 경로가 담겨 있다면, 여기에도 상대 경로가 담깁니다. 게다가, FilePattern이 짧은 (8.3) 폴더 이름이면 역시 짧은 이름이 담깁니다 (긴 버전을 얻으려면 다음 항목을 참조하십시오).
A_LoopFileLongPath 다음과 같은 점에서 A_LoopFileFullPath와 다릅니다:
  1. 언제나 파일의 절대/완전한 경로가 담깁니다. FilePattern에 절대 경로가 담겨 있어도 상관이 없습니다;
  2. FilePattern 자체의 짧은 (8.3) 폴더 이름은 긴 이름으로 변환됩니다;
  3. FilePattern 안의 문자는 파일 시스템에 저장된 대소문자에 맞추어 대문자나 소문자로 변환됩니다 . 이는 파일 이름을 탐색기에 보이듯이 정확한 경로 이름으로 -- 예를 들어 스크립트 안에 명령 줄 매개변수로 건네어지는 경로 -- 변환하는 데 유용합니다.
A_LoopFileShortPath

현재 열람된 파일/폴더의 8.3 짧은 경로와 이름. 예를 들어: C:\MYDOCU~1\ADDRES~1.txt. FilePattern에 절대 경로가 아니라 상대 경로가 담기면, 여기에서 경로도 역시 상대 경로가 됩니다.

단일 파일이나 폴더에 대하여 완벽한 8.3 경로와 이름을 열람하려면, FilePattern에 그의 이름을 다음 예제와 같이 지정하십시오:

Loop, C:\My Documents\Address List.txt
    ShortPathName = %A_LoopFileShortPath%

주의: 이 변수는 파일이 짧은 이름이 없다면 비어 있습니다. 이런 일은 레지스트리에 NtfsDisable8dot3NameCreation가 설정되어 있는 시스템에서 일어날 수 있습니다. 또 FilePattern에 상대 경로가 들어 있고 회돌이의 몸체가 SetWorkingDir를 사용하는 경우에도 일어날 수 있습니다. 현재 회돌이 자체에 영향이 있는 현재 작업 디렉토리로부터 다른 디렉토리로 전환하면 안됩니다.
A_LoopFileShortName | 8.3 짧은 이름, 또는 파일의 또다른 이름. 파일에 짧은 이름이 없다면 (긴 이름이 8.3보다 더 짧거나 또는 어쩌면 NTFS 파일 시스템에서 짧은-이름 생성이 꺼져 있기 때문에), A_LoopFileName이 대신 열람됩니다.
A_LoopFileDir | A_LoopFileName이 거주하는 디렉토리의 경로. FilePattern에 절대 경로가 아니라 상대 경로가 들어 있다면, 여기의 경로도 상대 경로가 됩니다. 루트 디렉토리는 뒤에 역사선을 포함하지 않습니다. 예를 들어: C:
A_LoopFileTimeModified | 파일이 마지막으로 수정된 시각. 형식은 YYYYMMDDHH24MISS.
A_LoopFileTimeCreated | 파일이 생성된 시각. 형식은 YYYYMMDDHH24MISS.
A_LoopFileTimeAccessed | 파일에 마지막으로 접근한 시각. 형식은 YYYYMMDDHH24MISS.
A_LoopFileAttrib | 현재 열람된 파일의 속성.
A_LoopFileSize | 현재 열람된 파일의 바이트 단위 크기. 4 기가 바이트보다 큰 파일도 지원합니다.
A_LoopFileSizeKB | 현재 열람된 파일의 Kbytes 단위 크기, 가장 가까운 정수로 반내림됩니다.
A_LoopFileSizeMB | 현재 열람된 파일의 Mbytes 단위 크기, 가장 가까운 정수로 반내림 됩니다.

논평

파일 회돌이는 파일/폴더의 집단을 한 번에 하나씩 처리하고 싶을 때 유용합니다.

숨은 파일을 포함하여, 부합하는 모든 파일이 열람됩니다. 대조적으로, DIR와 같은 OS 특징은 기본으로 숨은 파일을 제외합니다. 숨은, 시스템, 또는 읽기 전용 파일을 처리하지 않도록 하려면, 회돌이 안에 다음과 같은 코드를 사용하십시오:

if A_LoopFileAttrib contains H,R,S  ; 속성이 H (Hidden), R (Read-only), 또는 S (System)인 파일은 건너 뜁니다. 주의: "H,R,S"에 스페이스가 없습니다.
    continue  ; 이 파일을 건너 뛰고 다음 파일로 갑니다.

파일을 재귀적으로 검색하는 동안 절대 경로 대신에 상대 경로를 얻으려면, SetWorkingDir을 사용하여 회돌이를 시작하기 전에 먼저 기본 폴더로 변경한 다음, Loop에서는 그 경로를 생략하십시오 (예, Loop, *.*, 0, 1). 그러면 A_LoopFileFullPath에 그 기본 폴더에 상대적인 파일의 경로가 담깁니다.

파일-회돌이는 자신의 범위 안에서 파일이나 폴더를 만들거나 이름을 바꿀 경우 스스로를 혼란에 빠트릴 수 있습니다. 예를 들어, FileMove나 기타 수단으로 파일 이름을 변경한다면, 그런 파일은 각각 두 번 발견이 될 수 있습니다: 한 번은 그의 예전 이름으로 그리고 다시 새 이름으로 발견됩니다. 이를 우회하려면, 파일 리스트가 생성된 후에만 파일의 이름을 바꾸십시오. 예를 들어:

FileList =
Loop, Files, *.jpg
   FileList = %FileList%%A_LoopFileName%`n
Loop, Parse, FileList, `n
   FileMove, %A_LoopField%, renamed_%A_LoopField%

NTFS 파일 시스템의 파일은 아마도 언제나 알파벳 순서로 열람될 것입니다. 다른 파일 시스템에서는 특별한 순사가 없이 열람됩니다. 특정 순서로 열람하려면, 아래 섹션의 에제에서 보여주는 것처럼 Sort 명령어를 사용하십시오.

파일이나 폴더 이름이 259 문자가 넘어가면 마치 존재하지 않는 것처럼 건너 뜁니다. 그런 파일은 거의 없습니다. 보통 운영 체제에서 그런 파일은 생성을 허용하지 않기 때문입니다.

Blocks, Break, Continue, 그리고 A_Index 변수 (모든 유형의 회돌이에 존재함)에 관한 정보는 Loop를 참조하십시오.

관련 항목

Loop, Break, Continue, Blocks, SplitPath, FileSetAttrib, FileSetTime

예제

; 예제 #1:
Loop Files, %A_ProgramFiles%\*.txt, R  ; 서브폴더 안으로 재귀합니다.
{
    MsgBox, 4, , Filename = %A_LoopFileFullPath%`n`nContinue?
    IfMsgBox, No
        break
}

; 예제 #2: 폴더의 크기를 계산합니다. 그의 서브폴더 안에 있는 파일들을 모두 포함합니다:
SetBatchLines, -1  ; 최대 속도로 연산을 실행합니다.
FolderSizeKB = 0
FileSelectFolder, WhichFolder  ; 사용자에게 폴더를 고르도록 요구합니다.
Loop, Files, %WhichFolder%\*.*, R
    FolderSizeKB += %A_LoopFileSizeKB%
MsgBox Size of %WhichFolder% is %FolderSizeKB% KB.

; 예제 #3: 이름으로 정렬된 파일 이름들을 열람합니다. (다음 예제는 날짜로 정렬):
FileList =  ; 빈 값으로 초기화합니다.
Loop, C:\*.*
    FileList = %FileList%%A_LoopFileName%`n
Sort, FileList, R  ; R 옵션은 역순으로 정렬합니다. 다른 옵션은 Sort를 참조하십시오.
Loop, parse, FileList, `n
{
    if A_LoopField =  ; 리스트 맨 끝에 있는 빈 항목은 무시합니다.
        continue
    MsgBox, 4,, File number %A_Index% is %A_LoopField%.  Continue?
    IfMsgBox, No
        break
}

; 예제 #4: 수정 날짜로 정렬된 파일 이름들을 열람합니다:
FileList =
Loop, Files, %A_MyDocuments%\Photos\*.*, FD  ; 파일과 디렉토리를 포함합니다
    FileList = %FileList%%A_LoopFileTimeModified%`t%A_LoopFileName%`n
Sort, FileList  ; Sort by date.
Loop, Parse, FileList, `n
{
    if A_LoopField =  ; 리스트 맨 끝의 마지막 라인피드 (빈 항목)은 무시합니다.
        continue
    StringSplit, FileItem, A_LoopField, %A_Tab%  ; 탭 문자에서 두 부분으로 나눕니다.
    MsgBox, 4,, The next file (modified at %FileItem1%) is:`n%FileItem2%`n`nContinue?
    IfMsgBox, No
        break
}

; 예제 #5: 목표 파일과 비교해서 더 새로운 소스 파일만 복사합니다:
CopyIfNewer:
; 호출자는 변수 CopySourcePattern과 CopyDest를 우리 대신 설정해 줍니다.
Loop, Files, %CopySourcePattern%
{
    copy_it = n
    IfNotExist, %CopyDest%\%A_LoopFileName%  ; 목표 파일이 아직 존재하지 않으면 항상 복사합니다.
        copy_it = y
    else
    {
        FileGetTime, time, %CopyDest%\%A_LoopFileName%
        EnvSub, time, %A_LoopFileTimeModified%, seconds  ; 목표 파일의 시간으로부터 소스 파일의 시간을 뺍니다.
        if time < 0  ; 소스 파일은 목표 파일보다 더 새롭습니다.
            copy_it = y
    }
    if copy_it = y
    {
        FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1   ;  overwrite=yes를 사용하여 복사합니다
        if ErrorLevel
            MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%\%A_LoopFileName%".
    }
}
Return

; 예제 #6: 명령줄 매개변수를 통하여 건네어진 파일 이름을 긴 이름, 완전한 이름으로 변환합니다.
; 그리고 파일 시스템에 저장된 대소문자에 맞게 이름을 대문자나 소문자로 교정합니다.
Loop %0%  ; 스크립트에 떨구어진 각 파일에 대하여 (또는 매개변수로 건네어진).
{
    GivenPath := %A_Index%  ; 다음 명령줄 매개변수를 열람합니다.
    Loop %GivenPath%, 1
        LongPath = %A_LoopFileLongPath%
    MsgBox The case-corrected long path name of file`n%GivenPath%`nis:`n%LongPath%
}


Loop (parse a string)

Loop (문자열을 해석함)

문자열로부터 부문자열(필드)를 한 번에 하나씩 열람합니다.

Loop, Parse, InputVar [, Delimiters, OmitChars]

매개변수

Parse

이 개변수는 단어 PARSE만 됩니다. 다른 회돌이 유형과 다르게, 변수 참조는 단어 PARSE로 결정된다고 할지라도 허용하지 않습니다.

InputVar

내용을 분석할 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 변수의 내용을 이름으로 사용하고 싶다면 예외입니다.

[v1.1.21+]: 이 매개변수는 % 표현식이 될 수 있지만, 퍼센트-스페이스 접두사가 반드시 사용되어야 합니다.

Delimiters

이 매개변수가 비어 있거나 생략되면, InputVar의 각 문자는 별도의 부문자열로 간주됩니다.

이 매개변수가 CSV이면, InputVar는 표준의 쉼표로 가른 값 형식으로 해석됩니다. 다음은 CSV줄의 예로서 MS Excel로 생산했습니다:

"first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"

그렇지 않으면, Delimiters에는 하나 이상의 문자가 담깁니다 (대소문자 구별), 각 문자마다 InputVar에서 부문자열이 일어나는 경계를 결정합니다.

Delimiter 문자들은 부문자열 자체의 일부로 간주되지 않습니다. 또, InputVar 안에서 한 쌍의 구분자 사이에 아무것도 없다면, 상응하는 문자열은 비어 있습니다.

예를 들어: `, (피신된 쉼표)는 문자열을 쉼표가 출현할 때마다 가릅니다. 비슷하게, %A_Tab%%A_Space%는 InputVar에서 스페이스나 탭을 만날 때마다 새 문자열을 시작시킵니다.

문자 하나가 아니라 문자열을 구분자로 사용하려면, 먼저 StringReplace를 사용해 해당 문자열이 나타나면 모두 텍스트에서 절대로 문자 그대로 사용되지 않는 문자 하나로 교체합니다. 예를 들어 다음의 특수 문자들 중 하나: ¢¤¥¦§©ª«®µ¶. 다음 예제를 연구해 보십시오. 문자열 <br>을 구분자로 사용합니다:

StringReplace, NewHTML, HTMLString, <br>, ¢, All
Loop, parse, NewHTML, ¢ ; 센트 심볼에 기반하여 문자열을 해석합니다.
{
...
}
OmitChars

각 부문자열의 선두와 후미에서 배제할 문자의 (선택적) 리스트 (대소문자 구분). 예를 들어, OmitChars가 %A_Space%%A_Tab%이면, 스페이스와 탭이 열람된 매 부문자열로부터 선두와 후미에서 제거됩니다 (가운데는 아님).

Delimiters가 비어 있으면, OmitChars는 고려 대상에서 배제할 문자들을 가리킵니다 (회돌이는 그런 문자들을 보지 못합니다).

대부분의 다른 명령어의 마지막 매개변수와 다르게, OmitChars에서 쉼표는 반드시 피신시켜야 합니다 (`,).

논평

문자열 파싱 회돌이는 문자열에 들어 있는 각 필드를 한 번에 하나씩 처리할 때 유용합니다. (StringSplit은 영구적인 의사-배열을 생성하기 때문에) 파싱 회돌이는 StringSplit 보다 메모리를 덜 사용하고 대부분의 경우 더 사용하기 쉽습니다.

내장 변수 A_LoopField는 모든 파싱 회돌이 안에 존재합니다. 안에 InputVar로부터 파싱한 현재의 부문자열(필드)가 들어 있습니다. 내부 파싱 회돌이가 바깥 파싱 회돌이로 둘러 싸여 있다면 내부 회돌이의 필드가 우선 순위가 높습니다.

내장 변수 "A_LoopDelimiter"는 전혀 없지만, 이 페이지 맨 아래 예제는 각 필드마다 어느 구분자를 사용하고 있는 보여줍니다.

InputVar의 크기 또는 그의 필드의 크기에는 제한이 없습니다. 게다가, InputVar의 내용이 회돌이를 실행하는 동안에 바뀐다면, 그 회돌이는 그 변화를 "보지 못합니다". 왜냐하면 원래 내용의 임시 사본을 처리하고 있기 때문입니다.

해석하기 전에 필드를 다른 순서로 정돈하려면, Sort 명령어를 사용하십시오.

Blocks, Break, Continue, 그리고 A_Index 변수 (모든 회돌이에 존재)에 관한 정보는 Loop를 참조하십시오.

관련 항목

StringSplit, file-reading loop, Loop, Break, Continue, Blocks, Sort, FileSetAttrib, FileSetTime

예제

; 예제 #1:
Colors = red,green,blue
Loop, parse, Colors, `,
{
    MsgBox, Color number %A_Index% is %A_LoopField%.
}

; 예제 #2: 변수 안에 줄들을 하나씩 읽어 들입니다 (파일-읽기 회돌이와 유사).
; FileRead를 통하여 파일을 변수 안에 적재할 수 있습니다:
Loop, parse, FileContents, `n, `r  ; `n을 먼저 `r을 다음에 지정해야 Windows와 Unix 파일을 모두 해석할 수 있습니다.
{
    MsgBox, 4, , Line number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}

; 예제 #3: 위의 예제와 같지만 클립보드용입니다.
; 클립보드에 파일이 담겨 있을 때 유용합니다. 그런 파일은 보통 탐색창으로부터 복사됩니다
; (프로그램은 자동으로 그런 파일을 그들의 파일 이름으로 변환합니다):
Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , File number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}

; Example #4: 쉼표로 가른 값 (CSV) 파일을 해석합니다:
Loop, read, C:\Database Export.csv
{
    LineNumber = %A_Index%
    Loop, parse, A_LoopReadLine, CSV
    {
        MsgBox, 4, , Field %LineNumber%-%A_Index% is:`n%A_LoopField%`n`nContinue?
        IfMsgBox, No
            return
    }
}

; 예제 #5: 어느 구분자에 마주했는지 알아내기.

; 검색할 문자열을 초기화 합니다.
Colors = red,green|blue;yellow|cyan,magenta
; 문자열에서 위치를 추적할 계수를 초기화합니다.
Position := 0

Loop, Parse, Colors, `,|;
{
    ; 이 필드의 끝에서 구분자의 위치를 계산합니다.
    Position += StrLen(A_LoopField) + 1
    ; 해석 회돌이가 발견한 구분자를 열람합니다.
    Delimiter := SubStr(Colors, Position, 1)

    MsgBox Field: %A_LoopField%`nDelimiter: %Delimiter%
}


Loop (read file contents)

Loop (파일 내용 읽기)

텍스트 파일에서 한 번에 한 줄씩 열람합니다 (FileReadLine보다 수행성능이 좋습니다).

Loop, Read, InputFile [, OutputFile]

매개변수

Read

이 매개변수는 반드시 단어 READ이어야 합니다.

InputFile

그의 내용이 회돌이에 읽혀 질 텍스트 파일의 이름. 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다. Windows와 Unix 형식을 지원합니다; 즉, 파일 줄은 캐리지 리턴과 라인피드로 (`r`n) 끝나거나 아니면 그냥 라인피드로 (`n) 끝날 수 있습니다.

OutputFile

(선택적) 회돌이를 하는 동안 열어 둘 파일의 이름. 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

회돌이 몸체 안에서 매개 변수 하나만 (씌여질 텍스트만) 가지고 FileAppend 명령어를 사용하면 이 특별한 파일에 추가할 수 있습니다. 이런 방식으로 파일에 추가하면 FileAppend를 매개변수 2 개와 함께 사용하는 것보다 더 수행성능이 좋습니다. 왜냐하면 파일을 각 연산마다 닫고 다시 열 필요가 없기 때문입니다. 잊지 말고 텍스트 끝에 라인피드를 (`n) 추가하십시오.

아무것도 씌여지지 않으면 파일은 열리지 않습니다. 이런 일은 Loop가 전혀 반복을 수행하지 않거나 FileAppend 명령어를 전혀 사용하지 않을 때 일어납니다.

이진 모드: 텍스트 모드가 아니라 이진 모드로 추가하려면, 파일 이름 앞에 별표를 배치하십시오. 이렇게 하면 각 라인피드 문자가 (`n) 윈도우즈의 표준 CR+LF가 아니라 단일 라인피드로 씌여집니다 (LF). 예를 들어: *C:\My Unix File.txt. 별표가 없더라도, FileAppend를 처음 사용할 때 Loop에서 캐리지 리턴과 라인피드를 쓰면 (`r`n) 이진 모드가 자동으로 켜집니다(?).

표준 출력 (stdout): 별표를 (*) OutputFile에 지정하면 FileAppend가 쓰는 모든 텍스트는 표준 출력으로 전송됩니다 (stdout). 그런 출력을 파일에 방향전환하거나, 또다른 EXE로 파이프 처리하거나, 또는 멋진 텍스트 편집기로 나포할 수는 있지만, 기동된 명령어 프롬프트에 스크립트가 나타나지 않습니다. 더 자세한 것은 FileAppend를 참조하십시오.

피신된 쉼표: 대부분의 다른 명령어의 마지막 매개변수와 다르게, OutputFile에서 쉼표는 반드시 피신시켜야 합니다 (`,).

논평

파일-읽기 회돌이는 텍스트 파일에 든 각 줄을 한 번에 하나씩 처리할 때 유용합니다. FileReadLine을 사용하는 것보다 더 수행성능이 좋습니다. 왜냐햐면: 1) 연산 기간동안 파일이 열린 상태로 있을 수 있습니다; 그리고 2) 그 파일은 요청된 줄 번호츨 찾기 위해 매번 다시 스캔할 필요가 없습니다.

내장 변수 A_LoopReadLine은 모든 파일-읽기 회돌이 안에 존재합니다. 안에 현재 줄의 내용이 담겨 있습니다. 줄 끝을 표식하는 캐리지 리턴과 라인피드는 제외되어 있습니다 (`r`n). 내부 파일-읽기 회돌이가 바깥 파일-읽기 회돌이로 둘러 싸여 있다면, 가장 안쪽 회돌이의 파일-줄이 우선 순위를 갖습니다.

줄 당 65,534 문자 길이까지 읽을 수 있습니다. 줄 길이가 이 제한을 초과하면, 나머지 문자들을 다음 회돌이 때 읽힙니다.

InputFile으로부터 열람된 각 줄의 내용을 분해하기 위해 StringSplit 또는 파싱 회돌이가 종종 사용됩니다. 예를 들어, InputFile의 각 줄이 탭으로-구분된 일련의 필드로 구성되어 있다면, 그 필드들은 다음 예제와 같이 개별적으로 열람할 수 있습니다:

Loop, read, C:\Database Export.txt
{
    Loop, parse, A_LoopReadLine, %A_Tab%
    {
        MsgBox, Field number %A_Index% is %A_LoopField%.
    }
}

전체 파일을 변수 안으로 적재하려면, FileRead를 사용하십시오. 왜냐하면 회돌이보다 수행성능이 (특히 방대한 파일에 대하여) 훨씬 더 좋기 때문입니다.

여러 파일을 동시에 열려면, 다음 예제에 보여주는 바와 같이 DllCall()를 사용하십시오.

Blocks, Break, Continue, 그리고 (모든 유형의 회돌이에 존재하는) A_Index 변수에 관한 정보는 Loop를 참조하십시오.

바이트 순서 표식이 없을 때 파일을 어떻게 디코드할지 제어하려면 FileEncoding을 사용하십시오.

관련 항목

FileEncoding, FileOpen/File Object, FileRead, FileReadLine, FileAppend, Sort, Loop, Break, Continue, Blocks, FileSetAttrib, FileSetTime

예제

; 예제 #1: 1st 파일에서 단어 FAMILY가 든 줄들만 2nd 파일에 씌여집니다.
; 기존의 파일에 추가하는게 아니라 덮어쓰려면 첫 줄을 주석 해제하십시오.
;FileDelete, C:\Docs\Family Addresses.txt

Loop, read, C:\Docs\Address List.txt, C:\Docs\Family Addresses.txt
{
    IfInString, A_LoopReadLine, family, FileAppend, %A_LoopReadLine%`n
}

; 예제 #2: 텍스트 파일로부터 마지막 줄을 열람합니다.
Loop, read, C:\Log File.txt
    last_line := A_LoopReadLine  ; 회돌이가 끝날 때, 여기에 그 마지막 줄을 보유합니다.

; 예제 #3: 다음 스크립트는 HTML이나 텍스트 파일로부터
; FTP와 HTTP의 URL을 모두 추출하려고 시도합니다:
FileSelectFile, SourceFile, 3,, Pick a text or HTML file to analyze.
if SourceFile =
    return  ; 이 경우 종료합니다.

SplitPath, SourceFile,, SourceFilePath,, SourceFileNoExt
DestFile = %SourceFilePath%\%SourceFileNoExt% Extracted Links.txt

IfExist, %DestFile%
{
    MsgBox, 4,, Overwrite the existing links file? Press No to append to it.`n`nFILE: %DestFile%
    IfMsgBox, Yes
        FileDelete, %DestFile%
}

LinkCount = 0
Loop, read, %SourceFile%, %DestFile%
{
    URLSearchString = %A_LoopReadLine%
    Gosub, URLSearch
}
MsgBox %LinkCount% links were found and written to "%DestFile%".
return

URLSearch:
; 다음과 같이 특별한 방식으로 처리됩니다. 왜냐하면 어떤 URL은 다른 URL을 자신 안에 내장하기 때문입니다:
StringGetPos, URLStart1, URLSearchString, http://
StringGetPos, URLStart2, URLSearchString, ftp://
StringGetPos, URLStart3, URLSearchString, www.

; 가장 왼쪽의 시작 지점을 찾습니다:
URLStart = %URLStart1%  ; 기본 시작 지점을 설정합니다.
Loop
{
    ; "URLStart%A_Index%"를 한 번만 결정하면
    ; (적어도 많은 변수가 있는 스크립트에서) 수행성능이 향상됩니다
    ArrayElement := URLStart%A_Index%
    if ArrayElement =  ; 의사-배열의 끝에 도달했습니다.
        break
    if ArrayElement = -1  ; 이 요소는 자격이 없습니다.
        continue
    if URLStart = -1
        URLStart = %ArrayElement%
    else ; URLStart는 안에 유효한 위치를 가지고 있습니다.. 그래서 그것을 ArrayElement와 비교합니다.
    {
        if ArrayElement <> -1
            if ArrayElement < %URLStart%
                URLStart = %ArrayElement%
    }
}

if URLStart = -1  ; URL이 URLSearchString에 존재하지 않습니다.
    return

; 그렇지 않으면, 이 URL을 추출합니다:
StringTrimLeft, URL, URLSearchString, %URLStart%  ; 시작/부적절 부분을 제거합니다.
Loop, parse, URL, %A_Tab%%A_Space%<>  ; (있다면) 첫 번째 스페이스, 탭, 또는 앵글 문자를 찾습니다.
{
    URL = %A_LoopField%
    break  ; 즉, 첫 번째 "필드"를 가져 오기 위해 오직 한 번만 회돌이를 수행합니다.
}
; 종료 문자가 발견되지 않아서 위의 회돌이에 반복이 없다면,
; URL 변수의 내용을 그대로 둡니다.

; URL이 겹따옴표로 끝나면, 겹따옴표를 제거합니다. 지금 당장은 StringReplace가 사용됩니다.
; 그러나 겹따옴표가 URL 안에 존재해도 유효한 것 같습니다.
; 그래서 제거하면 손상을 입힐 수도 있습니다:
StringReplace, URLCleansed, URL, ",, All
FileAppend, %URLCleansed%`n
LinkCount += 1

; 이 줄에 다른 URL들이 있는 알아 봅니다:
StringLen, CharactersToOmit, URL
CharactersToOmit += %URLStart%
StringTrimLeft, URLSearchString, URLSearchString, %CharactersToOmit%
Gosub, URLSearch  ; 자신에게 재귀 호출을 합니다.
return


Loop (registry)

Loop (레지스트리)

지정된 레지스트리 서브키의 내용을 한 번에 하나씩 열람합니다.

Loop, Reg, RootKey[\Key, Mode]  ; v1.1.21+ (추천)
Loop, RootKey [, Key, IncludeSubkeys?, Recurse?]

매개변수

Reg [v1.1.21+]

문자 그대로의 단어 Reg (대소문자 구분). 이것은 변수 또는 표현식이 되면 안됩니다. 이 키워드가 존재하면, Key는 반드시 쉼표 대신에 정사선으로 RootKey와 분리해야 합니다. 둘 모두 하나의 변수에 담길 수 있습니다. 예를 들어, Loop, Reg, HKLM\Software 또는 Loop, Reg, %FullPathOfKey%.

RootKey

HKEY_LOCAL_MACHINE (HKLM), HKEY_USERS (HKU), HKEY_CURRENT_USER (HKCU), HKEY_CLASSES_ROOT (HKCR), 또는 HKEY_CURRENT_CONFIG (HKCC) 중 하나가 되어야 합니다.

원격 레지스트리에 접근하려면, 컴퓨터 이름과 쌍점을 앞에 배치하십시오. 다음 예제와 같이: \\workstation01:HKEY_LOCAL_MACHINE

Key

키의 이름 (예, Software\SomeApplication). 비어 있거나 생략하면, RootKey의 내용이 열람됩니다.

Mode [v1.1.21+]

다음 기호로 구성됩니다:

K: 키를 포함합니다.
V: 값을 포함합니다. K와 V를 모두 생략하면 값들도 포함됩니다.
R: 하위키로 재귀해 들어갑니다. R이 생략되면, Key의 하위키의 키와 값은 포함되지 않습니다.

IncludeSubkeys?

0 (기본값) Key 안에 포함된 하위키는 열람하지 않습니다 (오직 값만 열람합니다).
1 모든 값들과 하위키를 열람합니다.
2 하위키만 열람합니다 (값은 열람하지 않습니다).

Recurse?
0 (기본값) 하위키에 재귀하지 않습니다.
1 하위키에 재귀해 들어갑니다. 그래서 그 안에 포함된 모든 값과 키를 열람합니다.

논평

레지스트리-회돌이는 레지스트리 값 또는 하위키의 집단을 한 번에 하나씩 처리하고 싶을 때 유용합니다. 값과 하위키는 역순으로 (아래에서 위로) 열람되므로 회돌이를 방해하지 않고 회돌이 안에 RegDelete를 사용할 수 있습니다.

다음 변수들이 레지스트리-회돌이 안에 존재합니다. 내부 레지스트리-회돌이가 외부 레지스트리-회돌이 안에 싸여 있다면, 내부 회돌이의 레지스트리 항목이 우선 순위를 갖습니다:

A_LoopRegName | 현재 열람된 항목의 이름. 값 이름 또는 하위키의 이름 중 하나입니다. 값 이름에 값이 할당되어 있으면 Windows RegEdit이 "(Default)"로 보여주는 값 이름이 열람됩니다. 그러나 A_LoopRegName는 값 이름에 대하여 비워집니다.
A_LoopRegType | 현재 열람된 항목의 유형, 다음 단어 중 하나입니다: KEY (즉, 현재 열람된 항목은 값이 아니라 하위키입니다), REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD, REG_QWORD, REG_BINARY, REG_LINK, REG_RESOURCE_LIST, REG_FULL_RESOURCE_DESCRIPTOR, REG_RESOURCE_REQUIREMENTS_LIST, REG_DWORD_BIG_ENDIAN (아마도 대부분의 윈도우즈 하드웨어에서는 보기 힘들 것입니다). 현재 열람된 항목이 미지의 유형이면 비어 있습니다.
A_LoopRegKey | 접근 중인 루트 키의 이름 (HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT, 또는 HKEY_CURRENT_CONFIG). 원격 레지스트리 접근을 위하여, 이 값은 컴퓨터 이름을 포함하지 않습니다.
A_LoopRegSubKey | 현재 SubKey의 이름. 이 키는 Key 매개변수와 같습니다. 단, Recurse 매개변수가 재귀적으로 다른 하위키들을 탐험하는 데 사용중이면 예외입니다. 그런 경우라면, 현재 열람된 항목의 전체 경로입니다. 루트 키를 포함하지 않습니다. 예를 들어: Software\SomeApplication\My SubKey
A_LoopRegTimeModified | 현재 하위키 또는 그의 값이 마지막으로 변경된 시간. 형식은 YYYYMMDDHH24MISS입니다. 이 변수는 현재 열람된 항목이 하위키가 아니면 비어 있습니다 (즉, A_LoopRegType는 단어 KEY가 아닙니다).

레지스트리-회돌이 안에서 사용될 때, 다음 명령어들을 사용하면 현재 열람된 항목을 처리해야 할지 말지 간단하게 알려줄 수 있습니다:

RegRead, OutputVar | 현재 항목을 읽습니다. 현재 항목이 키이면, ErrorLevel에 1이 설정되고 OutputVar는 비워집니다.
RegWrite [, Value] | 현재 항목을 씁니다. Value를 생략하면, 항목은 그의 유형에 따라 0이 되거나 비워집니다. 현재 항목이 키이면, ErrorLevel은 1이 설정되고 다른 효과는 전혀 없습니다.
RegDelete | 현재 항목을 삭제합니다. 현재 항목이 키이면, 그의 서브키 그리고 그 안에 포함된 값까지 함께 삭제됩니다.

(위에 기술된 RootKey 매개변수를 통하여) 원격 레지스트리에 접근할 때, 다음 사항이 적용됩니다:

  • 목표 머신은 원격 레지스트리 서비스를 실행하고 있어야 합니다.
  • 목표 컴퓨터가 여러분의 도메인과 같은 도메인에 있지 않다면 또는 지역이나 원격 사용자이름이 충분한 권한이 없다면 원격 레지스트리 접근은 실패할 수 있습니다 (그렇지만, 가능한 해결책은 아래를 참조하십시오).
  • 사용자이름의 도메인, 작업그룹, 그리고/또는 권한에 따라, 원격 레지스트리 접근을 시도하기 전에, 먼저 드라이브를 맵핑하거나 함으로써, 공유 장치에 접속할 필요가 있습니다. 그런 식으로 접속하면 -- 레지스트리에 접근하거나 편집할 수 있는 권한이 있는 원격 사용자이름과 암호를 사용하여 접속하면 -- 원격 레지스트리 접근이 활성화되는 부작용이 있을 수 있습니다.
  • 이미 목표 컴퓨터에 다른 사용자로 접속했다면 (예를 들어, 사용자 Guest를 통하여 맵 드라이브에 접속했다면), 접속을 끊어서 원격 레지스트리 특징에 다시 접속해 여러분의 현재 로그-온 사용자이름으로 재-인증받을 필요가 있습니다.
  • Windows Server 2003 그리고 Windows XP Professional에 대하여, MSDN이 언급한 바에 의하면: "[레지스트리 서버] 컴퓨터가 작업그룹에 참여하고 로컬 계정을 사용하는 네크워크 로그온 사용자를 강제로 Guest로 인증받게 하는 정책이 활성화되어 있다면, 그 기능은 실패합니다. 컴퓨터가 작업그룹에 참여한다면 이 정책이 기본값으로 활성화되어 있는지 확인 하십시오."
  • Windows XP Home Edition에 대하여, MSDN이 언급한 바에 의하면 "이 기능은 언제나 실패합니다". Home Edition은 레지스트리 서버도 클라이언트도 없습니다. 물론 클라이언트는 OS cab 파일 중에서 추출할 수 있습니다.

Blocks, Break, Continue, 그리고 A_Index 변수 (모든 회돌이에 존재)에 관한 더 자세한 정보는 Loop를 참조하십시오.

관련 항목

Loop, Break, Continue, 블록, RegRead, RegWrite, RegDelete, SetRegView

예제

; 예제: 사용자가 타자한 인터넷 익스플로러의 URL 이력을 삭제합니다:
Loop, HKEY_CURRENT_USER, Software\Microsoft\Internet Explorer\TypedURLs
    RegDelete

; 예제: 작동하는 테스트 스크립트:
Loop, Reg, HKEY_CURRENT_USER\Software\Microsoft\Windows, KVR
{
    if a_LoopRegType = key
        value =
    else
    {
        RegRead, value
        if ErrorLevel
            value = *error*
    }
    MsgBox, 4, , %a_LoopRegName% = %value% (%a_LoopRegType%)`n`nContinue?
    IfMsgBox, NO, break
}

; 예제: 전체 레지스트리에서 특정 값을
; 재귀적으로 열람하는 예제.
SetBatchLines -1  ; 최대 속도로 검색합니다.
RegSearchTarget = Notepad  ; 서브루틴에 무엇을 검색하고 싶은지 알립니다.
Gosub, RegSearch
return

RegSearch:
ContinueRegSearch = y
Loop, Reg, HKEY_LOCAL_MACHINE, KVR
{
    Gosub, CheckThisRegItem
    if ContinueRegSearch = n ; 멈추어야 합니다.
        return
}
Loop, Reg, HKEY_USERS, KVR
{
    Gosub, CheckThisRegItem
    if ContinueRegSearch = n ; 멈추어야 합니다.
        return
}
Loop, Reg, HKEY_CURRENT_CONFIG, KVR
{
    Gosub, CheckThisRegItem
    if ContinueRegSearch = n ; 멈추어야 합니다.
        return
}
; 주의: HKEY_USERS를 검색 중이라면
; HKEY_CURRENT_USER는 검색할 필요가 없다고 필자는 믿습니다.
; 마찬가지로 HKEY_LOCAL_MACHINE를 검색 중이라면.
; HKEY_CLASSES_ROOT도 검색할 필요가 없을 것입니다.

return

CheckThisRegItem:
if A_LoopRegType = KEY  ; 키 이름도 점검하고 싶다면 다음 두 줄을 제거하십시오.
    return
RegRead, RegValue
if ErrorLevel
    return
IfInString, RegValue, %RegSearchTarget%
{
    MsgBox, 4, , The following match was found:`n%A_LoopRegKey%\%A_LoopRegSubKey%\%A_LoopRegName%`nValue = %RegValue%`n`nContinue?
    IfMsgBox, No
        ContinueRegSearch = n  ; 호출자에게 검색을 멈추라고 알립니다.
}
return


Menu

메뉴와 메뉴 항목을 만들고, 제거하고, 변경하고 그리고 보여줍니다. 트레이 아이콘과 툴팁을 변경합니다. 컴파일된 스크립트의 메인 창이 열릴지 말지 제어합니다.

Menu, MenuName, Cmd [, P3, P4, P5]

매개변수

MenuName

TRAY 또는 맞춤 메뉴의 이름이 될 수 있습니다. 맞춤 메뉴는 그의 이름이 Add 명령어에 처음 사용될 때 자동으로 생성됩니다. 예를 들어: Menu, MyMenu, Add, Item1.

일단 생성되면, 맞춤 메뉴는 Show 명령어로 보여줄 수 있습니다. Add 명령어를 통하여 여러 메뉴에 부메뉴로 부착할 수도 있습니다.

Cmd, P3, P4, P5

이 네 개의 매개변수는 서로 의존적입니다. 허용되는 조합은 아래의 리스트를 참조하십시오.

메뉴에 항목을 추가하거나 변경하기

Add [, MenuItemName, Label-or-Submenu, Pn]: 이것은 다중 목적의 명령어로서 메뉴 항목을 추가하거나, 부메뉴를 새로운 부메뉴 또는 라벨로 갱신하거나 또는 한 항목을 정상 항목에서 부메뉴로 (또는 그 반대로) 변환합니다. MenuItemName이 아직 존재하지 않으면, 메뉴에 추가됩니다. 그렇지 않으면, MenuItemName은 새로 지정된 라벨 또는 부메뉴(Label-or-Submenu)로 갱신됩니다.

메뉴 가름줄을 추가하려면, 세 개의 매개변수를 모두 생략하십시오.

라벨 서브루틴은 사용자가 메뉴 항목을 선택할 때 새 쓰레드로 실행됩니다 (Gosub 그리고 핫키 서브루틴과 비슷합니다). Label-or-Submenu를 생략하면, MenuItemName이 라벨과 메뉴 항목의 이름으로 사용됩니다.

[v1.1.20+]: 기존의 라벨 이름이 아니면, Label-or-Submenu는 함수의 이름이거나, 아니면 함수 객체를 담고 있는 단일 변수 참조일 수 있습니다. 예를 들어, %funcobj% 또는 % funcobj. 객체를 돌려주는 다른 표현식은 현재 지원하지 않습니다. 함수는 아래에 보여주는 바와 같이 선택적으로 매개변수를 정의할 수 있습니다:

FunctionName(ItemName, ItemPos, MenuName)

MenuItemName를 부메뉴가 되게 만들려면 -- 선택되면 새 메뉴를 여는 메뉴 항목을 만들려면 -- Label-or-Submenu에 쌍점 그리고 기존 맞춤 메뉴의 MenuName을 지정하십시오. 예를 들어:

Menu, MySubmenu, add, Item1
Menu, tray, add, 이 메뉴 항목은 부메뉴입니다, :MySubmenu

마지막 매개변수에는 기호 P 그리고 다음에 메뉴의 쓰레드 우선순위가 담길 수 있습니다. 예, P1. 메뉴 항목을 추가할 때 이 매개변수를 생략하면, 우선순위는 0이 될 텐데, 이것이 기본값입니다. 메뉴 항목을 갱신할 때 생략하면, 항목의 우선순위는 바뀌지 않습니다. 기존 항목의 우선 순위만 바꾸려면, Label-or-Submenu 매개변수를 생략하십시오. 우선 순위에 십진수를 사용하십시오 (십육진수는 불가).

Delete [, MenuItemName]: 메뉴로부터 MenuItemName을 삭제합니다. Exit (아래 참조)와 같은 표준 메뉴 항목은 개별적으로 삭제할 수 없습니다. 기본 메뉴 항목이 삭제되면, 그 효과는 NoDefault 옵션을 사용한 것과 비슷합니다. MenuItemName을 생략하면, 전체 MenuName 메뉴가 삭제됩니다. MenuName을 부메뉴로 사용하고 있는 다른 메뉴에 있는 메뉴 항목도 마찬가지로 삭제됩니다.

DeleteAll: 메뉴로부터 모든 맞춤 메뉴 항목을 제거하고, 메뉴를 빈 채로 둡니다. 단, 표준 항목들이 담겨 있는 경우는 예외입니다 (아래 참조). Delete 명령어로 완전히 삭제되는 메뉴와 다르게 (위 참조), 빈 메뉴는 여전히 존재합니다. 그래서 그 메뉴를 부메뉴로 사용하는 다른 메뉴도 여전히 그 부메뉴를 유지합니다.

Rename, MenuItemName [, NewName]: MenuItemName을 NewName으로 변경합니다 (NewName이 비어 있다면, MenuItemName는 가름줄로 변환됩니다). NewName는 기존의 맞춤 메뉴 항목과 같으면 안됩니다. 그 메뉴 항목의 현재 목표 라벨이나 부메뉴는 바뀌지 않습니다.

Check, MenuItemName: 보이는 체크표식을 (아직 없다면) MenuItemName옆의 메뉴에 추가합니다.

Uncheck, MenuItemName: MenuItemName으로부터 체크표식을 (있다면) 제거합니다.

ToggleCheck, MenuItemName: 체크표식을 없다면 추가합니다; 그렇지 않으면, 제거합니다.

Enable, MenuItemName: 이전에 꺼져 있었다면 (회색처리) MenuItemName을 사용자가 다시 한 번 선택하도록 허용합니다.

Disable, MenuItemName: MenuItemName를 회색으로 바꾸어서 사용자가 선택할 수 없다는 것을 나타냅니다.

ToggleEnable, MenuItemName: 이전에 켜져 있었다면 MenuItemName를 끕니다; 그렇지 않으면 켭니다.

Default [, MenuItemName]: 메뉴의 기본 항목을 MenuItemName으로 바꾸고 그 항목의 글꼴을 볼드체로 만듭니다 (TRAY 말고 메뉴에 기본 항목을 설정하는 것은 순전히 장식적인 효과입니다). 사용자가 트레이 아이콘을 클릭할 때, 그의 기본 메뉴 항목이 기동됩니다. 기본 항목이 없다면, 더블클릭해도 아무 효과가 없습니다. MenuItemName를 생략하면, 그 효과는 아래의NoDefault를 사용한 것과 동일합니다.

NoDefault: 트레이 메뉴에 대하여: 메뉴가 다시 표준의 기본 메뉴 항목을 가지도록 바꿉니다. 비-컴파일 스크립트에 기본 메뉴 항목은 OPEN이고 컴파일된 스크립트에 대해서는 없습니다 (단, MainWindow 옵션이 켜져 있을 경우는 제외합니다). 이전에 NoStandard 명령어를 사용했기 때문에 (아래 참조) OPEN 메뉴 항목이 존재하지 않으면, 기본 항목이 없으므로 트레이 아이콘을 더블 클릭해도 아무 효과가 없습니다. TRAY 말고 다른 메뉴에 대하여: 기존의 기본 항목에는 볼드체가-아닌 글꼴을 돌려줍니다.

Standard: 표준 메뉴 항목을 (아직 존재하지 않으면) 메뉴 아래에 삽입합니다. 이 명령어는 트레이 메뉴나 기타 메뉴에 사용될 수 있습니다.

NoStandard: 모든 표준 (맞춤-아닌) 메뉴 항목을 (존재한다면) 트레이 메뉴로부터 제거합니다.

메뉴 항목의 아이콘을 추가하거나 제거하기[AHK_L 17+]

Icon, MenuItemName, FileName [, IconNumber, IconWidth]: MenuItemName의 아이콘을 설정합니다. FileName은 아이콘 파일이거나 AutoHotkey가 지원하는 형식이 이미지일 수 있습니다. 파일에서 첫 번째 아이콘 말고 아이콘 그룹을 사용하려면, 그 번호를 IconNumber에 지정하십시오 (생략하면, 기본 값은 1입니다). IconNumber가 음수이면, 그의 절대 값이 실행 파일 안에 존재하는 아이콘의 자원 ID일 거라고 간주합니다. 아이콘의 너비는 IconWidth에 지정하십시오. IconNumber이 나타내는 아이콘 그룹 안에 여러 아이콘 크기가 있다면, 가장 근접하게 부합하는 아이콘이 사용되고 그 아이콘이 지정된 크기에 맞게 조절됩니다. 사용법은 예제 섹션을 참조하십시오.

현재 Windows Vista 이후에서 아이콘에 투명성을 유지하도록 설정하려면 "실제 크기"를 지정하는 것이 필요합니다. 예를 들어:

Menu, MenuName, Icon, MenuItemName, Filename.png,, 0

알려진 한계: Gui 메뉴 바의 아이콘들은 Windows XP 이전에서 올바르게 배치되지 않습니다.

NoIcon, MenuItemName: MenuItemName의 아이콘을, 있다면 제거합니다.

트레이 아이콘 또는 툴팁 변경하기 (MenuName이 반드시TRAY이어야 함)

Icon [, FileName, IconNumber, 1]: 스크립트의 아이콘을 FileName의 아이콘 중 하나로 바꿉니다. 다음 유형의 파일을 지원합니다: ICO, CUR, ANI, EXE, DLL, CPL, SCR, 그리고 아이콘 자원을 보유한 기타 유형들. 파일의 첫 번째 아이콘 말고 아이콘 그룹을 사용하려면, 그의 번호를 IconNumber에 지정하십시오 (생략하면, 기본값은 1입니다). 예를 들어, 2이면 기본 아이콘을 두 번째 아이콘 그룹으로부터 적재할 것입니다. IconNumber가 음수이면, 그의 절대 값이 실행 파일 안에 있는 아이콘의 자원 ID일 거라고 간주합니다. 별표 (*)를 FileName에 지정하면 스크립트를 기본 아이콘으로 복구할 수 있습니다.

마지막 매개변수: 1을 지정하면 아이콘을 동결합니다. 또는 0이면 그 아이콘을 해동합니다 (또는 비워 두면 동결/해동 상태를 바꾸지 않고 그대로 유지할 수 있습니다). 아이콘이 동결될 때, Pause와 Suspend는 그것을 바꾸지 않습니다. 주의: 현재 아이콘을 동결하거나 해동하려면, 1 또는 0을 다음 예제와 같이 사용하십시오: Menu, Tray, Icon,,, 1.

트레이 아이콘을 변경하면 InputBox, Progress, 그리고 이어서-생성되는 GUI 창이 보여주는 아이콘도 변경됩니다. 컴파일된 스크립트도 영향을 받습니다. 컴파일할 때 맞춤 아이콘을 지정했더라도 마찬가지입니다. 주의: 아이콘을 변경하더라도 트레이 아이콘은 언하이드되지 않습니다. 이전에 #NoTrayIcon과 같은 수단으로 숨겼다면 말입니다; 언하이드 하려면, (매개변수 없이) Menu, Tray, Icon를 사용하십시오.

.ICO 말고 다른 유형으로부터 트레이 아이콘을 적재할 때 약간 왜곡이 발생할 수 있습니다. 특히 16x16 아이콘이 그렇습니다. 이를 피하려면, 원하는 트레이 아이콘을 .ICO 파일에 저장하십시오.

어떤 아이콘들은 운영 체제의 DLL과 CPL에 내장되어 있어서 유용합니다. 예를 들어: Menu, Tray, Icon, Shell32.dll, 174.

내장 변수 A_IconNumber와 A_IconFile에는 현재 아이콘의 번호와 (완전한 경로) 이름이 들어 있습니다 (기본 아이콘이면 둘 다 비어 있습니다).

Icon (매개변수 없음): 아직 존재하지 않으면 트레이 아이콘을 생성합니다. 이렇게 하면 #NoTrayIcon이 오버라이드 됩니다. 이 지시어가 스크립트에 존재해도 마찬가지입니다.

NoIcon: 트레이 아이콘이 존재하면 제거합니다. 이 명령어를 스크립트 맨 꼭대기에 사용하면, 스크립트가 기동할 때 트레이 아이콘이 잠깐 보일 수 있습니다. 이를 피하려면 , 대신 #NoTrayIcon을 사용하십시오. 트레이 아이콘이 현재 숨어 있으면 내장 변수 A_IconHidden 안에 1이 담깁니다. 그렇지 않으면 0이 담깁니다.

Tip [, Text]: 트레이 아이콘의 툴팁을 변경합니다 -- 툴팁은 마우스가 위를 지나갈 때 보여집니다. 여러-줄 툴팁을 생성하려면, 각 줄 사이에 라인피드 (`n) 문자를 사용하십시오. 예, Line1`nLine2. Text에서 앞쪽 127 개만 보여줍니다. 그리고 Text는 (존재하면) 첫 번째 탭 문자에서 잘려 나갑니다. Text를 생략하면, 툴팁은 그의 기본 텍스트로 복구됩니다. 내장 변수 A_IconTip에는 툴팁의 현재 텍스트가 담깁니다 (텍스트가 기본 값이면 비어 있습니다).

기타 명령어

Show [, X, Y]: MenuName을 보여주므로, 사용자는 화살표 키, 메뉴 단축키 (밑줄 기호), 또는 마우스로 항목을 선택할 수 있습니다. 어떤 메뉴도 보여줄 수 있습니다. 여기에는 트레이 메뉴도 포함되지만, GUI 메뉴 바는 예외입니다. X와 Y를 모두 생략하면, 메뉴는 마우스 커서의 현재 위치에 보여집니다. 둘 중에 하나만 생략하면, 생략된 위치에 마우스 커서의 위치가 대신 사용됩니다. X와 Y는 활성 창에 상대적입니다. 전체 화면에 상대적으로 만들려면 미리 "CoordMode, Menu"를 지정하십시오.

Color, ColorValue [, Single]: 메뉴의 배경색을 ColorValue로 바꿉니다. 이 색은 16 가지 기본 HTML 색상 이름 또는 6-자리 RGB 컬러 값입니다 (컬러 차트 참조). ColorValue를 비워 두면 (또는 단어 Default를 지정하면) 메뉴를 그의 기본 컬러로 복구할 수 있습니다. 단어 Single이 다음 매개변수에 존재하지 않으면, 이 메뉴에 부착된 부메뉴들도 모두 색이 바뀝니다.

Click, ClickCount: 1을 ClickCount에 지정하면 한 번 클릭으로 트레이 메뉴의 기본 메뉴 항목을 활성화 할 수 있습니다. 2를 ClickCount에 지정하면 (더블-클릭해) 기본 행위로 돌아올 수 있습니다. 예를 들어: Menu, Tray, Click, 1.

MainWindow: 이 명령어는 컴파일된 스크립트에만 영향을 줍니다. 스크립트의 메인 창을 트레이 아이콘을 통하여 열 수 있습니다. 그렇지 않으면 불가능합니다. 또한 예를 들어 "최근에 실행된 줄"과 같이, 메인 창의 View 메뉴에 있는 항목들을 활성화 합니다. 이 메뉴는 스크립트의 소스 코드와 기타 정보를 보여줍니다. MenuName는 반드시 TRAY이어야 합니다.

NoMainWindow (default): 이 명령어는 컴파일된 스크립트에만 영향을 줍니다. 스크립트를 그의 기본 행위로 복구합니다. 즉, 메인 창이 열리지 못하도록 막습니다. 이 옵션이 켜져 있는 동안에도, 다음 명령어들은 스크립트에서 실행시간에 만나면 여전히 메인 창을 보여줄 수 있습니다: ListLines, ListVars, ListHotkeys, 그리고 KeyHistory. MenuName은 반드시 TRAY이어야 합니다.

UseErrorLevel [, off]: 이 옵션이 스크립트에 사용되지 않으면, 기본 값은 OFF입니다. OFF 설정은 Menu 명령어가 에러를 발생시킬 때마다 대화상자를 보여주고 현재 쓰레드를 종료합니다. Menu, Tray, UseErrorLevel를 지정하면 그 대화상자와 쓰레드 종료를 막을 수 있습니다; 대신에, ErrorLevel은 문제가 있으면 1이 없으면 0이 설정됩니다. 이 옵션을 다시 끄려면, 다음 매개변수에 OFF를 지정하십시오. 이 설정은 전역적입니다. MenuName은 물론이고, 모든 메뉴에 영향을 미친다는 뜻입니다.

논평

메뉴 항목 의 이름에 있는 글자 중 하나에 밑줄을 그으려면, 그 글자 앞에 앰퍼센드를 (&) 배치하십시오. 메뉴가 나타날 때, 그런 항목은 키보드에서 상응하는 키를 눌러서 선택할 수 있습니다. 글자 그대로 앰퍼센드를 보여주려면, 연속적으로 앰퍼센드 두 개를 다음 예제와 같이 지정하십시오: "Save && Exit"

메뉴와 메뉴 항목의 이름은 최대 260 문자까지 허용됩니다.

기존의 메뉴나 메뉴 항목을 참조할 때, 그 이름은 대소문자를 구별하지 않지만 앰퍼센드는 반드시 포함시켜야 합니다. 예를 들어: &Open

가름 줄은 Menu, Tray, Add를 사용하면 메뉴에 추가할 수 있습니다 (즉, 다른 모든 매개변수 생략). 그렇지만, 가름 줄은 현재 개별적으로 제거할 수 없습니다. 이를 우회하려면, Menu, Tray, DeleteAll를 사용한 다음 여러분의 맞움 메뉴 항목을 다시 부착하십시오.

새 메뉴 항목은 언제나 메뉴 아래에 추가됩니다. 트레이 메뉴에 대하여: 여러분이 메뉴 항목을 표준 메뉴 항목보다 위에 놓으려면 (여러분의 메뉴 항목을 추가한 후) Menu, Tray, NoStandard를 실행한 다음에 Menu, Tray, Standard를 실행하십시오.

"Pause Script" 그리고 "Suspend Hotkeys"와 같은 표준 메뉴 항목은 메뉴 부-명령어로 개별적으로 작동시킬 수 없습니다.

메뉴가 완전히 비게 되면 -- 예를 들어 Menu, MyMenu, DeleteAll을 사용하여 -- 보여줄 수 없습니다. 트레이 메뉴가 비게 되면, 트레이 아이콘에 우클릭과 더블클릭이 아무 효과가 없습니다 (그런 경우 보통 #NoTrayIcon을 사용하는 편이 더 좋습니다).

메뉴 항목의 서브루틴이 이미 실행 중이고 사용자가 같은 메뉴를 다시 선택한다면, 새 쓰레드가 생성되고 이전의 쓰레드를 가로채어 같은 서브루틴을 실행합니다. 대신에 그런 이벤트를 나중으로 버퍼 처리하려면, Critical을 서브루틴의 첫 줄에 사용하십시오 (그렇지만, 이렇게 하면 또 핫키 누름과 같은 다른 쓰레드도 역시 버퍼/연기 처리됩니다).

서브루틴이 메뉴 항목을 통하여 기동할 때마다 그 서브루틴은 예를 들어 SendMode에 설정된 기본 값을 가지고 새롭게 시작합니다. 이런 기본 값은 자동-실행 섹션에서 바꿀 수 있습니다.

내장 변수 A_ThisMenuItem 그리고 A_ThisMenuItemPos에 사용자가 최근에 선택한 맞춤 메뉴 항목의 이름과 위치가 담겨 있습니다 (비어 있으면 선택 없음). 비슷하게, A_ThisMenu는 A_ThisMenuItem가 선택된 메뉴의 이름입니다. 이런 변수들은 내용이 언제나 같지 않은 메뉴를 구성할 때 유용합니다. 그런 경우, 보통 그런 모든 메뉴 항목이 같은 라벨을 가리키도록 만들고 그 라벨이 위의 변수들을 참조해서 어떤 행위를 취할지 결정하는 것이 좋습니다.

비-핫키, 비-GUI 스크립트를 계속 실행되도록 유지하려면 -- 예를 들어 오직 맞춤 메뉴나 메뉴 항목만 담고 있는 스크립트 -- #Persistent를 사용하십시오.

관련 항목

GUI, Threads, Thread, Critical, #NoTrayIcon, Gosub, Return, SetTimer, #Persistent

예제

; 예제 #1: 이 스크립트는 새 메뉴 항목을 트레이 아이콘 메뉴의 아래에 부착합니다.

#Persistent  ; 사용자가 종료할 때까지 스크립트의 실행을 계속 유지합니다.
Menu, tray, add  ; 가름 줄을 만듭니다.
Menu, tray, add, Item1, MenuHandler  ; 새 메뉴 항목을 만듭니다.
return

MenuHandler:
MsgBox You selected %A_ThisMenuItem% from menu %A_ThisMenu%.
return

; 예제 #2: 이 스크립트는 사용자가 Win-Z 핫키를 누를 때 보여줄 팝업 메뉴를 생성합니다.

; 약간의 항목을 부착해서 팝업 메뉴를 생성합니다.
Menu, MyMenu, Add, Item1, MenuHandler
Menu, MyMenu, Add, Item2, MenuHandler
Menu, MyMenu, Add  ; Add a separator line.

; 위의 메뉴의 부메뉴가 될 또다른 메뉴를 생성합니다.
Menu, Submenu1, Add, Item1, MenuHandler
Menu, Submenu1, Add, Item2, MenuHandler

; 첫 번째 메뉴에 부메뉴를 하나 생성합니다 (오른쪽 화살표 표시). 사용자가 그것을 선택하면, 두 번째 메뉴가 보여집니다.
Menu, MyMenu, Add, My Submenu, :Submenu1

Menu, MyMenu, Add  ; 그 부메뉴 아래에 가름 줄을 추가합니다.
Menu, MyMenu, Add, Item3, MenuHandler  ; 그 부메뉴 아래에 또다른 메뉴 항목을 추가합니다.
return  ; 스크립트의 자동 실행 섹션이 끝났습니다.

MenuHandler:
MsgBox You selected %A_ThisMenuItem% from the menu %A_ThisMenu%.
return

#z::Menu, MyMenu, Show  ; 즉, Win-Z 핫키를 누르면 메뉴가 나타납니다.

; 예제 #3: 이 스크립트는 다양한 메뉴 명령어의 예를 보여줍니다.

#Persistent
#SingleInstance
menu, tray, add ; 가름 줄
menu, tray, add, TestToggle&Check
menu, tray, add, TestToggleEnable
menu, tray, add, TestDefault
menu, tray, add, TestStandard
menu, tray, add, TestDelete
menu, tray, add, TestDeleteAll
menu, tray, add, TestRename
menu, tray, add, Test
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TestToggle&Check:
menu, tray, ToggleCheck, TestToggle&Check
menu, tray, Enable, TestToggleEnable ; 다음 테스트도 활성화 됩니다. 자기 자신을 끈 것은 언두할 수 없기 때문입니다.
menu, tray, add, TestDelete ; 위와 비슷합니다.
return

TestToggleEnable:
menu, tray, ToggleEnable, TestToggleEnable
return

TestDefault:
if default = TestDefault
{
    menu, tray, NoDefault
    default =
}
else
{
    menu, tray, Default, TestDefault
    default = TestDefault
}
return

TestStandard:
if standard <> n
{
    menu, tray, NoStandard
    standard = n
}
else
{
    menu, tray, Standard
    standard = y
}
return

TestDelete:
menu, tray, delete, TestDelete
return

TestDeleteAll:
menu, tray, DeleteAll
return

TestRename:
if NewName <> renamed
{
    OldName = TestRename
    NewName = renamed
}
else
{
    OldName = renamed
    NewName = TestRename
}
menu, tray, rename, %OldName%, %NewName%
return

Test:
MsgBox, You selected "%A_ThisMenuItem%" in menu "%A_ThisMenu%".
return
; 예제 #4: 이 스크립트는 아이콘을 그의 메뉴 항목에 추가합니다.
Menu, FileMenu, Add, Script Icon, MenuHandler
Menu, FileMenu, Add, Suspend Icon, MenuHandler
Menu, FileMenu, Add, Pause Icon, MenuHandler
Menu, FileMenu, Icon, Script Icon, %A_AhkPath%, 2 ; 파일로부터 두 번째 아이콘 그룹을 사용합니다.
Menu, FileMenu, Icon, Suspend Icon, %A_AhkPath%, -206 ; 자원 식별자가 206인 아이콘을 사용합니다.
Menu, FileMenu, Icon, Pause Icon, %A_AhkPath%, -207 ; 자원 식별자가 207인 아이콘을 사용합니다.
Menu, MyMenuBar, Add, &File, :FileMenu
Gui, Menu, MyMenuBar
Gui, Add, Button, gExit, Exit This Example
Gui, Show
MenuHandler:
Return

Exit:
ExitApp


MouseClick

마우스 버튼을 클릭하거나 누릅니다. 또는 마우스 휠을 돌립니다. 주의: Click 명령어가 일반적으로 더 유연하고 사용하기 쉽습니다.

MouseClick [, WhichButton , X, Y, ClickCount, Speed, D|U, R]

매개변수

WhichButton

클릭할 버튼: Left (기본값), Right, Middle (또는 각각 그냥 앞 머리 글자 하나); 또는 네 번째 다섯 번째 마우스 버튼 (X1 또는 X2). 예를 들어: MouseClick, X1. 이 매개변수는 생략할 수 있습니다. 생략할 경우 기본값은 Left(왼쪽)입니다.

마우스 휠을 돌림: WheelUp 또는 WU를 지정하면 휠을 위로 돌립니다 (멀리); WheelDown 또는 WD를 지정하면 휠을 아래로 돌립니다 (가까이). v1.0.48+에서, WheelLeft (WL) 또는 WheelRight (WR)을 지정하면 휠을 왼쪽 또는 오른쪽으로 각각 돌릴 수 있습니다 (그러나 이것은 Windows Vista 미만의 운영 체제에서는 아무 효과가 없습니다). ClickCount는 휠을 돌릴 눈금의 개수입니다.

사용자가 제어판을 통하여 마우스의 좌우 버튼을 바꾼 경우에 자동으로 보완하려면 대신에 Click 명령어를 사용하십시오.

X, Y

클릭하기 전에 마우스 커서가 이동해 갈 x/y 좌표, 표현식 가능. 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾼 경우는 예외입니다. 생략하면, 커서의 현재 위치가 사용됩니다.

ClickCount

마우스를 클릭할 횟수, 표현식 가능. 생략하면, 버튼은 한 번만 클릭됩니다.

Speed

마우스가 이동할 속도. 범위는 0 (가장 빠름)부터 100 (가장 느림)까지, 표현식 가능. 주의: 속도가 0이면 마우스는 순간 이동합니다. 생략하면, 기본 속도 (SetDefaultMouseSpeed가 설정한 값, 아니면 2)가 사용됩니다.

Speed는 SendInput/Play 모드에서 무시됩니다; 이 모드는 마우스를 순간 이동시킵니다 (물론 SetMouseDelay는 SendPlay에 적용하는 모드가 있습니다). 시각적으로 마우스를 더 천천히 이동시키려면 -- 예를 들어 청중을 위하여 데모를 수행하는 스크립트와 같이 -- (선택적으로 BlockInput과 함께) SendEvent {Click 100, 200} 또는 SendMode Event를 사용하십시오 .

D|U

이 매개변수를 생략하면, 각 클릭은 "down" 이벤트 다음에 "up" 이벤트로 구성됩니다. 다른 방법으로는:
D = 마우스 버튼을 누르지만 떼지는 않습니다(즉, 누름 이벤트를 발생시킵니다).
U = 마우스 버튼을 놓습니다 (즉, 뗌 이벤트를 발생시킵니다).

R

이 매개변수가 기 R이면, X와 Y 좌표는 현재 마우스 위치로부터의 상대거리(offsets)으로 취급됩니다. 다른 말로, 커서는 현재 위치로부터 X 픽셀 만큼 오른쪽으로 (음수이면 왼쪽으로) 그리고 Y 픽셀 만큼 아래쪽으로 (음수이면 위쪽으로) 이동합니다.

논평

이 명령어는 SendMode가 설정한 전송 방법을 사용합니다.

MouseClick보다 Click 명령어를 권장합니다. 왜냐하면:

  1. 제어판을 통하여 마우스 좌우 버튼이 바꾸어도 자동으로 보상합니다.
  2. 일반적으로 더 사용하기 쉽습니다.

shift-click 또는 control-click을 수행하려면, 다음 예제와 같이 연산의 앞 뒤에 Send 명령어를 사용하십시오:

; 예제 #1:
Send, {Control down}
MouseClick, left, 55, 233
Send, {Control up}
; 예제 #2:
Send, {Shift down}
MouseClick, left, 55, 233
Send, {Shift up}

SendPlay 모드는 다른 모드에 비해 광범위한 게임에 성공적으로 마우스 이벤트를 발생시킬 수 없습니다. 게다가, 어떤 어플리케이션과 게임은 마우스를 너무 빨리 움직이면 마우스를 추적하는 데 어려움이 있을 수있습니다. speed 매개변수 또는 SetDefaultMouseSpeed를 사용하면 속도를 줄일 수 있습니다 (기본 SendEvent 모드 전용).

어떤 어플리케이션은 마우스 휠에 대하여 1보다 큰 ClickCount를 준수하지 않습니다. 그런 경우는 다음 예제와 같이 Loop(회돌이)를 사용하십시오:

Loop, 5
    MouseClick, WheelUp

BlockInput 명령어를 사용하면 사용자가 물리적으로 마우스를 움직여도 마우스 명령어로 흉내낸 마우스 이벤트가 방해 받지 않습니다. 그렇지만, 일반적으로 SendInput/Play 모드에는 불필요합니다. 왜냐하면 자동으로 사용자의 물리적 마우스 이동을 다음으로 연기하기 때문입니다.

마우스의 클릭 다운과 클릭 업 사이에 자동으로 지연 시간이 삽입됩니다 (단, SendInput 모드와 마우스 휠 회전은 예외). 지연 시간의 길이를 변경하려면 SetMouseDelay를 사용하십시오.

관련 항목

CoordMode, SendMode, SetDefaultMouseSpeed, SetMouseDelay, Click, MouseClickDrag, MouseGetPos, MouseMove, ControlClick, BlockInput

예제

; 현재 마우스 위치에 더블클릭 합니다:
MouseClick, left
MouseClick, left

; 위와 동일합니다:
MouseClick, left, , , 2

; 지정된 좌표로 이동한 다음 우클릭합니다:
MouseClick, right, 200, 300

; 다음은 마우스 휠을 돌리는 두 개의 핫키입니다:
#up::MouseClick, WheelUp, , , 2  ; 두 눈금 만큼 돌립니다.
#down::MouseClick, WheelDown, , , 2


MouseClickDrag

지정된 마우스 버튼을 클릭하고 누릅니다. 마우스를 목표 좌표로 이동시킨 다음, 버튼을 놓습니다.

MouseClickDrag, WhichButton, X1, Y1, X2, Y2 [, Speed, R]

매개변수

WhichButton

클릭할 버튼: Left, Right, Middle (또는 각각 앞 글자 하나). X1은 네 번째 버튼, X2는 다섯 번째 버튼입니다. 예를 들어: MouseClickDrag, X1, ....

사용자가 제어판을 통하여 마우스 좌우 버튼을 바꾼 경우 자동으로 보상하려면, 대신에 Click 명령어를 사용하십시오.

X1, Y1

끌기를 시작할 위치의 x/y 좌표, 표현식 가능 (마우스는 끌기가 시작되기 바로 전 이 좌표로 이동합니다). 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾼 경우는 예외입니다. 생략하면, 마우스의 현재 위치가 사용됩니다.

X2, Y2

마우스를 끌어다 놓을 x/y 좌표 (즉, 버튼이 눌려 있는 동안), 표현식. 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표를 바꾼 경우는 예외입니다.

Speed

마우스를 이동할 속도. 범위는 0 (가장 빠름)부터 100 (가장 느림)까지입니다. 표현식 가능. 주의: 속도가 0이면 마우스를 순간 이동시킵니다. 생략하면, 기본 속도 (SetDefaultMouseSpeed가 설정하거나 그렇지 않으면 2)가 사용됩니다.

Speed는 SendInput/Play 모드에서 무시됩니다; 이 모드에서 마우스는 순간 이동합니다 (물론 SetMouseDelay에는 SendPlay에 적용할 모드가 있습니다). 시각적으로 마우스를 더 느리게 이동시키려면 -- 예를 들어 청중을 위한 데모를 수행하는 스크립트라면 -- (선택적으로 BlockInput과 함께) SendEvent {Click 100, 200} 또는 SendMode Event를 사용하십시오.

R

이 매개변수가 기호 R이면, X1과 Y1 좌표는 현재 마우스 위치로부터의 상태거리(offsets)로 취급됩니다. 다른 말로, 커서는 현재 위치로부터 X1 픽셀 만큼 오른쪽으로 (음수이면 왼쪽으로) 그리고 Y1 픽셀 만큼 아래로 (음수이면 위로) 이동합니다.

비슷하게, X2와 Y2 좌표는 X1과 Y1 좌표로부터의 상대거리로 취급됩니다. 예를 들어, 다음은 먼저 그의 시작 위치로부터 커서를 아래로 오른쪽으로 5 픽셀 만큼 이동시킵니다. 그 다음에 그 위치로부터 마우스를 아래로 그리고 오른쪽으로 10 픽셀 만큼 끌어 놓습니다: MouseClickDrag, Left, 5, 5, 10, 10, , R.

논평

이 명령어는 SendMode에 의하여 설정된 전송 방법을 사용합니다.

끌기는 다양한 Send 명령어들을 통해서 달성할 수도 있습니다. 이 편이 더 유연합니다. 왜냐하면 명령어 이름을 통하여 모드를 지정할 수 있기 때문입니다. 예를 들어:

SendEvent {Click 6, 52, down}{click 45, 52, up}

위의 방법의 또다른 장점은 MouseClickDrag와 다르게, 사용자가 제어판을 통하여 마우스 좌우 버튼을 바꾼 경우에도 자동으로 보상해 준다는 것입니다.

SendPlay 모드는 다른 모드에 비해 더 광범위한 게임에 성공적으로 마우스 이벤트를 발생시킬 수 있습니다. 그렇지만, SendPlay를 통하여 끄는 것은 예를 들어 WordPad와 Metapad 같이 RichEdit 콘트롤에 작동하지 않을 가능성이 높습니다 (그리고 다른 것들도 마찬가지입니다).

어떤 어플리케이션과ㅏ 게임은 마우스가 너무 빨리 이동하면 추적하지 못할 수 있습니다. speed 매개변수나 SetDefaultMouseSpeed를 사용하면 그 속도를 줄일 수 있습니다 (기본 SendEvent 모드 전용).

BlockInput 명령어를 사용하면 사용자의 물리적 마우스 움직임에 마우스 명령어로 발생된 마우스 이벤트들이 방해 받지 않습니다. 그렇지만, 일반적으로 SendInput/Play 모드에는 불필요합니다. 왜냐하면 자동으로 사용자의 물리적 마우스 움직임을 뒤로 연기시켜 주기 때문입니다.

마우스의 클릭 다운과 클릭 업 사이에 자동 시간 지연이 있습니다 (SendInput 모드는 예외). 이 지연은 또 마우스가 끌기 연산을 하는 동안 이동 사이에서도 일어납니다. 지연 시간의 길이를 변경하려면 SetMouseDelay를 사용하십시오.

관련 항목

CoordMode, SendMode, SetDefaultMouseSpeed, SetMouseDelay, Click, MouseClick, MouseGetPos, MouseMove, BlockInput

예제

MouseClickDrag, left, 0, 200, 600, 400

; 다음 예제는 MS Paint를 열어 작은 집을 그립니다:
Run, mspaint.exe
WinWaitActive, ahk_class MSPaintApp,, 2
if ErrorLevel
    return
MouseClickDrag, L, 150, 250, 150, 150
MouseClickDrag, L, 150, 150, 200, 100
MouseClickDrag, L, 200, 100, 250, 150
MouseClickDrag, L, 250, 150, 150, 150
MouseClickDrag, L, 150, 150, 250, 250
MouseClickDrag, L, 250, 250, 250, 150
MouseClickDrag, L, 250, 150, 150, 250
MouseClickDrag, L, 150, 250, 250, 250


MouseGetPos

마우스 커서의 현재 위치를 열람합니다. 선택적으로 어느 창과 콘트롤에 마우스 커서가 올라가 있는지 열람합니다.

MouseGetPos, [OutputVarX, OutputVarY, OutputVarWin, OutputVarControl, 1|2|3]

매개변수

OutputVarX/Y

X와 Y 좌표를 열람할 변수의 이름. 열람된 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 화면 좌표를 바꾼 경우는 예외입니다.

OutputVarWin

이 선택적인 매개변수는 마우스 커서 아래에 있는 창의 유일한 ID 번호를 저장할 변수의 이름입니다. 창을 알아낼 수 없으면, 이 변수는 비워집니다.

창은 활성화되지 않아도 탐지됩니다. 숨은 창은 탐지할 수 없습니다.

OutputVarControl

이 선태적인 매개변수는 마우스 커서 아래에 있는 콘트롤의 이름(ClassNN)을 저장할 변수의 이름입니다. 콘트롤을 결정할 수 없으면, 이 변수는 비워집니다.

콘트롤의 이름은 언제나 Window Spy로 보여지는 이름과 일치해야 합니다. 최소 v1.0.14+이상 요구. 그렇지만 Window Spy와 다르게, 마우스 커서 아래의 창이 활성화되어 있지 않아도 콘트롤을 탐지할 수 있습니다.

1|2|3

생략하면, 기본 값은 0입니다. 그렇지 않으면, 다음 숫자 중 하나를 지정하십시오:

1: OutputVarControl을 알아 내는 데 더 간단한 방법을 사용합니다. 이 방법은 SysEdit이나 TextPad 같은 다중 문서 인터페이스(Multiple Document Interface (MDI)) 어플리케이션에서 활성/최상위 자손 창을 올바르게 열람합니다. 그렇지만, 다른 목적으로는 정밀하지 못합니다. 예를 들어 GroupBox 콘트롤 안의 콘트롤은 제대로 탐지하지 못합니다.

2 [v1.0.43.06+]: 콘트롤의 ClassNN이 아니라 콘트롤의 HWND를 OutputVarControl에 저장합니다.

3 [v1.0.43.06+]: 위의 1과 2의 조합.

논평

상응하는 정보가 필요하지 않을 경우 출력 변수는 모두 생략할 수 있습니다.

관련 항목

CoordMode, WinGet, SetDefaultMouseSpeed, Click

예제

MouseGetPos, xpos, ypos
Msgbox, The cursor is at X%xpos% Y%ypos%.

; 이 예제에서 마우스를 이동시켜서 현재 마우스 아래에 있는
; 창의 제목을 볼 수 있습니다:
#Persistent
SetTimer, WatchCursor, 100
return

WatchCursor:
MouseGetPos, , , id, control
WinGetTitle, title, ahk_id %id%
WinGetClass, class, ahk_id %id%
ToolTip, ahk_id %id%`nahk_class %class%`n%title%`nControl: %control%
return


MouseMove

마우스 커서를 이동시킵니다.

MouseMove, X, Y [, Speed, R]

매개변수

X, Y

마우스를 이동할 x/y 좌표, 표현식 가능. 조표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾸었다면 예외입니다.

Speed

마우스를 이동할 속도. 범위는 0 (가장 빠름)부터 100 (가장 느림)까지. 표현식 가능. 주의: 속도가 0이면 마우스는 순간 이동합니다. 생략하면, 기본 속도가 (SetDefaultMouseSpeed가 설정한 또는 2) 사용됩니다.

Speed는 SendInput/Play 모드에 대해서는 무시됩니다; 마우스를 순간 이동시킵니다 (그렇지만 SetMouseDelay는 SendPlay에 적용할 모드가 있습니다). 시각적으로 마우스를 더 느리게 이동시키려면 -- 청중을 위해 데모를 수행하는 스크립트라면 -- SendEvent {Click 100, 200} 또는 SendMode Event (선택적으로 BlockInput과 함께) 사용하십시오.

R

이 매개변수가 기호 R이면, X와 Y 좌표는 현재 마우스 위치로부터의 상대거리(offsets)로 취급됩니다. 다른 말로, 커서는 거의 현재 위치 X 픽셀 만큼 오르쪽으로 (음수이면 왼쪽으로) 그리고 Y 픽셀 만큼 아래쪽으로 (음수이면 위로) 이동합니다.

논평

이 명령어는 SendMode가 설정한 전송 방법을 사용합니다.

SendPlay 모드는 다른 모드보다 더 광범위한 게임에서 성공적으로 마우스 이벤트를 발생시킬 수 있습니다. 게다가, 어떤 어플리케이션과 게임은 마우스가 너무 빠르게 움직인다면 추적하는 데 어려움이 있을 수 있습니다. speed 매개변수나 SetDefaultMouseSpeed를 사용하면 그 속도를 줄일 수 있습니다 (기본 SendEvent 모드 전용).

BlockInput 명령어을 사용하면 사용자의 물리적인 마우스 활동 때문에 마우스 명령어로 생산한 흉내낸 마우스 이벤트가 어지럽게 되는 것을 막을 수 있습니다. 그렇지만, 이것은 보통 SendInput/Play 모드에는 불필요합니다. 왜냐하면 자동으로 사용자의 물리적 마우스 활동을 나중으로 연기하기 때문입니다.

마우스의 매 움직임마다 자동으로 지연 시간이 삽입됩니다 (SendInput 모드는 예외). SetMouseDelay를 사용하면 지연 시간의 길이를 변경할 수 있습니다.

다음은 마우스 커서를 이동하는 다른 방법입니다. 어떤 다중-모니터 구성에서는 더 잘 작동할 수도 있습니다:

DllCall("SetCursorPos", int, 100, int, 400)  ; 첫 번째 숫자는 X-좌표이고 두 번째 좌표는 Y입니다 (화면에 상대적입니다).

관련하여 말씀드리면, 마우스 커서는 커서-숨기기 예제와 같이 임시로 숨을 수 있습니다.

관련 항목

CoordMode, SendMode, SetDefaultMouseSpeed, SetMouseDelay, Click, MouseClick, MouseClickDrag, MouseGetPos, BlockInput

예제

; 마우스를 새 위치로 이동합니다:
MouseMove, 200, 100

; 마우스를 천천히 (속도 50 vs. 2) 현재 위치로부터
; 20 픽셀만큼 오른쪽으로 그리고 30 픽셀 만큼 아래쪽으로 이동시킵니다:
MouseMove, 20, 30, 50, R


MsgBox

지정된 텍스트를 작은 창에 보여줍니다. 그 안에 하나 이상의 버튼이 들어 있습니다 (예를 들어 Yes 그리고 No).

MsgBox, Text
MsgBox [, Options, Title, Text, Timeout]

매개변수

Text

모든 매개변수를 생략하면, MsgBox는 텍스트 "계속하려면 OK를 누르십시오."를 보여줍니다. 그렇지 않으면, 이 매개변수는 사용자에게 무엇을 해야 하는지 또는 정보를 제공하기 위해 메시지 박스 안에 보여주는 텍스트입니다.

피신 연속열을 사용하면 특수 문자를 표기할 수 있습니다. 예를 들어, `n은 라인피드 문자를 나타냅니다. 이 문자는 현재 줄을 끝내고 새 줄을 시작합니다. 그리하여, text1`n`ntext2는 text1과 text2 사이에 빈 줄을 만듭니다.

Text가 길면, 계속 섹션을 수단으로 여러 짧은 줄들로 가를 수 있습니다. 이렇게 하면 가독성과 유지관리성이 개선됩니다.

Options

메시지 박스의 종류와 가능한 버튼 조합을 나타냅니다. 비어 있거나 생략하면, 기본값은 0입니다. 허용되는 값들은 아래의 표를 참조하십시오.

이 매개변수는 기호 그대로의 숫자이거나 (v1.1.06+) 또는 % Options와 같은 강제 표현식입니다. 비어 있지 않은 다른 값들은 이 매개변수로 인지하지 않고, 단일-매개변수의 Text의 일부로 인지합니다.

Title

메시지 박스 창의 제목. 생략하거나 비어 있으면, 기본값은 스크립트의 (경로 없이) 이름입니다.

Timeout

(선택적) 초단위 시간 제한, 안에 십진 소수점이 들어 있지만 기본적으로 표현식이 아닙니다. v1.1.06+에서, % mins*60와 같은 강제 표현식일 수 있습니다.

값이 2147483 (24.8 일)을 넘어서면, 2147483이 설정됩니다. 시간제한이 경과한 후에 메시지 박스는 자동으로 닫힙니다. 그리고 IfMsgBox 명령어가 그 값 TIMEOUT을 보게 됩니다.

알려진 한계: MsgBox에 오직 OK 버튼만 있을 경우, 또다른 쓰레드에 의해 자신의 쓰레드가 인터럽트 되어 있는 동안에 MsgBox 시간제한이 끝나면 IfMsgBox는 OK 버튼이 눌렸다고 생각합니다.

Options 매개변수는 다음 값을 조합(합)으로 구성됩니다.

기능 | 십진수 값 | 십육진수 값
OK (즉, OK 버튼이 보여집니다) | 0 | 0x0
OK/Cancel | 1 | 0x1
Abort/Retry/Ignore | 2 | 0x2
Yes/No/Cancel | 3 | 0x3
Yes/No | 4 | 0x4
Retry/Cancel | 5 | 0x5
Cancel/Try Again/Continue | 6 | 0x6
도움말 버튼 추기 (아래 논평 참조) | 16384 | 0x4000
손 아이콘 (중지/에러) | 16 | 0x10
질문 아이콘 | 32 | 0x20
감탄 아이콘 | 48 | 0x30
별표 아이콘 (정보) | 64 | 0x40
2nd 버튼이 기본값 | 256 | 0x100
3rd 버튼이 기본값 | 512 | 0x200
System Modal (항상 위) | 4096 | 0x1000
Task Modal | 8192 | 0x2000
항상 위 (스타일 WS_EX_TOPMOST) (시스템 모델과 같지만 제목 바 아이콘이 생략됩니다) | 262144 | 0x40000
텍스트를 우측 정렬 | 524288 | 0x80000
Hebrew/Arabic에 대하여 오른쪽에서 왼쪽으로 읽음 | 1048576 | 0x100000

논평

위의 표에서 MsgBox에 보여줄 값들을 더해서 사용됩니다. 예를 들어, 기본 버튼을 Yes 대신에 No로 하여 Yes/No 박스를 지정하려면, Options 값은 256+4 (260)가 됩니다. 십육진수로 0x100+0x4 (0x104)가 됩니다.

MsgBox는 똑똑하게 쉼표를 처리합니다. 그래서 보통 Text 매개변수 안에 있는 쉼표를 피신 시킬 필요가 없습니다.

최근의 MsgBox에서 사용자가 어느 버튼을 눌렀는지 알아 내려면, IfMsgBox 명령어를 사용하십시오. 예를 들어:

MsgBox, 4,, 계속 하시겠습니까? (Yes 또는 No를 누르십시오)
IfMsgBox Yes
    MsgBox Yes를 누르셨습니다.
else
    MsgBox No를 누르셨습니다.

버튼의 이름들은 다음 예제를 따라 재단할 수 있습니다.

정보: MsgBox 창이 활성화되어 있는 동안 Control-C를 누르면 그의 텍스트를 클립보드로 복사합니다. 이것은 AutoHotkey가 생산한 MsgBox는 물론이고 모든 MsgBox에 적용됩니다.

GUI 창과 함께 MsgBox 사용하기: GUI 창은 Gui +OwnDialogs를 사용하면 모달 MsgBox를 보여줄 수 있습니다. 모달 MsgBox에서 사용자는 MsgBox를 끝낼 때까지 GUI 창과 상호 작용할 수 없습니다. 그런 경우, 위의 테이블에 있는 System Modal 또는 Task Modal 옵션을 지정할 필요가 없습니다.

Gui +OwnDialogs가 겨져 있지 않으면, Task Modal 옵션(8192)을 사용하면 사용자가 MsgBox를 끝낼 때까지 스크립트의 모든 창을 끌 수 있습니다.

도움말 버튼: 도움말 버튼 옵션 (83)이 Options에 존재하면, 도움말 버튼을 클릭해도 아무 효과도 없습니다. 단, 다음 두 조건이 모두 참인 경우는 예외입니다:

  1. Gui +OwnDialogs를 수단으로 MsgBox를 GUI 창이 소유합니다.
  2. 스크립트가 WM_HELP 메시지 (0x53)를 감시하고 있습니다. 예를 들어: OnMessage(0x53, "WM_HELP"). WM_HELP() 함수가 호출될 때, 사용자를 안내 할 수 있습니다. 예를 들어 또다른 창이나 MsgBox를 보여줍니다.

닫기 버튼 (MsgBox의 제목 바에 있는): MsgBox 창은 운영 체제의 내장 특징이기 때문에 , 그의 X 버튼은 어떤 버튼이 존재할 경우에만 활성 화됩니다. 오직 OK 버튼만 있다면, X 버튼을 클릭하더라도 OK를 클릭한 것과 같습니다. 그렇지 않으면, X 버튼은 비활성화 됩니다. 단, Cancel 버튼이 있다면 예외인데, 이 경우 X를 클릭한 것은 Cancel를 누른 것과 같습니다.

관련 항목

IfMsgBox, InputBox, FileSelectFile, FileSelectFolder, ToolTip, GUI

예제

MsgBox 이것은 매개변수가 한 개인 방법입니다. 쉼표 (,)는 피신시킬 필요가 없습니다.
MsgBox, 4, , 이것은 매개변수가 세 개인 방법입니다. 쉼표 (,)는 피신 시킬 필요가 없습니다.
MsgBox, 4, , 계속하시겠습니까? (YES 또는 NO를 누릅니다)
IfMsgBox No
    return
MsgBox, 4, , 매개변수가 네 개인 방법: 이 MsgBox는 시간제한이 5초입니다. 계속하시겠습니까?, 5
IfMsgBox Timeout
    MsgBox 5 초 안에 YES 또는 NO를 누르지 않았습니다.
else IfMsgBox No
    return

; 매개변수 앞에 "% "를 배치하면, 표현식이 됩니다. 다음 예제에서,
; 계산이 수행되고, 의시-배열 원소에 접근합니다. 그리고 함수를 호출합니다.
; 이 모든 항목들은 "." 연산자로 결합되어 하나의 문자열을 형성해 MsgBox에 보여집니다:
MsgBox % "New width for object #" . A_Index . " is: " . RestrictWidth(ObjectWidth%A_Index% * ScalingFactor)

; 다음 예제는 MsgBox가 초점을 훔치고 있다고 사용자에게 경고합니다 (이 경우 사용자가 타자하고 있음).
SplashTextOn,,, MsgBox가 곧 사라집니다.
Sleep 3000
SplashTextOff
MsgBox 백업이 완료되었습니다.


NumGet

지정된 주소+오프셋에 저장된 이진 숫자를 돌려줍니다.

Number := NumGet(VarOrAddress [, Offset = 0][, Type = "UPtr"])

매개변수

VarOrAddress

메모리 주소 또는 변수. VarOrAddress가 MyVar 같은 변수 이면, 그 변수의 문자열 버퍼의 주소가 사용됩니다. 이것은 보통 &MyVar를 건네는 것과 동등하지만, "&"를 생략하면 더 수행성능이 좋고 목표 주소 + 오프셋이 유효하다는 확신을 할 수 있습니다.

변수에 목표 주소가 담겨 있으면 변수 참조를 건네지 마십시오; 그 경우, MyVar+0와 같은 표현식을 건네십시오.

Offset

상대거리(오프셋) - 바이트 단위 - VarOrAddress에 더해져서 목표 주소를 결정합니다.

Type

다음 문자열 중 하나 (생략하면 UPtr이 기본값입니다):
UInt, Int, Int64, Short, UShort, Char, UChar, Double, Float, Ptr 또는 UPtr

DllCall와 다르게, 이것들은 문자 그대로의 문자열로 사용될 때 반드시 따옴표로 둘러 싸야 합니다.

자세한 것은 DllCall 유형을 참조하십시오.

반환 값

목표 주소가 유효하지 않으면, 빈 문자열이 돌아옵니다. 그렇지만, 어떤 무효 주소는 그런 식으로 탐지할 수 없습니다. 그래서 예상치 못한 행위를 야기할 수 있습니다.

그렇지 않으면, 지정된 주소+오프셋에 있는 숫자가 반환됩니다.

총평

세 개의 매개변수만 존재하면, 세 번째 매개변수는 Offset 또는 Type일 수 있습니다. 예를 들어, NumPut(x, var, "int")는 유효합니다.

관련 항목

NumPut, DllCall, VarSetCapacity


NumPut

지정된 주소 + 오프셋에 이진 형식으로 숫자를 저장합니다.

NumPut(Number, VarOrAddress [, Offset = 0][, Type = "UPtr"])

매개변수

Number

저장할 숫자.

VarOrAddress

메모리 주소 또는 변수. VarOrAddress가 MyVar와 같은 변수이면, 변수의 문자열 버퍼의 주소가 사용됩니다. 이것은 보통 &MyVar를 건네는 것과 동등하지만, "&"를 생략하면 수행성능이 향상되고 목표 주소 + 오프셋이 유효하다고 확신할 수 있습니다.

변수에 목표 주소가 들어 있다면 변수 참조를 건네지 마십시오; 그럴 경우, MyVar+0와 같은 표현식을 건네십시오.

Offset

목표 주소를 결정하기 위해 VarOrAddress에 더해지는 - 바이트 단위 - 오프셋.

Type

다음 문자열 중 하나 (생략하면 UPtr이 기본값):
UInt, Int, Int64, Short, UShort, Char, UChar, Double, Float, Ptr or UPtr

DllCall과 다르게, 이것들은 기호 문자열로 사용될 때 반드시 따옴표로 둘러야 합니다.

자세한 것은 DllCall Types를 참조하십시오.

반환 값

목표 주소가 유효하지 않으면, 빈 문자열이 반환됩니다. 그렇지만, 어떤 무효한 주소는 그대로 탐지할 수 없으므로, 예상치 못한 행위를 야기할 수 있습니다.

그렇지 않으면, 방금 씌여진 항목의 오른쪽 주소가 반환됩니다. 이것은 예를 들어 DllCall에 사용할 구조체에서 다른 유형의 숫자를 연속적으로 쓸 때 보통 사용됩니다.

총평

정수가 너무 커서 지정된 Type에 맞지 않으면, 제일 중요한 비트(MSB)가 무시됩니다; 예, NumPut(257, var, 0, "Char")는 숫자 1을 저장합니다.

매개변수가 세 개만 있으면, 세 번째 매개변수는 Offset 또는 Type이 될 수 있습니다. 예를 들어, NumPut(x, var, "int")는 유효합니다.

관련 항목

NumGet, DllCall, VarSetCapacity


ObjAddRef() / ObjRelease()

ObjAddRef() / ObjRelease() [AHK_L 53+]

객체의 참조 횟수를 줄이거나 늘립니다.

ObjAddRef(Ptr)
ObjRelease(Ptr)

매개변수

Ptr

관리되지 않는 객체 포인터 또는 COM 인터페이스 포인터.

반환 값

이 함수들은 새로운 참조 횟수를 돌려줍니다. 이 값은 디버깅 목적으로만 사용해야 합니다.

관련 항목

다음 글들은 COM에 적용될 때의 참조 횟수를 다루고 있지만, 일반적으로 오토핫키 객체에도 적용되는 중요한 개념과 규칙을 언급합니다: IUnknown::AddRef, IUnknown::Release, 참조 횟수 규칙.

예제

ComObjConnect를 참조하십시오.

obj := Object()

; 다음 두 줄은 동등합니다:
ptr1 := Object(obj)
ptr2 := ObjectToPointer(obj)

ObjectToPointer(obj) {
    if !IsObject(obj)
        return ""
    ptr := &obj
    ObjAddRef(ptr)
    return ptr
}

; Object() 또는 ObjectToPointer()를 통하여 열람된 포인터는 각각 수작업으로 풀어주어야 합니다.
; 그래야 객체가 영원히 해제되며 사용된 메모리도 돌려줄 수 있습니다.
ObjRelease(ptr2)
ObjRelease(ptr1)


ObjBindMethod()

ObjBindMethod() [v1.1.20+]

주어진 객체의 메쏘드를 호출하는 BoundFunc object를 생성합니다.

BoundFunc := ObjBindMethod(Obj, Method, Params)

매개변수

Obj

객체.

Method

메쏘드 이름.

Params

매개변수 개수.

논평

자세한 것은 BoundFunc 객체를 참조하십시오.


OnClipboardChange

어플리케이션이 (스크립트도 마찬가지로) 클립보드의 내용을 변경할 때마다 (존재한다면) 이름이 OnClipboardChange인 라벨이 자동으로 기동됩니다. 이 라벨은 또 스크립트가 처음 시작할 때 한 번 실행됩니다.

내장 변수 A_EventInfo에 다음과 같이 담겨 있습니다:
0 현재 클립보드가 비어 있습니다;
1 텍스트로 표현이 가능한 것이 들어 있습니다 (여기에는 탐색 창으로부터 복사된 파일이 포함됩니다);
2 그림과 같이 전혀 텍스트가 아닌 것이 들어 있습니다.

다음 예제는 작동하는 스크립트입니다. 실행될 때마다, 간략하게 각 클립보드의 변경에 대하여 툴팁을 보여줍니다.

#Persistent
return

OnClipboardChange:
ToolTip Clipboard data type: %A_EventInfo%
Sleep 1000
ToolTip  ; Turn off the tip.
return

OnClipboardChange() [v1.1.20+]

클립보드의 내용이 변경될 때마다 실행될 함수 또는 함수 객체를 등록합니다.

OnClipboardChange(Func [, AddRemove])

매개변수

Func

호출할 함수 이름 또는 함수 객체. 함수의 매개변수와 반환 값은 아래에 기술합니다.

AddRemove

다음 값 중 하나:
1 (기본값): 이전에 등록된 함수 다음에 이 함수를 호출합니다.
-1: 이전에 등록된 함수 보다 먼저 이 함수를 호출합니다.
0: 이 함수를 호출하지 않습니다.

OnClipboardChange 라벨이 존재하면, 언제나 먼저 호출됩니다.

Func

FunctionName(Type)
Type

다음 값 중 하나가 담겨 있습니다:
0 클립보드가 현재 비어 있습니다;
1 텍스트로 표현할 수 있는 것이 들어 있습니다 (여기에는 탐색 창으로부터 복사된 파일이 포함됩니다);
2 그림과 같이 전혀 텍스트가 아닌 것이 들어 있습니다.

Return Value

이것이 마지막 함수 또는 유일한 OnClipboardChange 함수라면 반환값은 무시됩니다. 그렇지 않으면, 함수는 0 아닌 값을 돌려주어 연이어서 다른 함수가 호출되지 못하도록 막습니다.

예제

다음 예제는 위의 예제와 동등합니다. 그러나 이 함수는 스크립트가 처음 실행될 때 호출되지 않습니다; 오직 클립보드의 내용이 변경될 때만 호출됩니다.

#Persistent
OnClipboardChange("ClipChanged")
return

ClipChanged(Type) {
    ToolTip Clipboard data type: %Type%
    Sleep 1000
    ToolTip  ; Turn off the tip.
}

논평

OnClipboardChange 라벨 또는 함수가 이미 실행되고 있는 동안에 클립보드가 변경되면, 그 고지 이벤트는 폐기됩니다. 이것이 바람직하지 않다면, Critical을 라벨의 첫 줄에 지정하십시오. 그렇지만, 이것은 또 OnClipboardChange 쓰레드가 실행 중인 동안에 일어나는 다른 쓰레드를 (예를 들어 핫키 누름을) 버퍼처리/연기합니다.

스크립트 자체가 클립보드를 바꾸면, 그의 OnClipboardChange 라벨 또는 함수는 전형적으로 즉시 실행되지 않습니다; 즉, 클립보드를 변경한 명령어 바로 아래의 명령어들이 먼저 실행될 가능성이 높습니다. 이 라벨이나 함수를 강제로 즉시 실행하려면, 클립보드를 변경한 후에 Sleep 20와 같이 짧게 지연하십시오.

관련 항목

Clipboard, OnExit, OnMessage(), RegisterCallback()


OnExit

스크립트가 종료할 때 자동으로 실행할 서브루틴 또는 함수를 지정합니다.

OnExit [, Label]
OnExit(Func [, AddRemove])  ; Requires [v1.1.20+]

매개변수

Label

생략하면, 이전에 등록된 라벨이 등록 해제됩니다. 그렇지 않으면 스크립트가 어떤 방식으로든 종료할 때 그의 내용이 (새 쓰레드로) 실행될 라벨의 이름을 지정하십시오.

Func

스크립트가 종료할 때 호출할 함수 이름 또는 함수 객체. 이 함수는 선택적으로 아래와 같이 매개변수를 정의할 수 있습니다. OnExit 함수가 0 아닌 정수 값을 돌려 주면, 스크립트는 종료하지 않습니다. 그렇지 않으면, 스크립트는 모든 등록된 함수를 호출한 후에 종료합니다.

ExitFunc(ExitReason, ExitCode)
AddRemove

다음 값 중 하나:
1 (기본값): 이전에 등록된 함수들 다음에 이 함수를 호출합니다.
-1: 이전에 등록된 함수보다 먼저 이 함수를 호출합니다.
0: 함수를 호출하지 않습니다.

라벨(서브루틴)이 등록되어 있으면, 그것이 언제나 먼저 호출됩니다.

논평

중요: 스크립트를 종료하는 대신에 지정된 서브루틴이 호출되기 때문에, 그 서브루틴은 종료가 필요하면 반드시 ExitApp 명령어를 사용해야 합니다. [v1.1.20+]: 새 스크립트는 서브루틴 대신에 함수를 사용해야 합니다 -- 이렇게 하면 우발적으로 종료가 불가능한 스크립트를 만들어 낼 위험을 줄여 줍니다. 그리고 Exit 또는 ExitApp에 건넨 종료 코드가 보존된다는 확신을 할 수 있습니다.

[v1.1.20+]: 얼마든지 OnExit 함수를 등록할 수 있습니다. 라벨 (서브루틴)도 등록되어 있다면, 함수는 서브루틴이 ExitApp를 호출한 뒤에 호출됩니다. OnExit 함수는 보통 ExitApp를 호출하면 안됩니다; 그럴 경우, 스크립트는 즉시 종료합니다.

어떤 수단으로든 스크립트가 종료할 때 OnExit 서브루틴이 호출됩니다 (단, "End Task"와 같은 것으로 종료되는 경우는 예외입니다). 또한 #SingleInstance 그리고 Reload 명령어가 이전이 실체를 종료하도록 요구할 때마다 호출됩니다.

스크립트는 OnMessage(0x11, "WM_QUERYENDSESSION")를 통하여 시스템 셧다운이나 로그오프를 탐지할 수 있고 선택적으로 취소할 수도 있습니다.

OnExit 쓰레드는 #MaxThreads를 준수하지 않습니다. (필요하면 언제든지 기동합니다). 게다가, 실행 중인 동안, 다른 쓰레드로 인터럽트 할 수 없습니다. 여기에는 핫키, 맞춤 메뉴 항목, 그리고 타이머 서브루틴이 포함됩니다. 그렇지만, 사용자가 메인 메뉴나 트레이 메뉴로부터 Exit을 선택했다면 인터럽트 됩니다 (그리고 스크립트는 종료합니다). 그렇지 않으면 스크립트에 Reload 또는 #SingleInstance 결과로 종료하도록 요구합니다. 이 때문에 OnExit 서브루틴은 빨리 끝나도록 설계해야 합니다. 단, 사용자가 무슨 일이 진행되는지 알고 있는 경우는 예외입니다.

OnExit 쓰레드가 실행시간 에러 같은 실패 조건을 만나면, 스크립트는 종료합니다. 이 때문에 결함이 있는 OnExit 서브루틴은 스크립트를 종료하지 못하게 막을 수 없습니다.

Exit 또는 ExitApp 명령어 때문에, 종료 코드를 지정한 OnExit 서브루틴이 기동되면, v1.1.19 이전에서 그 코드는 무시되고 더 이상 사용할 수 없습니다. [v1.1.20+]에서 최초의 종료 코드가 사용됩니다. 단, ExitApp 호출하여 새 종료 코드로 오버라이드한 경우는 예외입니다.

OnExit 서브루틴이 종료 시도로 호출될 때마다, SendMode와 같은 설정에 대한 기본 값들을 가지고 새롭게 시작합니다. 이런 기본값들은 자동-실행 섹션에서 바꿀 수 있습니다.

내장 함수 A_ExitReason는 비어 있습니다. 단, OnExit 서브루틴이 현재 실행 중이거나 이전이 종료 시도로 인해 적어도 한 번 호출된 경우는 예외입니다. 비어 있지 않으면, 다음 단어 중 하나입니다:

Logoff | 사용자가 로그오프 중입니다.
Shutdown | 예를 들어 Shutdown 명령어로 시스템이 닫히고 있는 중이거나 재시작 중입니다.
Close | 스크립트에 WM_CLOSE 또는 WM_QUIT 메시지가 전송되었습니다. 스크립트에 심각한 에러가 있습니다. 또는 다른 어떤 방법으로 닫혔습니다. 이 모든 것이 비정상적이지만, WM_CLOSE는 스크립트의 메인 창에 사용된 WinClose에 의해 야기될 수도 있습니다. 이를 방지하려면, 메인 창을 Send, !{F4}로 취소하십시오.
Error | 실행시간 에러가 핫키가 없고 영속적이 아닌 스크립트에 일어났습니다. 실행시간 에러의 예는 Run/RunWait가 지정된 프로그램이나 문서를 기동시키지 못하는 경우입니다.
Menu | 사용자가 메인 창의 메뉴 또는 표준 트레이 메뉴로부터 로부터 Exit를 선택했습니다.
Exit | Exit 또는 ExitApp 명령어가 사용되었습니다 (맞춤 메뉴 항목 포함).
Reload | 스크립트가Reload 명령어나 메뉴 항목을 통하여 재적재 중입니다.
Single | #SingleInstance의 결과로 스크립트가 자신의 새 실체로 교체 중입니다.

관련 항목

OnMessage(), RegisterCallback(), OnClipboardChange, ExitApp, Shutdown, #Persistent, Threads, Gosub, Return, Menu

예제

다음 예제는 #Persistent를 사용하여 스크립트가 자동으로 종료하는 것을 막습니다. 스크립트를 실행한 후에, 트레이 아이콘을 우클릭하고 Exit을 클릭해 보면 OnExit 또는 함수가 작동하는지 검증해 볼 수 있습니다. 그 다음 "Yes"를 클릭하면 스크립트가 종료하고 "No"를 클릭하면 실행을 그대로 유지합니다.

#Persistent
OnExit, ExitSub
return

ExitSub:
if A_ExitReason not in Logoff,Shutdown  ; 이 줄에서 쉼표 둘레에 스페이스를 피하십시오.
{
    MsgBox, 4, , 종료하고 싶습니까?
    IfMsgBox, No
        return
}
ExitApp  ; OnExit 서브루틴이 있는 스크립트는 종료하지 않습니다. 단, 서브루틴이 ExitApp를 사용하는 경우는 예외입니다.
#Persistent

; 종료시에 호출될 함수를 등록합니다:
OnExit("ExitFunc")

; 종료시에 호출돌 객체를 등록합니다:
OnExit(ObjBindMethod(MyObject, "Exiting"))

ExitFunc(ExitReason, ExitCode)
{
    if ExitReason not in Logoff,Shutdown
    {
        MsgBox, 4, , 끝내고 싶습니까?
        IfMsgBox, No
            return 1  ; OnExit 함수는 종료를 막기 위해 반드시 0 아닌 값을 돌려주어야 합니다.
    }
    ; ExitApp를 호출하지 마십시오 -- 그러면 다른 OnExit 함수가 호출되지 못합니다.
}

class MyObject
{
    Exiting()
    {
        MsgBox, 종료하기 전에 MyObject가 청소 중입니다...
        /*
        this.SayGoodbye()
        this.CloseNetworkConnections()
        */
    }
}


OnMessage()

스크립트가 지정된 메시지를 받을 때 자동으로 호출할 함수 또는 함수 객체를 지정합니다 .

OnMessage(MsgNumber [, Function, MaxThreads])

매개변수

MsgNumber

감시 또는 질의할 메시지 번호, 범위는 0부터 4294967295 (0xFFFFFFFF)까지. 시스템 메시지 (즉, 0x400 아래의 메시지)를 감시하고 싶지 않으면, 가능하면 4096 (0x1000)보다 더 큰 번호를 고르는 것이 제일 좋습니다. 이렇게 하면 오토핫키에 내부적으로 사용되는 메시지를 간섭할 기회가 줄어듭니다.

Function

함수의 이름, [v1.1.20+]에서는 함수 객체. 기호 그대로의 함수 이름을 건네려면, 따옴표로 둘러 싸야 합니다.

어떻게 함수가 등록되는가 그리고 OnMessage의 반환 값은 이 매개변수가 문자열인가 아니면 함수 객체인가에 달려 있습니다. 더 자세한 것은 함수 이름 vs 객체를 참조하십시오.

MaxThreads [v1.0.47+]

이 정수는 보통 생략됩니다. 이 경우 감시 함수는 한 번에 한 쓰레드로 제한됩니다. 이것이 보통 제일 좋습니다. 그렇지 않으면 스크립트가 감시 함수가 자신을 호출하면 시간 순서가 엉망인 채로 메시지들을 처리하기 때문입니다. 그러므로, MaxThreads에 대한 대안으로서, 아래에 기술하는 것처럼 Critical을 사용을 고려해 보십시오.

[v1.1.20+]: 기본값으로, 여러 함수가 하나의 MsgNumber에 등록되어 있으면, 등록된 순서대로 호출됩니다. 이전에 등록된 함수보다 먼저 호출될 함수를 등록하려면, MaxThreads에 음수를 지정하십시오. 예를 들어, OnMessage(Msg, Fn, -2)는 이전에 Msg에 등록된 다른 어떤 함수보다도 먼저 Fn을 호출되도록 등록합니다. 그리고 Fn에 최대 2 개의 쓰레드를 허용합니다. 그렇지만, 그 함수가 이미 등록되어 있으면, 등록을 해제하고 다시 재등록 하지 않은 한 순서가 바뀌지 않습니다.

함수 이름 vs 함수

OnMessage의 반환 값과 행위는 Function 매개변수가 함수 이름인가 아니면 객체인가에 따라 다릅니다.

함수 이름

하위 호환을 위해, 각각의 유일한 MsgNumber를 감시하려면 기껏해야 한 개의 함수만 이름으로 등록할 수 있습니다 -- 이것을 "legacy" 감시라고 부릅니다.

legacy 감시 함수가 처음 등록되면, 이전에 등록된 감시 함수들 앞에 호출될지 뒤에 호출될지는 MaxThreads 매개변수에 달려 있습니다. 이 감시 함수가 다른 함수를 호출하도록 업데이트하더라도 먼저 등록해제 하지 않는 한 순서에 영향을 주지 않습니다.

다음 코드는 MsgNumber에 대하여 현재 legacy 감시 함수를 등록하거나 업데이트합니다 (변수를 건넨다면 따옴표는 생략합니다):

Name := OnMessage(MsgNumber, "FunctionName")

반환 값은 다음 중 하나입니다:

  • 실패시 빈 문자열
  • 있었다면, 이전 함수의 이름
  • 그렇지 않으면, 새 함수의 이름.

다음은 MsgNumber에 대하여 현재의 legacy 감시자를 (있다면) 등록을 해제하고 그의 이름을 돌려줍니다 (없으면 빈 값을 돌려줌):

Name := OnMessage(MsgNumber, "")

다음은 MsgNumber에 대하여 현재의 legacy 감시자의 이름을 돌려줍니다 (없다면 빈 값을 돌려줌):

Name := OnMessage(MsgNumber)

함수 객체

(정상 함수를 포함하여) 갯수에 상관없이 얼마든지 함수 객체는 주어진 MsgNumber를 감시할 수 있습니다.

다음 두 줄은 이전에 등록한 함수들 다음에 호출될 함수 객체를 등록합니다:

OnMessage(MsgNumber, FuncObj)     ; Option 1
OnMessage(MsgNumber, FuncObj, 1)  ; Option 2 (MaxThreads = 1)

다음은 이전에 등록된 함수보다 먼저 호출될 함수 객체를 등록합니다:

OnMessage(MsgNumber, FuncObj, -1)

함수 객체를 등록 해제하려면 MaxThreads에 0을 지정하십시오:

OnMessage(MsgNumber, FuncObj, 0)

실패

실패는 Function이 다음과 같은 경우에 일어납니다:

  1. 객체가 아니거나, 사용자-정의 함수의 이름 또는 빈문자열입니다;
  2. 매개변수를 다섯 개 이상 요구한다고 알려져 있습니다
  3. 또는 v1.0.48.05 이전에서, ByRef 또는 선택적 매개변수를 가지고 있습니다.

v1.1.19.03 이전에서 실패는 이미 500 개의 메시지를 감시 중인데 스크립트가 새 메시지를 감시하려고 시도하는 경우에도 일어납니다.

Function이 객체이면, 실패시 예외를 던집니다. 그렇지 않으면, 빈 문자열을 돌려줍니다.

함수의 매개변수

여러 메시지를 감시하도록 할당된 함수는 최대 네 개까지 매개변수를 받을 수 있습니다:

MyMessageMonitor(wParam, lParam, msg, hwnd)
{
    ... body of function...
}

매개변수에 건넨 이름에 상관 없이, 다음 정보가 순서대로 매개변수에 할당됩니다.:

매개변수 #1: 메시지의 WPARAM 값.
매개변수 #2: 메시지의 LPARAM 값.
매개변수 #3: 메시지 번호, 함수가 여러 메시지를 감시할 때 유용합니다.
매개변수 #4: 메시지가 전송된 창이나 콘트롤의 HWND (유일한 ID). HWND는 ahk_id와 함께 사용할 수 있습니다.

WPARAM 그리고 LPARAM은 스크립트의 실행 파일이 32-비트인지 64-비트인지에 따라 부호 없는 32-비트 정수이거나 (0부터 232-1까지) 또는 부호 있는 64-비트 정수입니다 (-263부터 263-1까지). 32-비트 스크립트에 대하여, 들어오는 매개변수가 부호 있는 정수를 의도한다면, 음수는 다음 예제를 따라 노출시킬 수 있습니다:

if (A_PtrSize = 4 && wParam > 0x7FFFFFFF)  ; A_PtrSize를 점검해 스크립트가 32-비트임을 확인합니다.
    wParam := -(~wParam) - 1

상응하는 정보가 필요하지 않으면 리스트의 끝으로부터 하나 이상의 매개변수를 생략할 수 있습니다. 예를 들어, MyMsgMonitor(wParam, lParam)로 정의된 함수는 앞에서 두 개의 매개변수만 받습니다. 그리고 MyMsgMonitor()로 정의된 함수는 매개변수를 전혀 받지 않습니다.

함수에서 사용가능한 추가 정보

위에서 받은 매개변수 말고도, 함수는 다음 내장 변수로부터 값들을 참고할 수도 있습니다:

  • A_Gui: 메시지가 GUI 창 또는 콘트롤에 전송되지 않았다면 비어 있습니다. 이 경우 A_Gui는 Gui 창 번호입니다 (이 창은 또 함수의 기본 GUI 창으로 설정됩니다).
  • A_GuiControl: 메시지가 GUI 콘트롤에 전송되지 않았다면 비어 있습니다. 이 경우 안에 콘트롤의 변수 이름이나 다른 값이 들어 있습니다. 자세한 것은 A_GuiControl에 기술합니다. 어떤 콘트롤들은 어떤 종류의 메시지도 받지 않습니다. 예를 들어, 사용자가 텍스트 콘트롤을 클릭할 때, 운영 체제는 WM_LBUTTONDOWN을 그 콘트롤이 아니라 부모 창에 전송합니다. A_GuiControl는 비어 있습니다.
  • A_GuiX 그리고 A_GuiY: 들어오는 메시지가 SendMessage를 통하여 전송되었다면 둘 모두 -2147483648가 담깁니다. PostMessage를 통하여 전송되었다면, 메시지가 포스트되는 순간에 (화면에 상대적인) 마우스 커서의 좌표가 담깁니다.
  • A_EventInfo: 메시지가 SendMessage를 통하여 전송되었다면 0이 담깁니다. PostMessage를 통하여 전송되었다면, 메시지가 포스트된 틱-카운트 시간이 담깁니다.

감시 함수의 마지막 발견 창은 메시지가 전송된 부모 창으로 시작합니다 (콘트롤에 전송되었어도 마찬가지입니다). 창은 숨어 있지만 GUI 창은 아니라면 (예를 들어 스크립트의 메인 창), 사용하기 전에 먼저 DetectHiddenWindows를 켜십시오. 예를 들어:

DetectHiddenWindows On
MsgParentWindow := WinExist()  ; 메시지가 전송된 창의 유일한 ID를 저장합니다.

함수는 무엇을돌려주어야 하는가

감시 함수가 매개변수 없이 Return을 사용하거나, ""와 같은 빈 값을 지정하면 (또는 전혀 Return을 사용하지 않으면), 들어오는 메시지는 함수가 끝날 때 정상적으로 처리됩니다. 함수가 종료하거나(Exits) 존재하지 않는 파일을 실행하는 실행시간 에러를 야기하더라도 같은 일이 일어납니다. 대조적으로, 정수를 돌려주면, 그 메시지는 즉시 반송됩니다; 즉, 프로그램은 메시지를 더 이상 처리하지 않습니다. 예를 들어, WM_LBUTTONDOWN (0x201)을 감시하는 함수가 정수를 돌려주면 목표 창은 마우스 클릭이 일어난 사실을 고지 받지 못합니다. 많은 경우 (예를 들어 PostMessage를 통하여 도착하는 메시지의 경우), 어떤 정수가 반환되어도 상관하지 않습니다; 그러나 잘 모르겠다면, 0이 보통 가장 안전합니다.

유효한 반환 값의 범위는 스크립트의 실행파일이 32-비트인가 64-비트인가에 따라 다릅니다. 비어 있지 않은 값은 반드시 범위가 32비트-스크립트에 대하여 (A_PtrSize = 4) -231부터 232-1까지 그리고 64-비트 스크립트에 대하여(A_PtrSize = 8) -263부터 263-1까지입니다.

[v1.1.20+]: 하나의 메시지에 대하여 여러 감시 함수가 있다면, 비어 있지 않은 값을 돌려줄 때까지 하나씩 호출됩니다.

총평

정상 함수-호출과 다르게, 감시 메시지가 도착하면 함수는 새로운 쓰레드로 호출됩니다. 이 때문에, 함수는 SendMode 그리고 DetectHiddenWindows과 같은 기본값을 가지고 새롭게 시작합니다. 이 기본값은 자동-실행 섹션에서 바꿀 수 있습니다.

콘트롤에 (포스트 방식이 아니라) 센드 방식으로 전송되는 메시지는 관제되지 않습니다. 왜냐하면 시스템은 그런 메시지들을 화면 뒤의 콘트롤에 직접 보내 버리기 때문입니다. 이런 일은 시스템에서-생성되는 메시지들에는 별로 문제가 되지 않습니다. 왜냐하면 대부분 포스트 방식으로 전송되기 때문입니다..

OnMessage를 호출하는 스크립트는 자동으로 영속적이 됩니다. 또한 단일 실체이기도 합니다. 단, #SingleInstance를 사용하여 오버라이드된 경우는 예외입니다.

함수가 여전히 실행중인 동안에 또 같은 메시지가 도착하면, 그 함수는 다시 호출되지 않습니다 (단, MaxThreads가 1보다 큰 경우는 예외입니다); 대신에, 그 메시지는 감시되지 않은 것으로 취급됩니다. 이것이 마음에 들지 않으면, 0x312 이상의 메시지는 그의 함수가 완료할 때까지 버퍼 처리할 수 있습니다. 함수의 첫 줄에 Critical을 지정하면 됩니다. 대안으로, 감시 함수가 일을 끝낼만큼 충분히 긴 시간을 지속하기만 하면 쓰레드 인터럽트로 같은 일을 달성할 수 있습니다. 대조적으로, 0x312보다 작은 메시지는 Critical 또는 Thread Interrupt으로 버퍼 처리할 수 없습니다 (그렇지만, v1.0.46+에서, Critical은 도움이 됩니다. 왜냐하면 메시지를 덜 점검하기 때문에, 함수가 더 많은 시간을 가지고 일을 끝낼 수 있습니다). 그런 메시지를 놓치지 않도록 보장하는 유일한 방법은 함수가 6밀리초 아래에서 일을 끝내도록 확인하는 것입니다 (물론 이 제한은 Critical 30을 통하여 더 올릴 수 있습니다). 이렇게 하는 한 가지 방법은 0x312보다 큰 감시 메시지를 자신의 스크립트에 포스트해서 미래의 쓰레드를 미리 큐에 준비하는 것입니다. 그 메시지의 함수는 임계구역을 그의 첫 줄에 지정해서 그의 메시지가 버퍼 처리 되도록 확인해야 합니다.

스크립트가 절대적으로 인터럽트가 불가능한 동안에 0x312보다 작은 감시 메시지가 도착하면 -- 예를 들어 메뉴가 보여지거나, KeyDelay/MouseDelay가 진행 중이거나, 또는 클립보드가 열려 있다면 -- 그 메시지의 함수는 호출되지 않습니다. 그리고 그 메시지는 관제되지 않은 것으로 처리됩니다. 대조적으로 0x312 이상의 감시 메시지는 이런 인터럽트 불가능 기간동안에 버퍼 처리됩니디; 즉, 그의 함수는 스크립트가 인터럽트 가능해질 때 호출됩니다.

쓰레드 인터럽트 또는 임계구역의 설정 때문에 스크립트가 인터럽트가 불가능한 동안에 0x312 보다 작은 감시 메시지가 도착하면, 현재 쓰레드가 인터럽트 되어 그의 감시 함수를 호출할 수 있습니다. 대조적으로 0x312 이상의 감시 메시지는 쓰레드가 일을 끝내거나 인터럽트가 가능해질 때까지 버퍼 처리됩니다.

OnMessage 쓰레드의 우선 순위는 언제나 0입니다. 결과적으로 현재 쓰레드의 우선 순위가 0보다 높으면 어떤 메시지도 관제되지 않고 버퍼 처리되지 않습니다.

(0x400미만의) 시스템 메시지는 주의해서 사용해야 합니다. 예를 들어, 감시 함수가 빨리 일을 끝내지 못하면, 그 메시지에 대한 응답은 시스템의 예상보다 훨씬 더 걸립니다. 이 때문에 부작용을 야기할 수 있습니다. 감시 프로그램이 더 이상의 메시지 처리를 억누르기 위해 정수를 돌려주면 원하지 않는 행위가 일어날 수도 있습니다. 시스템은 다른 처리 다른 응답을 예상하고 있기 때문입니다.

스크립트가 MsgBox와 같은 시스템 창을 보여주고 있을 때, 콘트롤에 포스트되는 메시지는 모두 관제가 되지 않습니다. 예를 들어, 스크립트가 MsgBox를 보여주고 있고 사용자가 GUI 창에 버튼을 클릭하면, WM_LBUTTONDOWN 메시지는 감시 함수를 호출하지 않고 직접 버튼에 전송됩니다.

외부 프로그램은 PostThreadMessage() 또는 기타 API 호출을 통하여 메시지를 직접 스크립트의 쓰레드에 포스트할 수 있지만, 이것은 권장하지 않습니다. 왜냐하면 그 메시지들은 스크립트가 MsgBox 같은 시스템 창을 보여주고 있는 중이라면 소실되어 버리기 때문입니다. 대신에, 보통 스크립트의 메인 창이나 그의 GUI 창 중의 하나에 메시지를 보내는 것이 가장 좋습니다 (send vs post).

관련 항목

RegisterCallback(), OnExit, OnClipboardChange, Post/SendMessage, 함수, 창 메시지 목록, 쓰레드, Critical, DllCall()

예제

; 예제: 다음의 작동하는 스크립트는 GUI 창에서 마우스 클릭을 감시합니다
; 관련 주제: GuiContextMenu

Gui, Add, Text,, 이 창 아무데나 클릭하십시오.
Gui, Add, Edit, w200 vMyEdit
Gui, Show
OnMessage(0x201, "WM_LBUTTONDOWN")
return

WM_LBUTTONDOWN(wParam, lParam)
{
    X := lParam & 0xFFFF
    Y := lParam >> 16
    if A_GuiControl
        Control := "`n(in control " . A_GuiControl . ")"
    ToolTip Gui #%A_Gui% 창에서 클라이언트 좌표 %X%x%Y%.%Control%에 왼클릭 했습니다.
}

GuiClose:
ExitApp
; 예제: 다음 스크립트는 시스템 셧다운/로그오포를 탐지합니다. 그리고 그것을 취소할 기회를 줍니다
; Windows Vista 이후는 작동하지 않는다고 보고되었습니다).
; 관련 주제: OnExit

; 다음 DllCall은 선택적입니다: OS에게 이 스크립트를 (다른 모든 어플리케이션보다) 먼저 닫으라고 명령합니다.
DllCall("kernel32.dll\SetProcessShutdownParameters", UInt, 0x4FF, UInt, 0)
OnMessage(0x11, "WM_QUERYENDSESSION")
return

WM_QUERYENDSESSION(wParam, lParam)
{
    ENDSESSION_LOGOFF = 0x80000000
    if (lParam & ENDSESSION_LOGOFF)  ; 사용자가 로그오프중입니다.
        EventType = Logoff
    else  ; 시스템은 셧다운 또는 재시작 중입니다.
        EventType = Shutdown
    MsgBox, 4,, %EventType% in progress.  Allow it?
    IfMsgBox Yes
        return true  ; OS에게 셧다운/로그오프를 계속 허용하도록 명령합니다.
    else
        return false  ; OS에게 셧다운/로그오프를 취소하도록 명령합니다.
}
; 예제: 스크립트에게 다른 스크립트나 프로그램으로부터 맞춤 메시지와 최대 두 개의 숫자를 받도록 만듭니다.
; (숫자 대신에 문자열을 전송하려면, 이 다음 예제를 보십시오).

OnMessage(0x5555, "MsgMonitor")
OnMessage(0x5556, "MsgMonitor")

MsgMonitor(wParam, lParam, msg)
{
    ; 신속하게 돌아가는 것이 중요하다면, ToolTip을 사용하는 편이 더 좋습니다.
    ; MsgBox 같은 경우는 함수가 일을 끝내지 못하도록 방해하기 때문입니다:
    ToolTip Message %msg% arrived:`nWPARAM: %wParam%`nLPARAM: %lParam%
}

; 다음을 다른 스크립트 안에서 사용하면 위의 스크립트 안에서 함수를 실행할 수 있습니다:
SetTitleMatchMode 2
DetectHiddenWindows On
if WinExist("Name of Receiving Script.ahk ahk_class AutoHotkey")
    PostMessage, 0x5555, 11, 22  ; 이 메시지는 위의 WinExist() 때문에 "마지막 발견 창"으로 전송됩니다.
DetectHiddenWindows Off  ; PostMessage가 끝날 때까지 끄면 안됩니다.
; 예제: 문자열을 길이에 상관없이 한 스크립트에서 다른 스크립트로 전송합니다.  다음은 작동하는 예제입니다.
; 사용하려며니, 다음 스크립트들을 저장하고 실행한 다음 Win+Space를 누르면
; InputBox를 볼수 있습니다. 그 안에 문자열을 타자해 넣으면 됩니다.

; 다음 스크립트를 "Receiver.ahk"로 저장하고 기동시키십시오:
#SingleInstance
OnMessage(0x4a, "Receive_WM_COPYDATA")  ; 0x4a is WM_COPYDATA
return

Receive_WM_COPYDATA(wParam, lParam)
{
    StringAddress := NumGet(lParam + 2*A_PtrSize)  ; CopyDataStruct의 lpData 멤버를 받습니다.
    CopyOfData := StrGet(StringAddress)  ; 구조체로부터 문자열을 복사합니다.
    ; 그것을 ToolTip vs. MsgBox로 보여줍니다. 그래서 적절한 시간에 돌려줄 수 있습니다:
    ToolTip %A_ScriptName%`nReceived the following string:`n%CopyOfData%
    return true  ;  1 (true)을 돌려주는 것이 이 메시지를 승인하는 전통적인 방식입니다.
}

; 다음 스크립트를 "Sender.ahk"로 저장한 다음 기동시키십시오. 그 다음, Win+Space 핫키를 누르십시오.
TargetScriptTitle = Receiver.ahk ahk_class AutoHotkey

#space::  ; Win+Space 핫키. 누르면 메시지 문자열을 입력할 InputBox가 나타납니다.
InputBox, StringToSend, Send text via WM_COPYDATA, Enter some text to Send:
if ErrorLevel  ; 사용자가 취소 버튼을 눌렀습니다.
    return
result := Send_WM_COPYDATA(StringToSend, TargetScriptTitle)
if result = FAIL
    MsgBox SendMessage failed. Does the following WinTitle exist?:`n%TargetScriptTitle%
else if result = 0
    MsgBox Message sent but the target window responded with 0, which may mean it ignored it.
return

Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle)  ; ByRef는 이 경우 메모리를 상당히 절약해 줍니다.
; 다음 함수는 지정된 문자열을 지정된 창에 전송하고 응답을 돌려줍니다.
; 목표 창이 메시지를 처리했으면 응답은 1입니다. 또는 무시했다면 0입니다.
{
    VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0)  ; 구조체이 메모리 구역을 설정합니다.
    ; 먼저 구조체의 cbData 멤버에 문자열의 크기를 설정합니다. 그의 0 종료문자를 포함합니다:
    SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1)
    NumPut(SizeInBytes, CopyDataStruct, A_PtrSize)  ; OS의 요구대로 이렇게 처리합니다.
    NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize)  ; lpData에 문자열 자체를 가리키도록 설정합니다.
    Prev_DetectHiddenWindows := A_DetectHiddenWindows
    Prev_TitleMatchMode := A_TitleMatchMode
    DetectHiddenWindows On
    SetTitleMatchMode 2
    SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle%  ; 0x4a는 WM_COPYDATA입니다. Post가 아니라 Send를 사용해야 합니다.
    DetectHiddenWindows %Prev_DetectHiddenWindows%  ; 호출자에 대하여 원래 설정을 복구합니다.
    SetTitleMatchMode %Prev_TitleMatchMode%         ; 위와 같습니다.
    return ErrorLevel  ; SendMessage의 응답을 다시 호출자에게 전송합니다.
}
; 예제: WinLIRC 클라이언트 스크립트를 참조하십시오.
; 네트워크 접속에 데이터가 도착할 때 OnMessage()를 사용하여 고지를 받는 방법을 보여 줍니다.


OutputDebug

문자열을 디버거에 (있다면) 전송하여 보여줍니다.

OutputDebug, Text

매개변수

Text

보여주기 위해 디버거에 전송할 텍스트. 이 텍스트에는 라인피드 (`n)가 포함되어 새 줄을 시작할 수 있습니다. 게다가, 기다란 한 줄은 계속 섹션을 수단으로 여러 개의 짧은 줄들로 가를 수 있습니다.

논평

스크립트의 프로세스에 디버거가 없다면, 시스템 디버거가 그 문자열을 화면에 보여줍니다. 시스템 디버거가 꺼져 있다면, 이 명령어는 아무 효과가 없습니다.

디버거의 한 가지 예는 DebugView입니다. 이 디버거는 무료이며 www.sysinternals.com에서 얻을 수 있습니다.

다음도 참조하십시오: 다른 디버깅 방법들

관련 항목

FileAppend, 계속 섹션

예제

OutputDebug, %A_Now%: 창 "%TargetWindowTitle%"가 존재하지 않으므로, 프로세스가 종료되었습니다.


Pause

스크립트의 현재 쓰레드를 정지합니다.

#p::Pause ; Win+P를 한 번 누르면 스크립트가 정지됩니다. 다시 누르면 스크립트가 재개됩니다.
Pause [, On|Off|Toggle, OperateOnUnderlyingThread?]

매개변수

On|Off|Toggle

비어 있거나 생략되면, 기본 값은 Toggle입니다. 그렇지 않으면, 다음 단어 중 하나를 지정해야 합니다:

Toggle: 현재 쓰레드를 정지합니다. 단, 그 아래의 쓰레드가 정지해 있는 경우는 예외입니다. 이 경우 그 아래의 쓰레드가 재개됩니다.

On: 현재 쓰레드를 정지합니다.

Off: 현재 쓰레드 아래의 쓰레드가 정지되어 있으면, 재개될 때 그 아래의 쓰레드가 재개됩니다. 그렇지 않으면, 이 명령어는 아무 효과가 없습니다.

OperateOnUnderlyingThread?

Pause Off에 대하여 이 매개변수는 무시됩니다. 왜냐하면 언제나 그 아래의 쓰레드 위에서 작동하기 때문입니다. 다른 것에 대해서는, Pause가 켜져 있을 경우에만 효과가 있습니다 (Toggle을 사용 포함).

다음 숫자 중 하나를 지정하십시오:

0 (또는 생략): 현재 쓰레드가 정지합니다; 즉, 현재 Pause 명령어를 실행한 쓰레드.

1: 현재 쓰레드 아래의 쓰레드를 정지한 것으로 표식을 답니다. 그래서 재개하면, (있다면) 실행 중인 명령어를 종료한 다음, 정지 상태로 들어갑니다. 현재 쓰레드 아래에 쓰레드가 없으면, 스크립트 자체가 정지합니다. 이 때문에 타이머가 작동을 멈춥니다 (이 효과는 스크립트에 쓰레드가 없을 때 "Pause Script" 메뉴 항목을 사용한 것과 동일합니다).

주의: A_IsPaused에는 그 아래의 쓰레드의 정지 상태가 담깁니다.

논평

핫키와 핫스트링을 꺼버리는 Suspend와 다르게, pause를 켜면 현재 쓰레드가 동결됩니다. 부작용으로, 그 아래에 인터럽트된 쓰레드가 있다면 동면 상태가 됩니다.

쓰레드가 정지할 때마다, 타이머는 실행되지 않습니다. 대조적으로, 명시적으로 기동된 쓰레드는 핫키 그리고 메뉴 항목과 같이 여전히 기동될 수 있습니다; 그러나 쓰레드가 끝날 때, 그 아래의 쓰레드는 멈출 것입니다. 다른 말로, 각 쓰레드는 다른 쓰레드와 독립적으로 정지할 수 있습니다.

스크립트의 현재 쓰레드가 정지 상태에 있으면 트레이 아이콘의 색깔이 초록색에서 빨간색으로 바뀝니다. 이 컬러 변화는 아이콘을 동결하면 피할 수 있습니다. Menu 명령어의 마지막 매개변수에 1을 지정하면 됩니다. 예를 들어:

Menu, Tray, Icon, C:\My Icon.ico, , 1

스크립트를 정지하지 않고 타이머를 끄려면 Thread, NoTimers를 사용하십시오.

Pause 명령어는 기능 면에서 내장 메뉴 항목 "Pause Script"와 비슷합니다.

메뉴를 (트레이 메뉴, 메뉴 바, GUI 문맥 메뉴, 등등.) 보여주고 있는 동안 (공식적으로 정지한 것은 아니지만) 스크립트는 언제나 정지합니다.

관련 항목

Suspend, Menu, ExitApp, 쓰레드, SetTimer

예제

Pause::Pause  ; 토글-정지 함수를 "pause" 키에 할당합니다...
#p::Pause  ; ... 또는 그것을 Win+p나 기타 다른 핫키에 할당합니다.
; Pause 명령어를 또다른 스크립트에 전송합니다.
DetectHiddenWindows, On
WM_COMMAND := 0x111
ID_FILE_PAUSE := 65403
PostMessage, WM_COMMAND, ID_FILE_PAUSE,,, C:\YourScript.ahk ahk_class AutoHotkey


PixelGetColor

지정된 x,y 좌표에 있는 픽셀의 컬러를 열람합니다.

PixelGetColor, OutputVar, X, Y [, Alt|Slow|RGB]

매개변수

OutputVar

십육진 BGR 형식으로 컬러 ID를 저장할 변수의 이름. 예를 들어, 보라색은 0x800080으로 정의됩니다. 청색의 채도가 80이고 적색의 채도가 80 그리고 녹색은 채도가 0이기 때문입니다.

X, Y

픽셀의 X와 Y 좌표, 표현식 가능. 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾸었다면 예외입니다.

Alt|Slow|RGB

이 매개변수는 0 개 이상의 다음 단어가 담깁니다. 단어가 여러 개 존재하면, 다음 단어와 스페이스로 가르십시오 (예, Alt RGB).

Alt [v1.0.43.10+]: 대체 방법을 사용하여 색을 열람합니다. 정상 방법으로는 특정 유형의 창에 대하여 정확하거나 유효한 컬러를 얻을 수 없을 경우에 사용됩니다. 이 방법은 정상 방법보다 대략 10% 정도 느립니다.

Slow [v1.0.43.10+]: 더 정교한 방법을 사용하여 컬러를 열람합니다. 어떤 전체 화면 어플리케이션에서 다른 메쏘드는 실패하지만 이 방법은 작동할 가능성이 있습니다. 이 방법은 정상 방법보다 대략 세 배 느립니다. 주의: Slow가 Alt보다 우선 순위가 높습니다. 그래서 이 경우는 Alt를 지정할 필요가 없습니다.

RGB: 컬러를 RGB vs. BGR 포맷으로 열람합니다. 다른 말로, 적색과 청색을 교환합니다. 이는 WinSet, Gui, Progress, 그리고 SplashImage과 호환되는 컬러를 열람하는 데 유용합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1 그렇지 않으면 0이 설정됩니다.

논평

픽셀은 반드시 보여야 합니다; 다른 말로, 창에서 다른 창에 가려진 픽셀 컬러는 열람할 수 없습니다. 대조적으로, 마우스 아래의 커서는 보통 탐지할 수 있습니다. 이에 대한 예외는 게임 커서입니다. 대부분의 경우 게임 커서는 자신의 아래에 픽셀을 숨깁니다.

현재 화면의 컬러를 알아내려면 Window Spy (트레이 아이콘 메뉴)를 사용하거나 또는 이 페이지 아래에 에제를 사용하십시오.

알려진 한계:

  • 창이 부분적으로 투명하거나 또는 자신의 컬러를 보이지 않도록 표식했다면 (TransColor) 전형적으로 그 결과 컬러는 그 창에 아니라 그 창 뒤의 컬러가 됩니다.
  • PixelGetColor는 어떤 어플리케이션에서 정확한 결과를 생산할 수 없을 수도 있습니다. 이런 일이 일어나면, 단어 Alt 또는 Slow를 마지막 매개변수에 지정해 보십시오.

관련 항목

PixelSearch, ImageSearch, CoordMode, MouseGetPos

예제

^!z::  ; Control+Alt+Z 핫키.
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%
MsgBox 현재 커서 위치의 컬러는 %color%입니다.
return


PixelSearch

화면의 구역을 검색해 지정된 컬러의 픽셀을 찾습니다.

PixelSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ColorID [, Variation, Fast|RGB]

매개변수

OutputVarX/Y

ColorID에 부합하는 첫 번째 픽셀의 X와 Y의 좌표를 저장할 변수의 이름 (부합이 발견되지 않으면, 변수는 비워집니다). 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾼 경우는 예외입니다.

이 매개변수가 비어 있으면, ErrorLevel (아래 참조)를 사용하여 부합이 발견되었는지 알아낼 수 있습니다.

X1, Y1

검색할 사각 구역의 좌상 모서리의 X와 Y의 좌표. 표현식 가능. 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾼 경우는 예외입니다..

X2, Y2

검색할 사각 구역의 우하 모서리의 X와 Y의 좌표. 표현식 가능. 좌표는 활성 창에 상대적입니다. 단, CoordMode를 사용하여 좌표 체계를 바꾼 경우는 예외입니다.

ColorID

검색에 사용할 청-녹-적(Blue-Green-Red (BGR)) 형식의 십육진 또는 십진 컬러 ID. 표현식 가능. Color ID는 Window Spy를 사용하여 또는 PixelGetColor를 통하여 알아낼 수 있습니다 (트레이 메뉴로 접근 가능). 예를 들어: 0x9d6346.

Variation

0과 255 (포함) 사이의 값. 컬러의 적녹청 채도에 대하여 방향에 관계없이 몇 개의 쉐이드 변형을 허용할지 나타냅니다. (표현식 가능). 이 매개변수는 구하는 컬러가 언제나 정확하게 같은 쉐이드가 아닐 경우 유용합니다. 255 쉐이드의 변형을 지정했다면, 모든 컬러가 부합합니다. 기본값은 0 쉐이드입니다.

Fast|RGB

이 매개변수는 단어 Fast, RGB를 담거나 또는 둘 담을 수 있습니다 (둘 다 존재하면, 스페이스로 둘사이를 가르십시오; 즉, Fast RGB).

Fast: 빠른 검색 방법을 사용합니다. 대부분의 경우 검색에 사용된 CPU 시간의 양을 극적으로 줄여줍니다. 8-비트 (256-색) 컬러 깊이를 지원하지만, 빠른 모드는 24-비트 또는 32-비트 컬러에서 훨씬 더 빠릅니다. 화면의 컬러 깊이가 16-비트 이하라면, Variation 매개변수는 빠른 모드에서 느린 모드와 약간 다르게 행동할 수도 있습니다. 마지막으로, 빠른 모드는 화면을 컬럼 단위가 아니라 줄 단위로 (위에서 아래로) 검색합니다. 그러므로, 부합하는 픽셀이 많은 경우 느린 모드에서 발견되는 픽셀과 다른 픽셀을 발견할 수도 있습니다.

RGB: ColorID는 BGR이 아니라 RGB 값으로 번역됩니다. 다른 말로, 적과 청 구성요소가 서로 바뀝니다.

ErrorLevel

[v1.1.04+] 이 명령어는 검색하는 동안 문제가 있으면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 지정된 구역에서 컬러를 발견하였으면 0이 설정되고, 발견하지 못했으면 1이 설정됩니다. 아니면 문제가 있어서 검색을 수행하지 못했으면 2가 설정됩니다.

논평

검색될 구역은 반드시 보여야 합니다; 다른 말로, 창에서 또다른 창에 가려진 구역은 검색이 불가능하니다. 대조적으로, 마우스 커서 아래의 픽셀은 보통 탐지할 수 있습니다. 이에 대한 예외는 게임 커서입니다. 대부분의 경우 게임 커서는 자신의 아래에 있는 픽셀들을 감춥니다.

Slow 모드 전용: 기본값으로, 검색은 해당 구역의 좌상 모서리로부터 시작하여 수직으로 내려가며 픽셀이 부합하는지 맞추어 봅니다. 부합을 발견하지 못하면, 검색은 컬럼 오른쪽에서 부합하는 픽셀을 찾을 때까지 계속됩니다. 기본값이 좌에서 우로 검색 순서는 매개변수 리스트에서 X1와 X2를 바꾸면 뒤집어 집니다. 다른 말로, X1이 X2보다 더 크면, 검색은 X1컬럼에서 시작하여, 오른쪽에서 왼쪽으로 수행됩니다. 비슷하게, Y1이 Y2보다 크면, 검색될 픽셀 컬럼이 위가 아니라 아래부터 시작합니다. 마지막으로, 검색될 구역이 방대하고 검색이 높은 빈도록 반복되면, CPU 시간을 많이 소비할 수 있습니다. 이를 경감하려면, 검색 구역의 크기를 최소한으로 유지하십시오.

관련 항목

PixelGetColor, ImageSearch, CoordMode, MouseGetPos

예제

PixelSearch, Px, Py, 200, 200, 300, 300, 0x9d6346, 3, Fast
if ErrorLevel
    MsgBox, 해당 컬러를 지정된 구역에서 발견하지 못했습니다.
else
    MsgBox, 3 쉐이드의 변형 안에서 컬러가 X%Px% Y%Py%에서 발견되었습니다.


PostMessage / SendMessage

메시지를 창이나 콘트롤에 보냅니다 (SendMessage는 승인을 기다립니다).

PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout]

매개변수

Msg

전송할 메시지 번호, 표현식가능. 숫자를 알아 내려면 메시지 목록을 참조하십시오.

wParam

메시지의 첫 번째 구성요소. 표현식 가능. 비어 있거나 생략하면 0이 전송됩니다.

lParam

메시지의 두 번째 구성요소. 표현식 가능. 비어 있거나 생략하면 0이 전송됩니다.

Control

이 매개변수가 비어있거나 생략되면, 메시지는 그의 콘트롤 중에 하나가 아니라 직접 목표 창에 전송됩니다. 그렇지 않으면, 이 매개변수는 ClassNN (클래스이름과 콘트롤의 실체 번호) 또는 콘트롤의 텍스트일 수 있습니다. 둘 모두 Window Spy로 알아낼 수 있습니다. 텍스트를 사용할 때, 부합 행위는 SetTitleMatchMode로 결정됩니다.

콘트롤의 HWND (창 핸들)을 처리하려면, Control 매개변수를 비워 두고 ahk_id %ControlHwnd%를 WinTitle 매개변수에 지정하십시오 (이것은 숨은 창에도 작동합니다. DetectHiddenWindows가 꺼져 있어도(Off) 마찬가지입니다). 콘트롤의 HWND는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall를 통하여 열람합니다.

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져 있어야(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

Timeout

[AHK_L 42+]: 목표 창이 메시지를 처리하기를 기다릴 밀리초의 최대 개수. 생략하면 기본값은 5000 (밀리초)입니다. 이 값은 이 매개변수를 지원하지 않았던 예전 버전의 AutoHotkey에서 기본값입니다. 메시지가 이 시간 안에 처리되지 않으면, 명령어는 끝나고 ErrorLevel에 단어 FAIL을 설정합니다. 이 매개변수는 표현식일 수 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

PostMessage: ErrorLevel은 문제가 있었으면 1이 설정됩니다. 예를 들어 목표 창이나 콘트롤이 존재하지 않을 경우에 1이 설정됩니다. 그렇지 않으면 0이 설정됩니다.

SendMessage: ErrorLevel은 문제가 있었거나 시간제한에 걸리면 단어 FAIL이 설정됩니다. 그렇지 않으면, 메시지의 숫자 값 결과가 설정됩니다. 가끔 이 값이 메시지와 그의 목표 창의 성질에 따라 "reply"일 경우가 있습니다.

가능한 값의 범위는 오토핫키의 버전과 목표 창에 따라 다릅니다. 32-비트 버전의 오토핫키를 사용하거나, 또는 목표 창이 32-비트이면, 그 결과는 0부터 4294967295 까지의 32-비트 무부호 정수입니다. 64-비트 버전의 오토핫키를 64-비트 창에 사용하면, 그 결과는 -9223372036854775808과 9223372036854775807 까지의 64-비트 부호있는 정수입니다 .

결과가 32-비트 부호 있는 정수이기를 원한다면 (-2147483648부터 2147483648까지의 값), 다음과 같이 32-비트로 잘라내고 부호있는 값으로 변환할 수 있습니다:

MsgReply := ErrorLevel << 32 >> 32

이 변환은 AutoHotkey 64-비트에서도 필요할 수가 있습니다. 왜냐하면, 32-비트 창으로부터의 결과는 확장되지 않기 때문입니다. 예를 들어, 32-비트 창으로부터의 결과가 -1이면 어느 오토핫키 버전에서도 0xFFFFFFFF으로 보입니다. 반면에 64-비트 창으로부터의 결과가 -1이면 32비트 버전의 오토핫키에서는 0xFFFFFFFF으로 보이고 64비트 버전에서는 -1로 보입니다.

논평

이 명령어들은 주의해서 사용해야 합니다. 왜냐하면 엉뚱한 창에 메시지를 전송하면 (또는 무효한 메시지를 전송하면) 예상치 못한 행위를 야기하게 되고 심지어 목표 어플리케이션이 충돌을 일으킬 수 있기 때문입니다. 대부분의 어플리케이션은 외부 소스로부터 어떤 유형의 메시지를 받도록 설계되어 있지 않습니다.

PostMessage는 메시지를 목표 창에 연관된 메시지 큐에 넣습니다. 승인이나 응답을 기다리지 않습니다. 대조적으로, SendMessage는 목표 창이 그 메시지를 처리하기를 시간제한에 걸릴 때까지 기다립니다.

wParam과 lParam 매개변수는 정수여야 합니다. AutoHotkey 또는 목표 창이 32-비트이면, 오직 아래의 32 비트만 사용됩니다; 즉, 값은 범위가 -2147483648과 4294967295 (0xFFFFFFFF) 사이입니다. 오토핫키와 목표 창이 모두 64-비트이면, 오토핫키가 지원하는 어떤 정수도 사용할 수 있습니다. 오토핫키의 모든 정수 값처럼, 접두사가 0x이면 십육진수를 나타냅니다. 예를 들어 0xFF는 255와 동등합니다.

문자열은 변수의 주소를 지정하면 wParam 또는 lParam을 통하여 전송할 수 있습니다. 다음 예제는 주소 연산자 (&)를 사용해 전송합니다:

SendMessage, 0xC, 0, &MyVar, ClassNN, WinTitle  ; 0XC is WM_SETTEXT

v1.0.43.06+에서, 메시지 수신자에 의하여 MyVar 안에 배정된 문자열은 별도의 추가 절차 없이 적절하게 인지됩니다. 그렇지만, 이것은 매개변수의 첫 문자가 앰퍼센드 (&)일 경우에만 작동합니다; 예를 들어, 5+&MyVar는 작동하지 않지만 &MyVar 또는 &MyVar+5는 작동합니다.

인용부호 처리된/기호 그대로의 문자열도 다음 예제와 같이 전송할 수 있습니다 (& 연산자는 이 경우 사용하면 안 됩니다):

Run Notepad
WinWait Untitled - Notepad
SendMessage, 0xC, 0, "New Notepad Title"  ; 0XC is WM_SETTEXT

메시지 하나를 숨어 있든 비활성화되어 있든 시스템에 있는 모든 창에 보내려면, ahk_id 0xFFFF를 WinTitle (0xFFFF는 HWND_BROADCAST임)에 지정하십시오. 이 테크닉은 다음 예제와 같이 방송용 의도의 메시지에만 사용해야 합니다:

SendMessage, 0x1A,,,, ahk_id 0xFFFF  ; 0x1A is WM_SETTINGCHANGE

스크립트가 메시지를 받도록 하려면 OnMessage()를 사용하십시오.

이 명령어드들을 사용하는 방법에 관한 소개는 메시지 자습서를 참조하십시오.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

Message List, Message Tutorial, OnMessage(), Automating Winamp, DllCall, ControlSend, WinMenuSelectItem

예제

#o::  ; 모니터를 끌 Win+O 핫키.
Sleep 1000  ; 사용자에게 키를 뗄 기회를 줍니다 (키를 떼면 모니터가 다시 깹니다).
; Turn Monitor Off:
SendMessage, 0x112, 0xF170, 2,, Program Manager  ; 0x112는 WM_SYSCOMMAND이고, 0xF170는 SC_MONITORPOWER입니다.
; 위에 주목하십시오: 2 대신에 -1을 사용하면 모니터가 켜집니다.
; 2 대신에 1을 사용하면 모니터의 저전력 모드가 켜집니다.
return

; 사용자가 선택한 화면 보호기를 시작합니다:
SendMessage, 0x112, 0xF140, 0,, Program Manager  ; 0x112는 WM_SYSCOMMAND이고, 0xF140는 SC_SCREENSAVE입니다.

; 한 줄 위로 감습니다 (수직 스크롤 바가 있는 콘트롤에 대하여):
ControlGetFocus, control, A
SendMessage, 0x115, 0, 0, %control%, A

; 한 줄 아래로 감습니다:
ControlGetFocus, control, A
SendMessage, 0x115, 1, 0, %control%, A

; 활성 창의 키보드 레이아웃/언어를 영어로 전환합니다:
PostMessage, 0x50, 0, 0x4090409,, A  ; 0x50은 WM_INPUTLANGCHANGEREQUEST입니다.

; 이 예제는 Winamp에게 현재 활성화되어 있는 트랙 번호를 물어봅니다:
SetTitleMatchMode, 2
SendMessage, 1024, 0, 120, - Winamp
if ErrorLevel <> FAIL
{
    ErrorLevel++  ; Winamp의 카운트는 "0"에서 시작합니다. 그래서 1로 조정합니다.
    MsgBox, Track #%ErrorLevel% is active or playing.
}
; 더 자세한 정보는 Winamp 자동화 하기를 참조하십시오.

; AHK 스크립트의 프로세스 ID를 찾기 위해 ("WinGet PID"에 대한 대안):
SetTitleMatchMode, 2
DetectHiddenWindows, on
SendMessage, 0x44, 0x405, 0, , SomeOtherScript.ahk - AutoHotkey v
MsgBox %ErrorLevel% is the process id.


Process

다음 연산 중 하나를 프로세스에 수행합니다: 존재하는가; 우선 순위 변경; 닫기; 닫히기를 기다리기.

Process, Cmd [, PID-or-Name, Param3]

매개변수

Cmd

다음 단어 중 하나:

Exist: 부합하는 프로세스가 존재하면 ErrorLevel에 Process ID (PID)를 설정합니다. 그렇지 않으면 0이 설정됩니다. PID-or-Name 매개변수가 비어 있으면, 그 스크립트의 PID가 열람됩니다. 다른 방법으로 스크립트의 PID를 열람하는 한줄 짜리 방법이 있습니다: PID := DllCall("GetCurrentProcessId").

Close: 부합하는 프로세스가 성공적으로 종료하면, ErrorLevel에 그의 이전 Process ID (PID)가 설정됩니다. 그렇지 않으면 (부합하는 프로세스가 없거나 종료에 문제가 있었으면), 0이 설정됩니다. 프로세스는 갑자기 종료하기 때문에 -- 임계 지점에서 그의 작업이 인터럽트 된다거나 그의 창에 데이터를 저장하지 못하고 잃어버린다거나할 가능성이 있기 때문에 -- 이 방법은 그의 창 중에 하나에 WinClose를 사용해서 프로세스를 닫을 수 없을 경우에만 사용해야 합니다.

List: List는 아직 지원하지 않지만, 예제 섹션에서 DllCall을 통하여 프로세스 목록을 열람하는 법을 보여줍니다.

Param3에 처음 부합하는 프로세스의 Priority: 우선 순위를 (윈도우즈의 작업 관리자에 보여주는 순위) 변경하고 ErrorLevel에 그의 Process ID (PID)를 설정합니다. PID-or-Name 매개변수가 비어 있으면, 스크립트의 자신의 우선 순위가 변경됩니다. 부합하는 프로세스가 없거나 우선 순위를 변경하는 데 문제가 있었으면, ErrorLevel은 0이 설정됩니다.

Param3은 다음 기호나 단어중 하나가 되어야 합니다: L (Low), B (BelowNormal), N (Normal), A (AboveNormal), H (High), R (Realtime). 주의: 실시간 우선 순위를 가지고 실행되도록 설계되지 않은 프로세스는 시스템의 안정성을 훼손할 수 있습니다.

Wait: 부합하는 프로세스가 끝나기를 Param3 초까지 기다립니다 (소수점 포함 가능). Param3을 생략하면, 무한정 기다립니다. 부합하는 프로세스를 발견하면, ErrorLevel에 그의 Process ID (PID)가 설정됩니다. 명령어가 시간제한에 걸리면, ErrorLevel에 0이 설정됩니다.

WaitClose: 부합하는 모든 프로세스가 닫힐 때까지 Param3 초까지 기다립니다 (소수점 포함 가능). Param3을 생략하면, 무한정 기다립니다. 부합하는 프로세스가 모두 닫히면, ErrorLevel에 0이 설정됩니다. 명령어가 시간 제한에 걸리면, ErrorLevel에 여전히 존재하는 첫 번째 부합 Process ID (PID)가 설정됩니다.

PID-or-Name

이 매개변수는 아래에 기술하는 것처럼 숫자 (PID)이거나 프로세스 이름일 수 있습니다. 또 비워 두면 스크립트 자체의 우선 순위를 변경할 수도 있습니다.

PID: Process ID는 특정한 프로세스 하나를 유일하게 식별하는 숫자입니다 (이 숫자는 그 프로세스가 살아 있는 동안에만 유효합니다). 새로 기동된 프로세스의 PID는 Run 명령어를 통하여 알아낼 수 있습니다. 비슷하게, 창의 PID는 WinGet으로 알아낼 수 있습니다. Process 명령어 자체로도 PID를 알아낼 수 있습니다.

Name: 프로세스의 이름은 보통 (경로 없이) 실행 파일의 이름과 같습니다. 예, notepad.exe 또는 winword.exe. 이름은 여러 실행 프로세스에 부합할 수 있기 때문에, 첫 번째 프로세스에만 작동합니다. 이름은 대소문자를 구별하지 않습니다.

Param3

자세한 것은 위에서 Cmd를 참조.

ErrorLevel

자세한 것은 위에서 Cmd를 참조.

논평

Wait 그리고 WaitClose에 대하여: 프로세스는 100 밀리초마다 점검됩니다; 조건이 만족되는 순간, 명령어는 기다리기를 멈춥니다. 다른 말로, 시간제한이 경과하기를 기다리지 않고, 즉시 ErrorLevel에 위에 기술한 대로 설정한 다음, 계속해서 스크립트를 실행합니다. 또한, 명령어가 대기 상태에 있은 동안에, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드를 기동할 수 있습니다.

관련 항목

Run, WinGet, WinClose, WinKill, WinWait, WinWaitClose, IfWinExist

예제

; 예제 #1:

Run Notepad.exe, , , NewPID
Process, priority, %NewPID%, High
MsgBox 새로 기동된 노트패드의 PID는 %NewPID%입니다.

; 예제 #2:

Process, wait, Notepad.exe, 5.5
NewPID = %ErrorLevel%  ; ErrorLevel이 자주 바뀌기 때문에 값을 즉시 저장합니다.
if NewPID = 0
{
    MsgBox 지정한 프로세스가 5.5 초 이내에 나타나지 않았습니다.
    return
}
; 그렇지 않으면:
MsgBox 부합하는 프로세스가 나타났습니다 (프로세스 ID는 %NewPID%입니다).
Process, priority, %NewPID%, Low
Process, priority, , High  ; 스크립트 자체에 높은 순위를 설정합니다.
WinClose Untitled - Notepad
Process, WaitClose, %NewPID%, 5
if ErrorLevel ; 해당 PID가 여전히 존재합니다.
    MsgBox 프로세스가 5 초 이내에 닫히지 않았습니다.

; 예제 #3: 활성 창의 프로세스 우선순위를 변경할 핫키:

#z:: ; Win+Z 핫키
WinGet, active_pid, PID, A
WinGetTitle, active_title, A
Gui, 5:Add, Text,, 취소하려면 ESCAPE를 누르거나, 다음 창에 대하여 새 우선순위를`n더블 클릭하십시오:`n%active_title%
Gui, 5:Add, ListBox, vMyListBox gMyListBox r5, Normal|High|Low|BelowNormal|AboveNormal
Gui, 5:Add, Button, default, OK
Gui, 5:Show,, Set Priority
return

5GuiEscape:
5GuiClose:
Gui, Destroy
return

MyListBox:
if A_GuiEvent <> DoubleClick
    return
; 그렇지 않으면 다음 라벨로 갑니다:
5ButtonOK:
GuiControlGet, MyListBox
Gui, Destroy
Process, Priority, %active_pid%, %MyListBox%
if ErrorLevel
    MsgBox 성공:  "%MyListBox%"에 우선순위가바뀌었습니다.
else
    MsgBox 에러: "%MyListBox%"에 우선 순위를 바꾸지 못했습니다.
return

; 예제 #4: DllCall을 통하여 실행 프로세스 목록을 열람하고 그 목록을 MsgBox에 보여줍니다.

d := "  |  "  ; 문자열 가름자
s := 4096  ; 버퍼와 배열의 크기 (4 KB)

Process, Exist  ; ErrorLevel에 실행중인 스크립트의 PID를 설정합니다
; PROCESS_QUERY_INFORMATION (0x0400)로 이 스크립트의 핸들을 얻습니다
h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr")
; 다음 프로세스로 조절가능한 접근 토큰을 엽니다 (TOKEN_ADJUST_PRIVILEGES = 32)
DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t)
VarSetCapacity(ti, 16, 0)  ; 특권 구조체
NumPut(1, ti, 0, "UInt")  ; 특권 배열에 있는 한 엔트리...
; 디버그 특권의 지역적으로 유일한 식별자를 열람합니다:
DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid)
NumPut(luid, ti, 4, "Int64")
NumPut(2, ti, 12, "UInt")  ; 다음 특권을 활성 화합니다: SE_PRIVILEGE_ENABLED = 2
; 이 프로세스의 특권을 새 접근 토큰으로 업데이트합니다:
r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0)
DllCall("CloseHandle", "Ptr", t)  ; 이 접근 토큰 핸들을 닫아서 메모리를 절약합니다
DllCall("CloseHandle", "Ptr", h)  ; 이 프로세스 핸들을 닫아서 메모리를 절약합니다

hModule := DllCall("LoadLibrary", "Str", "Psapi.dll")  ; 라이브러리를 미리 적재해 수행성능을 높이니다.
s := VarSetCapacity(a, s)  ; 프로세스 식별자의 목록을 받을 배열:
c := 0  ; 프로세스 식별자를 위한 카운터
DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r)
Loop, % r // 4  ; 식별자를 위하여 배열을 DWORD (32 비트)로 분해합니다:
{
   id := NumGet(a, A_Index * 4, "UInt")
   ; 다음으로 프로세스를 엽니다: PROCESS_VM_READ (0x0010) | PROCESS_QUERY_INFORMATION (0x0400)
   h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr")
   if !h
      continue
   VarSetCapacity(n, s, 0)  ; 모듈의 기본 이름을 받을 버퍼:
   e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
   if !e    ; 32-비트 모드일 때 64-비트 프로세스를 위한 대비 방법:
      if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
         SplitPath n, n
   DllCall("CloseHandle", "Ptr", h)  ; 프로세스 핸들을 닫아 메모리를 절약합니다
   if (n && e)  ; 이미지가 널이 아니면 목록에 추가합니다:
      l .= n . d, c++
}
DllCall("FreeLibrary", "Ptr", hModule)  ; 라이브러리를 내려서 메모리를 풀어줍니다
;Sort, l, C  ; 이 줄을 주석 해제하면 리스트를 알파벳 순서로 리스트를 정렬할 수 있습니다
MsgBox, 0, %c% Processes, %l%

; 예제 #5: COM을 통하여 현재 실행 중인 프로세스 목록을 열람합니다.

Gui, Add, ListView, x2 y0 w400 h500, Process Name|Command Line
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    LV_Add("", process.Name, process.CommandLine)
Gui, Show,, Process List

; Win32_Process: http://msdn.microsoft.com/en-us/library/aa394372.aspx


Progress / SplashImage

프로그레스 바나 이미지를 담고 있는 창을 생성하거나 업데이트 합니다.

SplashImage, Off
SplashImage [, ImageFile, Options, SubText, MainText, WinTitle, FontName]

Progress, Off
Progress, ProgressParam1 [, SubText, MainText, WinTitle, FontName]

매개변수

ImageFile

단어 OFF이면, 창은 파괴됩니다. 단어 SHOW이면, 창이 현재 숨어 있을 경우 보여집니다.

그렇지 않으면, 이것은 보여줄 BMP, GIF, 또는 JPG 이미지의 파일이름입니다 (PNG, TIF, 그리고 ICO와 같이 다른 파일 형식을 보여주려면, Gui 명령어를 사용하여 그림 콘트롤이 들어 있는 창을 생성하는 방법을 고려하십시오).

[AHK_L 59+]: Gui가 지원하는 포맷이면 모두 SplashImage와 사용할 수 있습니다.

ImageFile은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주합니다. ImageFile 그리고 Options이 비어 있고 창이 이미 존재하면, 그의 이미지는 바뀌지 않지만 텍스트는 업데이트되어 SubText, MainText, 그리고 WinTitle에 제공된 새 문자열을 반영합니다.

새로 생성된 창에 대하여, ImageFile이 비어 있거나 이미지를 적재하는데 문제가 있으면, 창은 그림 없이 보여집니다.

ProgressParam1

프로그레스 창이 이미 존재하는 경우: Param1이 단어 OFF이면, 창은 파괴됩니다. Param1이 단어 SHOW이면, 창이 현재 숨어 있을 경우 보여집니다.

그렇지 않고, Param1이 순수 숫자이면, 그의 바 위치가 그 값에 맞게 바뀝니다. Param1이 비어 있으면, 그의 바 위치는 바뀌지 않지만 그의 텍스트는 업데이트되어 SubText, MainText, 그리고 WinTitle에 제공된 새 문자열을 반영합니다. 이 두 방법 모두, 창이 아직 존재하지 않으면, 모든 옵션에 대하여 기본 값을 가지고 창이 생성됩니다.

프로그레스 창이 존재하지 않으면: 새 프로그레스 창이 생성됩니다 (예전의 프로그레스 창을 교체합니다), 그리고 Param1은 아래 리스트의 옵션으로 구성된 문자열입니다.

Options

더 아래의 리스트 옵션으로 구성된 문자열.

SubText

이미지나 바 표시자 아래에 보여줄 텍스트. 단어-넘기기가 일어나지만, 새 줄을 명시적으로 시작하려면, 라인피드를 사용하십시오 (`n). 기존 창의 텍스트를 비우려면, %A_Space%를 지정하십시오. 창 높이를 자동 계산하기 위해, 빈 줄은 아래의 MainText와 비슷하게 보존할 수 있습니다.

MainText

이미지나 바 표시자 위에 보여줄 텍스트 (글꼴이 반-볼드체임). 단어-넘기기가 일어나지만, 새 줄을 명시적으로 시작하려면, 라인피드를 사용하십시오 (`n).

비어 있거나 생략하면, MainText에 대하여 창에 스페이스가 보존되지 않습니다. 나중에 한 줄을 추가하기 위해 스페이스를 보존하려면, 또는 기존 창의 텍스트를 비우려면, %A_Space%를 지정하십시오. 첫 줄을 넘어 따로 더 줄을 유지하려면, 라인피드를 더 추가하십시오 (`n).

일단 MainText의 콘트롤 구역의 높이가 설정되면, 창을 다시 만들지 않은 한 바꿀 수 없습니다.

WinTitle

창의 제목. 생략되고 창이 새로 생성되었다면, 창 제목은 (경로 없이) 스크립트의 이름이 기본값이 됩니다. B (borderless) 옵션이 지정되었다면, 제목 바는 보이지 않지만 창은 여전히 WinMove와 같은 명령어에서 이 제목으로 참조할 수 있습니다.

FontName

MainText와 SubText에 사용할 글꼴의 이름. 글꼴 테이블에 다양한 윈도우즈 버전에 포함된 글꼴이 나열되어 있습니다. 글꼴이 지정되지 않았거나 찾을 수 없으면, 시스템의 기본 GUI 글꼴이 사용됩니다.

글꼴의 크기와 두께 그리고 색을 변경하는 방법은 아래 옵션 섹션을 참조하십시오.

창 크기, 위치, 그리고 행위

A: 창은 언제나 위에 있지 않습니다.

B: Borderless: 창에 테두리가 없고 제목 바가 없습니다. 테두리는 있지만 제목 바는 필요 없다면, 얇은 테두리에 B1을 사용하고 대화상자 스타일의 테두리에 B2를 사용하십시오.

M: 사용자가 창을 이동할 수 있습니다 (테두리가 없는 경우는 예외). 추가로 (테두리를 끌어서) 창의 크기를 바꾸려면, M1을 지정하십시오. 추가로 시스템 메뉴를 포함하고 제목 바에 최소화/최대화/닫기 버튼 집합을 포함하려면, M2를 지정하십시오.

Pn: 프로그레스 창에 대하여, n에 제목 바의 시작 위치를 지정하십시오 (기본값은 0입니다. 또는 허용되는 범위 안에서 0에 가장 가까운 숫자입니다). 나중에 바의 위치를 바꾸려면, 다음 예제를 따르십시오: Progress, 50.

Rx-y: 프로그레스 창에 대하여, x-y에 바의 범위를 지정하십시오 (R 옵션이 없으면, 기본 값은 0-100입니다). 예를 들어, R0-1000이면 0부터 1000까지이 숫자를 허용합니다; R-50-50이면 -50부터 50까지 허용합; 그리고 R-10--5이면 -10부터 -5까지 허용합니다.

T: 창의 태스크 바에 버튼이 하나 주어집니다. 그리고 소유주가 없습니다. 보통, 창은 스크립트의 메인 창에 속하기 때문에 버튼이 없습니다. 이 설정은 또한 GUI 창의 Gui +OwnDialogs 설정이 스플레시 또는 프로그레스 창을 소유하지 못하도록 막습니다.

Hn: n에 창의 클라이언트 구역의 높이를 지정하십시오 (제목 바와 테두리를 제외한 구역입니다). 지정하지 않으면, 창의 텍스트와 이미지/바의 높이에 기반하여 그 높이가 자동으로 계산됩니다.

Wn: n에 창의 클라이언트 구역의 너비를 지정하십시오. 지정하지 않으면, (이미지가 있다면) SplashImage에 대하여 너비가 자동으로 계산됩니다. 그렇지 않으면, 기본값은 300입니다.

Xn: n에 창의 좌상 모서리의 x-좌표를 지정하십시오. 지정하지 않으면, 창은 수평으로 화면 가운데에 놓입니다.

Yn: n에 창의 좌상 모서리의 y-좌표를 지정하십시오. 지정하지 않으면, 창은 수직으로 화면 가운데에 놓입니다.

Hide: 창은 최초에 숨어 있습니다. Progress Show 또는 SplashImage Show를 사용해 나중에 보여줄 수 있습니다.

창에 객체 배치하기

Cxy: Centered: 이 옵션이 없으면, SubText 그리고 MainText 모두 창 한 가운데에 놓입니다. 0을 x에 지정하면 SubText가 왼쪽 정렬됩니다. 1을 지정하면 중앙에 정렬됩니다. y에도 마찬가지입니다. 단, MainText에 적용되는 경우는 예외입니다 (y는 생략할 수 있습니다). 예를 들어: c10.

ZHn: 객체의 높이: 프로그레스 창에 대하여, n에 프로그레스 바의 두께를 지정하십시오 (기본값 20). SplashImage 창에 대하여, n에 이미지를 조절할 높이를 지정하십시오. -1을 지정하면 높이를 ZWn 지정된 너비에 비례하도록 조절할 수 있습니다 (즉, "화면 비율 유지"). 지정하지 않으면, 실제 이미지 높이가 사용됩니다. 어느 경우든, 값을 0으로 지정하면 객체를 완전히 생략할 수 있습니다. 그러면 맞춤 글꼴과 크기 그리고 색으로 오직 텍스트만 보여주는 데 창을 사용할 수 있습니다.

ZWn: 객체의 너비 (SplashImage 창 전용): n에 이미지를 조절할 너비를 지정하시십시오. -1을 지정하면 너비를 ZHn에 지정된 너비에 비례하여 조절할 수 있습니다. (즉, "화면 비율 유지"). 지정하지 않으면, 실제 이미지 너비가 사용됩니다.

ZXn: n에 창의 좌우에 남길 여백의 양을 지정하십시오. 기본 값은 10 픽셀입니다. 단, SplashImage 창은 텍스트가 없고, 기본 값은 0입니다.

ZYn: n에 창의 상하 그리고 콘트롤 사이에 남길 빈 수직 공간의 양을 지정하십시오. 기본 값은 5픽셀입니다. 단, SplashImage 창은 텍스트가 없고, 기본값은 0입니다.

주의: 수직 프로그레스 바를 만들거나 레이아웃을 좀 더 유연하게 제어하려면, 다음 예제와 같이 Gui 명령어를 사용하십시오:

Gui, Add, Progress, Vertical vMyProgress
Gui, Show
return
; ... later...
GuiControl,, MyProgress, +10  ; 바를 위로10 퍼센트 이동시키빈다. +를 생랴갛면 절대 위치를 지정할 수 있습니다.

글꼴 크기와 무게

FMn: MainText에 대한 글꼴 크기를 n에 지정하십시오. 기본값은 0이고, 대부분의 시스템에서 10 포인트가 사용됩니다. 이 기본값은 제어판 > 화면 설정에서 시스템이 선택한 글꼴 크기에 영향을 받지 않습니다.

FSn: SubText에 대한 글꼴 크기를 n에 지정하십시오. 기본값은 0입이고 대부분의 시스템에서 0 포인트가 사용됩니다.

WMn: MainText에 대하여 글꼴 무게를 n에 지정하십시오. 이 두께는 범위가 1부터 1000까지입니다. 지정하지 않으면, 600 (반-볼드체)이 사용됩니다.

WSn: SubText에 대하여 글꼴 무게를 n에 지정하십시오. 두께는 범윅 1부터 1000까지 입니다 (700은 전통적으로 "볼드체"로 간주됩니다). 지정하지않으면, 400 (보통)이 사용됩니다.

객체 색

색은 아래 리스트의 색 이름 중 하나이거나 또는 여섯-자리 십육진 RGB 값입니다. 예를 들어, cw1A00FF를 지정하면 창 배경색이 적색은 1A, 녹색은 00, 그리고 청색은 FF로 설정됩니다.

그 다음에 옵션이 더 있으면 각 컬러 옵션 다음에 스페이스를 추가하십시오. 예를 들어: cbRed ct900000 cwBlue.

CBn: 프로그레스 바의 컬러: n에 16가지 기본 HTML 컬럼 이름 중 하나 또는 6-자리 RGB 컬러 값을 지정하십시오. 지정하지 않으면, 시스템의 기본 바 컬러가 사용됩니다. 단어 Default를 지정하면 시스템이 기본 프로그레스 바 컬러로 되돌아 올 수 있습니다.

CTn: 텍스트 컬러: n에 16가지 기본 HTML 컬러 이름 중 하나 또는 6-자리 RGB 컬러 값을 지정하십시오. 지정하지 않으면, 시스템의 기본 텍스트 컬러가 사용됩니다 (보통 검정색). 단어 Default를 지정하면 시스템의 기본 텍스트 컬러로 돌아올 수 있습니다.

CWn: 창의 컬러 (배경색): Sn에 16가지 기본 HTML 컬러 이름 중 하나 또는 6-자리 RGB 칼러 값을 지정하십시오. 지정하지 않으면, 시스템의 버튼 색이 사용됩니다 (단어 Default 를 지정하면 나중에 이 컬러로 되돌아 올 수 있습니다). 배경색을 투명하게 만들려면, WinSet TransColor를 사용하십시오.

컬러 이름과 RGB 값
Black = 000000 | Green = 008000
Silver = C0C0C0 | Lime = 00FF00
Gray = 808080 | Olive = 808000
White = FFFFFF | Yellow = FFFF00
Maroon = 800000 | Navy = 000080
Red = FF0000 | Blue = 0000FF
Purple = 800080 | Teal = 008080
Fuchsia = FF00FF | Aqua = 00FFFF

논평

첫 매개변수가 단어 OFF이면, 그 창은 파괴됩니다.

각 스크립트는 최대 10개의 프로그레스 창 그리고 10 개의 SplashImage 창을 보여줄 수 있습니다. 각 창마다 생성 순간에 할당된 번호가 있습니다. 지정되지 않으면 그 번호는 1 (첫 번째)입니다. 그렇지 않으면, 첫 매개변수 앞에 청 번호와 쌍점을 배치하십시오. 예를 들어, 2:Off로 Progress 명령어를 사용하면 2 번 프로그래스 창이 꺼집니다, 2:75이면 그의 바를 75%로 설정합니다, 2:이면 그의 텍스트 필드가 바뀝니다. 그리고 2:B이면 테투리 없는 새 프로그레스 창이 생성됩니다. 비슷하게, SplashImage 명령어를 2:Off와 함께 사용하면 2 번 SplashImage 창이 꺼지고, 2:이면 그의 텍스트 필드가 바뀝니다. 그리고 2:C:\My Images\Picture1.jpg 이면 새로 2 번 SplashImage 창이 생성됩니다.

생성될 때, 바탕화면보다 큰 창은 자동으로 바탕화면에 맞게 줄어듭니다.

맨 프로그레스 바를 보여 주려면 SubText도 MainText도 지정하지 않고, 다음 옵션을 포함하면 됩니다: b zx0 zy0. 맨 이미지를 보여주려면 같은 방식으로 하되 B 옵션이 더 필요합니다.

Windows XP 이후로, 비-클래식 테마가 켜져 있으면, 프로그레스 바의 내부가 부드럽게 이어지는 바가 아니라 딱딱하게 일련 구획으로 보일 수 있습니다. 이를 피하려면, cbBlue와 같이 바 컬러를 명시적으로 지정하십시오.

옵션 기호에 필요할 경우 (십육진수가 아니라) 십진수를 사용하십시오. 단, 따로 고지하는 경우는 예외입니다.

WinSet 그리고 WinMove 같은 명령어를 사용하면 다시 생성할 필요없이 기존 창의 속성을 바꿀 수 있습니다.

GUI 창이 Gui +OwnDialogs 수단을 사용하여 프로그레스 창이나 스플레시 창을 소유할 수 있습니다. 이렇게 하면 스플레시나 프로그레스 창이 소유창 보다 언제나 위에 있게 됩니다. 게다가, 그 GUI 창이 파괴될 때 프로그레스 창이나 스플레시 창도 자동으로 파괴됩니다.

관련 항목

GUI, SplashTextOn, ToolTip

예제

Progress, b w200, My SubText, My MainText, My Title
Progress, 50 ; 바의 위치를 50%로 설정합니다.
Sleep, 4000
Progress, Off

; 18-포인트 Courier 텍스트를 보여줄 창을 생성합니다:
Progress, m2 b fs18 zh0, This is the Text.`nThis is a 2nd line., , , Courier New

; 간단한 SplashImage 창을 만듭니다:
SplashImage, C:\My Pictures\Company Logo.gif

; 테투리 없는 SplashImage 창을 생성합니다. 이미지 아래에 큰 텍스트가 있습니다:
SplashImage, C:\My Pictures\Company Logo.gif, b fs18, This is our company logo.
Sleep, 4000
SplashImage, Off

; 다음은 SplashImage 위에 프로그래스 창을 중첩해서
; 설치 화면을 멋지게 보여줍니다:
IfExist, C:\WINDOWS\system32\ntimage.gif, SplashImage, %A_WinDir%\system32\ntimage.gif, A,,, Installation
Loop, %A_WinDir%\system32\*.*
{
    Progress, %a_index%, %a_loopfilename%, Installing..., Draft Installation
    Sleep, 50
    if a_index = 100
        break
}
; GUI 페이지 아래에 비슷한 예제가 있습니다. 그의 장점은 오직 하나의 창만 사용하고
; 창 레이아웃을 더 섬세하게 제어할 수 있다는 것입니다.


Random

의사-무작위 수를 발생시킵니다.

Random, OutputVar [, Min, Max]
Random, , NewSeed

매개변수

OutputVar

결과를 저장할 변수의 이름. 저장된 부동 소수점 수의 형식은 SetFormat에 의하여 결정됩니다.

Min
생성될 가장 작은 수. 음수나 부동 소수점수 또는 표현식 가능. 생략하면, 가장 작은 값은 0입니다. 정수에 대하여 허용되는 가장 낮은 값은 -2147483648 for integers이지만, 부동 소수점 수는 제한이 없습니다.
Max

생성될 가장 큰 수, 음수나 부동 소수점 수 또는 표현식 가능. 생략하면, 가장 큰 수는 정수에 대하여 2147483647입니다 (그러나 부동 소수점 수는 제한이 없습니다).

NewSeed

이 모드는 무작위 수 발생자에 NewSeed로 다시 씨앗을 먹입니다 (표현식 가능). 이것은 이어 발생되는 모든 무작위 수에 영향을 미칩니다. NewSeed는 0부터 4294967295 (0xFFFFFFFF) 사이의 정수여야 합니다. 다시 씨앗 먹기기는 발생된 무작위 수의 품질/보안성을 향상시킬 수 있습니다. 특히 NewSeed가 품질이 떨어지는 의사-무작위 수가 아니라 진짜 무작위수이면 더 좋습니다. 일반적으로, 씨앗 다시 먹이기는 한 번 이상 할 필요가 없습니다.

스크립트에서 다시 씨앗 먹이기가 사용되지 않았다면, 씨앗은 64-비트 값의 아래쪽 32-비트로 시작합니다. 이 값은 1601년 1월 1일 이후로 100-나노초 간격으로 나눈 개수입니다. 이 값은 ~7.2 분마다 0부터 4294967295 사이를 왔다 갔다 합니다.

논평

이 명령어는 의사-무작위 수를 산출합니다. 이 수는 진짜 무작위 수를 흉내 내지만 실제로는 다음 숫자가 무엇인지 추측/결정하기가 지극히 어려운 복잡한 공식에 기반한 숫자일 뿐입니다.

지정된 범위 안의 숫자는 모두 대략 비슷한 빈도로 발생됩니다 (그렇지만, 아래의 "알려진 한계"를 참조하십시오).

Min 또는 Max에 소수 점이 들어 있다면, 최종 결과는 부동 소수점 수가 됩니다. 형식은 SetFormat에 의하여 결정됩니다. 그렇지 않으면, 그 결과는 정수입니다.

알려진 한계: 부동 소수점 수에 대하여

  1. 특정 범위에 대하여 대략 4,294,967,296개의 구분된 숫자만 발생시킬 수 있습니다. 그래서 범위 안의 다른 모든 숫자들은 절대로 발생되지 않습니다;
  2. 가끔 결과가 지정된 최대값(Max)보다 더 큰 경우가 있습니다. (이것은 부분적으로 부동 소수점 수로부터 정밀도를 물려 받았기 때문입니다).

관련 항목

SetFormat

예제

Random, rand, 1, 10
Random, rand, 0.0, 1.0

원본에 있는 주석 인용

This function uses the Mersenne Twister random number generator, MT19937, written by Takuji Nishimura and Makoto Matsumoto, Shawn Cokus, Matthe Bellew and Isaku Wada.

The Mersenne Twister is an algorithm for generating random numbers. It was designed with consideration of the flaws in various other generators. The period, 219937-1, and the order of equidistribution, 623 dimensions, are far greater. The generator is also fast; it avoids multiplication and division, and it benefits from caches and pipelines. For more information see the inventors' web page at www.math.keio.ac.jp/~matumoto/emt.html

Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Do NOT use for CRYPTOGRAPHY without securely hashing several returned values together, otherwise the generator state can be learned after reading 624 consecutive values.

When you use this, send an email to: matumoto@math.keio.ac.jp with an appropriate reference to your work. It would be nice to CC: rjwagner@writeme.com and Cokus@math.washington.edu when you write.

This above has been already been done for AutoHotkey, but if you use the Random command in a publicly distributed application, consider sending an e-mail to the above people to thank them.


RegDelete

레지스트리로부터 값인 하위키를 제거합니다.

RegDelete, RootKey\SubKey [, ValueName]  ; v1.1.21+
RegDelete, RootKey, SubKey [, ValueName]

매개변수

RootKey

반드시 HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT, 또는 HKEY_CURRENT_CONFIG 중의 하나여야 합니다. (또는 HKLM와 같은 약어). 원격 레지스트리에 접근하려면, 컴퓨터 이름을 앞에 두고 다음에 쌍점 (또는 v1.1.21+이면, 역사선)을, 다음 예제와 같이 배치하십시오: \\workstation01:HKEY_LOCAL_MACHINE

SubKey

서브키의 이름 (예, Software\SomeApplication).

RootKey\SubKey [v1.1.21+]

RootKey 다음에 바로 역사선이 따라오면 (\), RootKey와 SubKey는 하나의 매개변수로 병합됩니다.

ValueName

삭제할 값의 이름. 생략되면, 전체 SubKey가 삭제됩니다. Subkey의 기본 값을 삭제하려면 -- RegEdit이 "(기본)"으로 보여주는 값 -- 이 매개변수에 AHK_DEFAULT를 사용하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다.

A_LastError은 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

레지스트리에서 삭제하는 것은 잠재적으로 위험합니다 - 조심해서 시행하십시오!

여러 키와 값에 작동하고 열람하려면, 레지스트리-회돌이의 사용을 고려하십시오.

원격 컴퓨터의 레지스트리에 접근하는 법에 관한 자세한 정보는 레지스트리-회돌이에서 논평을 참조하십시오.

32-비트 스크립트에서 레지스트리의 64-비트 섹션을 또는 그 반대로 삭제하려면, SetRegView를 사용하십시오.

관련 항목

RegRead, RegWrite, 레지스트리-회돌이, SetRegView, IniDelete

예제

RegDelete, HKEY_LOCAL_MACHINE, Software\SomeApplication, TestValue
RegDelete, HKEY_LOCAL_MACHINE\Software\SomeApplication, TestValue  ; v1.1.21+ 필요


RegExMatch

RegExMatch() [v1.0.45+]

문자열에 패턴이 담겨 있는지 알아냅니다 (정규 표현식).

FoundPos := RegExMatch(Haystack, NeedleRegEx [, UnquotedOutputVar = "", StartingPosition = 1])

매개변수

역주 : 정규표현식으로 목표 문자열에서 패턴을 찾는 것을
건초더미(Haystack)에서 바늘(NeedleRegEx)을 찾는 것에비유함.

FoundPos

RegExMatch()는 문자열 Haystack에 NeedleRegEx가 나타난 가장 왼쪽의 위치를 돌려줍니다. 위치가 1이면 첫 번째 문자입니다. 패턴이 발견되지 않으면 0을 돌려줍니다. 에러가 일어나면 (NeedleRegEx 안에서 구문 에러가 일어나면), 빈 문자열이 반환됩니다. ErrorLevel은 0 대신에 아래의 값 중 하나가 사용됩니다.

Haystack

내용을 검색할 문자열.

NeedleRegEx

검색 할 패턴, 펄-호환의 정규 표현식입니다 (PCRE). 패턴의 옵션은 문자열 처음에 포함해야 하고 그 다음에 닫는 반괄호가 따라 옵니다. 예를 들어, 패턴 "i)abc.*123"는 대소문자 비구분 옵션을 켜고 "abc"를 검색 한 다음, 0개 이상의 문자를 검색하고, 다음에 "123"을 검색합니다. 옵션이 없다면, ")"는 선택적입니다; 예를 들어, ")abc"는 "abc"와 동등합니다.

UnquotedOutputVar

Mode 1 (기본값): OutputVar는 한 따옴표를 제거한 변수입니다. 그 안에다 전체 패턴에 부합한 Haystack 부분을 저장합니다. 패턴이 발견되지 않으면 (즉, 함수가 0을 돌려주면), 이 변수와 모든 배열 원소는 비워집니다.

나포 부패턴이 NeedleRegEx 안에 존재하면, 그에 부합한 것들은 바탕 이름이 OutputVar인 의사-배열에 저장됩니다. 예를 들어, 변수의 이름이 Match라면, 첫 부패턴에 부합하는 부문자열은 Match1에 저장되고, 두 번째는 Match2에 저장됩니다, 등등. 이에 대한 예외는 이름 붙인 부패턴입니다: 숫자가 아니라 이름으로 저장됩니다. 예를 들어, 이름붙인 부패턴"(?P<Year>\d{4})" 에 부합한 부문자열은 MatchYear에 저장됩니다. 특정한 부패턴이 전혀 부합하지 않으면 (즉, 함수가 0을 돌려주면), 그에 상응하는 변수는 비워집니다.

함수 안에서, 지역이 아닌 전역 의사 배열을 생성하려면, 의사 배열의 바탕 이름을 사용하기 전에 (예, Match) 전역 변수로 선언 하십시오. 전역-간주 함수에 대하여 그 반대도 마찬가지입니다. 그렇지만, 흔한 혼란의 근원 때문에 각 원소마다 선언할 필요가 있는 경우도 있습니다.

Mode 2 (위치와 길이): 대문자 P가 RegEx의 옵션에 존재하면 -- 예를 들어 "P)abc.*123" --전체 패턴 부합의 길이가 OutputVar에 저장됩니다 (부합이 없으면 0). 나포 부패턴이 존재하면, 그 위치와 길이가 두 개의 의사-배열에 저장됩니다: OutputVarPos 그리고 OutputVarLen. 예를 들어, 변수의 바탕 이름이 Match라면, 첫 부패턴 부합의 위치가 1-기반으로 MatchPos1에 저장되고, 그의 길이는 MatchLen1에 저장됩니다 (부패턴에 부합이 없거나 함수가 0을 돌려주면 0이 저장됩니다). 이에 대한 예외는 이름붙인 부패턴입니다: 숫자가 아니라 이름으로 저장됩니다 (예, MatchPosYear 그리고 MatchLenYear).

Mode 3 (일치 객체) [v1.1.05+]: 대문자 O가 RegEx 옵션에 존재하면 -- 예를 들어 "O)abc.*123" -- 일치 객체가 UnquotedOutputVar에 저장됩니다. 이 객체를 사용하면 전체 부합과 나포된 부패턴 각각의 위치와 길이 그리고 값을 열람할 수 있습니다.

StartingPosition

StartingPosition을 생략하면 기본값은 1입니다 (Haystack의 시작). 그렇지 않으면, 2를 지정해 두 번째 문자에서 시작하거나 3을 지정해 세 번째 문자에서 시작할 수 있습니다. 등등. StartingPosition이 Haystack의 길이를 넘어 가면, 검색은 Haystack 끝의 빈 문자열에서 시작합니다 (전형적으로 부합 결과가 없습니다).

StartingPosition이 보다 작으면, Haystack 끝으로부터의 상대거리고 간주합니다. 예를 들어, 0은 마지막 문자에서 시작하고, -1은 마지막 문자 바로 앞에서 시작합니다. StartingPosition이 Haystack의 왼쪽 끝을 넘어서 시도하면, 모든 Haystack을 검색합니다.

StartingPosition의 값에 상관없이, 반환 값은 언제나 Haystack의 첫 문자에 상대적입니다. 예를 들어, "123abc789"에서 "abc"의 위치는 언제나 4입니다.

ErrorLevel

[v1.1.04+] 이 함수는 실패시 예외를 던질 수 있습니다 ("부합 없음"과 혼동하지 마십시오). 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 다음 값중 하나가 설정됩니다:

  • 0, 에러가 일어나지 않았다는 뜻입니다.
  • 다음과 같은 형태의 문자열: Compile error N at offset M: description. 이 문자열에서, N은 PCRE 에러 번호이고, M은 정규 표현식 안에서의 범칙 문자의 위치입니다. 그리고 description은 그 에러를 설명하는 텍스트입니다.
  • 음의 정수, 정규 표현식을 실행하는 동안에 에러가 일어났다는 뜻입니다. 그런 에러가 자주 일어나지는 않지만 일어난다면 다음과 같은 에러가 거의 대부분입니다: "too many possible empty-string matches" (-22), "recursion too deep" (-21), 그리고 "reached match limit" (-8). 이런 에러가 일어나면, 패턴을 더 엄격하게 재설계하십시오. 예를 들어 *를 ?, +로 교체하거나 가능하면 {0,3}과 같이 제한하십시오.

Options

수식자에 관해서 Options를 참조하십시오. 예를 들어 "i)abc"와 같은 경우, 패턴 "abc"에 대소문자 구분을 끕니다.

Match Object v1.1.05+

대문자 O가 RegEx 옵션에 존재하면, 일치 객체가 UnquotedOutputVar에 저장됩니다. 이 객체는 다음과 같은 특성을 소유합니다:

Match.Pos(N): 나포된 부패턴 또는 전체 부합의 위치를 돌려줍니다.

Match.Len(N): 나포된 부패턴 또는 전체 부합의 길이를 돌려줍니다.

Match.Value(N): 나포된 부패턴 또는 전체 부합을 돌려줍니다.

Match.Name(N): 주어진 부패턴의 이름을 돌려줍니다

Match.Count(): 부패턴의 전체 개수를 돌려줍니다.

Match.Mark(): 마지막으로 만난 (*MARK:NAME)의 NAME을 돌려줍니다.

Match[N]: N이 0이거나 유효한 부패턴 번호 또는 이름이라면, 이것은 Match.Value(N)과 동등합니다. 그렇지 않으면, N은 위의 특성의 이름 중 하나일 수 있습니다. 예를 들어, Match["Pos"] 그리고 Match.Pos는 Match.Pos()와 동등합니다. 단, 이름이 "Pos"인 부패턴이 존재하면 예외입니다. 이 경우 Match.Value("Pos")와 동등합니다.

Match.N: 위와 같습니다. 단, N이 인용부호를 붙이지 않은 이름이거나 숫자인 경우는 예외입니다.

위의 모든 특성에 대하여, N은 다음 중 하나가 될 수 있습니다:

  • 모든 부합하면 0.
  • 부패턴의 번호, 이름붙은 부패턴도 마찬가지.
  • 부패턴의 이름.

N을 지정하면 반괄호 () 대신에 각괄호 []를 사용해도 됩니다.

수행성능

문자열 안에서 간단한 부문자열을 검색하려면 InStr()을 사용하십시오. 왜냐하면 RegExMatch()보다 더 빠르기 때문입니다.

수행성능을 개선하기 위하여, 자주 사용되는 정규 표현식 100개를 메모리에 (컴파일된 형태로) 캐쉬합니다.

연구 옵션 (S)으로 종종 (예를 들어 회돌이 안에서) 많이 사용되는 정규 표현식의 수행성능을 개선시킬 수 있습니다.

논평

부패턴에 이름을 부여할 수 있습니다. 예를 들어 패턴 "(?P<Year>\d{4})"에 단어 Year가 부여 되어 있습니다. 이름은 최대 32개의 알파벳숫자와 밑줄 문자로 구성되니다. 다음 제한은 "O" (일치 객체) 모드에 적용되지 않습니다. 이름 붙인 부패턴도 RegEx 연산 자체에서 숫자로 참조할 수 있지만 (예, \1은 첫 나포 패턴에 실제로 부합한 문자열을 가리키는 역참조입니다), (숫자가 아니라) 이름으로만 출력 의사-변수에 저장됩니다. 예를 들어, "Year"가 첫 번째 부패턴이라면, OutputVarYear은 그 부합한 부문자열이 설정되지만, OutputVar1은 전혀 바뀌지 않습니다 (이전 값을 그대로 유지합니다). 그렇지만, 이름없는 부패턴이 "Year" 다음에 일어나면, 그것은 OutputVar1이 아니라 OutputVar2에 저장됩니다.

abc123와 같이 대부분의 문자는 정규 표현식 안에 기호 그대로 사용할 수 있습니다. 그렇지만, \.*?+[{|()^$와 같은 문자는 반드시 앞에 역사선을 배치해야 문자 그대로 보여지게 됩니다. 예를 들어, \.는 문자 그대로의 점이고 \\는 기호 그대로의 역사선입니다. 피신은 \Q...\E을 사용하여 대신할 수 있습니다. 예를 들어: \QLiteral Text\E.

정규 표현식 안에서, 탭과 새줄 같은 특수 문자들은 액센트 (`) 또는 역사선 (\)으로 피신시킬 수 있습니다. 예를 들어, `t는 \t와 같습니다. 단, x 옵션이 사용된 경우는 예외입니다.

정규 표현식의 기본을 배우려면 (또는 패턴 구문을 새롭게 기억해 보려면), RegEx 간편 참조서를 참조하십시오.

오토핫키의 정규 표현식은 펄-호환의 정규 표현식 (PCRE)을 사용하여 구현되었습니다: www.pcre.org.

관련 항목

RegExReplace(), RegEx Quick Reference, 정규 표현식 외부요청, InStr(), IfInString, StringGetPos, SubStr(), SetTitleMatchMode RegEx, 전역적 일치와 Grep (포럼 링크)

텍스트 데이터를 얻는 흔한 방법: FileRead, UrlDownloadToFile, Clipboard, GUI 편집 콘트롤

예제

FoundPos := RegExMatch("xxxabc123xyz", "abc.*xyz")  ; 4를 돌려줍니다, 부합이 발견된 위치입니다.
FoundPos := RegExMatch("abc123123", "123$")  ; $가 끝에 부합하기를 요구하기 때문에 7을 돌려줍니다.
FoundPos := RegExMatch("abc123", "i)^ABC")  ; 대소문자를 구분하지 않는 옵션을 통하여 부합했으므로 1을 돌려줍니다.
FoundPos := RegExMatch("abcXYZ123", "abc(.*)123", SubPat)  ; 1을 돌려주고 "XYZ"를 SubPat1에 저장합니다.
FoundPos := RegExMatch("abc123abc456", "abc\d+", "", 2)  ; 시작 위치가 1이 아니라 2이기 때문에 1 이 아니라 7을 돌려줍니다..

; 일반적인 RegEx 예제들은 RegEx 간편 참조서를 참조하십시오.


RegExReplace

RegExReplace() [v1.0.45+]

문자열 안에 나타나는 패턴 (정규 표현식)을 교체합니다.

NewStr := RegExReplace(Haystack, NeedleRegEx [, Replacement = "", OutputVarCount = "", Limit = -1, StartingPosition = 1])

매개변수

NewStr

RegExReplace()는 Haystack의 내용을 연산으로 교체하여 돌려줍니다. 교체가 필요하지 않으면, Haystack은 그대로 반환됩니다. 에러가 일어나면 (예를 들어 NeedleRegEx 안의 구문 에러가 있으면), Haystack은 그대로 반환됩니다 (1.0.46.06 이전 버전은 예외인데, ""를 돌려줍니다) 그리고 ErrorLevel은 0 대신에 아래의 값 중 하나가 설정됩니다.

Haystack

그의 내용이 검색되고 교체될 문자열.

NeedleRegEx

검색할 패턴, Perl-호환 정규 표현식 (PCRE)입니다. 패턴의 옵션은 (있다면) 문자열의 맨 앞에 닫는 반괄호를 포함시켜야 합니다. 예를 들어, 패턴 "i)abc.*123"는 대소문자 구분 옵션을 켜고 "abc"를 찾은 다음, 0 개 이상 문자가 나타나는지 찾고, 다음에 "123"을 찾습니다. 아무 옵션도 없다면, ")"는 선택적입니다; 예를 들어, ")abc"는 "abc"와 동등합니다.

Replacement

부합하면 교체될 문자열, 평범한 텍스트입니다 (정규 표현식 아님). $1와 같은 역참조를 포함할 수 있습니다. Haystack으로부터 첫 번째 부패턴에 부합한 부문자열을 가지고 옵니다. 가장 단순한 역참조는 $0부터 $9입니다. $0은 전체 패턴에 부합한 부문자열입니다. $1은 첫 부패턴에 부합한 부문자열입니다. $2는 두 번째 부패턴에 부합한 부문자열입니다. 등등. 10 이상의 역 참조는 (그리고 선택적으로 9 이하도), 숫자를 활괄호 안에 둘러 싸십시오; 예, ${10}, ${11}, 등등. 이름 부패턴은 그 이름을 활괄호 안에 둘러 싸십시오; 예, ${SubpatternName}. 기호 그대로 $를 지정하려면, $$를 사용하십시오 (이것은 그런 특별 취급이 필요한 유일한 문자입니다; 역사선은 피신시키는 데 전혀 필요하지 않습니다).

부패턴의 대소문자를 변환하려면, $ 다음에 다음 문자 중 하나를 배치하십시오: U 또는 u (대문자), L 또는 l (소문자), T 또는 t (제목격입니다. 즉, 각 단어의 첫 글자가 대문자가 되고 다른 모든 글자는 소문자가 됩니다). 예를 들어, $U1와 $U{1} 둘 모두 첫 부패턴의 대문자 버전으로 변환합니다.

존재하지 않는 역참조와 Haystack에서 아무 것도 부합하지 못한 것들은 -- 예를 들어 "(abc)|(xyz)"의 부패턴 중 하나 -- 빈 문자열로 변환됩니다.

OutputVarCount

일어난 교체의 횟수를 저장할 변수의 이름. 따옴표 처리 없음 (교체가 없으면 0).

Limit

Limit을 생략하면, 기본값은 -1입니다. 기본값은 Haystack에서 발견된 패턴에 부합하면 모두 교체합니다. 그렇지 않으면, 허용할 교체의 최대 횟수를 지정하십시오. Haystack에서 마지막 교체 이후의 오른쪽 부분은 바뀌지 않습니다.

StartingPosition

StartingPosition이 생략되면, 기본값은 1입니다 (Haystack의 시작). 그렇지만, 2를 지정하면 두 번째 문자부터, 3을 지정하면 세 번째 문자부터, 등등 시작할 수 있습니다. StartingPosition이 Haystack의 길이를 넘어 서면, 검색은 Haystack 끝의 빈 문자열에서 시작됩니다 (결과적으로 아무 교체도 없습니다).

StartingPosition이 1보다 작으면, Haystack 끝으로부터 상대거리(offset)라고 간주합니다. 예를 들어, 0은 마지막 문자에서 시작하고, -1은 마지막 문자 바로 전에서 시작합니다. StartingPosition이 Haystack의 왼쪽 끝을 넘어가려고 시도하면, 모든 Haystack이 검색됩니다.

StartingPosition의 값에 상관 없이, 반환 값은 언제나 Haystack의 완전한 사본입니다 -- 유일한 차이점은 StartingPosition이 1이었을 때와 비교하여 왼쪽이 좀 덜 변경된다는 것입니다.

ErrorLevel

[v1.1.04+] 이 함수는 실패시 예외를 던질 수 있습니다 ("부합이 발견되지 않음"과 혼동하지 말 것). 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 다음 중 하나가 설정됩니다:

  • 0이면 에러가 일어나나지 않았다는 뜻입니다.
  • 다음 형태의 문자열: Compile error N at offset M: description. 이 문자열에서, N은 PCRE 에러 번호이고, M은 정규 표현식 안에서 에러가 일어난 위치이면, 그리고 description은 에러를 설명하는 텍스트입니다.
  • 음수이면 정규 표현식을 실행하는 동안에 에러가 일어났다는 뜻입니다. 그런 에러는 별로 없지만, 가장 자주 일어나는 에러는 다음과 같습니다:
    "too many possible empty-string matches" (-22), - 빈 문자열이 너무 많이 부합함
    "recursion too deep" (-21), - 너무 깊이 재귀함
    "reached match limit" (-8). - 부합 제한에 도달함
    이런 일이 일어나면, 패턴을 좀 더 제한적으로 다시 설계하십시오. 예를 들어 가능하면 *는 ?, +,로 교체하고 또는 {0,3}과 같이 제한 하십시오.

옵션

수식자에 관한 것은 옵션을 참조하십시오. 예를 들어 "i)abc"와 같은 경우, "abc" 패턴에서 대소문자 구분을 끕니다.

수행성능

간단한 부문자열을 교체하려면, StringReplace를 사용하십시오. RegExReplace()보다 더 빠릅니다.

교체의 최대 개수를 알 경우, 그것을 Limit 매개변수에 지정하면 수행성능이 향상됩니다. 검색이 더 빨리 끝날 수 있습니다 (이렇게 하면 연산하는 동안 시스템에 메모리 부하도 줄어듭니다.). 예를 들어, 거대한 문자열의 앞쪽 근처에 오직 하나만 부합한다는 사실을 알고 있다면, 1로 제한하십시오.

수행성능을 개선하기 위해, 최근에 사용된 정규 표현식 100개를 (컴파일된 형태로) 메모리에 캐쉬합니다.

연구 옵션 (S)는 종종 (예를 들어 회돌이 안에서) 여러 번 사용되는 정규 표현식의 수행성능을 향상시킵니다.

논평

대부분의 문자들은 abc123과 같이 정규 표현식 안에 기호 그대로 사용할 수 있습니다. 그렇지만, \.*?+[{|()^$ 문자들은 앞에 역사선을 배치해야 기호로 보이게 됩니다. 예를 들어, \.는 기호 그대로 점이고 \\는 기호 그대로 역사선입니다. 피신은 \Q...\E를 사용해 회피할 수 있습니다. 예를 들어: \QLiteral Text\E.

정규 표현식 안에서, 탭과 새줄문자 같은 특수 문자는 액센트 (`) 또는 역사선 (\)으로 피신시킬 수 있습니다. 예를 들어, `t는 \t과 같습니다.

정규 표현식의 기초를 배우려면 (또는 패턴 구문을 다시 상기해 보고 싶다면), RegEx 간편 참조서를 일독 하십시오.

관련 항목

RegExMatch(), RegEx 간편 참조서, 정규 표현식 외부요청, StringReplace, InStr()

텍스트 데이터의 근원: FileRead, UrlDownloadToFile, Clipboard, GUI Edit 콘트롤

예제

NewStr := RegExReplace("abc123123", "123$", "xyz")  ; "abc123xyz"을 돌려줍니다. 왜냐하면 $는 끝에만 부합을 허용하기
때문입니다.
NewStr := RegExReplace("abc123", "i)^ABC")  ; "123"을 돌려줍니다. 왜냐하면 대소문자 구분 옵션을 통하여 부합에 성공했기 때문입니다.
NewStr := RegExReplace("abcXYZ123", "abc(.*)123", "aaa$1zzz")  ; $1 역참조를 사용하여 "aaaXYZzzz"을 돌려 줍니다.
NewStr := RegExReplace("abc123abc456", "abc\d+", "", ReplacementCount)  ; ""를 돌려주고 2를 ReplacementCount에 저장합니다.

; 일반적인 RegEx 예제는 RegEx 간편 참조서를 일독 하십시오.


RegisterCallback

RegisterCallback() [v1.0.47+]

머신-코드 주소를 생성합니다. 이 주소는 호출될 때, 스크립트의 함수로 방향전환 합니다.

Address := RegisterCallback("FunctionName" [, Options = "", ParamCount = FormalCount, EventInfo = Address])

매개변수

Address

성공하면, RegisterCallback()은 숫치 주로를 돌려줍니다. 이 주소를 DllCall() 또는 기타 머신-코드 함수를 호출할 수 있는 다른 함수가 호출할 수 있습니다. 실패하면, 빈 문자열을 돌려줍니다. 실패가 일어나는 경우는 FunctionName이:

  1. 존재하지 않을 경우;
  2. ParamCount 보다 너무 많거나 너무 적게 매개변수를 받은 경우;
  3. 또는 ByRef 매개변수를 받은 경우입니다.

FunctionName

함수의 이름입니다. 기호 그대로의 문자열일 경우 반드시 따옴표로 둘러 싸야 합니다. 이 함수는 Address가 호출될 때마다 자동으로 호출됩니다. 함수는 또 Address에 건네어진 매개변수들도 받습니다.

[v1.1.06+]: 함수 이름 대신에 함수 참조를 건넬 수 있습니다.

Options

0개 이상의 다음 단어들을 지정합니다. 각 옵션은 다음 옵션과 스페이스로 구분하십시오 (예, C Fast).

Fast 또는 F: FunctionName이 호출될 때마다 새 쓰레드가 시작하는 것을 피합니다. 비록 수행성능은 좋아지지만, Address로 호출되는 쓰레드가 달라질 경우는 (예, 들어오는 메시지에 의하여 역호출이 촉발될 때는) 피해야 합니다. 왜냐하면 호출되는 순간에 쓰레드가 실행되는 경우 FunctionName이 ErrorLevel, A_LastError, 그리고 마지막으로-발견된 창과 같이 전역 설정을 바꾸어 버릴 위험이 있기 때문입니다. 더 자세한 정보는 논평을 보십시오.

CDecl 또는 C: Address가 "C" 호출 관례를 따르도록 만듭니다. 이는 전형적으로 생략됩니다. 왜냐하면 표준 호출 관례가 훨씬 더 많이 역호출에 사용되기 때문입니다.

ParamCount

매개변수의 개수입니다. Address의 호출자가 건넵니다. 전부 생략하면, 기본값은 FunctionName에 정의된 필수 매개변수의 개수입니다. 어느 경우든, 호출자가 정확하게 이 개수의 매개변수를 건네는지 확인하십시오.

EventInfo

FunctionName이 Address를 통하여 호출될 때마다 A_EventInfo에서 보게될 정수입니다. FunctionName이 하나 이상의 Address로 호출될 때 유용합니다. 생략되면, 기본값은 Address입니다. 주의: 다른 전역 설정과 다르게, 현재 쓰레드의 A_EventInfo는 빠른 모드에 영향을 받지 않습니다.

스크립트를 실행하는 파일이 32-비트이면, 이 매개변수는 0부터 4294967295 사이의 값입니다. 64비트이면, 이 매개변수는 64-비트 정수입니다. A_EventInfo는 보통 부호없는 정수를 돌려주지만, 오토핫키는 부호없는 64-비트 정수를 완벽하게 지원하지 못합니다. 그래서 어떤 연산은 그 값을 부호있는 정수에 싸서 돌려주기도 합니다.

역호출 함수의 매개변수

역호출 주소에 할당된 함수는 매개변수를 31개까지 받을 수 있습니다. 선택적 매개변수를 허용합니다. 이는 함수가 여러 호출자에게 호출될 때 유용합니다.

매개변수를 올바르게 번역하려면 x86 호출 관례의 작동 방식을 이해해야 합니다. 오토핫키는 매개변수가 유형이 정의되지 않으므로, 역호출 함수의 매개변수 리스트는 정수로 구성되어 있다고 간주됩니다. 그리고 약간의 재번역이 요구됩니다.

AutoHotkey 32-bit: 들어오는 모든 매개변수는 32-비트 정수입니다. 더 작은 유형은 32비트에 맞게 패드를 덧댑니다. 반면에 더 큰 유형은 두 개의 32 비트 매개변수로 쪼개어집니다.

들어오는 매개변수가 부호있는 정수를 의도하면, 음의 정수는 다음 예제 중 하나로 노출시킬 수 있습니다:

; 방법 #1
if wParam > 0x7FFFFFFF
    wParam := -(~wParam) - 1

; 방법 #2: 오토핫키가 근본적으로 부호 있는 64-비트 정수를 사용한다는 사실에 의존합니다.
wParam := wParam << 32 >> 32

AutoHotkey 64-bit: 들어오는 모든 매개변수는 부호있는 64-비트 정수입니다. 오토핫키는 부호없는 64-비트 정수를 지원하지 않습니다. 더 작으면 64 비트까지 패드가 덧대어지고, 더 크면 언제나 주소로 건네집니다.

AutoHotkey 32-bit/64-bit: 들어오는 매개변수가 8-비트 또는 16-비트를 의도한다면 (또 x64 머신에서는 32-비트 ), 값의 상위 비트들은 "쓰레기"로 채워집니다. 이 쓰레기들은 비트별-and 연산으로 다음 예제와 같이 여과할 수 있습니다:

Callback(UCharParam, UShortParam, UIntParam) {
    UCharParam &= 0xFF
    UShortParam &= 0xFFFF
    UIntParam &= 0xFFFFFFFF
    ;...
}

들어오는 매개변수가 그의 호출자에게 문자열이기를 의도한다면, 실제로 받는 것은 그 문자열의 주소입니다. 문자열 자체를 받으려면 StrGet을 사용하십시오:

MyString := StrGet(MyParameter)  ; AHK_L 46+

들어오는 매개변수가 구조체의 주소이면, 각 멤버들은 다음 DllCall 구조의 단계를 따라 추출합니다.

주소로 매개변수 받기 [AHK_L 60+]: 함수가 가변함수로 선언되어 있으면, 그의 마지막 매개변수는 역호출 함수의 첫 매개변수 주소에 할당됩니다. 스크립트 매개변수에 할당되지 않습니다. 예를 들어:

callback := RegisterCallback("TheFunc", "F", 1)  ; 매개변수 개수를 명시해야 합니다.
TheFunc("TheFunc was called directly.")          ; 직접 TheFunc를 호출합니다.
DllCall(callback, float, 10.5, int64, 42)        ; 역호출을 통하여 TheFunc를 호출합니다.
TheFunc(params*) {
    if IsObject(params)
        MsgBox % params[1]
    else
        MsgBox % NumGet(params+0, "float") ", " NumGet(params+A_PtrSize, "int64")
}

대부분의 역호출함수는 stdcall 호출 관례를 사용합니다. 이 관례는 고정된 개수의 매개변수를 요구합니다. 그러므로, 역호출이 생성될 때 ParamCount를 지정해야 합니다. 64-비트 빌드에서는 ParamCount를 생략할 수 있고 32-비트 빌드는 Cdecl 역호출을 사용합니다 - 그런 경우 모든 선택적인 매개변수는 기본 값을 받고 params에 저장하기 위해 주소를 계산하기 위한 목적으로는 무시됩니다.

함수는 무엇을 돌려주어야 하는가(Return)

함수가 매개변수 없이 Return을 사용하거나, ""와 같이 빈 값을 지정하면 (또는 전혀 Return을 사용하지 않으면), 0이 역호출의 호출자에게 반환됩니다. 그렇지 않으면, 함수는 정수를 반환해야 합니다. 이 값은 그러면 호출자에게 반환됩니다. 오토핫키 32-비트는 반환 값을 32-비트로 잘라냅니다. 반면에 오토핫키 64-비트는 64-비트 반환값을 지원합니다. 이 보다 큰 값을 (값으로) 반환하는 것은 지원하지 않습니다.

빠르게 vs. 느리게

기본/느리게 모드에서 함수는 SendMode 그리고 DetectHiddenWindows와 같은 설정에 대하여 기본 값으로 새롭게 시작합니다. 이 기본값들은 자동-실행 섹션에서 바꿀 수 있습니다 .

대조적으로, 빠른 모드는 함수가 호출되는 순간에 우연하게 실행중인 쓰레드로부터 전역 설정을 물려받습니다. 게다가, 함수가 전역 설정에 가하는 모든 변경은 (ErrorLevel 그리고 마지막으로-발견된 창을 포함하여) 현재 쓰레드 안으로 영향을 줍니다. 결과적으로, 빠른 모드는 정확하게 어느 쓰레드로부터 함수가 호출되는지 알 경우에만 사용해야 합니다.

자기 자신 (또는 다른 쓰레드)로부터 인터럽트되지 않으려면, 역호출함수는 자신의 첫 줄에 임계값(Critical)을 사용해야 합니다. 그렇지만, 이것이 완전하게 효과가 있는 것은 아닙니다. 함수가 0x312 보다 작은 메시지의 도착을 통하여 간접적으로 호출될 때는 효력을 미치지 못합니다 (Critical의 간격을 증가시키면 도움이 될 수 있습니다). 게다가, 임계값(Critical)으로는 함수가 간접적으로 자신을 호출하는 결과가 되는 것을 막지 못합니다. 예를 들어 SendMessage이나 DllCall를 호출하는 것을 막을 수 없습니다.

메모리

RegisterCallback()을 사용할 때마다 작은 메모리가 할당됩니다 (32 바이트에다 약간의 시스템 오버헤드). OS는 스크립트가 종료할 때 이 메모리를 자동으로 해제하기 때문에 , 스크립트가 작은, 고정 개수의 역호출을 등록한다면 명시적으로 메모리를 해제할 필요가 없습니다. 대조적으로, 스크립트가 RegisterCallback()을 무제한/끝없이 호출한다면 명시적으로 다음과 같이 사용되지 않는 역호출 함수를 호출해야 합니다:

DllCall("GlobalFree", "Ptr", Address, "Ptr")

관련 항목

DllCall(), OnMessage(), OnExit, OnClipboardChange, Sort의 역호출, Critical, Post/SendMessage, 함수, 윈도우즈 메시지 리스트, 쓰레드

예제

; 예제: 다음 예제는 작동하는 스크립트로서 모든 최상위 창의 정보를 요약해 보여줍니다.

; 수행성능과 메모리 보전을 위해, 주어진 역호출에 대해서 RegisterCallback()을 한 번만 호출합니다:
if not EnumAddress  ; 빠른-모드는 이 쓰레드에서만 호출되기 때문에 괜찮습니다:
    EnumAddress := RegisterCallback("EnumWindowsProc", "Fast")

DetectHiddenWindows On  ; 빠른 모드 때문에, 이 설정은 역호출에게도 영향을 미칩니다.

; 제어를 EnumWindows()에게 건넵니다. 이 함수는 반복적으로 역호출을 호출합니다:
DllCall("EnumWindows", Ptr, EnumAddress, Ptr, 0)
MsgBox %Output%  ; 역호출이 축적한 정보를 보여줍니다.

EnumWindowsProc(hwnd, lParam)
{
    global Output
    WinGetTitle, title, ahk_id %hwnd%
    WinGetClass, class, ahk_id %hwnd%
    if title
        Output .= "HWND: " . hwnd . "`tTitle: " . title . "`tClass: " . class . "`n"
    return true  ;  EnumWindows()에게 모든 창이 열거될 때까지 계속하라고 명령합니다.
}

; 예제: 다음 작동하는 스크립트로서 GUI 창을 상속받는 법을 보여줍니다.
; 그의WindowProc을 스크립트의 새 WindowProc으로 방향 전환합니다.
; 이 경우, 텍스트 콘트롤의 배경색은 맞춤 색으로 바뀝니다.

TextBackgroundColor := 0xFFBBBB  ; BGR 포맷의 맞춤 색.
TextBackgroundBrush := DllCall("CreateSolidBrush", UInt, TextBackgroundColor)

Gui, Add, Text, HwndMyTextHwnd, Here is some text that is given`na custom background color.
Gui +LastFound
GuiHwnd := WinExist()

; 64-비트 스크립트는 SetWindowLong 대신에 SetWindowLongPtr를 호출해야 합니다:
SetWindowLong := A_PtrSize=8 ? "SetWindowLongPtr" : "SetWindowLong"

WindowProcNew := RegisterCallback("WindowProc", ""  ; ""를 지정하여 상속을 받는데 빠른-모드를 회피합니다.
    , 4, MyTextHwnd)  ; EventInfo 매개변수가 존재하면 정확하게 ParamCount를 지정해야 합니다.
WindowProcOld := DllCall(SetWindowLong, Ptr, GuiHwnd, Int, -4  ; -4 is GWL_WNDPROC
    , Ptr, WindowProcNew, Ptr) ; 반환값은  Ptr 또는 UPtr vs. Int으로 설정해야 합니다.

Gui Show
return

WindowProc(hwnd, uMsg, wParam, lParam)
{
    Critical
    global TextBackgroundColor, TextBackgroundBrush, WindowProcOld
    if (uMsg = 0x138 && lParam = A_EventInfo)  ; 0x138 is WM_CTLCOLORSTATIC.
    {
        DllCall("SetBkColor", Ptr, wParam, UInt, TextBackgroundColor)
        return TextBackgroundBrush  ; HBRUSH을 돌려주어 OS에게 HDC를 변경했다고 알립니다.
    }
    ; 그렇지 않으면 (위가 반환되지 않았기 때문에), 처리되지 않은 모든 이벤트를 원래의 WindowProc에 건넵니다.
    return DllCall("CallWindowProc", Ptr, WindowProcOld, Ptr, hwnd, UInt, uMsg, Ptr, wParam, Ptr, lParam)
}

GuiClose:
ExitApp


RegRead

레지스트리로부터 값을 읽습니다.

RegRead, OutputVar, RootKey\SubKey [, ValueName]  ; v1.1.21+
RegRead, OutputVar, RootKey, SubKey [, ValueName]

매개변수

OutputVar

열람된 값을 저장할 변수의 이름. 변수를 열람할 수 없으면, 변수는 비워지고 ErrorLevel에 1이 설정됩니다.

RootKey

다음 HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT, 또는 HKEY_CURRENT_CONFIG 중 하나 (또는 HKLM와 같은 약자). 원격 레지스트리에 접근하려면, 다음 예제와 같이 컴퓨터 이름과 쌍점을 (또는 v1.1.21+이면, 정사선을) 앞에 배치하십시오: \\workstation01:HKEY_LOCAL_MACHINE

SubKey

하위키의 이름 (예, Software\SomeApplication).

RootKey\SubKey [v1.1.21+]

RootKey 다음에 정사선이 오면 (\), RootKey와 SubKey는 하나의 매개변수로 합병됩니다.

ValueName

열람될 값의 이름. 생략하면, Subkey의 기본 값이 열람됩니다. 이 값은 RegEdit이 "(Default)"로 보여주는 값입니다. 기본 값이 없다면 (즉, RegEdit "value not set"이라고 보여주면), OutputVar는 비워지고 ErrorLevel은 1이 설정됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1이 설정되고 (예를 들어 존재하지 않는 값이나 키) 그렇지 않으면 0이 설정됩니다.

A_LastError은 운영 체제의 GetLastError() 함수의 결과가 저장됩니다.

논평

현재 다음의 값 유형만 지원됩니다: REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD, 그리고 REG_BINARY.

REG_DWORD 값은 언제나 양의 십진수로 표현됩니다.

REG_BINARY 키를 읽을 때 그 결과는 십육진 문자로 구성된 문자열입니다. 예를 들어 REG_BINARY 값이 01,a9,ff,77이면 문자열 01A9FF77로 읽힙니다.

REG_MULTI_SZ 키를 읽을 때, 각 구성요소는 라인피드 문자로 끝납니다 (`n). 구성요소가 없다면, OutputVar는 비워집니다. OutputVar로부터 개별적으로 구성요소를 추출하는 방법을 보여주는 예는 FileSelectFile을 참조하십시오.

REG_BINARY 값이 64K보다 크면 v1.1.10.01 이상에서만 읽을 수 있습니다.

여러 레지스트리 키나 값을 열람하고 처리하려면, 레지스트리-회돌이의 사용을 고려해 보십시오.

원격 컴퓨터의 레지스트리에 접근하는 법에 관한 자세한 정보는 레지스트리-회돌이의 논평을 참조하십시오.

32-비트 스크립트에서 64-비트 섹션의 레지스트리로부터 엔트리를 또는 그 반대로 읽고 쓰려면, SetRegView를 사용하십시오.

관련 항목

RegDelete, RegWrite, Registry-loop, SetRegView, IniRead

예제

; 예제: 프로그램 파일 디렉토리의 경로를 열람합니다.

; 아래의 줄은 OS는 64-비트인데 스크립트는 그렇지 않을 경우,
; 64-비트 프로그램 파일의 경로가 반환된다는 것을 확인합니다.
SetRegView 64  ; v1.1.08+ 필요

RegRead, OutputVar, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion, ProgramFilesDir
MsgBox, Program files are in: %OutputVar%

; 다른 구문 (v1.1.21+ 필요):
RegRead, OutputVar, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion, ProgramFilesDir
MsgBox, Program files are in: %OutputVar%

; 프로그램 파일 디렉토리 경로를 열람하는 또다른 방법:
EnvGet OutputVar, % A_Is64bitOS ? "ProgramW6432" : "ProgramFiles"
MsgBox, Program files are in: %OutputVar%

; 다음 예제는 레지스트리 값의 유형을 열람합니다 (예, REG_SZ 또는 REG_DWORD).
MsgBox % RegKeyType("HKCU", "Environment", "TEMP")
return

RegKeyType(RootKey, SubKey, ValueName)  ; 이 함수는 지정된 값의 유형을 돌려줍니다.
{
    Loop, %RootKey%, %SubKey%
        if (A_LoopRegName = ValueName)
            return A_LoopRegType
    return "Error"
}


RegWrite

레지스트리에 값을 씁니다.

RegWrite, ValueType, RootKey\SubKey [, ValueName, Value]  ; v1.1.21+
RegWrite, ValueType, RootKey, SubKey [, ValueName, Value]

매개변수

ValueType

반드시 REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD, 또는 REG_BINARY 중 하나.

RootKey

반드시 HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT, 또는 HKEY_CURRENT_CONFIG (또는 HKLM와 같은 약자) 중 하나. 원격 레지스트리에 접근하려면, 다음 예제와 같이 앞에 컴퓨터 이름과 쌍점 (또는 v1.1.21+이면, 정사선)을 배치하십시오: \\workstation01:HKEY_LOCAL_MACHINE

SubKey

하위키의 이름 (예, Software\SomeApplication). SubKey가 존재하지 않으면, (필요하면 그의 조상도 함께) 생성됩니다. SubKey가 비어 있으면, 값은 직접적으로 RootKey에 씌여집니다 (그렇지만 어떤 운영 체제는 HKEY_CURRENT_USER이 최상위 레벨에 쓰는 것을 거부할 수도 있습니다).

RootKey\SubKey [v1.1.21+]

RootKey 다음에 바로 정사선 (\)이 따라오면, RootKey 와 SubKey는 하나의 매개변수로 합병됩니다.

ValueName

씌여질 값의 이름. 비어 있거나 생략하면, Subkey의 기본값이 사용됩니다. 기본 값은 RegEdit가 "(Default)"로 보여주는 값입니다.

Value

씌여질 값. 생략하면, ValueType에 따라 빈 문자열 또는 0이 기본값입니다. 텍스트가 길면, 계속 섹션을 수단으로 짧은 줄로 가를 수 있습니다. 이렇게 하면 가독성과 유지관리성이 향상됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 예외시 에러를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

A_LastError은 운영 체제의 GetLastError() 함수의 결과가 설정됩니다.

논평

ValueType이 REG_DWORD이면, Value는 -2147483648와 4294967295 (0xFFFFFFFF) 사이의 값이어야 합니다.

REG_BINARY 키를 쓸 때, 십육진 문자로 구성된 문자열을 사용하십시오. 예를 들어 REG_BINARY 값이 01,a9,ff,77 이면 문자열 01A9FF77을 사용해 쓸 수 있습니다.

REG_MULTI_SZ 키를 쓸 때, 각 구성요소를 다음 구성요소와 라인피드 문자로 갈라야 합니다 (`n). 마지막 구성요소는 선택적으로 라인피드로 끝나도 됩니다. 빈 구성요소는 허용하지 않습니다. 다른 말로, 두 개의 라인피드를 한 줄에 지정하지 마십시오 (`n`n). 왜냐하면 그렇게 하면 예상보다 더 짧은 값이 레지스트리에 씌여지기 때문입니다.

REG_BINARY와 REG_MULTI_SZ 값이 64K보다 크면 v1.1.10.01 이후에서만 지원합니다. 예전 버전에서는 64K까지 만 남기고 잘라내 버립니다.

여러 레지스트리나 키를 열람하고 처리하려면, 레지스트리-회돌이의 사용을 고려해 보십시오.

원격 컴퓨터의 레지스트리에 접근하는 법에 관한 더 자세한 정보는 레지스트리-회돌이의 논평을 참조하십시오.

32-비트 스크립트에서 64비트- 섹션의 레지스트리를 또는 그 반대로 읽고 쓰려면, SetRegView를 사용하십시오.

관련 항목

RegDelete, RegRead, Registry-loop, SetRegView, IniWrite

예제

RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SOFTWARE\TestKey, MyValueName, Test Value
RegWrite, REG_BINARY, HKEY_CURRENT_USER, Software\TEST_APP, TEST_NAME, 01A9FF77
RegWrite, REG_MULTI_SZ, HKEY_CURRENT_USER, Software\TEST_APP, TEST_NAME, Line1`nLine2

; 또다른 구문 (v1.1.21+ 필요):
RegWrite, REG_SZ, HKEY_LOCAL_MACHINE\SOFTWARE\TestKey, MyValueName, Test Value
RegWrite, REG_BINARY, HKEY_CURRENT_USER\Software\TEST_APP, TEST_NAME, 01A9FF77
RegWrite, REG_MULTI_SZ, HKEY_CURRENT_USER\Software\TEST_APP, TEST_NAME, Line1`nLine2


Reload

스크립트의 현재 실행 중인 실체를 새 실체로 교체합니다.

Reload

이 명령어는 자주 변경되는 스크립트에 유용합니다. 핫키를 이 명령어에 할당하면, 변경을 편집기에 저장한 후에 쉽게 스크립트를 재시작할 수 있습니다.

원래 스크립트에 건네지는 명령어-줄 매개변수는 모두 새 실체로 건네지지 않습니다. 그런 매개변수를 전달하려면, Reload를 사용하지 마십시오. 대신에, A_AhkPath 그리고 A_ScriptFullPath와 함께 Run을 사용하십시오 (그리고 스크립트가 컴파일된 형태로 사용되었다면 A_IsCompiled와 함께 사용하십시오). 또, 문자열 /restart를 첫 매개변수로 (즉, 실행파일의 이름 뒤에) 포함하십시오. 그러면 프로그램은 Reload와 같은 행위를 사용합니다. 다음도 참조하십시오: 명령어 줄 스위치와 구문.

스크립트가 시작할 때, 그의 원래 작업 디렉토리에서 (처음 기동될 때 적용되었던 디렉토리에서) 기동합니다. 다른 말로, SetWorkingDir는 새 실체에 사용될 작업 디렉토리를 바꾸지 않습니다.

스크립트를 재적재 할 수 없으면 -- 아마도 구문 에러가 있기 때문에 -- 스크립트의 원래 실체가 계속 실행됩니다. 그러므로, 재적재 명령어는 다음에 실패시에 취하고 싶은 조치가 따라와야 합니다 (예를 들어 return이면 현재 서브루틴을 종료합니다). 원래 실체가 실패를 탐지하도록 만들려면, 다음 예제를 따르십시오:

Reload
Sleep 1000 ; 성공하면, 재적재 때문에 이 실체는 Sleep 시간 동안 닫힙니다. 그래서 아래 줄은 절대 도달하지 못합니다.
MsgBox, 4,, 스크립트를 재적재할 수 없습니다. 편집을 위해 여시겠습니까?
IfMsgBox, Yes, Edit
return

관련 항목

Edit

예제

^!r::Reload  ; Ctrl-Alt-R를 스크립트를 재시작할 핫키에 할당합니다.


Return

함수-호출, Gosub, Hotkey 활성화, GroupActivate, 또는 기타 방법을 통하여, 이전에 점프해 갔던 서브루틴으로부터 돌아옵니다.

Return [, Expression]

매개변수

Expression

이 매개변수는 생략해야 합니다. 단, return이 함수 안에 사용될 때는 예외입니다.

이 매개변수가 표현식이면, 다음은 모두 유효한 예제입니다:

return 3
return "문자열을 그대로 반환"
return MyVar
return i + 1
return true  ; 숫자 1을 돌려주어 "true"를 나타냅니다.
return ItemCount < MaxItems  ; 참이나 거짓을 돌려줍니다.
return FindColor(TargetColor)

알려진 한계: 하위 호환을 위해 그리고 사용의 편의를 위해, 다음 두 예제는 기능적으로 동일합니다:

return MyVar
return %MyVar%

다른 말로, 변수 하나가 퍼센트 사인에 둘러 싸여 있으면 표현식이 아닌 것으로 취급됩니다. 이를 우회하려면, 반괄호로 둘러 싸서 확실하게 표현식으로 만드십시오; 예를 들어: return (%MyVar%).

논평

돌아갈 호출자가 없다면, Return은 대신에 Exit을 수행합니다.

함수로부터 호출자에게 여러 값을 돌려주는 다양한 방법이 있습니다. 값을 호출자에게 돌려주기에 자세하게 기술되어 있습니다.

관련 항목

함수, Gosub, Exit, ExitApp, GroupActivate

예제

#z::
MsgBox Win-Z 핫키가 눌렸습니다.
Gosub MySubroutine
return

MySubroutine:
Sleep 1000
return


Run / RunWait

외부 프로그램을 실행합니다. Run과 다르게, RunWait는 실행을 계속하기 전에 프로그램이 끝날 때까지 기다립니다.

Run, Target [, WorkingDir, Max|Min|Hide|UseErrorLevel, OutputVarPID]

매개변수

Target

기동할 문서, URL, 실행 파일 (.exe, .com, .bat, etc.), 단축 아이콘 (.lnk), 또는 문맥 메뉴 (논평 참조). Target이 지역 파일이고 경로가 지정되어 있지 않으면, A_WorkingDir이 제일 먼저 검색됩니다. 거기에서 부합하는 파일이 없으면, 운영체제는 ("알고 있는") PATH 폴더를 검색해 발견하면 그 파일을 기동합니다.

매개변수를 건네려면, 프로그램이나 문서 이름 다음에 바로 그것들을 추가합니다. 매개변수에 스페이스가 담겨 있다면, (어떤 경우는 겹따옴표 없이도 잘 작동하겠지만) 그것을 겹따옴표 안에 둘러싸는 것이 가장 안전합니다.

WorkingDir

기동된 항목을 위한 작업 디렉토리. 안에 스페이스가 있더라도 이름을 겹따옴표로 둘러싸지 마십시오. 생략하면, 스크립트의 작업 디렉토리가 (A_WorkingDir) 사용됩니다.

Max|Min|Hide
UseErrorLevel

생략되면, Target이 정상 기동합니다. 대안으로, 다음 단어들을 포함할 수 있습니다:

Max: 최대화 기동

Min: 최소화 기등

Hide: 숨은 채로 기동 (위와 조합해 사용할 수 없습니다)

주의: 어떤 어플리케이션은 (예, Calc.exe) 요청한 기동 상태를 준수하지 않습니다. 그런 경우 Max/Min/Hide는 아무 효과가 없습니다.

UseErrorLevel: UseErrorLevel 홀로 지정하거나 위이 단어 중 하나에 추가해 지정할 수 있습니다 (다른 단어와는 스페이스로 구분합니다). 기동에 실패하면, 이 옵션은 경고 대화상자를 건너뛰고, ErrorLevel에 ERROR를 설정하며, 그리고 현재 쓰레드를 계속 진행합니다. 기동에 성공하면, RunWait는 ErrorLevel을 프로그램의 종료 코드에 설정하고, Run은 거기에 0을 설정합니다.

UseErrorLevel이 지정되면, 변수 A_LastError는 운영 체제의 GetLastError() 함수의 결과에 설정됩니다. A_LastError는 0부터 4294967295 사이의 숫자입니다 (십진수가 아니라 언제나 16진수로 포맷됩니다). 영 (0)은 성공을 뜻하지만, 다른 숫자는 기동에 실패했다는 뜻입니다. 각 숫자는 특정한 에러 조건에 상당합니다 (목록은 www.microsoft.com에서 "시스템 에러 코드"를 검색해 보십시오). ErrorLevel처럼, A_LastError는 쓰레드마다 설정됩니다; 즉, 다른 쓰레드가 인터럽트 해도 변경되지 않습니다. 그렇지만, A_LastError는 DllCall이 설정하기도 합니다.

OutputVarPID

새로 기동한 프로그램의 유일한 Process ID (PID)를 저장할 변수의 이름입니다. PID를 결정할 수 없으면 변수는 비어 있습니다, 보통 그런 경우는 실행 파일 보다는 문맥 메뉴, 문서, 또는 단축 아이콘을 기동할 때 일어납니다. RunWait도 이 매개변수를 지원합니다. 그렇지만 그의 OuputVarPID는 반드시 또다른 메쏘드에서 점검해야 합니다 (그렇지 않으면, 다음 RunWait가 실행하는 줄에 도달할 즈음이면 프로세스가 종료되어 버리기 때문에 PID는 무효가 되어 버립니다).

Run 명령어가 PID를 실행한 후, 해당 프로세스가 만든 창은 아직 존재하지 않을 수 있습니다. 적어도 하나의 창은 만들어지기를 기다리려면, WinWait ahk_pid %OutputVarPID%를 사용하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

Run: (위의) UseErrorLevel이 효과가 없는 한, ErrorLevel을 설정하지 않습니다. 실패시 ErrorLevel은 단어 ERROR이 설정되고 성공하면 0이 설정됩니다.

RunWait: ErrorLevel을 프로그램의 종료 코드에 설정합니다 (부호있는 32-비트 정수). UseErrorLevel가 영향을 미치고 기동에 실패하면 단어 ERROR가 저장됩니다.

논평

Run과 다르게, RunWait는 Target이 종료하거나 끝날 때까지 기다립니다. 종료 시에 ErrorLevel이 프로그램의 종료 코드에 설정됩니다 (부호있는 32-비트 정수). 어떤 프로그램은 여전히 실행 중임에도 불구하고 즉시 반환되는 듯 보입니다; 이런 프로그램은 또다른 프로세스를 퍼트립니다.

Target에 쉼표가 담겨 있으면, 다음 예제에 보여주는 바와 같이 세 번 피신시켜야 합니다:

Run rundll32.exe shell32.dll`,Control_RunDLL desk.cpl`,`, 3  ; 제어판 > 디스플레이 > 설정이 열립니다

Comspec을 통하여 프로그램을 실행할 때 (cmd.exe) -- 아마도 프로그램의 입력이나 출력을 방향전환해야 할 필요가 있기 때문에 -- 실행 파일의 이름이나 경로에 스페이스가 포함되어 있으면, 전체 문자열을 바깥쪽에서 따옴표로 둘러 싸야 합니다. 다음 예제에서, 바깥 따옴표는 빨간색으로 보이고 아쪽의 모든 따옴표는 검정색으로 보입니다:

Run %comspec% /c ""C:\My Utility.exe" "param 1" "second param" >"C:\My File.txt""

Target을 기동할 수 없으면, 에러 창이 화면에 나타나고 현재 쓰레드는 종료합니다. 문자열 UseErrorLevel이 세 번째 매개변수에 포함되어 있거나 에러를 Try/Catch 서술문으로 잡는 경우는 예외로 합니다.

Target이 정확한 경로이면, 수행성능이 약간 개선될 수 있습니다. 예, Run, C:\My Documents\Test.txt 말고 Run, C:\Windows\Notepad.exe "C:\My Documents\Test.txt"으로 지정합니다.

특수한 CLSID 폴더는 Run을 통하여 열 수 있습니다. 예를 들어:

Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; "내 컴퓨터" 폴더가 열립니다.
Run ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 쓰레기통이 열립니다.

문맥 메뉴는 탐색창에서 파일에 우클릭하면 나타나는 조치들에 상응합니다. 파일이 문맥 메뉴 없이 기동하면, 기본 문맥 메뉴가 (보통 "open") 그 특정한 파일 유형에 대하여 사용됩니다. 지정하면, 문맥 메뉴는 목표 파일 이름 다음에 따라와야 합니다. 현재 다음 문맥 메뉴를 지원합니다:

*verb | [AHK_L 57+]: 시스템에-정의된 또는 맞춤 문맥 메뉴. 예를 들어: Run *Compile %A_ScriptFullPath% 윈도우즈 비스타 이후에서, *RunAs 문맥 메뉴를 Run As Administrator 우클릭 메뉴 항목 대신에 사용할 수 있습니다.
properties | 지시한 파일에 대하여 탐색기의 특성 창을 보여줍니다. 예를 들어: Run, properties "C:\My File.txt" 주의: 특성 창은 스크립트가 종료할 때 자동으로 닫힙니다. 이를 피하려면, WinWait를 사용해 창이 나타나기를 기다린 다음, WinWaitClose를 사용해 사용자가 닫기를 기다리십시오.
find | 지시된 폴더에 대하여 탐색기의 파일 검색 또는 찾기 창의 실체를 엽니다. 예를 들어: Run, find D:\
explore | 지시된 폴더에 탐색기의 실체를 엽니다. 예를 들어: Run, explore %A_ProgramFiles%.
edit | 지시된 파일을 편집을 위해 엽니다. 지시된 파일의 유형에 "edit" 조치가 연관되어 있지 않으면 작동하지 않을 수도 있습니다. 예를 들어: Run, edit "C:\My File.txt"
open | 지시된 파일을 엽니다 (보통 필요하지 않습니다. 대부분의 파일 유형에 기본 조치이기 때문입니다). 예를 들어: Run, open "My File.txt".
print | 지시된 파일을 연관된 어플리케이션으로 인쇄합니다. 예를 들어: Run, print "My File.txt"

RunWait가 대기 상태에 있는 동안, 새 쓰레드를 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 기동할 수 있습니다.

관련 항목

RunAs, Process, Exit, CLSID List, DllCall

예제

Run, Notepad.exe, C:\My Documents, max

Run, mailto:someone@domain.com?subject=이것은 제목 줄입니다&body=이것은 메시지 몸체의 텍스트입니다.
Run, ReadMe.doc, , Max UseErrorLevel  ; 최대화 상태로 기동하고 실패하더라도 대화상자를 보여주지 않습니다.
if ErrorLevel = ERROR
    MsgBox 문서를 기동할 수 없었습니다.

RunWait, %comspec% /c dir c:\ >>c:\DirTest.txt, , min
Run, c:\DirTest.txt
Run, properties c:\DirTest.txt

Run, http://www.google.com ; 즉, 어떤 URL도 기동할 수 있습니다.
Run, mailto:someone@somedomain.com  ; 기본 이메일 프로그램이 열립니다.

Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; "내 컴퓨터" 폴더가 열립니다.
Run ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 쓰레기통이 열립니다.

; 여러 명령어를 연속적으로 실행하려면, 사이에 "&&"를 사용하십시오:
Run, %comspec% /c dir /b > C:\list.txt && type C:\list.txt && pause

; 다음을 사용하여 명령어를 실행하고 그 출력을 열람할 수 있습니다:
MsgBox % RunWaitOne("dir " A_ScriptDir)

; ...또는 단 번에 여러 명령어를 실행하고 그 출력을 열람합니다:
MsgBox % RunWaitMany("
(
echo 명령어는 여기에 배치합니다,
echo 하나씩 실행될 것이고,
echo 결국 출력을 얻게 될 것입니다.
)")

RunWaitOne(command) {
    ; WshShell 객체: http://msdn.microsoft.com/en-us/library/aew9yb99
    shell := ComObjCreate("WScript.Shell")
    ; cmd.exe를 통하여 명령어 하나를 실행합니다.
    exec := shell.Exec(ComSpec " /C " command)
    ; 그 명령어의 출력을 읽어 돌려줍니다
    return exec.StdOut.ReadAll()
}

RunWaitMany(commands) {
    shell := ComObjCreate("WScript.Shell")
    ; 명령어 반향을 끄고 cmd.exe를 엽니다
    exec := shell.Exec(ComSpec " /Q /K echo off")
    ; 실행할 명령어를 새줄문자로 갈라서 전송합니다.
    exec.StdIn.WriteLine(commands "`nexit")  ; 언제나 결국 종료합니다!
    ; 모든 명령어의 출력을 읽어 돌려줍니다.
    return exec.StdOut.ReadAll()
}

; ExecScript: 주어진 코드를 새 AutoHotkey 프로세스로 실행합니다.
ExecScript(Script, Wait:=true)
{
    shell := ComObjCreate("WScript.Shell")
    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")
    exec.StdIn.Write(script)
    exec.StdIn.Close()
    if Wait
        return exec.StdOut.ReadAll()
}

; 예제:
InputBox expr,, 새 스크립트로 평가할 표현식을 입력하십시오.,,,,,,,, Asc("*")
result := ExecScript("FileAppend % (" expr "), *")
MsgBox % "Result: " result


RunAs

연이어 사용할 모든 Run 그리고 RunWait에 대하여 사용자 신용장 세트를 지정합니다.

RunAs [, User, Password, Domain]

매개변수

User

이 매개변수와 다른 모든 매개변수를 모두 생략하면, RunAs 특징은 꺼집니다. 그러면 Run과 RunWait는 그들의 기본 행위로 복구됩니다. 그렇지 않으면, 이것은 사용자 이름으로서 그 아래에 새 프로세스가 생성될 것입니다.

Password

User의 암호.

Domain

User의 영역. 로컬 계정을 사용하려면, 이 매개변수를 비워 두십시오. 작동에 실패하면, @YourComputerName를 사용해 보십시오.

논평

이 명령어는 오로지 AutoHotkey에게 앞으로 Run과 RunWait를 사용할 때마다 전부 보조 사용자 신용장을 사용하라고 (또는 사용하지 말라고) 알리는 일만 합니다.

ErrorLevel은 이 명령어로 바뀌지 않습니다. 무효한 User, Password, 또는 Domain이 지정되면, Run과 RunWait는 문제를 설명하는 에러 메시지를 보여줍니다 (단, 그들의 UseErrorLevel 옵션이 켜져 있는 경우는 예외입니다).

RunAs 특징이 켜져 있는 동안, Run과 RunWait는 문서, URL, 또는 시스템 명령어를 기동할 수 없습니다. 다른 말로, 기동될 파일은 반드시 실행 파일이어야 합니다.

이 명령어가 작동하려면 "보조 로그온" 서비스가 자동이든 수동이든 설정되어 있어야 합니다 (수동으로 설정되어 있을지라도 요구하면 OS는 자동으로 그 서비스를 시작합니다). 역주: 보조 로그온(Secondary logon) 서비스는 윈도우 계정으로 관리자 권한이 필요한 작업을 수행할 수 있습니다.

관련 항목

Run, RunWait

예제

RunAs, Administrator, MyPassword
Run, RegEdit.exe
RunAs  ; 정상 행위로 재설정합니다.


Send / SendRaw / SendInput / SendPlay / SendEvent: Send Keys & Clicks

키눌림과 마우스 클릭을 흉내내어 활성 창에 전송합니다.

Send Keys
SendRaw Keys
SendInput Keys
SendPlay Keys
SendEvent Keys

매개변수

Keys

전송할 키 연속열. 다른 명령어처럼, 첫 매개변수 앞의 쉼표는 선택적입니다.

날 모드: SendRaw 명령어는 모든 문자들 문자 그대로 해석합니다. {Enter}를 ENTER 키눌림으로, ^c를 Control-C로, 등등 변환하지 않습니다. 그렇지만, 피신 연속열의 정상 규칙, 변수 참조 그리고 표현식은 여전히 적용됩니다. 왜냐하면 명령어가 실행되기 전에 이것들이 먼저 처리되기 때문입니다. SendInput, SendPlay, 또는 SendEvent에 날 모드를 사용하려면, 문자열에서 첫 항목에 {Raw}를 쓰십시오. 예를 들어: SendInput {Raw}abc.

정상 모드: 날 모드가 아닐 때, 다음 문자들은 수식자로 취급됩니다 (이 수식 키들은 바로 다음 키에만 영향을 줍니다):

!: ALT 키눌림을 전송합니다. 예를 들어, Send This is text!a는 "This is text"를 전송한 다음 ALT+a를 누릅니다. 주의: !A는 어떤 프로그램에서는 !a와 전혀 다른 효과를 냅니다. 이것은 !A가 ALT+SHIFT+A를 누르는 반면 !a는 ALT+a를 누르기 때문입니다. 잘 모르겠으면, 소문자를 사용하십시오.

+: SHIFT 키눌림을 전송합니다. 예를 들어, Send +abC는 "AbC"를 전송하고, Send !+a는 ALT+SHIFT+a를 누릅니다.

^: CONTROL 키눌림을 전송합니다. 예를 들어, Send ^!a는 CTRL+ALT+a를 누르고, Send ^{Home}는 CONTROL+HOME을 누릅니다. 주의: ^A는 어떤 프로그램에서 ^a와 전혀 다른 효과를 냅니다. 왜냐하면 ^A는 CONTROL+SHIFT+A를 누르는 반면 ^a는 CONTROL+a를 누르기 때문입니다. 잘 모르겠으면, 소문자를 사용하십시오.

#: WIN 키눌림을 전송합니다. 그러므로 Send #e는 Windows 키를 누른 채로 기호 "e"를 누릅니다.

SendInput그리고 SendPlay [v1.0.43+]: SendInput 그리고 SendPlay는 Send와 같은 구문을 사용합니다. 그러나 일반적으로 더 빠르고 더 신뢰성이 있습니다. 게다가, 전송하는 동안에 물리적 키눌림과 마우스 클릭을 버퍼 처리해 줍니다. 그 덕분에 사용자의 키눌림이 흩어지지 않고 온전하게 전송됩니다. SendMode을 사용하면 Send를 SendInput 또는 SendPlay과 똑같이 만들 수 있습니다. 각 모드에 관하여 더 자세한 정보는 아래의 SendInput 그리고 SendPlay를 참조하십시오.

SendEvent [v1.0.43+]: SendEvent는 1.0.43-이전의 Send 명령어와 같은 방법으로 키눌림을 전송합니다. 키눌림의 전송 비율은 SetKeyDelay로 결정됩니다. 기본값으로, Send는 SendEvent와 동일하지만; SendMode를 통하여 SendInput이나 SendPlay와 같게 만들 수 있습니다 .

Key Names: 다음 테이블은 전송이 가능한 특수 키들을 나열합니다. (각 키 이름은 활괄호로 둘러싸야 합니다):

키 이름 | 결과 키눌림
{F1} - {F24} | 기능 키. 예를 들어: {F12}는 F12 키.
{!} !
{#} #
{+} +
{^} ^
{{} {
{}} }
{Enter} | 메인 키보드의 엔터키
{Escape} 또는 {Esc} | ESCAPE
{Space} | SPACE (스페이스가 전송할 문자열의 앞이나 뒤에 나타날 때 필요합니다 -- 가운데 있는 스페이스는 문자 그대로 스페이스입니다)
{Tab} | 탭키
{Backspace} 또는 {BS} | 백스페이스
{Delete} 또는 {Del} | 삭제
{Insert} 또는 {Ins} | 삽입
{Up} | 메인 위 화살표 키
{Down} | 메인 아래 화살표 키
{Left} | 메인 왼쪽 화살표 키
{Right} | 메인 오른쪽 화살표 키
{Home} | 메인 홈 키
{End} | 메인 엔드 키
{PgUp} | 메인 페이지 업 키
{PgDn} | 메인 페이지 다운 키
{CapsLock} | CapsLock (Win 2k/XP이라면 SetCapsLockState을 사용하는 편이 더 신뢰성이 높습니다). {CapsLock}를 전송하려면 미리 SetStoreCapslockMode Off이 되어 있어야 합니다.
{ScrollLock} | ScrollLock (다음도 참조: SetScrollLockState)
{NumLock} | NumLock (다음도 참조: SetNumLockState)
{Control} 또는 {Ctrl} | CONTROL (기술 정보: 좌우 구분 없는 가상 키를 보내지만 스캔 코드는 왼쪽을 전송함)
{LControl} 또는 {LCtrl} | 왼쪽 CONTROL 키 (기술 정보: 좌우 구분 없는 가상 키가 아니라 왼쪽 가상 키를 전송함)
{RControl} 또는 {RCtrl} | 오른쪽 CONTROL 키
{Control Down} 또는 {Ctrl Down} | {Ctrl Up}이 전송될 때까지 CONTROL 키를 누릅니다. 대신에 왼쪽 또는 오른쪽 키를 누르고 있으려면, {RCtrl Down}과 {RCtrl Up}을 사용하십시오.
{Alt} | ALT (기술 정보: 좌우 구분없는 가상 키를 전송하지만 스캔 코드는 왼쪽 스캔코드를 전송함)
{LAlt} | 왼쪽 ALT 키 (기술 정보: 좌우 구분없는 가상 키가 아니라 왼쪽 가상 키를 전송합니다)
{RAlt} | 오른쪽 ALT 키 (또는 키보드 레이아웃에 따라 AltGr)
{Alt Down} | {Alt Up}이 전송될 때까지 ALT 키를 누릅니다. 대신에 왼쪽 또는 오른쪽 키를 누르고 있으려면 {RAlt Down}과 {RAlt Up}을 사용하십시오.
{Shift} | SHIFT (기술 정보: 좌우 구분없는 가상 키를 전송하지만 스캔코드는 왼쪽 스캔코드를 전송함)
{LShift} | 왼쪽 SHIFT 키 (기술 정보: 좌우 구분 없는 가상 키가 아니라 왼쪽 가상 키를 전송함)
{RShift} | 오른쪽 SHIFT 키
{Shift Down} | {Shift Up}이 전송될 때까지 SHIFT 키를 누릅니다. 대신에 왼쪽 또는 오른쪽 키를 누르고 있으려면 {RShift Down}과 {RShift Up}을 사용하십시오.
{LWin} | 왼쪽 Windows 키
{RWin} | 오른쪽 Windows 키
{LWin Down} | {LWin Up}이 전송될 때까지 왼쪽 Windows 키를 누릅니다
{RWin Down} | {RWin Up}이 전송될 때까지 오른쪽 Windows 키를 누릅니다
{AppsKey} | Windows App 키 (오른쪽 클릭 또는 문맥 메뉴를 요청합니다)
{Sleep} | 컴퓨터 SLEEP 키.
{ASC nnnnn}

ALT+nnnnn 키패드 조합을 전송합니다. 이를 이용하여 키보드에 존재하지 않는 특수 문자들을 발생시킬 수 있습니다. ASCII 문자들을 발생시키려면, 1부터 255 사이의 숫자를 지정하십시오. (대부분의 언어에 표준인) ANSI 문자를 발생시키려면, 128부터 255 사이의 숫자를 지정하되, 앞에 0을 덧붙이십시오. 예, {Asc 0133}.

유니코드 문자는 256부터 65535 사이의 숫자를 지정해 발생시킬 수 있습니다 (앞에 0을 붙이지 않음). 그렇지만, 이 방법은 모든 어플리케이션에서 지원되지는 않습니다. 대안은 아래 섹션을 참조하십시오.
{U+nnnn}

[AHK_L 24+]: 유니코드 문자를 전송합니다. nnnn은 앞에 0을 제외하고 문자의 십육진 값입니다. 유니코드 버전의 오토핫키에서는 자동으로 Send와 ControlSend이 유니코드 텍스트를 지원하기 때문에 이 방법이 필요하지 않습니다.

문자가 가상 키보드에 짝지어지지 않는다면, SendInput() 또는 WM_CHAR을 이용해 그 문자를 전송할 수 있습니다. 현재의 Send 모드는 아무 효과가 없습니다.

{vkXX}
{scYYY}
{vkXXscYYY}

가상 키 XX와 스캔 코드 YYY인 키눌림을 전송합니다. 예를 들어: Send {vkFFsc159}. sc 또는 vk 부분을 생략하면, 그 자리에 가장 적절한 값이 전송됩니다.

XX와 YYY에 대한 값들은 십육진수이고 보통 메인 창이 View->Key history 메뉴 항목을 통하여 알아낼 수 있습니다. 다음도 참조: 특수 키
{Numpad0} - {Numpad9} | 넘패드 숫자 키 (Numlock을 켜면 보임). 예를 들어: {Numpad5}는 숫자 5입니다.
{NumpadDot} | 넘패드 점 (Numlock을 켜면 보임).
{NumpadEnter} | 키패드의 엔터 키
{NumpadMult} | 넘패드 곱셈 키
{NumpadDiv} | 넘패드 나눗셈 키
{NumpadAdd} | 넘패드 덧셈 키
{NumpadSub} | 넘패드 뺄셈 키
{NumpadDel} | 키패드의 삭제 키 (이 키와 아래의 넘패드 키들은 Numlock이 꺼져 있을 때 사용됩니다)
{NumpadIns} | 키패드의 삽입 키
{NumpadClear} | 키패드의 소거 키 (보통 Numlock이 꺼져 있을 때 '5' 키).
{NumpadUp} | 키패드의 위 화살표 키
{NumpadDown} | 키패드의 아래 화살표 키
{NumpadLeft} | 키패드의 왼쪽 화살표 키
{NumpadRight} | 키패드의 오른쪽 화살표 키
{NumpadHome} | 키패드의 홈 키
{NumpadEnd} | 키패드의 엔드 키
{NumpadPgUp} | 키패드의 페이지-업 키
{NumpadPgDn} | 키패드의 페이지-다운 키
{Browser_Back} | 브라우저의 "back" 버튼
{Browser_Forward} | 브라우저의 "forward" 버튼
{Browser_Refresh} | 브라우저의 "refresh" 버튼
{Browser_Stop} | 브라우저의 "stop" 버튼
{Browser_Search} | 브라우저의 "search" 버튼
{Browser_Favorites} | 브라우저의 "favorites" 버튼
{Browser_Home} | 브라우저를 기동하고 홈페이지로 갑니다
{Volume_Mute} | 마스터 볼륨 음소거. 보통 SoundSet, +1, , mute와 동등함.
{Volume_Down} | 마스터 볼륨을 줄입니다. 보통 SoundSet -5와 동등.
{Volume_Up} | 마스터 볼륨을 높입니다. 보통 SoundSet +5와 동등함.
{Media_Next} | 미디어 플레이어에서 다음 트랙으로
{Media_Prev} | 미디어 플레이어에서 이전 트랙으로
{Media_Stop} | 미디어 플레이어 중지
{Media_Play_Pause} | 미디어 플레이어 정지/연주
{Launch_Mail} | 이메일 어플리케이션 기동
{Launch_Media} | 미디어 플레이어 기동
{Launch_App1} | 사용자 app1 기동
{Launch_App2} | 사용자 app2 기동
{PrintScreen} | 화면 인쇄
{CtrlBreak} | Ctrl+break
{Pause} | 정지
{Click [Options]}
[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}는 추가 Control 키눌림을 생략합니다; 그러므로: 1) LWin/RWin 키를 눌러도 시작 메뉴가 촉발되지 않습니다; 2) Alt 키를 눌러도 메뉴 바가 활성화되지 않습니다.

맹목-모드는 키를 리맵핑할 때 내부적으로 사용됩니다. 예를 들어, 리맵핑 a::b는: 1) "a"를 타자하면 "b"를 생산하고; 2) 대문자 A를 타자하면 대문자 B를 생산하며 ; 그리고 3) Control-A를 타자하면 Control-B를 생산합니다.

{Blind}는 SendRaw과 ControlSendRaw가 지원하지 않습니다. 게다가, SendPlay도 완벽하게는 지원하지 못합니다. 특히 수식 키들을 다룰 때 (Control, Alt, Shift, 그리고 Win) 지원하지 못합니다.
{Raw}
[v1.0.43+] 		키눌림을 보이는 그대로 전송합니다. {Enter}를 ENTER 키눌림으로 변환하지 않고, ^c를 Control-C로 변환하지 않습니다, 등등. 문자열 {Raw}는 문자열의 시작부터 일어날 필요는 없지만, 일단 지정되면, 문자열의 나머지에 효과를 유지합니다.

키를 반복하기 또는 키를 누르고 있기

키를 반복하려면: 키의 이름에 활괄호를 두르고 다음에 반복할 횟수를 지정합니다. 예를 들어:

Send {DEL 4}  ; Delete 키를 4 번 누릅니다.
Send {S 30}   ; 대문자 S를 30개 전송합니다.
Send +{TAB 4}  ; Shift-Tab을 4 번 누릅니다.

키를 누르고 있거나 떼기: 키의 이름을 활괄호로 둘러싸고 다음에 단어 Down 또는 Up을 지정합니다. 예를 들어:

Send {b down}{b up}
Send {TAB down}{TAB up}
Send {Up down}  ; 위 화살표 키를 누릅니다.
Sleep 1000  ; 1초 동안 누르고 있습니다.
Send {Up up}  ; 위 화살표 키를 뗍니다.

키가 위의 방법을 통하여 눌릴 때, 자동 반복을 시작하지 않습니다. 반면에 물리적으로 키를 누르고 있으면 자동 반복을 시작합니다 (이것은 자동-반복이 드라이버/하드웨어의 특징이기 때문입니다). 그렇지만, Loop를 사용하면 자동 반복을 흉내낼 수 있습니다. 다음 예제는 20 개의 탭 키눌림을 전송합니다:

Loop 20
{
    Send {Tab down}  ; 자동-반복은 연속적인 누르기 이벤트로 구성됩니다 (업-이벤트 없음).
    Sleep 30  ; 키 눌림 사이에 대기하는 밀리 초 (또는 SetKeyDelay를 사용하십시오).
}
Send {Tab up}  ; 키를 뗍니다.

단어 DownTemp도 사용할 수 있습니다. 그의 효과는 수식 (Control/Shift/Alt/Win) 키를 제외하고 Down과 똑 같습니다. 그런 경우, DownTemp는 연이은 전송에 키가 영구히 눌려 있는 것은 아니며, 그러므로 키눌림이 요구하면 언제든지 떼어도 좋다고 알려줍니다. 예를 들어, Send {Control DownTemp} 다음에 Send a가 따라오면 보통의 "a" 키눌림을 생산하며, control-A 키눌림을 생산하지 않습니다.

총평

Send 명령어가 지원하는 문자에 특별한 제한은 없습니다. 문자가 현재 키보드 레이아웃에 존재하지 않으면, 오토핫키 버전에 따라 유니코드 문자 패킷 또는 Alt+nnnnn 조합을 전송해 흉내낼 수 있습니다. 유니코드 문자는 텍스트로 유니코드 버전의 오토핫키에서 직접적으로 지원합니다. 또는 다른 버전이라면 {U+nnnn} 표기법을 사용하면 됩니다.

SendInput/SendPlay와 비교한 BlockInput: BlockInput 명령어는 사용자가 물리적으로 타자하는 키 눌림이 흉내낸 키눌림에 방해를 받지 않도록 막아 주지만, 종종 SendInput이나 SendPlay를 사용하면 더 좋은 경우가 있습니다. 키눌림과 마우스 클릭이 인터럽트가 불가능합니다. BlockInput과 다르게, SendInput/Play 는 전송하는 동안 사용자가 타자한 키들을 버리지 않습니다; 대신, 그런 키들은 버퍼 처리되었다가 나중에 전송됩니다.

엄청나게 많은 키눌림을 전송할 경우, 계속 섹션을 사용하면 가독성과 유지관리성을 개선할 수 있습니다.

운영 체제는 CTRL-ALT-DELETE 조합을 허용하지 않기 때문에, Send ^!{Delete}와 같이 하더라도 아무 효과가 없습니다.

Send는 아무 효과가 없을 수 있습니다 Windows Vista 이후 활성 창이 관리자 권한으로 실행중인데 스크립트는 관리자 권한이 없으면 그렇습니다. 이것은 사용자 인터페이스 권한 격리(User Interface Privilege Isolation) 보안 매커니즘 때문입니다.

SendInput [v1.0.43+]

SendInput은 일반적으로 키눌림과 마우스 클릭을 전송하는 데 선호되는 방법입니다. 왜냐하면 속도가 월등하고 신뢰성이 있기 때문입니다. 대부분의 상황에서, SendInput은 거의 즉시 실행됩니다. 기다란 문자열을 보내도 순식간입니다. SendInput은 빠르기 때문에, 더 신뢰성이 있습니다. 왜냐하면 다른 창이 의도치 않게 나타나거나 키눌림을 가로 채는 빈도가 줄어들기 때문입니다. SendInput 동안에 사용자가 타자하면 연기되었다가 나중에 처리되므로 신뢰성은 더욱 개선됩니다.

다른 전송 모드와 다르게, 운영 체제는 SendInput을 대략 5000 문자로 제한합니다 (이 값은 운영 체제의 버전과 수행성능 설정에 따라 달라집니다). 이 제한을 넘어서 문자들과 이벤트들은 전송되지 않습니다.

주의: SendInput은 SetKeyDelay를 무시합니다. 왜냐하면 운영 체제가 이 모드에서는 지연 시간을 지원하지 않기 때문입니다. 그렇지만, 아래에 기술한 상황 아래에서 SendInput은 SendEvent에 의존합니다. SendEvent는 SetKeyDelay -1, 0를 사용합니다 (단, SendEvent의 키 지연시간이(KeyDelay) -1,-1인 경우는 예외입니다. 이 경우는 -1,-1이 사용됩니다). SendInput이 SendPlay에 의존할 때, SendPlay의 키 지연시간(KeyDelay)을 사용합니다.

SendInput을 실행하는 스크립트에 저-수준 키보드 갈고리가 설치되어 있다면, SendInput은 자동으로 SendEvent에 의존합니다 (아니면 SendMode InputThenPlay가 켜져 있을 경우라면 SendPlay에 의존합니다). 외부 갈고리의 존재 때문에 SendInput의 모든 장점이 가려집니다. 그 때문에 SendPlay와 SendEvent에 비해 열등합니다. 그렇지만, SendInput은 AutoHotkey v1.0.43+이 아니라면 저-수준 갈고리를 탐지할 수 없기 때문에, 이런 경우는 의존할 것이 없으므로 SendPlay/Event 보다 신뢰성이 더 떨어집니다.

SendInput이 {Click}와 같은 수단을 통하여 마우스 클릭을 전송할 때 그리고 CoordMode Mouse, Relative가 켜져 있을 때 (기본값), 모든 클릭은 전송이 시작될 때 활성화 된 창에 상대적입니다. 그러므로, SendInput이 의도적으로 (알트-탭 같은 수단으로) 또다른 창을 활성화하면, 같은 명령어 안에서 연이은 클릭의 좌표들은 오류가 일어납니다. 왜냐하면 여전히 새 창이 아니라 예전 창에 상대적이기 때문입니다.

SendPlay [v1.0.43+]

SendPlay의 가장 큰 장점은 다른 모드와 다르게 광범위한 게임에서 마우스 클릭과 키눌림을 "재시연"할 수 있다는 것입니다. 예를 들어, 특정한 게임은 오직 SendPlay 옵션이이 있을 경우에만 핫스트링을 받아 들입니다. 그렇지만, SendPlay는 Windows Vista 이후에서 사용자 계정 통제(User Account Control)가 켜져 있으면, 아무 효과가 없습니다. 스크립트가 사용자 권한으로 실행되어도 마찬가지입니다. 다음 스크립트는 이 문제의 우회책을 제공합니다: http://www.autohotkey.com/forum/topic75595.html.

세 가지 전송 모드 중에서, SendPlay가 가장 이상합니다. 왜냐하면 키눌림과 마우스 클릭을 사실상 흉내내지 않기 때문입니다. 대신에, 일련의 이벤트 (메시지)를 만들어 냅니다. 그 메시지들이 활성 창으로 직접 흘러 들어갑니다 (ControlSend와 비슷하게, 그러나 낮은 수준에서). 결과적으로, SendPlay는 핫키나 핫트링을 촉발시키지 않습니다.

SendInput처럼, SendPlay의 키눌림은 사용자가 타자한 키눌림 때문에 흩어지지 않습니다. 그래서, 사용자가 어쩌다가 SendPlay 중에 타자를 하더라도, 그런 키눌림은 연기되었다가 나중에 처리됩니다.

SendPlay는 SendInput에 비해 상당히 느립니다. 그러나 보통 전통적인 SendEvent 모드 보다는 빠릅니다 (KeyDelay가 -1일 경우에도 마찬가지입니다).

Windows 키 (LWin 그리고 RWin)는 키보드 갈고리가 설치되어 있으면 SendPlay 동안 자동으로 막힙니다. 이 덕분에 전송하는 동안에 사용자가 우발적으로 Windows 키를 눌러도 시작 메뉴가 나타나지 않습니다. 대조적으로, LWin와 RWin 말고 다른 키들은 막아줄 필요가 있습니다. 왜냐하면 운영 체제가 자동으로 키들을 (버퍼 처리하여) SendPlay가 끝날 때까지 연기해 주기 때문입니다.

SendPlay는 SetKeyDelay와 SetMouseDelay의 표준 설정을 사용하지 않습니다. 대신에, 기본값으로 전혀 대기 시간이 없습니다. 이 대기 시간은 다음 예제와 같이 바꿀 수 있습니다:

SetKeyDelay, 0, 10, Play  ; SendPlay 모드에서는 0과 -1이 같음을 주목하십시오.
SetMouseDelay, 10, Play

SendPlay는 Capslock, Numlock, 또는 Scroll-lock 키를 켜고 끌 수 없습니다. 비슷하게, GetKeyState로 보이는 키의 상태를 바꿀 수 없습니다. 단, 그 키눌림들이 스크립트의 창 중에 하나로 전송된다면 예외입니다. 그 때까지, 왼쪽/오른쪽 수식키에 변화가 있다면 (예, RControl) 오직 좌우 구분 없는 수식키를 통해서만 탐지할 수 있습니다 (예, Control). 또, SendPlay는 SendMode 페이지에 기술된 다른 제한도 있습니다.

SendInput 그리고 SendEvent과 다르게, 사용자는 Control-Alt-Del이나 Control-Escape를 눌러서 SendPlay를 인터럽트할 수 있습니다. 이런 일이 일어날 때, 나머지 키눌림은 전송되지 않지만 스크립트른 마치 SendPlay가 정상적으로 전송을 완료한 것처럼 실행을 계속합니다.

SendPlay는 send LWin과 RWin 이벤트를 보낼 수 있지만, 창에 직접적으로 전송합니다. 운영 체제 고유의 기능을 수행하지 않습니다. 이를 우회하려면 SendEvent를 사용하십시오. 예를 들어, SendEvent #r는 시작 메뉴의 실행 대화상자를 보여줄 것입니다.

관련 항목

SendMode, SetKeyDelay, SetStoreCapslockMode, 피신 연속열 (예, `%), ControlSend, BlockInput, 핫스트링, WinActivate

예제

Send Sincerely,{enter}John Smith  ; 두 줄의 서명을 타자합니다.
Send !fs ; File->Save 메뉴를 선택합니다 (Alt+F를 누른 다음 S).
Send {End}+{Left 4} ; 텍스트 끝으로 점프해서 네 개의 shift+left-arrow 키눌림을 전송합니다.
SendInput {Raw}기다란 날 문자열들이 빠른 방법을 사용하여 전송됨 (SendInput).


SendLevel

SendLevel [v1.1.06+]

핫키와 핫스트링이 무시하는 인위적인 키보드 그리고 마우스 이벤트를 제어합니다.

SendLevel, Level

매개변수

Level

0부터 100 사이이 정수, 표현식 가능.

총평

기본값으로, 갈고리와 핫키 그리고 핫스트링은 오토핫키 스크립트가 발생시킨 키보드와 마우스 이벤트를 무시합니다. 어떤 경우는 이 행위를 오버라이드하면 유용합니다; 예를 들면, 리맵 키를 다른 핫키를 촉발시키는 데 사용할 수 있습니다. SendLevel과 #InputLevel은 이를 완수하는 수단을 제공합니다.

SendLevel은 현재의 스크립트 쓰레드로 발생된 이벤트에 대하여 레벨을 설정합니다. 반면에 #InputLevel은 그 아래에 있는 핫키나 핫스트링에 대하여 레벨을 설정합니다. 스크립트가 발생시킨 이벤트가 다른 핫키나 핫스트링을 촉발할 수 있으려면, 이벤트의 전송 레벨이 핫키나 핫스트링의 입력 레벨보다 더 높아야 합니다.

호환성:

  • SendPlay는 SendLevel에 영향을 받지 않습니다.
  • SendInput은 SendLevel에 영향을 받습니다. 그러나 스크립트의 갈고리 핫키는 SendInput이 진행 중인 동안 활성화될 수 없습니다. 왜냐하면 SendInput이 임시로 갈고리를 끄기 때문입니다.
  • "reg" 방법을 사용하는 핫키는 물리적 입력과 인위적 입력을 구별할 수 있습니다. 그래서 SendLevel에 영향을 받지 않습니다. 그렇지만, 레벨이 0보다 높은 핫키는 언제나 키보드 또는 마우스 갈고리를 사용합니다.
  • 자동-교체 핫스트링은 언제나 레벨 0에서 키눌림을 발생시킵니다. 왜냐하면 교체 텍스트가 또다른 핫스트링 또는 핫키를 촉발시키는 것은 보통 바람직하지 않기 때문입니다. 이를 우회하려면, 비-자동-교체 핫스트링과 Send 명령어를 사용하십시오.
  • 현재 키보드 레이아웃에 있는 키와 상응하지 않는 문자는 핫스트링을 촉발시킬 수 없습니다. SendLevel이 사용되어도 마찬가지입니다. 이것은 핫스트링 인식자의 한계입니다.

새로 기동된 핫키 또는 핫스트링 쓰레드는 전송 레벨을 입력 레벨과 같게 설정하고 시작합니다. 새로 기동된 다른 쓰레드는 (예를 들어 맞춤 메뉴 항목 또는 타이머 서브루틴) 기본 설정을 가지고 새롭게 시작합니다. 기본값은 보통 0이지만 자동-실행 섹션에 이 명령어을 사용하여 바꿀 수 있습니다.

SendLevel이 자동-실행 섹션에 사용되면, 키보드와 마우스 리맵핑에도 영향을 줍니다.

v1.1.06 미만 버전 마치#InputLevel 0 그리고 SendLevel 0이 켜진 것처럼 행위합니다.

관련 항목

#InputLevel, Send, Click, MouseClick, MouseClickDrag

예제

SendLevel 1
Send btw{Space} ; "by the way "를 생산.

; 별도의 스크립트에 정의할 수 있습니다:
::btw::by the way


SendMode

SendMode [v1.0.43+]

Send를 기본 (SendEvent)이 아니라 SendInput 또는 SendPlay와 동의어로 만듭니다. 또한 Click과 MouseMove/Click/Drag가 지정한 방법을 사용하도록 만듭니다.

SendMode Input|Play|Event|InputThenPlay

첫 매개변수는 다음 단어 중 하나입니다:

Event: 모든 스크립트가 시작할 때 사용하는 기본 값입니다. Send, SendRaw, Click, 그리고 MouseMove/Click/Drag에 대하여 SendEvent 방법을 사용합니다.

Input: Send, SendRaw, Click, 그리고 MouseMove/Click/Drag에 대하여 SendInput 방법으로 전환합니다 .

    알려진 한계:
  • 윈도우즈 탐색기는 SendInput의 어떤 항해 핫키를 무시합니다. 예를 들어 Alt+LeftArrow와 같은 경우, 이를 우회하려면, SendEvent !{Left} 또는 SendInput {Backspace}를 사용하십시오.

InputThenPlay [v1.0.43.02+]: 위와 동일합니다. 그러나 SendInput이 사용 불가능할 때 Event 모드에 의존하기 보다, Play 모드에 의존합니다 (아래 참조). 이것은 또한 SendInput을 사용할 수 없다면 SendInput 명령어 자체도 Play 모드에 의존하게 만듭니다.

Play: Send, SendRaw, Click, 그리고 MouseMove/Click/Drag에 대하여 SendPlay 방법으로 전환합니다.

    알려진 한계:
  • 현재 키보드 레이아웃에 존재하지 않는 문자는 (예를 들어 영어의 Ô와 같은 경우) 전송할 수 없습니다. 이를 우회하려면, SendEvent를 사용하십시오.
  • 흉내낸 마우스 끌기는 예를 들어 WordPad와 Metapad 같이 RichEdit 콘트롤에서 아무 효과도 없을 수가 있습니다 (다른 것들도 마찬가지임) . 특정한 드래그에 대하여 보조 모드를 사용하려면, 다음 예제를 따르십시오: SendEvent {Click 6, 52, down}{Click 45, 52, up}.
  • 흉내낸 마우스 휠 회전은 한 쪽 방향으로만 움직임을 생산합니다 (보통 안쪽이지만, 어떤 어플리케이션에서는 바깥쪽으로). 또한, 휠 회전은 MS Word와 Notepad 같은 어플리케이션에서는 아무 효과도 없을 수 있습니다. 특정 회전에 대하여 보조 모드를 사용하려면, 다음 예제를 따르십시오: SendEvent {WheelDown 5}.
  • 자동-실행 섹션 (스크립트의 상단)에서 SendMode Play를 사용할 때, 모든 리맵 키가 영향을 받고 기능의 일부를 잃어 버릴 수도 있습니다. 자세한 것은 SendPlay 리맵핑 한계를 참조하십시오.
  • SendPlay는 다른 프로그램이나 OS가 등록한 AutoHotkey의 핫키나 핫스트링 또는 전역 핫키를 촉발시키지 않습니다.

논평

SendMode는 Click 그리고 MouseMove/Click/Drag의 모드도 변경하기 때문에, 특정한 마우스 이벤트에 대하여 다른 모드를 사용하고 싶을 때가 있을 수 있습니다. 가장 쉬운 방법은 {Click}을 사용하는 것입니다. 예를 들어:

SendEvent {Click 100, 200}  ; SendEvent은 예전의 전통적인 방식의 클릭을 사용합니다.

SendMode가 자동-실행 섹션 (스크립트의 상단)에 사용되면, 키보드와 마우스 리맵핑도 영향을 받습니다. 특히, SendMode Play를 리맵핑에 사용한다면, SendPlay 리맵핑의 한계를 참조하십시오.

새로 기동된 쓰레드마다 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본 값은 자동-실행 섹션(스크립트의 상단)에서 이 명령어를 사용하면 바꿀 수 있습니다.

관련 항목

Send, SetKeyDelay, SetMouseDelay, Click, MouseClick, MouseClickDrag, MouseMove

예제

SendMode Input
SendMode InputThenPlay


SetBatchLines

스크립트가 얼마나 빨리 실행될지 결정합니다 (CPU 이용에 영향을 줌).

SetBatchLines, 20ms
SetBatchLines, LineCount

매개변수

20ms

(20ms는 그냥 예제일 뿐입니다.) 값이 ms로 끝나면, 스크립트가 얼마나 자주 잠자야 하는지 나타냅니다 (각 잠자기마다 10 ms 길이입니다). 다음 예제에서, 스크립트는 20ms 동안 실행한 후에 매번 10ms 동안 잡니다: SetBatchLines, 20ms.

LineCount

10ms 동안 잠자기 전에 실행할 스크립트 줄의 개수. 값은 최대 9223372036854775807입니다. 또한, 이 모드는 앞 문단에서 20ms 모드 동안 서로 배타적입니다; 즉, 한 번에 그 중에 하나만 효과가 있습니다.

논평

SetBatchLines -1를 사용하면 절대 잠자지 않습니다 (즉, 스크립트는 최대 속도로 실행됩니다).

기본 설정은 10ms입니다. 단 v1.0.16 이전 버전에서는 대신에 10 (줄)을 사용했습니다.

"ms" 방법은 속도와 협력이 중요한 스크립트에 권장합니다. 예를 들어, 대부분의 시스템에서 설정이 10ms이면 스크립트는 CPU 휴식 시간의 50%를 넘지 않게 사용합니다. 이렇게 하면 스크립트는 빠르게 실행되면서 동시에 예를 들어 게임과 비디오캡쳐/상연과 같이 CPU에 민감한 작업과 여전히 높은 수준의 협력을 유지할 수 있습니다.

내장 변수 A_BatchLines에 현재 설정이 담겨 있습니다.

스크립트의 속도는 또한 스크립트의 성질에 따라 다음 명령어들에 영향을 받습니다: SetWinDelay, SetControlDelay, SendMode, SetKeyDelay, SetMouseDelay, 그리고 SetDefaultMouseSpeed.

새로 기동된 쓰레드는 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본값은 자동 실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하면 바꿀 수 있습니다.

관련 항목

SetWinDelay, SetControlDelay, SendMode, SetKeyDelay, SetMouseDelay, SetDefaultMouseSpeed, Critical

예제

SetBatchLines, 10ms
SetBatchLines, 1000


SetControlDelay

각 콘트롤-변경 명령어 다음에 일어날 지연 시간을 설정합니다.

SetControlDelay, Delay

매개변수

Delay

밀리초 단위 시간, 표현식 가능. -1이면 지연 시간이 전혀 없습니다. 0이면 가능한 적게 지연됩니다. 설정하지 않으면 기본값으로 20입니다.

논평

짧은 지연 시간은 (sleep) 콘트롤을 변경하는 Control 명령어마다 자동으로 삽입됩니다. 즉, Control, ControlMove, ControlClick, ControlFocus, 그리고 ControlSetText (ControlSend는 SetKeyDelay를 사용). 이렇게 하는 이유는 스크립트의 신뢰성을 향상시키기 위해서입니다. 콘트롤은 종종 이런 명령어 때문에 변경이 되면 "잠시 쉬는 시간"이 필요합니다. 쉬는 시간이 있어야 자신을 갱신할 수 있고 스크립트가 전송하려고 시도하는 다음 명령어에 응답할 수 있기 때문입니다.

지연 시간이 -1이라도 (전혀 지연 시간 없음) 허용하지만, 적어도 0은 사용하기를 권장합니다. 그러면 CPU에 부하가 많아도 스크립트가 올바르게 실행될 것이라는 보장이 높아집니다.

지연 시간이 0이면 내부적으로 Sleep(0)을 실행합니다. 이는 그를 필요로 하는 다른 프로세스에 스크립트의 시간조각(timeslice)의 나머지를 나누어 줍니다. 남는 게 없으면, Sleep(0)은 전혀 잠자지 않습니다.

CPU가 느리거나 부하가 많으면, 또는 창 애니메이션이 켜져 있으면, 높은 지연 시간이 필요합니다.

내장 변수 A_ControlDelay에 현재 설정이 담겨 있습니다.

새로 기동된 쓰레드 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본 값은 자동-실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하면 바꿀 수 있습니다.

관련 항목

Control, ControlMove, ControlClick, ControlFocus, ControlSetText, SetWinDelay, SetKeyDelay, SetMouseDelay, SetBatchLines

예제

SetControlDelay, 0


SetDefaultMouseSpeed

지정하지 않으면 Click 그리고 MouseMove/Click/Drag에 사용될 마우스 속도를 설정합니다.

SetDefaultMouseSpeed, Speed

매개변수

Speed

마우스를 이동하는 속도. 범위는 0 (가장 빠름)부터 100 (가장 느림)까지. 주의: 속도가 0이면 마우스를 순간 이동 시킵니다. 이 매개변수는 표현식일 수 있습니다.

논평

SendInput/Play 모드에 대하여 SetDefaultMouseSpeed는 무시됩니다; 이 모드에서는 마우스가 순간 이동합니다 (그렇지만, SetMouseDelay는 SendPlay에 적용되는 모드가 있습니다). 시각적으로 마우스를 더 느리게 이동하고 싶으면 -- 예를 들어 청중을 위하여 데모를 수행하는 스크립트라면 -- (선택적으로 BlockInput과 함께) SendEvent {Click 100, 200} 또는 SendMode Event를 사용하십시오.

이 명령억 사용되지 않으면, 기본 마우스 속도는 2입니다. 내장 변수 A_DefaultMouseSpeed에 현재 설정이 담겨 있습니다.

명령어 MouseClick, MouseMove, 그리고 MouseClickDrag는 모두 기본 마우스 속도를 오버라이드 할 매개변수가 있습니다.

Speed가 0 보다 크면, SetMouseDelay도 마우스가 목표를 향해 조금씩 이동할 때마다 지연 시간을 두어서 속도에 영향을 미칩니다.

새로 기동되는 쓰레드는 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본값은 자동 실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하여 변경할 수 있습니다.

관련 항목

SetMouseDelay, SendMode, Click, MouseClick, MouseMove, MouseClickDrag, SetWinDelay, SetControlDelay, SetKeyDelay, SetKeyDelay

예제

SetDefaultMouseSpeed, 0 ; 마우스를 순간 이동 시킵니다.


SetEnv

SetEnv (Var = Value)

지정된 값을 변수에 할당합니다.

SetEnv, Var, Value
Var = Value

매개변수

Var

Value을 저장할 변수의 이름.

Value

저장할 숫자 또는 문자열. 문자열이 길면, 계속 섹션을 수단으로 더 짧은 줄로 나눌 수 있습니다. 이렇게 하면 가독성과 유지관리성이 향상됩니다.

논평

기본값으로, Value 앞 뒤의 스페이스나 탭은 Var에서 제외됩니다. 이를 피하려면, AutoTrim Off에 기술된 방법을 사용하십시오.

"SetEnv"라는 이름은 혼란을 줍니다. 이것은 AutoIt v2로부터 물려 받은 유산입니다. AutoIt v2와 다르게, AutoHotkey는 변수를 환경에 저장하지 않습니다. 수행성능이 좋지 않을 뿐만 아니라 OS가 환경 변수의 길이를 32 KB로 제한하기 때문입니다. 환경 변수에 쓰려면 SetEnv 대신에 EnvSet을 사용하십시오.

거대한 변수가 점유한 메모리는 아무 것도 설정하지 않으면 해제할 수 있습니다. 예, Var =.

이 명령어 그리고 OutputVar를 받는 기타 명령어로 의사-배열을 생성할 수 있습니다. OuputVar에 또다른 변수를 가리키는 참조를 담도록 만들면 됩니다. 예, array%i% = 123. 더 자세한 것은 배열을 참조하십시오.

관련 항목

AutoTrim, EnvSet, EnvAdd, EnvSub, EnvMult, EnvDiv, If, 배열

예제

Var1 = 이것은 문자열입니다.
Color2 = 450
Color3 = %Var1%
Array%i% = %A_TICKCOUNT%


Var := expression

표현식을 평가해 그 결과를 변수에 저장합니다.

Var := expression

매개변수

Var

표현식의 결과를 저장할 변수의 이름.

Expression

자세한 것은 표현식과 아래의 예제를 참조하십시오.

논평

:= 연산자는 다음과 같이 간단한 경우에 = 연산자처럼 똑같이 빠르게 수행되도록 최적화 됩니다:

x := y  ; 수행성능은 x = %y%와 같음
x := 5  ; 수행성능은 x = 5와 같음.
x := "literal string"  ; 수행성은 x = literal string과 같음.

단어 true와 false는 내장 상수로서 각각 1과 0을 담고 있습니다. 다음 예제와 같이 스크립트를 더 읽기 쉽게 만들 수 있습니다:

CaseSensitive := false
ContinueSearch := true

이 명령어와 그리고 OuputVar를 받는 다른 명령어로 의사-배열을 만들 수 있습니다. OutputVar에 또다른 변수를 가리키는 참조를 담도록 만들면 됩니다. 예, Array%i% := Var/100 + 5. 더 자세한 정보는 배열을 참조하십시오.

관련 항목

표현식, IF (표현식), Functions, SetEnv, EnvSet, EnvAdd, EnvSub, EnvMult, EnvDiv, If, 배열

예제

Var := 3
Var := "literal string"
Var := Price * (1 - Discount/100)

Finished := not Done or A_Index > 100
if not Finished
{
    FileAppend, %NewText%`n, %TargetFile%
    return
}
else
    ExitApp


SetFormat

수학 연산으로 생성된 부동 소수점 수나 정수의 형식을 설정합니다.

SetFormat, NumberType, Format

매개변수

NumberType

반드시 다음 중 하나입니다: IntegerFast, FloatFast, Integer, 또는 Float (두 개의 빠른 모드는 v1.0.48+를 요구합니다; 논평 참조).

Format

NumberType Integer 또는 IntegerFast에 대하여, 십육진수는 H 또는 HEX를 지정하거나, 또는 십진수이면 D를 지정하십시오. 십육진수는 모두 접두사 0x로 시작합니다 (예, 0xFF). [AHK_L 42+]: 십육진 정수는 A-F 자리의 형식이 이 매개변수가 h이면 소문자이고 H이면 대문자입니다.

NumberType Float 또는 FloatFast에 대하여, TotalWidth.DecimalPlaces를 지정하십시오 (예, 0.6). v1.0.46.11+에서, 기호 "e"를 추가해 과학 표기법을 만들어 낼 수 있습니다; 예, 0.6e 또는 0.6E (대문자를 사용하면 각 숫자에 소문자가 아니라 대문자 E를 생산합니다). 주의: AutoHotkey 1.x에서, 과학적 표기법은 반드시 소수 점을 포함해야 합니다; 예, 1.0e1는 유효하지만 1e1는 유효하지 않습니다.

TotalWidth는 전형적으로 0입니다. 그 숫자에 빈 공간이 있거나 0으로 덧대면 안된다는 뜻입니다. 더 높은 값을 사용하면, 그 너비만큼 만들기 위해 숫자들은 스페이스나 0으로 덧대어집니다 (논평 참조).

DecimalPlaces는 보여줄 소수 점 자리의 갯수입니다. (반올림이 일어납니다). 비어 있거나 0이면, 소수점 부분도 소수점도 보여주지 않습니다. 즉, 부동 소수점 수의 결과는 정수로 화면에 보여줍니다. 시작 기본 값은 6입니다.

Padding: 만약 TotalWidth가 패딩을 야기할 만큼 높다면, 스페이스가 그 왼쪽에 추가됩니다; 즉, 각 숫자는 오른쪽으로 정렬됩니다. 대신에 왼쪽 정렬을 하려면, TotalWidth 앞에 마이너스 사인을 추가하십시오. 스페이스 대신에 0으로 덧대려면, TotalWidth 앞에 0을 추가하십시오 (예, 06.2).

빠른 모드 vs. 느린 모드

v1.0.48+에서, Integer 대신에 IntegerFast 그리고 Float 대신에 FloatFast를 사용할 수 있습니다.
  • 장점: 빠른 모드는 부동 소수점 수와 정수를 캐쉬하는 변수의 능력을 보존합니다. 이 덕분에 숫치 집약적인 연산이 눈에 띄게 빨라집니다. (대조적으로, 느린 모드는 모든 수치 결과를 즉시 문자열로 변환해 저장하도록 강제합니다.)
  • 단점: 숫자를 변수에 저장할 때, 빠른 모드는 (예, MsgBox 안에 보여주기 위해) 스크립트가 실제로 텍스트/문자열 버전의 변수를 필요로 할 때까지 SetFormat의 효과를 지연시킵니다. 그 순간 다양한 SetFormat이 효과가 있을 수 있기 때문에 (예, 소수점 자리수가 더 많거나 적을 수 있으므로), 예상치 못한 결과에 이를 수 있습니다. 현재의 빠른 포맷을 즉시 적용하려면, HexValue .= ""과 같은 연산을 사용하십시오. 이 코드는 빈 문자열을 현재 HexValue에 저장된 숫자에 추가합니다.

느린 모드인 "Integer" 또는 "Float"가 스크립트 어디서든 사용된다면, SetFormat 줄이 전혀 실행되지 않더라도, 정수나 부동 소수점 수의 캐쉬는 (각각) 스크립트가 기동하는 순간 꺼집니다.

부동 소수점 형식

v1.0.48+에서, 부동 소수점 변수는 대략 내부적으로 15 자리의 정밀도를 가집니다. 단, SetFormat Float (즉, 느린 모드)가 스크립트에 존재하는 경우는 예외입니다. 이 경우 저장된 정밀도의 부동 소수점 수는 DecimalPlaces에 의하여 결정됩니다 (pre-1.0.48 버전과 같습니다). 다른 말로, 부동 소수점 수의 결과가 일단 변수 안에 저장되면, 여분의 정밀도는 소실됩니다. 그리고 SetFormat, Float, 0.15와 같은 것으로 다시 계산을 하지 않고는 다시 요청할 수 없습니다. 이런 정밀도의 손실을 피하려면, SetFormat Float을 스크립트에 사용하지 마십시오. 다시 말해, 대신 SetFormat FloatFast를 사용하십시오.

느린 모드이든 빠른 모드이든 상관 없이, 부동 소수점 수가 결과이고 변수는 텍스트 문자열로 변환되거나 보여질 때 DecimalPlaces로 내림됩니다. (예, MsgBox 또는 FileAppend). 완벽한 정밀도를 보려면, 다음 SetFormat, FloatFast, 0.15과 같이 사용하십시오.

부동 소수점 수를 정수로 변환하려면, Var:=Round(Var), Var:=Floor(Var), 또는 Var:=Ceil(Var)를 사용하십시오. 정수를 부동 소수점 서로 변환하려면, 0.0을 더하십시오 (예, Var+=0.0) 또는 다음 MyFloat:=Round(MyInteger, 1)처럼 사용하십시오.

내장 변수 A_FormatFloat에는 현재 부동 소수점 형식이 포함되어 있습니다 (예, 0.6).

정수 포맷

정수 결과는 보통 십육진수가 아니라 십진수로 보여줍니다. 십육진수로 전환하려면, SetFormat, IntegerFast, Hex를 사용하십시오. 이것은 도 정수를 십진수에서 십육진수로 (또는 그 반대로) 변화하는데에도 사용할 수 있습니다. 이 페이지 맨 아래에 예제에 보여줍니다.

스크립트에 지정된 기호 그대로의 정수는 십육진수 또는 십진수로 쓸 수 있습니다. 십육진 정수는 모두 접두사 0x로 시작합니다 (예, 0xA9). 숫치 값이 예상되는 곳이면 어디든 사용할 수 있습니다. 예를 들어, Sleep 0xFF는 Sleep 255와 동등합니다. SetFormat으로 설정된 현재 정수의 형식에 상관이 없습니다.

AutoHotkey는 64-비트 부호있는 정수를 지원합니다. 그 범위는 -9223372036854775808 (-0x8000000000000000)부터 9223372036854775807 (0x7FFFFFFFFFFFFFFF) 까지입니다.

내장 변수 A_FormatInteger에 현재 정수 형식이 들어 있습니다 (H 또는 D).

총평

SetFormat이 스크립트에 사용되지 않으면, 정수는 기본값이 십진 형식이고, 부동 소수점 수는 기본값이 TotalWidth.DecimalPlaces = 0.6입니다. 새로 기동된 쓰레드는 모두 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 다음 기본 값을 가지고 새롭게 시작합니다; 그러나 이 기본값은 자동 실행 섹션 (스크립트의 상단)에서 SetFormat를 사용하여 바꿀 수 있습니다.

x=%y%와 같은 예전-스타일의 할당은 앞 뒤에 스페이스를 생략합니다 (즉, 패딩). 이를 피하려면, AutoTrim 또는 쌍점-등호 연산자를 사용하십시오 (예, x:=y).

"if var is number/integer/float"를 사용하면 변수에 수치 값이 들어 있는지 알아낼 수 있습니다.

부동 소수점 수 연산을 할 필요 없이 정수에 0 또는 스페이스를 덧대려면, 다음 예제를 따르십시오:

Var := "          " . Var     ; 따옴표 안에 10개의 스페이스가 들어 있습니다.  0으로 덧대려면, 스페이스를 0으로 교체하십시오.
StringRight, Var, Var, 10  ; Var 안에 있는 숫자에 스페이스를 덧대 총 너비가 10 문자에 맞도록 만듭니다.
Var := SubStr("          " . Var, -9)  ; 위의 두 줄을 한 줄로 대신합니다.

관련 항목

Format(), 표현식 할당 (:=), EnvAdd, EnvSub, EnvMult, EnvDiv, AutoTrim, if var is type

예제

Var = 11.333333
SetFormat, float, 6.2
Var -= 1  ; Var에 10.33을 설정합니다. 총 너비가 6이므로 앞에 스페이스가 하나 있습니다.
SetFormat, float, 0.2
Var += 1  ; Var에 11.33을 설정합니다. 앞에 스페이스가 없습니다.
SetFormat, float, 06.0
Var += 0  ; Var에 000011을 설정합니다.

; 십진 정수를 십육진 형식으로 변환합니다:
SetFormat, IntegerFast, hex
Var += 0  ; Var에 0xb를 설정합니다 (이전에 11이 들어 있었습니다).
Var .= ""  ; "빠른" 모드이기 때문에 필수입니다.
SetFormat, IntegerFast, d


SetKeyDelay

Send와 ControlSend에 의한 각 키눌림마다 일어날 지연 시간을 설정합니다.

SetKeyDelay [, Delay, PressDuration, Play]

매개변수

Delay

밀리초 시간, 표현식 가능. -1이면 지연 시간이 전혀 없고 0이면 가능하면 적게 지연됩니다 (그렇지만, Play 매개변수가 존재하면, 0과 -1 모두 지연 시간이 없습니다). 이 매개변수를 비워 두면 현재 Delay를 유지합니다.

SetKeyDelay가 스크립트에 사용되지 않으면, 기본 Delay는 전통적인 SendEvent 모드에 대하여 10입니다. SendPlay mode에 대해서 기본 Delay는 -1입니다. 두 모드 모두 기본 PressDuration (아래 참조)는 -1입니다.

PressDuration

어떤 게임과 기타 특수한 어플리케이션은 각 키눌림 안에서 지연 시간을 요구합니다; 즉, 키가 눌린 후 다시 떼기 까지 그 사이에 지연 시간을 요구할 수 있습니다.

-1이면 지연 시간이 전혀 없습니다 (기본 값). 그리고 0이면 가능하면 적게 지연됩니다 (그렇지만, Play 매개변수가 존재하면, 0과 -1 모두 지연 시간이 없습니다). 이 매개변수를 생략하면 현재 PressDuration이 바뀌지 않습니다.

주의: PressDuration는 전송 중인 키를 지원하기 위하여 수식 키 상태를 변경한 다음에도 지연 시간을 생산합니다 (CTRL, ALT, SHIFT, 그리고 WIN).

이 매개변수는 표현식일 수 있습니다.

Play
[v1.0.43+]

단어 Play는 위의 설정을 전통적인 SendEvent 모드가 아니라 SendPlay 모드에 적용합니다. 스크립트가 이 매개변수를 사용하지 않으면, 지연 시간은 SendPlay에 대하여 언제나 -1/-1입니다.

논평

주의: SendInput은 SetKeyDelay를 준수하지 않습니다; 그 모드에서는 키눌림 사이에 지연 시간이 전혀 없습니다. 이는 SendMode Input이 켜져 있을 때 Send도 마찬가지로 적용됩니다.

짧은 지연(잠자기)는 Send 또는 ControlSend가 전송하는 키눌림마다 자동으로 시행됩니다. 이렇게 하면 스크립트의 신뢰성이 개선됩니다. 왜냐하면 창은 가끔 빠르게 밀려 오는 키눌림의 범람 속도를 따라 잡을 수 없기 때문입니다.

OS의 시간-유지 시스템의 정밀성 때문에, 지연 시간은 가장 까까운 10 또는 15의 배수로 올림됩니다. 예를 들어, 1과 10 (포함) 사이의 지연 시간은 대부분의Windows XP 시스템에서 10 또는 15와 동등합니다 (아마도 2k도 마찬가지일 것임).

Send/SendEvent 모드에 대하여, 지연 시간이 0이면 내부적으로 Sleep(0)을 실행합니다. 그러면 스크립트의 시간조각(timeslice)의 나머지를 그를 필요로 하는 다른 프로세스에 양보합니다. 나머지가 없다면 Sleep(0)은 전혀 잠자지 않습니다. 대조적으로, 지연 시간이 -1이면 절대 잠자지 않습니다. 더 높은 신뢰를 위해, -1보다는 0을 권장합니다.

지연 시간이 -1로 설정되면, 스크립트의 프로세스 우선순위는 전통적인 SendEvent 모드를 사용할 때 얼마나 빨리 키눌림을 전송할 것인가를 결정하는 중요한 요인이 됩니다. 스크립트의 우선 순위를 높이려면, Process, Priority,, High를 사용하십시오. 이 때문에 전형적으로 키눌림이 활성 창이 처리하는 속도보다 더 빨리 전송되지만, 시스템이 지동으로 키눌림을 버퍼 처리해 줍니다. 버퍼 처리된 키눌림은 Send 명령어가 완료된 후에도 계속해서 목표 창에 도달합니다 (심지어 창이 더 이상 활성 창이 아니더라도 상관이 없습니다). 이것은 보통 해가 되지 않습니다. 왜냐하면 같은 창에 연이어 전송되는 키눌림은 이미 버퍼에 자리 잡은 키눌림 뒤에 차곡차곡 쌓이기 때문입니다.

내장 변수 A_KeyDelay에 Send/SendEvent 모드에 대한 현재 Delay 설정이 담겨 있습니다. PressDuration나 SendPlay의 Delay를 위한 내장 변수는 없습니다.

새로 기동된 쓰레드는 모두 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본값은 저동-실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하면 바꿀 수 있습니다.

관련 항목

Send, ControlSend, SendMode, SetMouseDelay, SetControlDelay, SetWinDelay, SetBatchLines, Click

예제

SetKeyDelay, 0


SetMouseDelay

각 마우스 이동이나 클릭마다 일어날 지연 시간을 설정합니다.

SetMouseDelay, Delay [, Play]

매개변수

Delay

밀리초 단위 시간. 표현식 가능. -1을 사용하면 지연시간이 전혀 없습니다. 0이면 가능하면 적게 지연합니다 (그렇지만, Play 매개변수가 존재하면,. 0과 -1 모두 지연 시간이 없습니다). 설정하지 않으면, 기본 지연 시간은 전통적인 SendEvent 모드에 대하여 10이고 SendPlay 모드에 대하여 -1입니다.

Play
[v1.0.43+]

단어 Play는 지연 시간을 전통적인 Send/SendEvent 모드가 아니라 SendPlay 모드에 적용합니다. 스크립트가 이 매개변수를 사용하지 않으면, 지연 시간은 언제나 SendPlay에 대하여 -1입니다.

논평

Click 그리고 MouseMove/Click/Drag (SendInput 모드 제외)에 의하여 발생하는 매 마우스 이동이나 클릭마다 짧은 지연 시간 (잠자기)이 자동으로 삽입됩니다. 이것은 스크립트의 신뢰성을 높이기 위한 것입니다. 창은 종종 빠른 속도의 마우스 이벤트 범람을 따라 잡을 수 없기 때문입니다.

OS의 시간-유지 시스템의 정밀성 때문에, 지연은 가장 가까운 10 또는 15의 배수로 올림됩니다. 예를 들어, 1부터 10 (포함) 까지의 지연 시간은 대부분의 Windows XP 시스템에서 10 또는 15와 동등합니다 (아마도 2k도 그럴 것임).

지연 시간이 0이면 내부적으로 Sleep(0)을 실행합니다. 이는 그를 필요로 하는 다른 프로세스에 스크립트의 시간조각(timeslice)의 나머지를 나누어 줍니다. 남는 조각이 없다면, Sleep(0)은 전혀 잠자지 않습니다. 대조적으로, 지연 시간이 -1이면 절대 잠자지 않습니다.

내장 변수 A_MouseDelay에 Send/SendEvent 모드에 대한 현재 설정이 담겨 있습니다 (SendPlay 모드에 대해서는 내장 변수가 없습니다).

새로 기동된 쓰레드는 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정값을 가지고 새롭게 시작합니다. 이 기본 값은 자동-실행 섹션(스크립트의 상단)에서 이 명령어를 사용하면 바꿀 수 있습니다.

관련 항목

SetDefaultMouseSpeed, Click, MouseMove, MouseClick, MouseClickDrag, SendMode, SetKeyDelay, SetControlDelay, SetWinDelay, SetBatchLines

예제

SetMouseDelay, 0


SetCapsLockState/SetNumLockState/SetScrollLockState

Capslock/NumLock/ScrollLock 키의 상태를 설정합니다. 키의 상태를 강제로 유지할 수 있습니다.

SetCapsLockState [, State]
SetNumLockState [, State]
SetScrollLockState [, State]

매개변수

State

이 매개변수가 생략되면, 키의 AlwaysOn/Off 속성이 제거됩니다. 그렇지 않으면 다음 단어 중 하나를 설정하십시오:

On: 키를 켜고 AlwaysOn/Off 속성을 제거합니다.

Off: 키를 끄고 AlwaysOn/Off 속성을 제거합니다.

AlwaysOn: 강제로 켠 상태를 유지합니다.

AlwaysOff: 강제로 끈 상태를 유지합니다.

논평

Send 명령어를 사용하여 키를 반대 상태로 토글할 수 있습니다; 예를 들어: Send {Capslock}.

키를 AlwaysOn 또는 AlwaysOff 상태로 유지하려면 키보드 갈고리가 필요합니다. 키보드 갈고리는 그런 경우 자동으로 설치됩니다.

관련 항목

SetStoreCapslockMode, GetKeyState

예제

SetNumlockState, on
SetScrollLockState, AlwaysOff


SetRegView

SetRegView [v1.1.08+]

RegRead, RegWrite, RegDelete 그리고 레지스트리 회돌이에 사용되는 레지스트리 뷰를 설정합니다.

SetRegView, RegView

매개변수

RegView

레지스트리를 32-비트 어플리케이션처럼 보려면 32를 지정하고, 64-비트 어플리케이션처럼 보려면 64를 지정하십시오.

정상 행위로 복구하려면 단어 Default를 지정하십시오.

총평

이 명령어는 Windows 64-비트에만 유용합니다. Windows 32-비트에서는 효과가 없습니다.

64-비트 시스템에서, 32-비트 어플리케이션은 WOW64라고 부르는 Windows 서브시스템 위에서 실행됩니다. 기본으로, 시스템은 충돌을 피하기 위해 어떤 레지스트리 키는 방향전환합니다. 예를 들어, 32-비트 스크립트에서HKLM\SOFTWARE\AutoHotkey는 HKLM\SOFTWARE\Wow6432Node\AutoHotkey으로 방향전환됩니다. SetRegView를 사용하면 32-비트 스크크립트의 레지스트리 명령어가 64-비트 레지스트리 뷰로 방향전환된 키에 그리고 그 반대로 접근할 수 있습니다.

내장 변수 A_RegView에 현재 설정이 담깁니다. 새로 기동된 쓰레드는 (핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 기본값은 이 명령어를 자동-실행 섹션 (스크립트 상단)에서 사용하면 바꿀 수 있습니다.

관련 항목

RegRead, RegWrite, RegDelete, Loop (레지스트리)

예제

예제 1은 특정한 레지스트리 뷰를 설정하는 법과 레지스트리 방향전환으로 스크립트에 영향을 주는 법을 보여줍니다.

; 레지스트리 키에 32-비트 어플리케이션처럼 접근합니다.
SetRegView 32
RegWrite REG_SZ, HKLM, SOFTWARE\Test.ahk, Value, 123

; 레지스트리 키에 64-비트 어플리케이션처럼 접근합니다.
SetRegView 64
RegRead value, HKLM, SOFTWARE\Wow6432Node\Test.ahk, Value
RegDelete HKLM, SOFTWARE\Wow6432Node\Test.ahk

MsgBox Read value '%value%' via Wow6432Node.

; 레지스트리 뷰를 기본값으로 복구합니다.
; 기본값은 스크립트가 32-비트인가 64-비트인가에 따라 다릅니다.
SetRegView Default
;...

예제 2은 스크립트가 실행중인 운영 체제와 EXE와 의 유형을 탐지하는 법을 보여줍니다.

if (A_PtrSize = 8)
    script_is := "64-bit"
else ; if (A_PtrSize = 4)
    script_is := "32-bit"

if (A_Is64bitOS)
    OS_is := "64-비트입이다"
else
    OS_is := "32-비트입니다. 오직 단일 레지스트리 뷰만 있습니다"

MsgBox 이 스크립트는 %script_is%이고, OS는 %OS_is%입니다.


SetStoreCapslockMode

Send 명령어를 수행한 후 CapsLock의 상태를 복구할지 말지 결정합니다.

SetStoreCapslockMode, On|Off

매개변수

On|Off

On: 모든 스크립트에 최초로 설정됩니다: CapsLock 키는 Send가 자신의 연산을 위해 잠시 그것을 변경할 필요가 있었다면 그의 이전 값으로 복구됩니다.

Off: CapsLock 키의 상태를 절대 바꾸지 않습니다. 결과적으로, Send의 연산 동안 어쩌다가 Capslock 키가 켜졌다면(ON) 문자의 대소문자가 반대로 나타날 것입니다.

논평

이것은 Capslock 키가 Send와 ControlSend에 대하여 언제나 꺼지는 것은 아니라는 뜻입니다. 성공적으로 꺼졌다고 할지라도, 키들이 전송된 후에 다시 원래대로 켜지지 않을 수도 있습니다.

이 명령어는 자주 사용되지 않습니다. 왜냐하면 기본값이 대부분의 경우 제일 좋기 때문입니다.

새로 기동되는 쓰레드는 ( 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본값은 자동-실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하면 바꿀 수 있습니다.

관련 항목

SetCaps/Num/ScrollLockState, Send, ControlSend

예제

SetStoreCapslockMode, off


SetTimer

서브루틴이 지정된 일정 간격으로 자동으로 반복적으로 기동되도록 만듭니다.

SetTimer [, Label, Period|On|Off|Delete, Priority]

매개변수

Label

점프해 갈 라벨 또는 핫키 라벨의 이름. Return이나 Exit을 만날 때까지 Label 아래의 명령어들이 실행됩니다. 거의 모든 다른 명령어의 매개변수처럼, Label은 변수 참조가 될 수 있습니다. %MyLabel%와 같이, 변수에 저장된 이름이 목표로 사용됩니다.

[v1.1.01+]: Label이 생략되면, A_ThisLabel이 사용됩니다. 예를 들어, SetTimer,, Off를 타이머 서브루틴 안에 사용하면 타이머를 끌 수 있습니다.

[v1.1.20+]: 라벨 이름이 유효하지 않으면, 이 매개변수는 함수의 이름, 또는 함수 객체를 담고 있는 한 개짜리 변수가 될 수 있습니다. 예를 들어, SetTimer %funcobj%, 1000 또는 SetTimer % funcobj, 1000. 객체를 돌려주는 다른 표현식은 현재 지원하지 않습니다.

Period|On|Off|Delete

On: 이전 기간(period) 동안 비활성화되어 있던 타이머를 재활성화합니다. 타이머가 존재하지 않으면, 새로 만듭니다 (기본 간격은 250입니다). 타이머가 존재하지만 이전에 한-번만- 실행 모드로 설정되어 있었다면, 다시 한 번만 실행됩니다.

Off: 기존의 타이머를 끕니다.

Delete [v1.1.20+]: 기존의 타이머를 끄고 삭제합니다. 타이머가 함수 객체에 연관되어 있다면, 그 객체는 해제됩니다. 타이머를 끄더라도 객체는 해제되지 않습니다.

Period: 이 매개변수를 대략적인 밀리 초의 개수로 사용하여 타이머를 생성하거나 갱신합니다. 이 시간은 마지막으로 Label 서브루틴이 시작한 이후로 경과해야 하는 시간입니다. 이 시간 만큼 지나면, Label은 다시 실행됩니다 (단, 지난 시간 이후로 계속 실행 중이라면 예외입니다). 타이머는 자동으로 활성화됩니다. 이를 막으려면, 이 매개변수에 OFF를 지정하고, 즉시 두 번째로 명령어를 호출하십시오.

Period는 정수여야 합니다. 단 변수나 표현식이 사용되면 안됩니다. 이 경우는 소수점 이하는 전부 무시됩니다.

이 매개변수가 비어 있고 그리고:
1) 타이머가 존재하지 않는다면: 기간을 250으로 하여 생성됩니다.
2) 타이머가 이미 존재한다면: 그 타이머가 활성화되고 Priority를 지정하지 않는 한, 이전의 기간(period)은 리셋됩니다.

Run only once [v1.0.46.16+]: 음의 정수로 Period를 지정하면 타이머가 오직 한 번만 실행되어야 한다는 사실을 나타낼 수 있습니다. 예를 들어, -100을 지정하면 타이머는 지금 부터 100 ms 동안 실행되고 타이머를 끕니다. 마치 SetTimer, Label, Off를 사용한 효과가 있습니다.

Priority

이 선택적 매개변수는 -2147483648에서 2147483647 사이의 정수입니다 (또는 표현식). 이 타이머의 쓰레드 우선 순위를 지정합니다. 생략하면, 0이 사용됩니다. 자세한 것은 쓰레드를 참조하십시오.

다른 것은 전혀 건드리지 않은 채로 기존 타이머의 우선 순위만 바꾸려면, 이 매개변수 앞의 매개변수를 빈 채로 두십시오.

논평

타이머는 비동기적으로 실행되기 때문에 유용합니다. 지정된 간격으로 일정하게 실행된다는 뜻입니다. 심지어 스크립트가 창을 기다리거나, 대화상자를 보여주거나 또는 다른 일을 하느라 바쁜 때에도 상관이 없습니다. 많이 사용되는 예로는 사용자가 쉴 때 어떤 일을 하기 (A_TimeIdle에 반영됨) 또는 사용자가 나타나는 순간 원하지 않는 창을 닫기가 있습니다.

타이머 때문에 스크립트가 동시에 여러 일을 수행한다는 환상을 불러 일으키지만, 사실은 그렇지 않습니다. 대신에, 시간제한 서브루틴을 다른 쓰레드와 똑같이 취급합니다: 핫키 서브루틴과 마찬가지로, 다른 쓰레드에게 인터럽트 당하고 또 인터럽트 할 수 있습니다. 자세한 것은 쓰레드를 참조하십시오.

타이머가 만들어질 때마다, 재활성되고, 새 기간(period)으로 갱신됩니다. 그의 서브루틴은 즉시 실행되지 않습니다; 먼저 기간(period)이 다해야 합니다. 타이머를 시작하자 마자 바로 실행하고 싶으면, Gosub를 사용해 타이머의 서브루틴을 실행하십시오 (그렇지만, 이것은 타이머 자체가 그런 것 처럼 새 쓰레드를 시작하지 않습니다; 그래서 SendMode와 같은 설정은 기본값으로 시작하지 않습니다).

SetTimer가 기존의 타이머에 사용되고 매개변수 #2가 숫자이거나 단어 ON 이면 (또는 생략되면), 지난 번 실행된 타이머의 "내부 시간"이 현재 시간으로 재설정됩니다; 다른 말로 하면, 전체 기간이 경과해야 서브루틴이 다시 실행됩니다.

타이머의 정밀도: OS의 시간-유지 시스템의 정밀도 때문에, Period는 전형적으로 (설치된 하드웨어와 드라이버의 유형에 따라) 가장 가까운 10 또는 15.6 밀리초의 배수로 반올림됩니다. 예를 들어, 1부터 10 (포함) 사이의 Period는 보통 Windows 2000/XP에서 10 또는 15.6과 동등합니다. 더 짧은 지연은 Loop+Sleep을 통하여 달성할 수 있습니다. 예제는 DllCall+timeBeginPeriod+Sleep를 보십시오.

타이머는 다음 상황 아래에서는 지정된 만큼 자주 실행될 수는 없습니다:

  1. 다른 어플리케이션들이 CPU에 아주 큰 부담을 줍니다.
  2. 타이머 서브루틴은 그 자체로 실행에 자신에게 주어진 기간보다 더 많이 걸립니다. 또는 경쟁관계에 있는 타이머가 너무 많습니다 (SetBatchLines를 변경하면 도움이 될 것입니다).
  3. 타이머가 다른 쓰레드에 의해 인터럽트 되었습니다. 즉, 또다른 일정의 서브루틴, 핫키 서브루틴, 또는 맞춤 메뉴 항목이 타이머를 인터럽트 했습니다 (인터럽트는 Critical을 통하여 피할 수 있습니다). 이런 일이 일어나면 그리고 인터럽트한 쓰레드가 종료에 시간이 오래 걸린다면, 인터럽트된 타이머는 그 동안 꺼지는 효과가 있습니다. 그렇지만, 다른 타이머들은 계속해서 실행됩니다. 첫 번째 타이머를 인터럽트한 쓰레드를 또 인터럽트 합니다.
  4. Critical이나 Thread Interrupt/Priority의 결과로 스크립트를 인터럽트 할 수 없습니다. 그 시간 동안, 타이머는 실행되지 않습니다. 나중에, 스크립트가 다시 인터럽트가 가능해지면, 기간을 넘긴 타이머는 가능하면 한 번 빨리 실행된 다음, 그의 원래 일정을 재개합니다.

타이머는 스크립트가 보류중(suspended)일 때에도 작동합니다. 그러나 현재 쓰레드에 "Thread NoTimers"가 작용하고 있거나 어떤 쓰레드이든 쓰레드가 정지(paused)되어 있으면 작동하지 않습니다. 게다가, 사용자가 (예를 들어 트레이 아이콘 메뉴나 메뉴 바와 같은) 스크립트 매뉴를 통하여 항해하고 있을 때에도 작동하지 않습니다.

타이머는 임시로 스크립트의 현재 활동을 인터럽트해 작동하기 때문에, 그의 서브루틴은 (빨리 끝낼 수 있도록) 짧게 유지해야 합니다. 오랫 동안 인터럽트 하는 것은 바람직하지 못합니다.

스크립트가 실행되는 중에도 효과를 유지하는 타이머는 보통 자동-실행 섹션에 만들어야 합니다. 대조적으로, 임시 타이머는 종종 그의 서브루틴에 의하여 꺼지기도 합니다 (이 페이지 하단의 예제를 보십시오).

시간제한 서브루틴이 실행 중일 때마다, SendMode와 같은 설정에 대한 기본 값으로 새롭게 시작합니다. 이런 기본값들은 자동-실행 섹션에서 바꿀 수 있습니다.

핫키의 반응 시간이 중요하다면 (게임에서와 같이) 그리고 스크립트가 보유한 타이머의 서브루틴이 실행에 대략 5 ms 이상이 걸려야 한다면, 다음 명령어를 사용해 15 ms 지연 시간으로 바꾸지 않도록 막습니다. 그렇게 하지 않으면 타이머 쓰레드를 인터럽트할 수 없는 순간에 핫키가 눌리면 그런 지연이 일어납니다:

Thread, interrupt, 0  ; 모든 쓰레드를 언제나 인터럽트가 가능하도록 만듭니다.

그의 서브루틴이 현재 실행 중인데 타이머가 꺼지더라도, 그 서브루틴은 완료할 때까지 계속 진행됩니다.

KeyHistory 특징은 얼마나 많은 타이머가 존재하는지 그리고 얼마나 많이 현재 켜져 있는지 보여줍니다.

타이머의 기간은 4294967295 밀리초보다 클 수 없습니다 (49.7 일).

스크립트를 계속 실행하려면 -- 오직 타이머만 담고 있는 스크립트 -- #Persistent를 사용하십시오.

관련 항목

Gosub, Return, Threads, Thread (command), Critical, IsLabel(), Menu, #Persistent

예제

; 예제 #1: 원하지 않는 창이 나타날 때마다 닫습니다:
#Persistent
SetTimer, CloseMailWarnings, 250
return

CloseMailWarnings:
WinClose, Microsoft Outlook, 통신하는 동안 시간제한이 일어남
WinClose, Microsoft Outlook, 서버에 접속을 확립할 수 없었음
return

; 예제 #2: 어떤 창이 나타나기를 기다렸다가 사용자에게 알려줍니다:
#Persistent
SetTimer, Alert1, 500
return

Alert1:
IfWinNotExist, Video Conversion, 프로세스 완료
    return
; 그렇지 않으면:
SetTimer, Alert1, Off  ; 즉, 타이머는 여기에서 자신을 끕니다.
SplashTextOn, , , 비디오 변환이 끝났습니다.
Sleep, 3000
SplashTextOff
return

; 예제 #3: 핫키가 한 번, 두 번, 그리고 세 번 눌렸는지 탐지합니다.
; 얼마나 많이 눌렀는가에 따라
; 핫키가 다른 조치를 수행할 수 있습니다:
#c::
if winc_presses > 0 ; SetTimer가 이미 시작되었습니다. 그래서 대신에 키눌림을 기록합니다.
{
    winc_presses += 1
    return
}
; 그렇지 않으면, 이 번에 처음으로 키를 눌렀습니다.
;  카운트를 1로 설정하고 타이머를 시작합니다:
winc_presses = 1
SetTimer, KeyWinC, 400 ; 400 밀리초 창 안에서 키눌림을 기다립니다.
return

KeyWinC:
SetTimer, KeyWinC, off
if winc_presses = 1 ; 키가 한 번 눌렸습니다.
{
    Run, m:\  ; 폴더를 엽니다.
}
else if winc_presses = 2 ; 키가 두 번 눌렸습니다.
{
    Run, m:\multimedia  ; 다른 폴더를 엽니다.
}
else if winc_presses > 2
{
    MsgBox, 세 번 이상 클릭이 탐지되었습니다.
}
; 위에서 어느 조치가 촉발되든 상관없이, 카운트를 리셋해
; 다음 키눌림을 준비합니다:
winc_presses = 0
return


SetTitleMatchMode

WinWait 같은 명령어에서 WinTitle 매개변수의 부합 행위를 설정합니다.

SetTitleMatchMode, MatchMode
SetTitleMatchMode, Fast|Slow

매개변수

MatchMode

다른 숫자나 단어 RegEx 중 하나:

1: 창 제목은 반드시 지정된 WinTitle로 시작해야 부합할 수 있습니다.
2: 창 제목에 어디든 WinTitle이 포함되어 있으면 부합합니다.
3: 창 제목이 반드시 정확하게 WinTitle에 일치해야 부합합니다.

RegEx (v1.0.45+): WinTitle, WinText, ExcludeTitle, 그리고 ExcludeText를 정규 표현식으로 변경합니다. 표현식을 명령어와 함께 사용할 때 따옴표 안에 둘러 싸지 마십시오. 예를 들어: WinActivate Untitled.*Notepad. RegEx는 또한 ahk_class에 적용됩니다; 예를 들어, ahk_class IEFrame는 클래스 이름 어디든 IEFrame이 들어 있는 창을 검색합니다 (기본적으로 정규 표현식은 목표 문자열 어디든 상관 없이 부합하기 때문입니다). 주의: WinText에 대하여, 각 텍스트 요소는 (즉, 각 콘트롤의 텍스트) RegEx에 따로따로 부합합니다. 그러므로, 여러 텍스트 요소에 걸쳐 하나가 부합하는 것은 불가능 합니다.

위의 모드는 또 WinTitle과 똑같은 방식으로 ExcludeTitle에 영향을 미칩니다. 예를 들어, 모드 3은 그 창을 배제하려면 창 제목이 정확하게 ExcludeTitle에 부합하기를 요구합니다.

Fast|Slow

Fast: 이것이 기본 행위입니다. 수행성능은 Slow 보다 현격하게 좋습니다. 그러나 일부 유형의 창에 대하여 어떤 WinText 요소들은 다양한 창 명령어에 "보이지 않을 수 있습니다".

Slow: 훨씬 더 느릴 수 있습니다. 그러나 창 명령어가 창들을 ?어 가면서 부합을 찾아 모든 창으로부터 모든 가능한 WinText를 열람합니다. Window Spy는 (있다면) 창 텍스트의 어느 부분이 느린 모드를 요구하는지 보여줍니다.

논평

이 명령어는 모든 창 명령어의 행위에 영향을 줍니다. 예, IfWinExist 그리고 WinActivate.

지정하지 않으면, TitleMatchMode는 기본값이 1이고 fast입니다.

창 그룹이 사용되면, 현재 제목 부합 모드는 그룹에 있는 각 규칙에 적용됩니다.

일반적으로, slow 모드는 그의 제목과 fast-모드 텍스트 만으로는 목표 창을 유일하게 식별할 수 없을 경우에만 사용해야 합니다. 왜냐하면 느린 모드는 바쁘거나 "응답하지 않는" 어플리케이션 창이 있다면 극심하게 느릴 수 있기 때문입니다.

오토핫키에 따라오는 Window Spy는 slow 텍스트를 별도의 섹션에 보고합니다. 그래서 slow 모드가 필요한지 쉽게 알아낼 수 있습니다.

두 속성을 모두 바꾸고 싶다면, 다음 예제와 같이 명령어를 두 번 실행하십시오:

SetTitleMatchMode, 2
SetTitleMatchMode, slow

내장 변수 A_TitleMatchMode 그리고 A_TitleMatchModeSpeed에는 현재 설정이 담겨 있습니다.

현재 TitleMatchMode와 상관 없이, WinTitle, WinText, ExcludeTitle 그리고 ExcludeText는 대소문자를 구분합니다. 유일한 예외는 RegEx 모드의 대소문자 비구분 옵션입니다; 예를 들어: i)untitled - notepad.

새로 기동된 쓰레드는 모두 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본값은 자동-실행 섹션에서 (스크립트의 상단) 이 명령어를 사용하여 바꿀 수 있습니다.

관련 항목

SetWinDelay, IfWinExist, WinActivate, RegExMatch()

예제

SetTitleMatchMode 2
; OR:
SetTitleMatchMode RegEx

SetTitleMatchMode Slow  ; Slow/Fast는 다른 모든 모드와 독립적으로 설정할 수 있습니다.


SetWinDelay

WinActivate와 같은 각 창 명령어를 실행한 후에 일어날 지연시간을 설정합니다.

SetWinDelay, Delay

매개변수

Delay

밀리초 시간, 표현식 가능. -1은 지연시간이 없으며 0이면 가능하면 최소로 지연합니다. 설정하지 않으면, 기본 값은 100입니다.

논평

각 창 명령어가 실행된 후 짧은 지연시간 (잠자기)가 자동으로 실행됩니다. 단, IfWinActive와 IfWinExist는 제외합니다. 이렇게 하는 이유는 스크립트의 신뢰성을 개선하기 위해서입니다. 창은 종종 생성되거나, 활성화되거나 또는 최소화 되거나 등등 변경이 있고 난 후에 일정한 "휴식"시간이 필요합니다. 그래야 창은 자신을 갱신할 기회를 가질 수 있고 스크립트가 그 창에 보내려고 시도하는 다음 명령어에 응답할 수 있기 때문입니다.

지연 시간이 -1이라도 (지연 시간 전혀 없음) 허용하지만, 적어도 0은 사용하기를 권장합니다. 그래야 CPU가 부하가 많더라도 스크립트가 제대로 실행된다는 보장이 높아집니다.

지연 시간이 0이면 내부적으로 Sleep(0)을 실행하는데, 이 함수는 그를 필요로 하는 프로세스에 스크립트의 시간조각(timeslice)의 나머지를 건넵니다. 아무것도 없으면, Sleep(0)은 전혀 잠자지 않습니다.

CPU가 느리거나 부하가 많다면, 또는 창 애니메이션이 켜져 있다면, 더 높은 지연 시간이 필요합니다.

내장 변수 A_WinDelay에 현재 설정이 담겨 있습니다.

새로 기동된 쓰레드는 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본 값은 자동 실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하여 변경할 수 있습니다.

관련 항목

SetControlDelay, SetKeyDelay, SetMouseDelay, SetBatchLines, SendMode

예제

SetWinDelay, 10


SetWorkingDir

스크립트의 현재 작업 디렉토리를 변경합니다.

SetWorkingDir, DirName

매개변수

DirName

새로운 작업 디렉토리의 이름. 절대 경로를 지정하지 않으면 현재 %A_WorkingDir%이 하위 디렉토리라고 간주됩니다.

ErrorLevel

[v1.1.04+] 이 명령어를 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 문제가 있으며 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

스크립트의 작업 디렉토리는 절대 경로를 지정하지 않았을 때 파일과 폴더에 접근하는 데 사용되는 기본 디렉토리입니다. 다음 예제에서 파일 My Filename.txt은 %A_WorkingDir% 안에 있다고 간주됩니다: FileAppend, A Line of Text, My Filename.txt.

스크립트의 최초 작업 디렉토리는 어떻게 기동되었는가에 따라 결정됩니다. 예를 들어, 단축키를 통하여 실행되었다면 -- 예를 들어 시작 메뉴로 -- 그의 작업 디렉토리는 단축 파일의 특성 안에 있는 "시작하기" 속성에 따라 결정됩니다.

스크립트가 무조건 자신의 폴더를 작업 디렉토리로 사용하도록 강제하려면, 첫 줄을 다음과 같이 작성하십시오:

SetWorkingDir %A_ScriptDir%

일단 변경되면, 새 작업 디렉토리는 스크립트 전체를 통하여 전역적으로 그리고 즉시 효과를 발휘합니다. 타이머를 비롯하여 인터럽트된, 멈춘, 그리고 새로 기동된 모든 쓰레드가 영향을 받습니다..

관련 항목

%A_WorkingDir%, %A_ScriptDir%, FileSelectFolder

예제

SetWorkingDir %A_ScriptDir%
SetWorkingDir, D:\My Folder\Temp


Shutdown

시스템을 끄고, 재시작하며, 로그오프 합니다.

Shutdown, Code

매개변수

Code

아래에 나열된 셧다운 코드의 조합.

논평

셧다운 코드는 다음 값으로 조합됩니다:

로그오프 | 0
셧다운 | 1
리부트 | 2
강제 창 닫기 | 4
전원 내리기 | 8
보류/잠재우기 | 이 페이지 하단 DllCall 예제를 참조하십시오.
모니터 끄기 | PostMessage 예제를 참조하십시오.

필요한 값을 함께 더하십시오. 예를 들어, 셧다운과 전원 내리기는 코드가 9입니다 (셧다운 + 전원 내리기 = 1 + 8 = 9). 다른 방법으로, 1+8과 같이 표현식을 지정할 수도 있습니다.

강제 종료("Force") 값 (4)는 모든 열린 어플리케이션을 강제로 닫습니다. 비상시에만 사용해야 합니다. 왜냐하면 열린 어플리케이션이 데이터를 잃어 버릴 수 있기 때문입니다.

전원 내리기("Power down") 값은 시스템을 셧다운 하고 전원을 끕니다.

관련하여 말씀 드리자면, 스크립트는 시스템이 셧다운 중인지 아니면 사용작 로그 오프 중인지 OnExit를 통하여 알 수 있습니다.

관련 항목

Run, ExitApp, OnExit

예제

; 강제로 모든 창을 닫고 리부트 합니다 (reboot + force = 2 + 4 = 6):
Shutdown, 6

; 시스템을 보류하거나 재우기 위해 Windows API 함수 "SetSuspendState"를 호출합니다.
; 매개변수 #1: 0 대신 1을 건네면 보류가 아니라 재웁니다.
; 매개변수 #2: 0 대신 1을 건네면 각 어플리케이션에 허가를 구하지 않고 즉시 보류합니다.
; 매개변수 #3: 0 대신 1을 건네면 깨어 있는 모든 이벤트를 비활성화 합니다.
DllCall("PowrProf\SetSuspendState", "int", 0, "int", 0, "int", 0)


Sleep

계속하기 전에 지정된 시간 동안 기다립니다.

Sleep, DelayInMilliseconds

매개변수

Delay

멈출 시간 (밀리초 단위), 0부터 2147483647까지 (24 일), 표현식 가능.

논평

OS의 시간-유지 시스템의 정밀도 때문에, 지연 시간은 보통 (하드웨어와 설치된 드라이버의 종류에 따라) 가장 가까운 10 또는 15.6 밀리초의 배수로 올림됩니다. 예를 들어, 지연시간이 1부터 10(포함) 사이이면 대부분의 Windows 2000/XP 시스템에서 10 또는 15.6과 동등합니다. 더 짧은 지연 시간이 필요하면, 다음 예제를 참조하십시오.

실제 지연 시간은 CPU에 부하가 많을 경우 요구한 것보다 더 길어질 가능성이 있습니다. 이것은 OS가 스크립트에 또다른 시간조각(timeslice)을 주기 전에 각각의 필요한 프로세스에 CPU 시간을 나누어 주기 때문입니다 (보통 20 밀리초).

지연 시간이 0일 경우 (다른 스크립트보다 우선 순위가 엄청나게 낮지만 않다면) 그를 필요로 하는 다른 프로세스에 스크립트의 현재 시간조각(timeslice)의 나머지를 나누어 줍니다. 그래서, 지연 시간이 0이면 실제 지연 시간은 필요로 하는 프로세스의 개수에 따라 0부터 20ms (이상)이 생산됩니다 (필요로 하는 프로세스가 없다면, 전혀 지연 시간이 없습니다). 그렇지만, Delay가 0이면 더 긴 Delay가 걸렸을 지연 시간보다 언제나 떠 짧게 끝납니다.

잠자는 동안, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드를 기동할 수 있습니다.

Sleep -1: 지연 시간이 -1이면 잠자지 않지만 대신에 스크립트가 즉시 그의 메시지 큐를 점검하도록 만듭니다. 이것을 사용하면 보류된 인터럽트들을 무작위로 아무데서나 일어나도록 두지 않고 강제로 특정한 위치에서 일어나게 만들 수 있습니다. 자세한 것은 Critical을 참조하십시오.

관련 항목

SetKeyDelay, SetMouseDelay, SetControlDelay, SetWinDelay, SetBatchLines

예제

Sleep, 1000  ; 1 초

; 다음은 정상인 10 또는 15.6 밀리초보다
; 더 짧게 재우는 법을 보여주는 예제입니다.
; 주의: 스크립트가 이런 식으로 실행 중인 동안,
; 전체 운영체제와 어플이 모두 아래의 timeBeginPeriod에 영향을 받습니다.

SetBatchLines -1  ; 이 방법이 최대로 효과가 있도록 확인합니다.

SleepDuration = 1  ; 이것은 종종 아래의 값에 따라 미세하게 조절할 수 있습니다 (예,  2는 3과 다릅니다).
TimePeriod = 3 ; 7 또는 3을 시도합니다. 아래 주석을 참조하십시오.
; 잠자기 시간이 보통 15.6 밀리초로 올림되는 PC라면, TimePeriod=7을 시도하면
; 약간 더 짧은 수면 시간을 허용하고, TimePeriod=3 이하를 시도하면 가능한 짧은 수면 시간을 허용합니다.

DllCall("Winmm\timeBeginPeriod", uint, TimePeriod)  ; 이 스크립트의 DllCall("Sleep"...)은 물론이고 모든 어플리케이션에 영향을 줍니다. 그러나 SetTimer에는 영향을 미치지 않습니다..
Iterations = 50
StartTime := A_TickCount

Loop %Iterations%
    DllCall("Sleep", UInt, SleepDuration)  ; Sleep 명령어 대신에 DllCall을 사용해야 합니다.

DllCall("Winmm\timeEndPeriod", UInt, TimePeriod)  ; 시스템을 정상으로 복구하려면 호출해야 합니다.
MsgBox % "Sleep duration = " . (A_TickCount - StartTime) / Iterations


Sort

변수의 내용을 알파벳, 숫자, 또는 무작위 순서로 정렬합니다 (선택적으로 중복을 제거합니다).

Sort, VarName [, Options]

매개변수

VarName

그의 내용이 정렬될 변수의 이름. 이 변수는 표현식이 불가능합니다.

Options

아래 리스트 참조.

Options

다음 기호로 구성되는 문자열 (순서에 상관없이, 선택적으로 사이에 스페이스):

C: 대소문자 구분 정렬 (N 옵션도 존재하면 무시됩니다). C와 CL이 모두 생략되면, 대문자 A-Z는 정렬의 목적으로 소문자와 동일하다고 간주합니다.

CL [v1.0.43.03+]: 현재 사용자의 로케일에 기반하여 대소문자를 구분하여 정렬합니다. 예를 들어, 대부분의 영어와 서구 유럽어 로케일은 A-Z 기호 그리고 Ä 와 Ü와 같은 ANSI 기호를 소문자와 동일하다고 간주합니다. 이 방법은 또한 "word sort"를 사용하기도 합니다. 이렇게 하면 "coop" 그리고 "co-op"와 같은 단어들이 함께 있도록 하이픈(hyphens)과 어포스트로피(apostrophes)를 취급합니다. 현재 정렬 중인 항목의 내용에 따라, 수행성능은 기본적인 대소문자 비구분 방법에 비해 1배에서 8 배까지 나쁠 수 있습니다.

Dx: 구분 문자로 x를 지정합니다. 구분 문자는 VarName에서 각 항목이 시작되고 끝나는 곳을 결정합니다. 이 옵션이 존재하지 않으면, x는 기본값이 라인피드 (`n)입니다. 줄이 LF (`n) 또는 CR+LF (`r`n)로 끝난다면 올바르게 VarName을 정렬합니다.

F MyFunction [v1.0.47+]: MyFunction에 있는 기준에 맞게 맞춤 정렬합니다 (물론 정렬 시간은 더 길어집니다). 기호 "F" 다음에 선택적으로 스페이스/탭과 그리고 리스트의 두 항목을 비교하는 데 사용될 함수의 이름을 지정하십시오. 함수는 두 개 또는 세 개의 매개변수를 받아야 합니다. 함수가 첫 번째 매개변수를 두 번째 보다 크다고 생각하면, 양의 정수를 돌려줄 것입니다. 두 매개변수가 같다고 생각하면 0 또는 ""을 돌려주거나 아니면 아무것도 돌려주지 않습니다; 그렇지 않으면, 음의 정수를 돌려줍니다. 소수 점이 반환된 값에 존재하면, 그 부분은 무시됩니다 (즉, 0.8은 0과 같습니다). 존재하면, 세 번째 매개변수는 원본/정렬되지 않은 리스트에 보여지는 (예제 참조) 첫 번째 항목으로부터 두 번째 항목의 상대거리를 받습니다 (문자 단위). 마지막으로, 이 함수는 그를 호출한 Sort 명령어와 같은 전역 설정을 사용합니다 (예, StringCaseSense).

주의: F 옵션에서 모든 옵션은 D, Z, 그리고 U를 제외하고 무시됩니다 (물론 N, C, 그리고 CL은 여전히 중복을 탐지하는 방식에 영향을 미칩니다). 또한, . 지정된 함수가 :

  1. 존재하지 않거나;
  2. 매개변수를 두 개 미만으로 받을 때;
  3. 또는 첫 번째 또는 두 번째 매개변수가 ByRef일 때
정렬은 일어나지 않습니다.

N: 숫자순 정렬: 각 항목은 문자열이 아니라 숫자로 간주됩니다 (예를 들어, 이 옵션이 존재하지 않으면, 알파벳 순서이기 때문에 문자열 233은 문자열 40보다 작다고 간주됩니다.). 십진 문자열과 십육진 문자열 모두 (예,. 0xF1) 숫자로 간주됩니다. 숫자로 시작하지 않는 문자열은 정렬의 목적으로 0이라고 간주합니다. 숫자는 64-비트 부동 소수점 수로 간주합니다. (있다면) 각 숫자의 소수 부분도 고려됩니다.

Pn: 문자 위치 n에 기반하여 항목들을 정렬합니다 (n에 십육진 수를 사용하지 마십시오). 이 옵션이 존재하지 않으면, n 은 기본값이 1입니다. 이것은 첫 문자의 위치입니다. 정렬은 각 문자열을 다른 문자열에 그의 n번째 문자부터 비교합니다. n이 문자열의 길이보다 더 크면, 그 문자열은 정렬의 목적으로 비어 있다고 간주합니다. N (숫자 정렬) 옵션과 함께 사용될 때, 이 문자열의 위치가 사용됩니다. 반드시 그 숫자의 자리 위치와 같아야 할 필요는 없습니다.

R: 역순으로 정렬합니다 (다른 옵션에 따라 알파벳 또는 숫자 순서로).

Random: 무작위 순서로 정렬합니다. 이 옵션 때문에 D, Z, 그리고 U를 제외하고 다른 모든 옵션은 무시됩니다 (물론 N, C, 그리고 CL은 여전히 중복을 탐지하는 방식에 영향을 미칩니다). 예를 들어:

Sort, MyVar, Random
Sort, MyVar, Random Z D|

U 모든 항목이 유일하도록 리스트로부터 중복 항목을 제거합니다. ErrorLevel은 제거된 항목의 개수가 설정됩니다 (없으면 0). C 옵션이 켜져 있으면, 항목의 대소문자가 반드시 일치해야 동일하다고 간주합니다. N 옵션이 켜져 있으면, 2 같은 항목은 2.0과 중복이라고 간주합니다. Pn 또는 \ (역사선) 옵션이 켜져 있으면, 정렬에 사용된 부문자열이 아니라 전체 항목이 중복이어야 합니다. Random 또는 F/Function 옵션이 켜져 있으면, 정렬의 결과로 서로 인접하게 나타날 때만 중복이 제거됩니다. 예를 들어, "A|B|A"를 무작위 순서로 정렬할 때, 그 결과는 A가 한 개 또는 두 개가 담길 수 있습니다.

Z: 이 옵션을 이해하려면, 변수에 RED`nGREEN`nBLUE`n가 담겨 있다고 생각해 보십시오. Z 옵션이 존재하지 않으면, 마지막 라인피드 (`n)는 마지막 항목의 일부분으로 간주됩니다. 그리하여 3 개의 항목만 있습니다. 그러나 Z 옵션을 지정하면, 마지막의 `n (존재하면)은 리스트 마지막의 빈 항목을 구분한다고 간주됩니다. 그리하여 4 개의 항목이 있습니다 (마지막 항목은 비어 있습니다).

\: 각각의 마지막 역사선 다음에 오는 부문자열에 기반하여 항목들을 정렬합니다. 항목에 역사선이 없으면, 전체 항목이 부문자열로 사용됩니다. 이 옵션은 파일 이름만 정렬할 때 유용합니다 (즉, 경로 제외). 아래의 예제와 같은 경우, AAA.txt 줄은 BBB.txt 줄보다 위에 정렬됩니다. 왜냐하면 정렬의 목적으로 디렉토리는 무시하기 때문입니다:

C:\BBB\AAA.txt
C:\AAA\BBB.txt

주의: Options N 그리고 P는 역사선 옵션이 존재하면 무시됩니다.

논평

이 명령어는 전형적으로 줄 리스트를 담고 있는 변수를 정렬하는 데 사용됩니다. 줄 리스트는 각 줄이 라인피드 문자 (`n)로 끝납니다. 줄 리스트를 변수 안에 넣는 방법은 전체 파일을 FileRead를 통하여 적재하는 것입니다.

VarName은 Clipboard이고 그 클립보드 안에는 파일들이 담겨 있습니다 (예를 들어 열린 탐색 창으로부터 복사된 파일들). 그런 파일들은 정렬된 리스트로 교체됩니다. 다른 말로, 연산이 끝나면 클립보드에는 더 이상 파일 자체가 남아 있지 있습니다.

ErrorLevel는 U 옵션이 켜져 있을 때만 이 명령어로 바뀝니다.

변수의 최대 가용 능력은 #MaxMem를 통하여 증가시킬 수 있습니다.

방대한 변수를 정렬했고 나중에 그의 내용이 더 이상 필요하지 않으면, 비워서 그의 메모리를 해제할 수 있습니다. 예, MyVar =.

관련 항목

FileRead, 파일-읽기 회돌이, 파싱 회돌이, StringSplit, RegisterCallback(), 클립보드, #MaxMem

예제

MyVar = 5,3,7,9,1,13,999,-4
Sort MyVar, N D,  ; 숫치로 정렬합니다. 쉼표를 구분자로 사용합니다.
MsgBox %MyVar%   ; 결과는 -4,1,3,5,7,9,13,999입니다

; 다음 예제는 파일의 내용을 정렬합니다:
FileRead, Contents, C:\Address List.txt
if not ErrorLevel  ; 성공적으로 적재됨.
{
    Sort, Contents
    FileDelete, C:\Address List (alphabetical).txt
    FileAppend, %Contents%, C:\Address List (alphabetical).txt
    Contents =  ; 메모리를 풀어줍니다.
}

; 다음 예제에서 Win+C는 핫키가 됩니다.
; 열린 탐색 창으로부터 파일들을 복사해 정렬된 파일이름들을 클립보드에 배치합니다:
#c::
Clipboard = ; 탐지가 작동하려면 반드시 비어 있어야 합니다.
Send ^c
ClipWait 2
if ErrorLevel
    return
Sort Clipboard
MsgBox Ready to be pasted:`n%Clipboard%
return

; 다음 예제는 역호출 함수를 통하여 맞춤 정렬을 보여줍니다.
MyVar = def`nabc`nmno`nFGH`nco-op`ncoop`ncop`ncon`n
Sort, MyVar, F StringSort
StringSort(a1, a2)
{
    return a1 > a2 ? 1 : a1 < a2 ? -1 : 0  ; StringCaseSense에 기반하여 알파벳 순으로 정렬합니다.
}

MyVar = 5,3,7,9,1,13,999,-4
Sort, MyVar, F IntegerSort D,
IntegerSort(a1, a2)
{
    return a1 - a2  ; 숫자를 오름 차순으로 정렬합니다. 이 방법은 차이가 부호있는 64-비트 정수를 넘지 않을 때에만 작동합니다.
}

MyVar = 1,2,3,4
Sort, MyVar, F ReverseDirection D,  ; 안에 4,3,2,1이 들어 있는 리스트를 뒤집습니다.
ReverseDirection(a1, a2, offset)
{
    return offset  ; 원래 리스트에서 a2 가 a1 뒤에 오면 상대거리(Offset)는 양수입니다. 그렇지 않으면 음수입니다.
}


SoundBeep

PC 스피커로 톤을 방출합니다.

SoundBeep [, Frequency, Duration]

매개변수

Frequency

소리의 진동수. 표현식일 수 있습니다. 37부터 32767 사이의 숫자가 되어야 합니다. 생략하면, 기본값은 523입니다.

Duration

소리의 지속 시간. 밀리초 단위 (표현식 가능). 생략하면, 기본값은 150입니다.

논평

스크립트는 소리가 끝나기를 기다린 다음 실행을 계속합니다. 게다가, 소리가 나오는 동안은 시스템의 반응성이 줄어들 수도 있습니다.

컴퓨터에 사운드 카드가 없다면, 표준 삐-이 소리가 PC 스피커를 통하여 연주됩니다.

PC 스피커 대신에 표준 시스템 사운드 카드로 삐-이 소리를 내려면, SoundPlay의 별표 모드를 참조하십시오.

관련 항목

SoundPlay

예제

SoundBeep  ; 기본 진동수와 지속 시간으로 연주합니다.
SoundBeep, 750, 500  ; 0.5초간 높은 진동수로 연주합니다.


SoundGet

사운드 창치로부터 다양한 설정을 열람합니다 (음소거, 볼륨 등등.)

SoundGet, OutputVar [, ComponentType, ControlType, DeviceNumber]

매개변수

OutputVar

열람된 설정을 저장할 변수의 이름, 0부터 100 (포함) 사이의 부동 소수점 수이거나 또는 단어 ON이나 OFF입니다. (used only for ControlTypes ONOFF, MUTE, MONO, LOUDNESS, STEREOENH, 그리고 BASSBOOST). 이 변수는 설정을 열람하는 데 문제가 있었으면 비워집니다. 부동 소수점 수의 형식은, 예를 들어 소수점의 위치는, SetFormat에 의하여 결정됩니다.

ComponentType

비어 있거냐 생략하면, 기본 값은 단어 MASTER입니다. 그렇지 않으면, 다음 단어 중 하나가 될 수 있습니다: MASTER (SPEAKERS와 동의어), DIGITAL, LINE, MICROPHONE, SYNTH, CD, TELEPHONE, PCSPEAKER, WAVE, AUX, ANALOG, HEADPHONES, 또는 N/A. 사운드 장치에 지정된 ComponentType이 없으면, ErrorLevel은 그 문제를 나타낼 것입니다.

어떤 믹서에서 라벨이 Auxiliary인 콤포넌트는 AUX가 아니라ANALOG로 접근할 수 있습니다.

사운드 장치에 ComponentType의 실체가 여럿이면 (예를 들어 두 종류의 LINE이 있으면), 보통 첫 번째에 연주 설정이 담기고 둘 째에 녹음 설정이 담깁니다. 첫 번째 말고 다른 실체에 접근하려면, 쌍점과 숫자를 이 매개변수에 추가하십시오. 예를 들어: Analog:2는 아날로그 컴포넌트의 두번째 실체라는 뜻입니다.

ControlType

비어 있거나 생략하면, 기본 값은 VOLUME입니다. 그렇지 않으면, 다음 단어 중 하나가 될 수 있습니다: VOLUME (또는 VOL), ONOFF, MUTE, MONO, LOUDNESS, STEREOENH, BASSBOOST, PAN, QSOUNDPAN, BASS, TREBLE, EQUALIZER, 또는 유효한 콘트롤 유형의 번호 (사운드카드 분석 스크립트 참조). 지정된 ComponentType에 지정된 ControlType이 없으면, ErrorLevel은 그 문제를 알려줄 것입니다.

주의: 사운드 장치는 보통 VOLUME (또는 VOL) 그리고 MUTE만 지원합니다. 물론 다른 것들도 윈도우즈 버전과 사운드 장치에 따라 사용할 수 있습니다.

DeviceNumber

1부터 지원되는 장치의 총 개수까지의 숫자. 이 매개변수를 생략하면, 기본 값은 1입니다 (첫 번째 사운드 장치), 아니면 Windows Vista 이상에서 연주를 위한 시스템의 기본 장치입니다. 이 매개변수는 표현식일 수 있습니다. 사운드카드 분석 스크립트가 어느 번호를 사용해야할지 결정하는 데 도움을 줄 것입니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel는 명령어가 성공하면 0이 설정됩니다. 그렇지 않으면 다음 문구 중 하나가 설정됩니다:

Invalid Control Type or Component Type (유효하지 않은 콘트롤 유형이나 컴포넌트 유형)
Can't Open Specified Mixer (지정된 믹서를 열 수 없음)
Mixer Doesn't Support This Component Type (믹서가 이 콤포넌트 유형을 지원하지 않음)
Mixer Doesn't Have That Many of That Component Type (믹서가 지정한 만큼 많은 콤포넌트 유형이 없음)
Component Doesn't Support This Control Type (컴포넌트가 이 콘트롤 유형을 지원하지 않음)
Can't Get Current Setting (현재 설정을 얻을 수 없음)

논평

Windows Vista 이후는 v1.1.10부터 지원합니다.

시스템에 설치된 사운드 장치 (믹서)의 능력을 알아내려면 -- 예를 들어, 컴포턴트 유형과 콘트롤 유형 -- 다음 사운드카드 분석 스크립트를 실행하십시오.

오디오를 더 섬세하게 제어하려면, VA 라이브러리의 사용을 고려해 보십시오.

설정을 바꾸려면 SoundSet을 사용하십시오.

관련 항목

SoundSet, SoundGetWaveVolume, SoundSetWaveVolume, SoundPlay

예제

SoundGet, master_volume
MsgBox, 마스터 볼륨은 %master_volume% 퍼센트입니다.

SoundGet, master_mute, , mute
MsgBox, 마스터 음소거는 현재 %master_mute%입니다.

SoundGet, bass_level, Master, bass
if ErrorLevel
    MsgBox, 에러 설명: %ErrorLevel%
else
    MsgBox, MASTER에 대한 BASS 레벨은 %bass_level% 퍼센트입니다.

SoundGet, microphone_mute, Microphone, mute
if microphone_mute = Off
    MsgBox, 마이크로폰이 음소거되지 않았습니다.


SoundGetWaveVolume

사운드 장치에 대하여 웨이브 출력 볼륨을 열람합니다.

SoundGetWaveVolume, OutputVar [, DeviceNumber]

매개변수

OutputVar

열람된 볼륨 레벨을 저장할 변수의 이름. 이 값은 0부터 100까지의 부동 소수점 수일 수 있습니다. 이 변수는 볼륨을 열람하는 데 문제가 있었으면 비워집니다. 부동 소수점 수의 형식은, 예를 들어 그의 소수점 자리는, SetFormat에 의하여 결정됩니다.

DeviceNumber

이 매개변수가 생략되면, 기본값은 1입니다 (첫 번째 사운드 장치), 이것이 보통 녹음과 연주에 사용되는 시스템의 기본 장치입니다. 1보다 큰 숫자를 지정하면 다른 사운드 장치를 처리할 수 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1 , 그렇지 않으면 0이 설정됩니다.

논평

현재 웨이브 출력 볼륨 레벨은 SoundSetWaveVolume를 통하여 설정할 수 있습니다. Master Volume, Synth, Microphone, Mute, Treble, 그리고 Bass 같은 설정들은 SoundSet과 SoundGet을 사용하여 설정하고열람할 수 있습니다.

Windows Vista 이후 (v1.1.10+): 이 명령어는 SoundGet에서 ComponentType에 Wave를 설정하고 ControlType에 Volume을 설정한 것과 동등합니다.

관련 항목

SoundSetWaveVolume, SoundSet, SoundGet, SoundPlay

예제

SoundGetWaveVolume, OutputVar
MsgBox, 현재 웨이브 출력 볼륨 레벨은 %OutputVar%`%입니다.


SoundPlay

사운드, 비디오, 또는 기타 지원되는 파일 유형을 연주합니다.

SoundPlay, Filename [, wait]

매개변수

Filename

연주될 파일의 이름, 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주합니다.

표준 시스템 사운드를 생산하려면, 아래에 보여 주듯이 별표 다음에 숫자를 지정하십시오. 주의: wait 매개변수는 이 모드에서 아무 효과도 없습니다.
*-1: 단순한 비프음. 사운드 카드가 없으면 , 사운드는 스피커를 사용하여 생성됩니다.
*16: 손 (중지/에러)
*32: 질문
*48: 감탄
*64: 별표 (정보)

wait

생략하면, 파일이 연주되고 있는 동안 스크립트의 현재 쓰레드가 다음 명령어로 이동합니다. 이를 피하려면, 1 또는 단어 WAIT를 지정하십시오. 그러면 파일이 연주를 끝낼 때까지 현재 쓰레드가 기다렸다가 실행을 계속합니다. 기다리고 있는 동안에도, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새로운 쓰레드를 기동할 수 있습니다.

알려진 한계: WAIT 매개변수를 생략하면, OS는 연주 중인 파일이 스크립트가 닫힐 때까지 또는 또다른 파일이 연주될 때까지 (심지어 존재하지 않은 파일일지라도) "사용될 거라고" 간주합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

모든 Windows 운영체제는 .wav 파일을 연주할 수 있을 것입니다. 그렇지만, 다른 파일들은 (.mp3, .avi, etc.) 올바른 코덱이나 특징을 OS에 설치하지 않으면 연주하지 못할 수도 있습니다.

파일이 연주 중이고 현재 스크립트가 두 번째 파일을 연주한다면, 첫 번째 파일은 멈추고 두 번째 파일이 연주됩니다. 어떤 시스템에서, 어떤 파일 유형은 완전히 별개의 스크립트가 새 파일을 연주할 지라도 연주를 중단합니다.

현재 연주 중인 파일을 중지하려면, SoundPlay를 다음 예제와 같이 존재하지 않은 파일이름에 실행하십시오: SoundPlay, Nonexistent.avi.

스크립트가 종료하면, 스크립트가 기동해서 현재 연주 중인 파일도 중지됩니다.

관련 항목

SoundBeep, SoundGet, SoundSet, SoundGetWaveVolume, SoundSetWaveVolume, MsgBox, 쓰레드

예제

SoundPlay, %A_WinDir%\Media\ding.wav
SoundPlay *-1  ; 간단한 비프음. 사운드 카드가 없으면, 스피커를 사용하여 소리를 발생시킵니다.


SoundSet

사운드 장치의 다양한 설정을 변경합니다 (음소거, 볼륨 등등.)

SoundSet, NewSetting [, ComponentType, ControlType, DeviceNumber]

매개변수

NewSetting

백분률 숫자. 범위는 -100부터 100 까지 (부동 소수점 수 또는 표현식 가능). 숫자가 플러스 또는 마이너스 사인으로 시작하면, 현재 설정이 지정한 양만큼 위나 아래로 조절됩니다. 그렇지 않으면, 이 설정은 명시적으로 NewSetting에 지정한 값이 설정됩니다.

오직 두 개의 설정만 가능한 ControlTypes에 대하여 -- 즉 ONOFF, MUTE, MONO, LOUDNESS, STEREOENH, 그리고 BASSBOOST -- 양수는 설정을 켜고 0이면 설정을 끕니다. 그렇지만, 숫자가 플러스 또는 마이너스 사인으로 시작하면, 설정은 토글됩니다 (현재 상태를 반대로 설정합니다).

ComponentType

생략하거나 비어 있으면, 기본값은 단어 MASTER입니다. 그렇지 않으면, 다음 단어 중 하나가 될 수 있습니다: MASTER (SPEAKERS와 동의어), DIGITAL, LINE, MICROPHONE, SYNTH, CD, TELEPHONE, PCSPEAKER, WAVE, AUX, ANALOG, HEADPHONES, 또는 N/A. 사운드 장치에 지정된 ComponentType이 없으면, ErrorLevel은 그 에러를 알려줍니다.

라벨이 Auxiliary인 컴포넌트는 어떤 믹서에서 AUX가 아니라 ANALOG로 접근할 수 있습니다.

장치에 ComponentType의 실체가 하나 이상 있으면 (예를 들어 두 종류의 LINE), 보통 첫 번째 콤포넌트에 연주 설정이 담기고 두 번째 콤포넌트에 녹음 설정이 담깁니다. 첫 콤포넌트 말고 다른 콤포넌트에 접근하려면 쌍점과 숫자를 이 매개변수 뒤에 추가하십시오. 예를 들어: Analog:2는 아날로그 컴포넌트의 두 번째 실체입니다.

ControlType

생략하거나 비어 있으면, 기본 값은 VOLUME입니다. 그렇지 않으면, 다음 단어 중 하나가 될 수 있습니다: VOLUME (또는 VOL), ONOFF, MUTE, MONO, LOUDNESS, STEREOENH, BASSBOOST, PAN, QSOUNDPAN, BASS, TREBLE, EQUALIZER, 또는 유효한 콘트롤 유형이 번호 (사운드카드 분석 스크립트 참조). 지정된 ComponentType에 지정된 ControlType이 없으면, ErrorLevel은 그 문제를 알려 줍니다.

주의: 사운드 장치는 보통 VOLUME (또는 VOL) 그리고 MUTE만 지원합니다. 물론 다른 것들도 사운드 장치와 윈도우즈 버전에 따라 사용할 수 있습니다.

DeviceNumber

1부터 지원되는 장치의 총 갯수 까지의 숫자. 이 매개변수를 생략하면, 기본 값은 1 (첫 번째 사운드 장치)이거나, 아니면 Windows Vista 이후에서 연주에 대한 시스템의 기본 장치입니다. 이 매개변수는 표현식일 수 있습니다. 사운드카드 분석 스크립트는 어느 번호를 사용할 지 결정하는 데 도움이 될 것입니다..

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 명령어가 성공했으면 0이 설정됩니다. 그렇지 않으면, 다음 문구 중 하나가 설정됩니다:

Invalid Control Type or Component Type (무효한 콘트롤 유형이나 컴포넌트 유형)
Can't Open Specified Mixer (지정된 믹서를 열 수 없음)
Mixer Doesn't Support This Component Type (믹서가 이 컴포넌트 유형을 지원하지 않음)
Mixer Doesn't Have That Many of That Component Type (지정한 만큼 많은 컴포넌트 유형이 믹서에 없음)
Component Doesn't Support This Control Type (컴포넌트가 이 콘트롤 유형을 지원하지 않음)
Can't Get Current Setting (현재 설정을 가져올 수 없음)
Can't Change Setting (설정을 변경할 수 없음)

논평

Windows Vista 이후는 v1.1.10부터 지원합니다.

오디오를 더 섬세하게 제어하려면, VA 라이브러리의 사용을 고려해 보십시오.

볼륨을 조절하는 또다른 방법은 스크립트에게 볼륨-제어 키눌림을 전송하게 해 전체 시스템에 대하여 마스터 볼룸을 변경하는 것입니다. 예를 들어 다음 예제와 같이 할 수 있습니다:

Send {Volume_Up}  ; 마스터 볼륨을 1 눈금 올립니다 (보통 5%).
Send {Volume_Down 3}  ; 마스터 볼륨을 3 눈금 내립니다.
Send {Volume_Mute}  ; 마스터 볼륨을 음소거 하거나 해제합니다.

시스템에 설치된 사운드 장치 (믹서)의 능력을 알아 내려면 -- 예를 들어 컴포넌트 유형과 콘트롤 유형 -- 사운드카드 분석 스크립트를 실행하십시오.

Windows 2000/XP/2003: SoundSet이 한 컴포넌트의 볼륨을 변경할 때, 다른 모든 컴포넌트의 채널도 (예, 왼쪽 오른쪽) 같은 레벨로 설정됩니다. 다른 말로, 이전에 "평형"을 벗어난 값이 설정되었다면 모두 사라집니다. WAVE 컴포넌트에 대하여 이를 피하려면 대신에 SoundSetWaveVolume을 사용하면 됩니다. 이는 볼륨 레벨을 변경할 때 기존의 평형을 유지하려고 시도합니다.

Windows Vista 이후 (v1.1.10+): SoundSet는 볼륨 레벨을 변경할 때 기존의 평형을 유지하려고 노력합니다.

설정의 현재 값을 열람하려면 SoundGet을 사용하십시오.

관련 항목

SoundGet, SoundGetWaveVolume, SoundSetWaveVolume, SoundPlay

예제

; 기본 예제:
SoundSet, 50  ; 마스터 볼륨에 50%를 설정합니다
SoundSet +10  ; 마스터 볼륨을 10% 올립니다
SoundSet -10  ; 마스터 볼륨을  10% 내립니다
SoundSet, 1, Microphone, mute  ; 마이크로폰을 음소거합니다
SoundSet, +1, , mute  ; 마스터 음소거를 토글합니다 (반대 상태로 설정합니다)
SoundSet, +20, Master, bass  ; bass 레벨을 20% 올립니다.
if ErrorLevel
    MsgBox, MASTER에서 BASS 설정을 지원하지 않습니다.

사운드카드 분석

다음 스크립트를 사용하면 사운드카드의 능력을 알아볼 수 있습니다 (컴포넌트 유형과 콘트롤 유형). 그 결과를 간단한 ListView에 보여줍니다. 다른 방법으로, Windows Vista 이후에 (예를 들어 장치의 화면 이름과 같은) 더 자세한 정보를 제공하는 스크립트를 다음 포럼의 주제에서 내려 받을 수 있습니다: http://www.autohotkey.com/board/topic/90877-/

SetBatchLines -1
SplashTextOn,,, Gathering Soundcard Info...

; 아래에서 순수한 숫자는 대부분 아마도 어느 믹서에도 존재하지 않겠지만, 완벽을 기하기 위해 질의합니다.
; 숫자들은 다음 항목에 (순서대로) 상응합니다: CUSTOM, BOOLEANMETER, SIGNEDMETER, PEAKMETER,
; UNSIGNEDMETER, BOOLEAN, BUTTON, DECIBELS, SIGNED, UNSIGNED, PERCENT, SLIDER, FADER, SINGLESELECT, MUX,
; MULTIPLESELECT, MIXER, MICROTIME, MILLITIME
ControlTypes = VOLUME,ONOFF,MUTE,MONO,LOUDNESS,STEREOENH,BASSBOOST,PAN,QSOUNDPAN,BASS,TREBLE,EQUALIZER,0x00000000, 0x10010000,0x10020000,0x10020001,0x10030000,0x20010000,0x21010000,0x30040000,0x30020000,0x30030000,0x30050000,0x40020000,0x50030000,0x70010000,0x70010001,0x71010000,0x71010001,0x60030000,0x61030000

ComponentTypes = MASTER,HEADPHONES,DIGITAL,LINE,MICROPHONE,SYNTH,CD,TELEPHONE,PCSPEAKER,WAVE,AUX,ANALOG,N/A

; ListView를 생성하고 메인 회돌이를 위해 준비를 합니다:
Gui, Add, Listview, w400 h400 vMyListView, Component Type|Control Type|Setting|Mixer
LV_ModifyCol(4, "Integer")
SetFormat, Float, 0.2  ; Limit number of decimal places in percentages to two.

Loop  ; 시스템에 존재하는 각 믹서 번호에 대하여, 그의 능력을 질의합니다.
{
    CurrMixer := A_Index
    SoundGet, Setting,,, %CurrMixer%
    if ErrorLevel = Can't Open Specified Mixer  ; 이 에러만 아니면 믹서가 존재한다는 뜻입니다.
        break

    ; 이 믹서에 존재하는 각 컴포넌트 유형에 대하여, 그의 실체와 콘트롤 유형을 질의합니다:
    Loop, parse, ComponentTypes, `,
    {
        CurrComponent := A_LoopField
        ; 먼저 이 컴포넌트 유형이 믹서에 존재하는지 점검합니다:
        SoundGet, Setting, %CurrComponent%,, %CurrMixer%
        if ErrorLevel = Mixer Doesn't Support This Component Type
            continue  ; 다음 콤포넌트 유형으로 나아가기 위해 새 반복을 시작합니다.
        Loop  ; 이 컴포넌트 유형의 각 실체에 대하여, 그의 콘트롤 유형을 질의합니다.
        {
            CurrInstance := A_Index
            ; 먼저 이 컴포넌트의 실체가 믹서에 존재하는지 점검합니다:
            SoundGet, Setting, %CurrComponent%:%CurrInstance%,, %CurrMixer%
            ; 다음의 에러 두 개를 모두 점검하면 이 스크립트를 예전 버전에서도 실행시킬 수 있습니다:
            if ErrorLevel in Mixer Doesn't Have That Many of That Component Type,Invalid Control Type or Component Type
                break  ; 이 콤포넌트 유형의 실체가 없습니다.
            ; 이 컴포넌트의 실체에 존재하는 각 콘트롤 유형의 현재 설정을 얻습니다:
            Loop, parse, ControlTypes, `,
            {
                CurrControl := A_LoopField
                SoundGet, Setting, %CurrComponent%:%CurrInstance%, %CurrControl%, %CurrMixer%
                ; 다음 두 에러를 모두 점검하면 이 스크립트를 예전 버전에서도 실행할 수 있습니다:
                if ErrorLevel in Component Doesn't Support This Control Type,Invalid Control Type or Component Type
                    continue
                if ErrorLevel  ; 생각지 못한 에러입니다. 그래서 그 결과에 보여줍니다.
                    Setting := ErrorLevel
                ComponentString := CurrComponent
                if CurrInstance > 1
                    ComponentString = %ComponentString%:%CurrInstance%
                LV_Add("", ComponentString, CurrControl, Setting, CurrMixer)
            }  ; 각 콘트롤 유형에 대하여.
        }  ; 각 컴포넌트 실체에 대하여.
    }  ; 각 컴포넌트 유형에 대하여.
}  ; 각 믹서에 대하여.

Loop % LV_GetCount("Col")  ; 그의 내용에 맞게 각 컬럼의 크기를 자동으로 조절합니다.
    LV_ModifyCol(A_Index, "AutoHdr")

SplashTextOff
Gui, Show
return

GuiClose:
ExitApp


SoundSetWaveVolume

사운드 장치에 대하여 웨이브 출력 볼륨을 변경합니다.

SoundSetWaveVolume, Percent [, DeviceNumber]

매개변수

Percent

퍼센트 숫자는 범위가 -100부터 100까지입니다 (부동 소수점이나 표현식을 허용합니다). 숫자가 플러스 또는 마이너스 사인으로 시작하면, 현재 볼륨 레벨이 지시한 양 만큼 위 또는 아래로 조절됩니다. 그렇지 않으면, 볼륨은 Percent로 지시한 레벨에 명시적으로 지정됩니다.

DeviceNumber

이 매개변수를 생략하면, 기본 값은 1입니다 (첫 번째 사운드 장치), 이 장치는 보통 녹음과 연주에 사용되는 시스템의 기본 장치입니다. 1보다 큰 값을 지정하면 다른 사운드 장치를 처리할 수 있습니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

현재 웨이브 출력 볼륨 레벨은 SoundGetWaveVolume를 통하여 열람할 수 있습니다. Master Volume, Synth, Microphone, Mute, Treble, 그리고 Bass와 같은 설정은 SoundSet과 SoundGet를 통하여 각각 설정하고 열람할 수 있습니다.

Windows Vista 이후 (v1.1.10+): 이 명령어는 SoundSet에서 ComponentType은 Wave로 설정하고 ControlType는 Volume으로 설정한 것과 동등합니다. 두 명령어 모두 채널 사이의 기존의 평형을 유지하려고 노력합니다.

Windows 2000/XP/2003: SoundSet과 다르게, 이 명령어는 볼륨 레벨을 변경할 때 채널 사이의 기존의 평형을 유지하려고 노력합니다 (예, 왼쪽과 오른쪽).

관련 항목

SoundGetWaveVolume, SoundSet, SoundGet, SoundPlay

예제

SoundSetWaveVolume, 50  ; 볼륨을 그의 절반으로 설정합니다.
SoundSetWaveVolume, -10  ; 현재 레벨을 10만큼 낮춥니다 (예, 80이면 70이 됩니다).
SoundSetWaveVolume, +20  ; 현재 레벨을 20만큼 높입니다.


SplashTextOn / SplashTextOff

맞춤 가능한 텍스트 팝업 창을 생성합니다.

SplashTextOff
SplashTextOn [, Width, Height, Title, Text]

매개변수

Width

창의 픽셀 단위 너비. 기본값은 200. 이 매개변수는 표현식일 수 있습니다.

Height

창의 픽셀 단위 높이 (제목 바 제외). 기본값은 0 (즉, 제목 바만 보여줍니다). 이 매개변수는 표현식일 수 있습니다.

Title

창의 제목, 기본 값은 비어 있습니다.

Text

창의 텍스트, 기본값은 비어 있습니다. Text가 길면, 계속 섹션을 수단으로 더 짧은 줄로 가를 수 있습니다. 이렇게 하면 가독성과 유지관리성이 향상됩니다.

논평

레이이웃과 글꼴 이름/색/크기에 대하여 더 섬세하게 통제하려면, Progress 명령어에 zh0 옵션을 함께 사용하십시오. 그러면 제목 바를 생략하고 텍스트만 보여줍니다. 예를 들어: Progress, zh0 fs18, 보여 줄 18-포인트 텍스트 약간.

SplashTextOff 명령어를 사용하면 기존의 스플래시 창을 제거할 수 있습니다.

스플래시 창은 "언제나 위에"있습니다. 즉, 다른 모든 정상 창보다 위에 있다는 뜻입니다. 이를 바꾸려면 WinSet, AlwaysOnTop, Off, <스플래시 창의 제목을 삽입하십시오>를 사용하십시오. WinSet은 또 스플래시 창을 투명하게 만들 수도 있습니다.

WinMove를 사용하면 이 명령어로 화면에 보여준 후에 SplashText 창의 위치와 크기를 조절할 수 있습니다.

Progress, SplashImage, MsgBox, InputBox, FileSelectFile, 그리고 FileSelectFolder와 다르게, 스크립트당 오직 하나의 SplashText 창만 가능합니다.

스플래시 창이 이미 화면에 보이는 동안에 SplashTextOn이 사용되면, 그 창은 새 매개변수 값을 가지고 다시 생성됩니다. 그렇지만, 제목 바나 텍스트를 변경할 때마다 스플래시 창을 다시 생성하기 보다, 다음과 같이 하면 더 수행성능이 좋습니다. 특히 창이 자주 바뀔 필요가 있다면 다음과 같이 하십시오:

WinSetTitle, <스플래시 창의 제목을 삽입하십시오>, , NewTitle
ControlSetText, Static1, NewText, <스플래시 창의 제목을 입력하십시오>

관련 항목

Progress, SplashImage, ToolTip, MsgBox, InputBox, FileSelectFile, FileSelectFolder, WinMove, WinSet

예제

SplashTextOn, , , 제목 바를 보여줍니다.
Sleep, 2000
SplashTextOn, 400, 300, Clipboard, 클립보드에 다음이 담겨 있습니다:`n%clipboard%
WinMove, Clipboard, , 0, 0  ; 스플래시 창을 좌상 모서리로 이동시킵니다.
Msgbox, 스플래시 텍스트를 취소하려면 OK를 누릅니다.
SplashTextOff


SplitPath

파일이름이나 URL을 그의 이름, 디렉토리, 확장자 그리고 드라이브로 분해합니다.

SplitPath, InputVar [, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive]

매개변수

InputVar

분석할 파일이름을 담고 있는 변수의 이름.

[v1.1.21+]: 이 매개변수는 % 표현식일 수 있지만, 퍼센트-스페이스를 반드시 앞에 사용해야 합니다.

OutFileName

경로 없이 파일 이름을 저장할 변수의 이름. 파일의 확장자는 포함됩니다.

OutDir

파일의 디렉토리를 저장할 변수의 이름, 드라이브 기호와 (존재하면) 공유 이름을 포함합니다. 파일이 드라이브의 루트 디렉토리에 있다면 마지막의 역사선은 포함되지 않습니다.

OutExtension

파일의 확장자를 저장할 변수의 이름 (예, TXT, DOC, 또는 EXE). 점은 포함되지 않습니다.

OutNameNoExt

경로, 점, 그리고 확장자 없이 파일 이름을 저장할 변수의 이름.

OutDrive

파일의 드라이브 기호 또는 서버 이름을 저장할 변수의 이름. 파일이 로컬 또는 맵 드라이브에 있다면, 변수는 드라이브 기호와 다름 쌍점 (역사선 없음)이 설정됩니다. 파일이 네트워크 경로에 있다면 (UNC), 변수는 공유 이름이 설정됩니다. 예, \\Workstation01

논평

상응하는 정보가 필요하지 않다면 출력 변수를 생략할 수 있습니다.

InputVar에 파일이름이 들어 있는데 드라이브 기호가 없다며 (즉, 경로가 없거나 단순히 상대 경로만 있다면), OutDrive는 비워지지만 다른 모든 출력 변수는 올바르게 설정됩니다. 비슷하게, 경로가 존재하지 않으면, OutDir은 비워집니다; 그리고 경로는 있으나 파일이름이 없으면, OutFileName과 OutNameNoExt가 비워집니다.

시스템에서 실제 파일과 디렉토리는 이 명령어로 점검되지 않습니다. 그냥 InputVar에 주어진 문자열을 분석할 뿐입니다.

파일이름에 유효하지 않은 와일드카드 (* 그리고 ?) 그리고 기타 문자는 유효한 문자로 취급합니다. 단, 예외는 쌍점, 역사선, 그리고 점입니다. 이것들은 각자 임무에 따라 파일의 드라이브 기호와 디렉토리 그리고 확장자를 구분하는 데 사용됩니다.

URL 지원: InputVar에 쌍점과 두개의 정사선이 포함되어 있다면, 예를 들어 http://domain.com or ftp://domain.com와 같은 경우, OutDir는 프로토콜 접두어 + 도메인 이름 + 디렉토리 (예, http://domain.com/images)가 설정됩니다. 그리고 OutDrive는 프로토콜 접두어 + 도메인 이름 (예, http://domain.com)이 설정됩니다. 다른 모든 변수는 위에 정의된 대로 설정됩니다.

관련 항목

A_LoopFileExt, StringSplit, StringGetPos, StringMid, StringTrimLeft, StringLeft, FileSelectFile, FileSelectFolder

예제

FullFileName = C:\My Documents\Address List.txt

; 위로부터 파일이름만 가져 옵니다:
SplitPath, FullFileName, name

; 디렉토리만 가져 옵니다:
SplitPath, FullFileName,, dir

; 모든 정보를 가져 옵니다:
SplitPath, FullFileName, name, dir, ext, name_no_ext, drive

; 위로부터 변수들은 다음과 같이 설정됩니다:
; name = Address List.txt
; dir = C:\My Documents
; ext = txt
; name_no_ext = Address List
; drive = C:


StatusBarGetText

표준 상태 바 콘트롤으로부터 텍스트를 열람합니다.

StatusBarGetText, OutputVar [, Part#, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

열람된 텍스트를 저장할 변수의 이름.

Part#

바에서 열람할 부분의 번호, 표현식 가능. 기본값은 1이며 보통 관심의 텍스트를 담고 있는 부분입니다.

WinTitle

창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져 있어야(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1 없으면 0이 설정됩니다. 문제가 있었으면 OutputVar도 비워집니다.

논평

이 명령어는 창에서 첫 번째 표준 상태 바를 읽으려고 시도합니다 (Microsoft 공통 콘트롤: msctls_statusbar32). 어떤 프로그램은 자신만의 상태 바를 사용하기도 하고 특별한 버전의 MS 공통 콘트롤을 사용합니다. 이 경우 텍스트를 열람할 수 없습니다.

이 명령어를 회돌이 안에 사용하기 보다, 보통 StatusBarWait를 사용하는 것이 더 효율적입니다. 이 명령어는 반복적으로 StatusBarGetText를 호출하는 부담을 피하도록 최적화 되어 있습니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows이 켜져 있어야 탐지됩니다.

관련 항목/h3>

StatusBarWait, WinGetTitle, WinGetText, ControlGetText

예제

StatusBarGetText, RetrievedText, 1, Search Results
IfInString, RetrievedText, found, MsgBox, 검색 결과가 발견되었습니다.


StatusBarWait

창의 상태 바에 지정된 문자열이 담길 때까지 기다립니다.

StatusBarWait [, BarText, Seconds, Part#, WinTitle, WinText, Interval, ExcludeTitle, ExcludeText]

매개변수

BarText

명령어가 기다리는 텍스트 또는 부분적 텍스트. 기본값은 비어 있습니다. 즉, 상태 바가 비기를 기다린다는 뜻입니다. 텍스트는 대소문자를 구별하고 부합 행위는 SetTitleMatchMode의해 결정됩니다. 아래의 WinTitle과 비슷합니다.

대신에 상태 바의 텍스트가 변하기를 기다린다면, StatusBarGetText를 회돌이 안에 사용하거나, 이 페이지 하단에 있는 RegEx 예제를 따르십시오.

Seconds

시간 제한을 선언하기 전에 기다릴 초의 개수 (소수 점을 포함할 수 있고 표현식일 수 있습니다). 시간 제한에 걸릴 경우 ErrorLevel은 1이 설정됩니다. 기본 값은 비어 있습니다. 즉, 무한정 기다린다는 뜻입니다. 0을 지정하면 0.5를 지정한 것과 같습니다.

Part#

상태 바에서 열람할 부분의 번호. 표현식 가능. 기본값은 1이며 보통 관심의 텍스트가 포함된 부분입니다.

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 반드시 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText이 겨져(ON) 있어야 탐지됩니다.

Interval

이 명령어가 실행 중인 동안에 얼마나 자주 상태 바를 점검할 것인가 (밀리초 단위), 이 값은 표현식일 수 있습니다. 기본 값은 50입니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 상태바에 접근하지 못 했으면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 상태 바에서 부합을 발견하기 전에 시간 제한에 걸리면 1이 설정됩니다. 상태 바에 접근하지 못 했으면 2가 설정됩니다. 부합을 발견하면 0이 설정됩니다.

논평

StatusBarWait은 창의 첫 번째 표준 상태 바를 읽으려고 시도합니다 (class msctls_statusbar32). 어떤 프로그램은 자신 만의 상태바가 있고 특별한 버전의 MS 공통 콘트롤을 가집니다. 그런 경우 상태바를 열람할 수 없습니다.

회돌이 안에 StatusBarGetText를 사용하는 것보다, 보통 StatusBarWait를 사용하는 것이 더 효율적입니다. 왜냐하면 StatusBarGetText를 반복적으로 호출하면 일어날 부담을 피하도록 최적화되어 있기 때문입니다.

StatusBarWait는 그의 목표 창을 결정한 다음 부합하기를 기다립니다. 그 목표 창이 닫히면, StatusBarWait는 지정된 WinTitle과 WinText로 또다른 창이 부합하더라도 기다리기를 멈춥니다.

이 명령어가 대기 상태에 있는 동안, 새로운 쓰레드를 기동할 수 있습니다 핫키, 맞춤 메뉴 항목, 또는 타이머.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

StatusBarGetText, WinGetTitle, WinGetText, ControlGetText

예제

; 다음 예제는 새로운 검색 패턴을 기존의 Explorer/Search 창에 삽입합니다.
IfWinExist, Search Results ; 마지막 발견 창을 설정하여 아래를 간단하게 만듭니다.
{
    WinActivate
    Send, {tab 2}!o*.txt{enter}  ; 검색 창에, 검색할 패턴을 입력합니다.
    Sleep, 400  ; 상태 바에 "Searching"으로 바꿀 시간을 줍니다.
    StatusBarWait, found, 30
    if ErrorLevel
        MsgBox, 명령어가 시간 제한에 걸렸거나 문제가 있었습니다.
    else
        MsgBox, 검색이 성공적으로 완료 되었습니다.
}

; 다음 예제는 활성 창의 상태바가 바뀌기를 기다립니다. 이 예제는 v1.0.46.06+을 요구합니다.
SetTitleMatchMode RegEx
IfWinExist A  ; 마지막 발견 창에 활성 창을 설정합니다 (아래에 사용).
{
   StatusBarGetText, OrigText
   StatusBarWait, ^(?!^\Q%OrigText%\E$)  ; 이 정규 표현식은 텍스트에 무엇이든 변화가 있기를 기다립니다.
}


StringCaseSense

문자열 비교가 대소문자를 구분할지 말지 결정합니다 (기본 값은 "대소문자를 구분하지 않습니다").

StringCaseSense, On|Off|Locale

매개변수

On|Off|Locale

On: 문자열 비교는 대소문자를 구분합니다. 이 설정은 또한 표현식 등호 사인 연산자 (=) 그리고 InStr()의 대소문자 비 구분 모드를 아래에 기술된 로케일 방법을 사용하도록 만듭니다.

Off (기본값으로 시작): 기호 A-Z는 소문자로 간주합니다. 이것은 하위 호환과 수행성능의 문제 때문에 모든 스크립트를 시작할 때 기본값입니다 (Locale은 비교되는 문자열의 성질에 따라 Off 때보다 1에서 8배까지 느립니다).

Locale [v1.0.43.03+]: 문자열 비교는 현재 사용자의 로케일에 따라 대소문자를 구분 합니다. 예를 들어, 대부분의 영어와 서구 유럽 로케일은 기호 A-Z를 소문자로 취급할 뿐만 아니라 Ä and Ü와 같은 ANSI 기호도 소문자로 취급합니다.

논평

이 설정은 다음에 적용됩니다:

  • 표현식 비교 연산자 ( ==는 예외). 그렇지만, 등호-사인 연산자 (=)는 언제나 대소문자를 구분하지 않기 때문에, StringCaseSense가 On되어 있으면 Locale 모드를 사용합니다. InStr()의 대소문자 비구분 모드도 마찬가지로 Locale 모드를 사용합니다.
  • IfInString, StringGetPos, 그리고 InStr(). 그렇지만, InStr()은 CaseSensitive 매개변수가 참(true)이어도 영향을 받지 않습니다.
  • StringReplace
  • if var in/contains MatchList, if var between, 그리고 IfEqual과 그의 가족.
  • [AHK_L 42+]: if var is [not] type은 Locale 모드가 켜져 있을 경우에만 시스템 로케일을 존중합니다.

내장 변수 A_StringCaseSense는 현재 설정이 담깁니다 (단어 On, Off, 또는 Locale).

새로 기동되는 쓰레드는 모두 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머 서브루틴) 이 명령어에 대한 기본 설정을 가지고 새롭게 시작합니다. 이 기본값은 자동-실행 섹션 (스크립트의 상단)에서 이 명령어를 사용하면 변경할 수 있습니다.

관련 항목

IfEqual, IfInString, if var between, StringReplace, StringGetPos

예제

StringCaseSense Locale


StringGetPos

문자열 안에서 지정된 부문자열의 위치를 열람합니다.

StringGetPos, OutputVar, InputVar, SearchText [, L#|R#, Offset]
Position := InStr(Haystack, Needle [, CaseSensitive?, StartingPos]) ; 자세한 것은 InStr() 함수 참조.

매개변수

OutputVar

열람된 위치를 저장할 변수의 이름. InputVar의 첫 문자에 상대적입니다. 위치가 0이면 StringGetPos에 대하여 첫 문자이고 위치가 1이면 InStr()에 대하여 첫 문자입니다.

InputVar

내용이 검색될 입력 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용이 이름이기를 바라는 경우라면 예외입니다.

SearchText

검색할 문자열, 부합은 대소문자를 구분하지 않습니다. 단, StringCaseSense가 켜져 있는 경우는 예외입니다.

L#|R#

이 매개변수는 InputVar 안에서 SearchText가 여러 번 출현하면 몇 번째 부합을 발견할지에 영향을 미칩니다 . 이 매개변수를 생략하면, 첫 번째 부합을 위해 InputVar를 왼쪽부터 검색합니다. 이 매개변수가 1이거나 기호 R이면, 검색이 InputVar의 오른쪽부터 시작해 왼쪽으로 첫 번째 부합을 발견할 때까지 계속됩니다.

첫 번째 부합말고 다른 부합을 발견하려면, 기호 L 또는 R 다음에 출현 횟수를 지정하십시오. 예를 들어, 오른쪽에서 네 번째 출현을 발견하고 싶으면. r4를 지정하십시오. 주의: 숫자를 0이하로 지정하면, 부합이 발견되지 않습니다.

Offset

왼쪽 끝 또는 오른쪽 끝으로부터 (위의 매개변수에 따라) 건너 뛸 문자의 개수. 생략하면, 기본값은 0입니다. 예를 들어, 다음은 왼쪽 10번째 문자부터 검색을 시작합니다: StringGetPos, OutputVar, InputVar, abc, , 9. 이 매개변수는 표현식일 수 있습니다..

ErrorLevel

ErrorLevel은 지정된 SearchText의 출현을 InputVar 안에서 발견할 수 없었으면 1이 설정되고 그렇지 않으면 0이 설정됩니다.

논평

StringMid 그리고 InStr()와 다르게, StringGetPos에 대하여 0은 첫 번째 문자의 위치로 정의됩니다.

열람된 위치는 언제나 InputVar의 첫 문자에 상대적입니다. L#|R# 그리고/또는 Offset이 지정되어 있든 말든 상관이 없습니다. 예를 들어, 문자열 "abc"가 123abc789에서 발견되면, 보고된 그의 위치는 언제나 3입니다. 어떤 방법으로 발견했는지는 상관이 없습니다.

SearchText의 지정된 출현이 InputVar안에 존재하지 않으면, OutputVar는 -1이 설정되고 ErrorLevel는 1이 설정됩니다.

SplitPath를 사용하면 보다 쉽게 파일 경로를 그의 디렉토리와 파일이름 그리고 확장자로 가를 수 있습니다.

내장 변수 %A_Space%와 %A_Tab%에 각각 스페이스 문자 하나와 탭 문자 하나가 들어 있습니다. SearchText의 앞이나 뒤에서 스페이스와 탭을 따로 검색할 경우에 유용합니다.

관련 항목

InStr(), RegExMatch(), IfInString, if var in/contains MatchList, StringCaseSense, StringReplace, SplitPath, StringLeft, StringRight, StringMid, StringTrimLeft, StringTrimRight, StringLen, StringLower, StringUpper, if var is type

예제

Haystack = abcdefghijklmnopqrs
Needle = def
StringGetPos, pos, Haystack, %Needle%
if pos >= 0
    MsgBox, 문자열이 위치 %pos%에서 발견되었습니다.

; 예제 #2:
; 파일이 전체 경로를 각 구성요소로 분해 합니다.
; StringSplit 또는 파싱 회돌이를 사용하면
;  훨씬 더 쉽게 가를 수 있습니다. 그래서 아래는 그저 보여주기 용입니다.
FileSelectFile, file, , , 깊숙히 내포된 폴더 안에서 파일이름 하나를 고르십시오:
if file <>
{
    StringLen, pos_prev, file
    pos_prev += 1 ; 마지막 문자 뒤에 위치에 맞게 조절합니다.
    Loop
    {
        ; 오른쪽으로부터 N번째 출현을 검색합니다:
        StringGetPos, pos, file, \, R%A_Index%
        if ErrorLevel
            break
        length := pos_prev - pos - 1
        pos_prev := pos
        pos += 2  ; StringMid에 사용하기 위해 조정합니다.
        StringMid, path_component, file, %pos%, %length%
        MsgBox Path component #%a_index% (from the right) is:`n%path_component%
    }
}


StringLeft / StringRight

문자열의 왼쪽이나 오른쪽으로부터 문자들을 열람합니다.

StringLeft, OutputVar, InputVar, Count
StringRight, OutputVar, InputVar, Count
NewStr := SubStr(String, StartPos [, Length]) ; 자세한 것은 SubStr() 함수를 참조하십시오.

Parameters

OutputVar

InputVar으로부터 추출한 부문자열을 저장할 변수의 이름.

InputVar

내용을 추출할 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용이 이름이기를 바라는 경우라면 예외입니다.

Count

추출할 문자의 개수, 표현식 가능. Count가 0보다 작거나 같으면, OutputVar는 비워집니다. Count가 InputVar의 길이를 초과하면, OutputVar는 InputVar 전체와 같게 설정됩니다.

논평

이 명령어와 다른 모든 명령어에 대하여, OutputVar는 InputVar와 같은 변수가 되어도 허용합니다.

관련 항목

SubStr(), StringMid, StringTrimLeft, StringTrimRight, IfInString, StringGetPos, StringLen, StringLower, StringUpper, StringReplace

예제

String = This is a test.
StringLeft, OutputVar, String, 4  ; 문자열 "This"를 OutputVar에 저장합니다.
StringRight, OutputVar, String, 5  ; 문자열 "test."를 OutputVar에 저장합니다.


StrLen / StringLen

문자열에 있는 문자의 개수를 열람합니다.

OutputVar := StrLen(InputVar)
StringLen, OutputVar, InputVar

매개변수

OutputVar

길이를 저장할 변수의 이름.

InputVar

측정할 내용이 들어 있는 변수의 이름. 퍼센트 사인에 이름을 둘러싸지 마십시오. 그러면 변수의 내용이 이름으로 사용됩니다.

논평

InputVar가 이전에 ClipboardAll에 할당된 변수이면, StringLen은 그의 전체 크기를 보고합니다.

관련 항목

IfInString, StringGetPos, StringMid, StringTrimLeft, StringTrimRight, StringLeft, StringRight, StringLower, StringUpper, StringReplace

예제

InputVar := "재빠른 갈색 여우, 게으른 개를 덮쳤네"
MsgBox % "InputVar의 길이는 " . StrLen(InputVar) ; 결과: 21
StringLen, length, InputVar
MsgBox, InputVar의 길이는 %length%입니다.


StringLower / StringUpper

문자열을 소문자 또는 대문자로 변환합니다.

StringLower, OutputVar, InputVar [, T]
StringUpper, OutputVar, InputVar [, T]

매개변수

OutputVar

새로 변환된 문자열을 저장할 변수의 이름.

InputVar

내용을 읽어 들일 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용을 이름으로 사용하고 싶다면 예외입니다.

T

이 매개변수가 기호 T이면, 문자열은 제목 격으로 변환됩니다. 예를 들어, "GONE with the WIND"는 "Gone With The Wind"이 됩니다;

논평

문자 또는 문자열이 전체적으로 대문자인지 아니면 소문자인지 탐지하려면, "if var is [not] upper/lower"를 사용하십시오.

이 명령어와 다른 모든 명령어에 대하여, OutputVar는 InputVar와 같은 변수이어도 허용됩니다.

[v1.1.20+]: 아래에 보여주는 바와 같이 Format()도 대소문자 변환에 사용할 수 있습니다:

MsgBox % Format("{:U}, {:L} and {:T}", "upper", "LOWER", "title")

관련 항목

Format(), IfInString, StringGetPos, StringMid, StringTrimLeft, StringTrimRight, StringLeft, StringRight, StringLen, StringReplace

예제

StringUpper, String1, String1  ; 즉, 출력은 입력과 같을 수 있습니다.
StringLower, String2, String2


StringMid

문자열에서 지정된 위치로부터 하나 이상의 문자를 열람합니다.

StringMid, OutputVar, InputVar, StartChar [, Count , L]
NewStr := SubStr(String, StartPos [, Length]) ; 자세한 것은 SubStr() 함수 참조.

매개변수

OutputVar

InputVar로부터 추출한 부문자열을 저장할 변수의 이름.

InputVar

내용에서 부분자열을 추출할 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용이 이름이기를 바라는 경우는 예외입니다.

StartChar

추출할 첫 문자의 위치, 표현식 가능. StringGetPos와 다르게, 1이면 첫 문자입니다. StartChar가 1보다 작으면, 1이라고 간주합니다. StartChar가 문자열의 끝을 넘어서면, OutputVar는 비워집니다.

Count

v1.0.43.10+에서, 이 매개변수는 생략하거나 비워 둘 수 있습니다. 이것은 문자열로부터 모든 문자를 열람하기에 충분히 큰 정수를 지정한 것과 같은 효과가 있습니다.

그렇지 않으면, 추출할 문자의 개수를 지정하십시오. 표현식이 가능합니다. Count가 0보다 작거나 같으면, OutputVar는 비워집니다. Count가 StartChar로부터 측정해 InputVar의 길이를 초과하면, OutputVar는 StartChar부터 시작해 InputVar의 전체로 설정됩니다.

L

기호 L을 사용하면 StartChar의 오른쪽이 아니라 왼쪽에 있는 문자들을 추출할 수 있습니다. 다음 예제에서, OutputVar는 Red로 설정됩니다:

InputVar = The Red Fox
StringMid, OutputVar, InputVar, 7, 3, L

L 옵션이 존재하고 StartChar가 1보다 작으면, OutputVar은 비워집니다. StartChar가 InputVar의 길이를 넘어 서면, 오직 Count 범위 안의 문자들만 추출됩니다. 예를 들어, 아래의 예제에서 OutputVar는 Fox가 설정됩니다:

InputVar = The Red Fox
StringMid, OutputVar, InputVar, 14, 6, L

논평

이 명령어와 기타 모든 명령어에 대하여, OutputVar는 InputVar와 변수가 같아도 허용합니다.

관련 항목

SubStr(), StringLeft, StringRight, StringTrimLeft, StringTrimRight, IfInString, StringGetPos, StringLen, StringLower, StringUpper, StringReplace

예제

Source = Hello this is a test.
StringMid, the_word_this, Source, 7, 4


StringReplace

지정된 부문자열을 새 문자열로 교체합니다.

OutputVar := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1])  ; v1.1.21+
StringReplace, OutputVar, InputVar, SearchText [, ReplaceText, ReplaceAll?]

매개변수

OutputVar

교체의 결과를 저장할 변수의 이름.

InputVar 또는 Haystack

그의 내용을 읽을 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용이 이름이기를 원하는 경우는 예외입니다.

StrReplace()는 함수이므로, Haystack은 표현식이 가능합니다.

SearchText

검색에 사용될 문자열. 부합은 대소문자를 구분하지 않습니다. 단, StringCaseSense가 켜져 있는 경우는 예외입니다.

ReplaceText

SearchText는 이 텍스트로 교체됩니다. 생략되거나 비어 있으면, SearchText는 빈 문자열로 교체됩니다. 다른 말로, OutputVar로부터 제외됩니다.

OutputVarCount (StrReplace)

교체가 일어난 횟수를 저장할 변수의 이름. 인용부호 처리 안함 (없으면 0).

Limit (StrReplace)

Limit을 생략하면, 기본값은 -1입니다. 기본으로 Haystack 발견된 모든 패턴을 교체합니다. 그렇지 않으면, 교체를 허용할 최대 횟수를 지정하십시오. Haystack에서 마지막 매개변수의 오른쪽 부분은 교체되지 않고 그대로입니다.

ReplaceAll? (StringReplace)

생략하면, 오직 SearchText의 첫 번째 부합만 교체됩니다. 그러나 이 매개변수가 1이나 A 또는 All이면, 모든 부합이 교체됩니다.

단어 UseErrorLevel을 지정하면 ErrorLevel에 교체된 횟수를 저장할 수 있습니다 (없으면 0). UseErrorLevel은 묵시적으로 "All".

ErrorLevel

StrReplace: ErrorLevel은 설정되지 않습니다.

StringReplace: 마지막 매개변수가 UseErrorLevel이면, ErrorLevel에는 교체된 횟수가 설정됩니다 (없으면 0). 그렇지 않으면, ErrorLevel은 SearchText를 InputVar 안에서 발견하지 못한 경우 1이 설정되고 발견한 경우는 0이 설정됩니다.

논평

이 명령어 그리고 기타 모든 명령어에 대하여, OutputVar는 InputVar와 변수가 같아도 허용됩니다.

내장 변수 %A_Space%와 %A_Tab%에 각각 스페이스 하나와 탭 문자 하나가 들어 있습니다. SearchText의 앞이나 뒤에서 스페이스와 탭만 홀로 검색할 때 유용합니다.

v1.0.45에서, AllSlow 옵션은 수행성능 향상과 효율적인 메모리 이용을 위해 폐기 되었습니다. 여전히 지정할 수는 있지만, 아무 효과가 없을 것입니다.

관련 항목

RegExReplace(), IfInString, StringCaseSense, StringLeft, StringRight, StringMid, StringTrimLeft, StringTrimRight, StringLen, StringLower, StringUpper, StringGetPos, if var is type

예제

; 클립보드의 내용에서 모든 CR+LF를 제거합니다:
StringReplace, clipboard, clipboard, `r`n, , All

; 모든 스페이스를 플러스로 교체합니다:
StringReplace, NewStr, OldStr, %A_SPACE%, +, All

; 변수 안의 텍스트로부터 모든 빈 줄을 제거합니다:
Loop
{
    StringReplace, MyString, MyString, `r`n`r`n, `r`n, UseErrorLevel
    if ErrorLevel = 0  ; 더 이상 교체가 필요하지 않습니다.
        break
}


StringSplit / StrSplit()

문자열을 지정된 구분자로 갈라 부문자열의 배열로 만듭니다.

StringSplit, OutputArray, InputVar [, Delimiters, OmitChars]
Array := StrSplit(String [, Delimiters, OmitChars])  ; [v1.1.13+]

Parameters

StringSplit

OutputArray

InputVar로부터 추출된 각 부문자열을 저장할 의사-배열의 이름. 예를 들어, MyArray가 지정되면, 이 명령어는 생산된 부문자열의 개수를 (없으면 0) MyArray0에 배치합니다. 첫 번째 부분자열은 MyArray1에, 두 번째 부문자열은 MyArray2에, 등등 배치합니다.

함수 안에서, 지역이 아니라 전역적인 의사-배열을 생성하려면, 함수 안에서 MyArray0를 전역 변수로 선언하십시오 (전역-간주 함수에 대하여 그 반대도 마찬가지입니다). 그렇지만, 흔한 혼란의 근원 때문에, 각 원소마다 따로따로 선언해야 할 경우도 종종 있습니다. 더 자세한 정보는 함수를 참조하십시오.

InputVar

내용을 분석할 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용이 이름으로 사용되기를 원하는 경우라면 예외입니다. 주의: InputVar는 OutputArray 안에 있는 변수 중 하나가 되어야 합니다.

Delimiters

이 매개변수가 비어 있거나 생략되면, InputVar의 각 문자는 별도의 부문자열로 간주됩니다.

그렇지 않으면, Delimiters는 하나 이상의 문자를 담습니다 (대소문자 구분). 각 구분자는 InputVar에서 부문자열 사이의 경계가 나타나는 곳을 결정하는 데 사용됩니다. 구분 문자들은 부문자열의 일부분으로 간주되지 않기 때문에, OutputArray에 절대로 복사되지 않습니다. 또한, InputVar 안에서 구분자 사이에 아무 것도 없으면, 그에 상응하는 원소는 빈 원소입니다.

예를 들어: `, (피신된 쉼표)는 쉼표가 나타날 때마다 문자열을 분리합니다. 비슷하게, %A_Tab%%A_Space%는 InputVar 안에서 스페이스나 탭을 만날 때마다 새로운 배열 원소를 생성합니다.

문자열을 문자가 아니라 구분자로 사용하려면, 먼저 StringReplace를 사용해 그 문자열이 나타나면 모두, 텍스트에서 절대로 기호 그대로 사용되지 않는 하나의 문자로 교체하십시오. 다음 예제를 연구해 보십시오. 다음 예제는 문자열 <br>을 구분자로 사용합니다:

StringReplace, NewHTML, HTMLString, <br>, ``, All  ; <br>이 나타날 때마다 액센트 문자로 바꿉니다.
StringSplit, MyArray, NewHTML, ``  ; 액센트 문자에 기반해 문자열을 가릅니다.

StrSplit() [v1.1.13+]

Array
(반환 값)

문자열 (객체)의 배열.

String

분리할 문자열.

Delimiters

이 매개변수가 비어 있거나 생략되면, 입력 문자열의 각 문자는 별도의 부문자열로 간주됩니다.

그렇지 않으면, Delimiters는 단일 문자열이거나 문자열 배열일 수 있습니다. 각 구분자는 부문자열 사이의 경계가 나타나는 곳을 결정하는데 사용됩니다. 구분자는 부문자열의 일부분으로 간주되지 않으므로, 절대로 반환된 배열에 포함되지 않습니다. 또한, 입력 문자열에서 구분자 한 쌍 사이에 아무것도 없다면, 그에 상응하는 배열 원소는 빈 원소입니다.

예를 들어: ","는 문자열을 쉼표가 나타날 때마다 분리합니다. 비슷하게, [A_Tab, A_Space]는 입력 문자열에서 스페이스나 탭을 만날 때마다 새 배열 원소를 생성합니다.

Both

OmitChars

각 배열 원소의 앞과 뒤로부터 배제할 문자열의 리스트 (대소문자 구분, 선택적). 예를 들어, OmitChars가 %A_Space%%A_Tab% (StringSplit) 또는 " `t" (StrSplit)이면, 스페이스와 탭은 모든 원소의 앞과 뒤로부터 제거됩니다 (가운데는 아님).

Delimiters가 비어 있으면, OmitChars는 배열로부터 어느 문자를 배제해야 하는지를 나타냅니다.

대부분의 다른 명령어의 마지막 매개변수와 다르게, StringSplit에 대하여 OmitChars에서 쉼표는 반드시 피신시켜야 합니다 (`,).

논평

의사 배열이 이미 존재하면, StringSplit 명령어는 앞쪽부터 N개의 원소의 값만 변경합니다. 여기에서 N은 InputVar에서 출현하는 부문자열의 개수입니다. N 번째 이후의 원소는 변경되지 않습니다. 그러므로, 얼마나 많은 항목이 실제로 이 명령어로 생산되었는가를 알아내려면, 0 원소를 사용하는 것이 가장 안전합니다 (MyArray0).

스페이스와 탭 같은 공백 문자들은 유지됩니다. 단, 그 문자 자체가 구분자이거나 OmitChars에 포함되는 경우는 예외입니다. 탭과 스페이스는 Trim 함수를 호출해 변수의 양쪽 끝으로부터 다듬을 수 있습니다. 예를 들어: MyArray1 := Trim(MyArray1).

표준 CSV (쉼표로 가른 값(comma separated value)) 형식의 문자열을 가르려면, 파싱 회돌이를 사용하십시오. CSV 처리가 내장되어 있습니다.

문자열을 가르기 전에 필드를 다른 순서로 정렬하려면, Sort 명령어를 사용하십시오.

부문자열을 메모리에 영원히 저장할 필요가 없다면, 파싱 회돌이의 사용을 고려해 보십시오 -- 특히 InputVar가 매우 방대하다면 꼭 고려해 보시기를 바랍니다. 그런 경우는 방대한 양의 메모리가 저장될 것입니다. 예를 들어:

Colors = red,green,blue
Loop, parse, Colors, `,
    MsgBox Color number %A_Index% is %A_LoopField%.

관련 항목

파싱 회돌이, 배열, Sort, SplitPath, IfInString, StringGetPos, StringMid, StringTrimLeft, StringTrimRight, StringLen, StringLower, StringUpper, StringReplace

예제

TestString = This is a test.
StringSplit, word_array, TestString, %A_Space%, .  ; 점은 제외합니다.
MsgBox, The 4th word is %word_array4%.

Colors = red,green,blue
StringSplit, ColorArray, Colors, `,
Loop, %ColorArray0%
{
    this_color := ColorArray%a_index%
    MsgBox, Color number %a_index% is %this_color%.
}
TestString := "This is a test."
word_array := StrSplit(TestString, A_Space, ".")  ; 점은 제외합니다.
MsgBox % "The 4th word is " word_array[4]

Colors := "red,green,blue"
ColorArray := StrSplit(Colors, ",")
Loop % ColorArray.MaxIndex()
{
    this_color := ColorArray[a_index]
    MsgBox, Color number %a_index% is %this_color%.
}


StringTrimLeft / StringTrimRight

문자열의 왼쪽 오른쪽으로부터 문자들을 제거합니다.

StringTrimLeft, OutputVar, InputVar, Count
StringTrimRight, OutputVar, InputVar, Count
NewStr := SubStr(String, StartPos [, Length]) ; 자세한 것은 SubStr() 함수 참조.

매개변수

OutputVar
줄어든 InputVar를

저장할 변수의 이름 .

InputVar

내용을 읽어 들일 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 단, 변수의 내용이 이름으로 사용되기를 바란다면 예외입니다.

Count

제거할 문자의 개수. 표현식 가능. Count가 0보다 작으면, OutputVar는 InputVar 전체와 같게 설정됩니다. Count가 InputVar의 길이를 초과하면, OutputVar는 비워집니다.

논평

이 명령어와 기타 모든 명령어에 대하여, OutputVar는 InputVar와 같은 변수가 되어도 허용합니다.

관련 항목

SubStr(), StringMid, StringLeft, StringRight, IfInString, StringGetPos, StringLen, StringLower, StringUpper, StringReplace

예제

String = This is a test.
StringTrimLeft, OutputVar, String, 5  ;  문자열 "is a test."를 OutputVar에 저장합니다.
StringTrimRight, OutputVar, String, 6  ; 문자열 "This is a"를 OutputVar에 저장합니다.


StrPut / StrGet

StrPut() / StrGet() [AHK_L 46+]

문자열을 메모리 주소에 또는 메모리 주소로부터 복사합니다. 선택적으로 주어진 코드 페이지 사이에 변환합니다.

StrPut(String [, Encoding = None ] )
StrPut(String, Address [, Length] [, Encoding = None ] )
StrGet(Address [, Length] [, Encoding = None ] )

매개변수

String

문자열, 숫자도 받을 수 있습니다.

Address

문자열을 읽고/쓸 주소.

Length

읽고/쓸 문자의 최대 개수, 필요하면 널-종료 문자 포함. 반환 값을 참조하십오.

Encoding

StrGet에 대한 소스 인코딩 또는 StrPut에 대한 타겟 인코딩; 예를 들어, "UTF-8", "UTF-16" or "CP936". Address와 Length를 지정하지 않으면, 숫치 식별자 앞에 "CP"를 붙여야 하니다. 빈 문자열이나 "CP0"을 지정하면 시스템 기본 ANSI 코드 페이지를 사용합니다.

반환 값

각 함수에 대하여, 무효한 매개변수는 빈 문자열을 돌려줍니다.

StrPut은 씌여진 문자의 개수를 돌려줍니다. Address가 주어지지 않으면 문자단위로 필요한 버퍼 크기를 돌려주고 에러가 일어나면 0을 돌려줍니다. Length가 소스 문자열이 길이보다 작으면, 함수는 실패하고 0을 돌려줍니다. Length가 정확하게 소스 문자열의 길이이면, 문자열은 널-문자로 종료하지 않습니다; 그렇지 않으면 반환된 개수는 널 문자를 포함합니다.

StrGet은 필요한 변환을 수행한 후 요청된 문자열을 길이를 돌려줍니다.

논평

StrPut의 String 매개변수와 StrGet의 반환값은 언제나 현재 실행 파일의 고유 인코딩을 따릅니다. 반면에 Encoding은 주어진 Address에 읽고 쓸 문자열의 인코딩을 지정합니다. Encoding을 지정하지 않으면, 그 문자열은 그냥 아무 변환도 일어나지 않고 그대로 복사되거나 측정됩니다.

코드 페이지 사이의 변환이 필요하면, 필요한 버퍼 크기는 소스 String의 크기에 따라 달라질 수 있습니다.

스크립트가 AutoHotkey Basic과의 호환을 필요로 하면 여전히 StrPut과 StrGet을 사용할 수 있습니다. 단 적절한 스크립트 파일들이 함수 라이브러리에 설치되어 있어야 합니다. 이런 스크립트들은 오토핫키 공동체 포럼에서 발견할 수 있습니다.

관련 항목

스크립트 호환성, FileEncoding, VarSetCapacity()

예제

Length나 Encoding을 Address 다음에 직접적으로 지정할 수 있습니다. 그러나 그런 경우 Encoding은 절대로 숫치형이 되면 안됩니다:

strA := StrGet(addressA, "cp0")     ; OK
strA := StrGet(addressA, length, 0) ; OK
strA := StrGet(addressA, 0)         ; Error

StrPut은 특정한 인코딩으로 문자열에 대하여 필요한 버퍼 크기를 계산하기 위하여 한 번 호출이 가능합니다. 다음, 그 문자열을 인코드해서 버퍼 안으로 써 넣을 수 있습니다. 자주 변수를 StrPut과 함께 사용한다면, 다음과 같은 함수를 여러분의 라이브러리에 넣어 보십시오:

StrPutVar(string, ByRef var, encoding)
{
    ; 가용능력을 확인합니다.
    VarSetCapacity( var, StrPut(string, encoding)
        ; StrPut은 문자 개수를 돌려주지만, VarSetCapacity는 바이트를 필요로 합니다.
        * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
    ; 그 문자열을 복사하거나 변환합니다.
    return StrPut(string, &var, encoding)
}


Suspend

선택된 핫키와 핫스트링을 켜거나 끕니다.

Suspend [, Mode]

매개변수

Mode

On: 모든 핫키와 핫스트링을 보류합니다. 단, 논평 섹션에 설명한 것들은 예외입니다.

Off: 위에서 꺼진 핫키와 핫스트링을 다시 켭니다.

Toggle (기본값): 이전 상태와 반대 상태로 변경합니다 (On 또는 Off).

Permit: 현재 서브루틴을 보류에서 면제시키는 일만 합니다. 다른 일은 하지 않습니다.

논평

맨 첫 줄이 보류된(Suspend) 핫키/핫스트링 서브루틴은 (Suspend On을 제외하고) 보류로부터 면제됩니다. 다른 말로 하면, 핫키는 보류가 켜져 있는 (ON) 동안에도 여전히 켜져 있을 것입니다. 그러므로 그런 핫키를 통하여 보류를 끌 수 있습니다.

선택된 핫키 또는 핫스트링을 존재하는 창의 유형에 기반하여 자동으로 끄려면, #IfWinActive/Exist를 사용하십시오.

스크립트의 핫키를 보류하더라도 이미 실행 중인 스크립트의 쓰레드는 (있다면) 멈추지 않습니다; 멈추려면 Pause를 사용하십시오.

스크립트의 핫키가 보류될 때, 그의 트레이 아이콘은 기호 S로 바뀝니다. 이를 피하려면 아이콘을 동결하면 됩니다. Menu 명령어의 마지막 매개변수에 1을 지정하면 동결시킬 수 있습니다. 예를 들어:

Menu, Tray, Icon, C:\My Icon.ico, , 1

내장 변수 A_IsSuspended는 스크립트가 보류되면 1 그렇지 않으면 0이 설정됩니다.

관련 항목

#IfWinActive/Exist, Pause, Menu, ExitApp

예제

^!s::Suspend  ; 토글-보류 함수를 핫키에 할당합니다.
; Suspend 명령어를 또다른 스크립트에 보냅니다.
DetectHiddenWindows, On
WM_COMMAND := 0x111
ID_FILE_SUSPEND := 65404
PostMessage, WM_COMMAND, ID_FILE_SUSPEND,,, C:\YourScript.ahk ahk_class AutoHotkey


SysGet

화면 해상도, 다중-모니터 정보, 시스템 객체의 크기, 그리고 기타 시스템 특성들을 열람합니다.

SysGet, OutputVar, Sub-command [, Param3]

매개변수

OutputVar

결과를 저장할 변수의 이름.

Sub-command
아래 리스트 참조.
Param3

이 매개변수는 아래에 기술한 경우를 제외하고 생략됩니다.

Sub-commands

MonitorCount: 모니터의 총 개수를 열람합니다. 아래 테이블에 기술한 SM_CMONITORS와 다르게, MonitorCount에는 모든 모니터가 포함됩니다. 심지어 바탕화면의 일부분으로 사용되지 않는 모니터도 포함됩니다.

MonitorPrimary: 기본 모니터의 번호를 열람합니다. 단일-모니터 시스템이라면 1입니다.

Monitor [, N]: N번 모니터의 둘레 좌표를 열람합니다 ( N을 생략하면, 기본 모니터가 사용됩니다). 정보는 네 개의 변수에 저장됩니다. 이 변수는 모두 OutputVar로 시작합니다. N이 너무 크거나 정보를 열람하는 데 문제가 있으면, 이 네 변수는 모두 비워집니다. 예를 들어:

SysGet, Mon2, Monitor, 2
MsgBox, Left: %Mon2Left% -- Top: %Mon2Top% -- Right: %Mon2Right% -- Bottom %Mon2Bottom%.

함수 안에서, 지역 변수가 아닌 전역 변수의 집합을 만들려면, 이 명령어를 사용하기 전에 먼저 Mon2를 전역 변수로 선언 하십시오 (전역-간주 함수에 대하여 그 반대도 마찬가지입니다). 그렇지만, 흔한 혼란의 근원 때문에 종종 집합에서 각 변수를 따로 선언할 필요가 있는 경우도 있습니다.

MonitorWorkArea [, N]: 위와 같지만 구역이 축소됩니다. 태스크바와 기타 등록된 바탕화면 툴바를 제외합니다.

MonitorName [, N]: N번 모니터에 대한 운영 체제의 이름 (N을 생략하면, 기본 모니터가 사용됩니다).

(Numeric): Sub-command에 아래 테이블에 있는 숫자 중 하나를 지정하면 상응하는 값을 열람할 수 있습니다. 다음 예제는 마우스 버튼의 개수를 이름이 "MouseButtonCount"인 변수에 저장합니다: SysGet, MouseButtonCount, 43.

자주 사용됨

번호 | 설명
80 | SM_CMONITORS: 바탕화면의 디스플레이 모니터의 번호 ("비-디스플레이 의사-모니터는 제외").
43 | SM_CMOUSEBUTTONS: 마우스의 버튼의 개수 (마우스가 설치되어 있지 않으면 0).
16, 17 | SM_CXFULLSCREEN, SM_CYFULLSCREEN: 기본 디스플레이 모니터의 전체-화면 창에 대하여 클라이언트 구역의 픽셀단위 너비와 높이.
61, 62 | SM_CXMAXIMIZED, SM_CYMAXIMIZED: 기본 디스플레이 모니터의 최대화된 최상위 창의 픽셀 단위 기본 크기.
59, 60 | SM_CXMAXTRACK, SM_CYMAXTRACK: 캡션과 크기 조절 테두리가 있는 창의 픽셀 단위로 기본 최대 크기. 이 크기는 전체 바탕화면을 가리킵니다. 사용자는 창 프레임을 끌어 이 크기보다 더 크게 만들 수 없습니다.
28, 29 | SM_CXMIN, SM_CYMIN: 픽셀단위 창의 최대 너비와 높이.
57, 58 | SM_CXMINIMIZED, SM_CYMINIMIZED: 픽셀 단위 최소화된 창의 크기.
34, 35 | SM_CXMINTRACK, SM_CYMINTRACK: 한 창의 최소 추적 너비와 높이, 픽셀 단위. 사용자는 창 프레임을 끌어 이 크기보다 더 작게 만들 수 없습니다. 창은 WM_GETMINMAXINFO 메시지를 처리하면 이 값들을 오버라이드 할 수 있습니다.
0, 1 | SM_CXSCREEN, SM_CYSCREEN: 기본 디스플레이 모니터의 화면 높이와 너비, 픽셀 단위. 내장 변수 A_ScreenWidth 그리고 A_ScreenHeight와 동일합니다.
78, 79 | SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN: 가상 화면의 너비와 높이, 픽셀 단위입니다. 가상 화면은 모든 디스플레이 모니터의 사각 테두리입니다. SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN는 가상 화면의 좌상 모서리 좌표입니다.
19 | SM_MOUSEPRESENT: 마우스가 설치되어 있으면 0 아닌 값; 그렇지 않으면 0.
75 | SM_MOUSEWHEELPRESENT: 휠 마우스가 설치되어 있으면 0 아닌 값; 그렇지 않으면 0.
63 | SM_NETWORK: 네트워크가 존재하면 LSB(Least significant bit)가 설정됩니다; 그렇지 않으면 지워집니다. 다른 비트들은 미래의 사용을 위해 예야되어 있습니다.
8193 | SM_REMOTECONTROL: 이 시스템 숫치는 터미널 서비스 환경에서 사용됩니다. 현재 세션이 원격 제어되고 있으면 그의 값은 0이 아닙니다; 그렇지 않으면 0.
4096 | SM_REMOTESESSION: 이 시스템 숫치는 터미널 서비스 환경에서 사용됩니다. 호출 프로세스가 터미널 서비스 클라이언트 세션에 연관되어 있으면, 반환 값은 0이 아닙니다. 호출 프로세스가 터미널 서버 콘솔 세션에 연관되어 있으면, 반환 값은 0입니다. 콘솔 세션이 반드시 물리적 콘솔이어야 할 필요는 없습니다.
70 | SM_SHOWSOUNDS: 사용자가 어플리케이션을 시각적으로 정보를 보여주도록 요구하면 0이 아닌 값입니다. 보통은 정보를 청각 형태로만 제시합니다; 그렇지 않으면 0.
8192 | SM_SHUTTINGDOWN: 현재 세션이 닫히고 있는 중이면 0이 아닌 값입니다; 그렇지 않으면 0. Windows 2000: 반환된 값은 항상 0입니다.
23 | SM_SWAPBUTTON: 좌우 마우스 버튼의 의미가 서로 바뀌었으면 0이 아닙니다; 그렇지 않으면 0.
76, 77 | SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN: 가상 화면의 좌상 모서리 좌표. 가상 화면은 모든 디스플레이 모니터의 사각 테두리입니다. 대조적으로, SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN는 가상 화면의 너비와 높이입니다.

자주 사용되지 않음

번호 | 설명
56 | SM_ARRANGE: 시스템이 최소화된 창들을 어떻게 정렬할지 지정하는 플래그. 더 자세한 정보는 MSDN 참조.
67 | SM_CLEANBOOT: 시스템이 어떻게 시작할지를 지정합니다: 0 정상 부트 1 안전 부트 2 네트워크가 있는 안전 부트
5, 6 | SM_CXBORDER, SM_CYBORDER: 창 데투리의 너비와 높이, 픽셀 단위. 이것은 3-D 모습을 갖춘 창에 대하여 SM_CXEDGE 값과 동일합니다.
13, 14 | SM_CXCURSOR, SM_CYCURSOR: 커서의 너비와 높이, 픽셀 단위. 시스템은 다른 크기의 커서를 만들 수 없습니다.
36, 37 | SM_CXDOUBLECLK, SM_CYDOUBLECLK: 더블클릭 연속에서 첫 번째 클릭의 위치를 둘러싼 사각 구역의 너비와 높이. 픽셀 단위. 두 번째 클릭은 반드시 이 사각 구역 안에서 일어나야 시스템이 그 두 클릭을 더블 클릭으로 간주합니다. (두 클릭은 또 지정된 시간 안에 일어나야 합니다.)
68, 69 | SM_CXDRAG, SM_CYDRAG: 드래그 지점 가운데에 놓이는 사각형의 너비와 높이. 드래그 연산이 시작되기 전에 마우스 포인터의 제한된 이동을 허용합니다. 그 덕분에 사용자는 의도치 않게 드래그 연산을 할 필요 없이 마우스를 쉽게 클릭하고 놓을 수 있습니다.
45, 46 | SM_CXEDGE, SM_CYEDGE: 3-D 테두리의 크기, 픽셀 단위. SM_CXBORDER 그리고 SM_CYBORDER의 3-D 짝입니다.
7, 8 | SM_CXFIXEDFRAME, SM_CYFIXEDFRAME (다음과 동등:SM_CXDLGFRAME, SM_CYDLGFRAME): 캡션은 있지만 크기 조절은 불가능한 창의 외곽의 프레임 두께, 픽셀 단위. SM_CXFIXEDFRAME은 수평 테두리의 높이이고 SM_CYFIXEDFRAME은 수직 테두리의 너비입니다.
83, 84 | SM_CXFOCUSBORDER, SM_CYFOCUSBORDER: 초점이 있는 한 콘트롤의 사각 구역의 좌우 가장자리 너비 그리고 상하 가장자리 높이 (픽셀 단위). Windows 2000: 반환된 값은 언제나 0입니다.
21, 3 | SM_CXHSCROLL, SM_CYHSCROLL: 수평 스크롤 바의 화살표 비트맵의 너비, 픽셀 단위; 수평 스크롤 바의 높이, 픽셀 단위.
10 | SM_CXHTHUMB: 수평 스크롤바의 엄지 박스의 너비, 픽셀 단위.
11, 12 | SM_CXICON, SM_CYICON: 아이콘의 기본 너비와 높이, 픽셀 단위.
38, 39 | SM_CXICONSPACING, SM_CYICONSPACING: 큰 아이콘 뷰의 항목에 대하여 격자 셀의 크기, 픽셀 단위. 각 항목은 정렬될 때 이 크기의 사각형에 맞게 크기가 바뀝니다. 이 값들은 언제나 SM_CXICON 그리고 SM_CYICON보다 크거나 같습니다.
71, 72 | SM_CXMENUCHECK, SM_CYMENUCHECK: 기본 메뉴 체크-표식 비트맵의 크기, 픽셀 단위.
54, 55 | SM_CXMENUSIZE, SM_CYMENUSIZE: 메뉴 바 버튼의 크기, 예를 들어 다중 문서 인터페이스에 사용되는 자손 창 닫기 버튼, 픽셀 단위.
47, 48 | SM_CXMINSPACING SM_CYMINSPACING: 최소화된 창에 대한 격자 셀의 크기, 각각의 최소화된 창은 정렬될 때 이 크기의 사각형 안에 맞게 크기가 조절됩니다. 이 값들은 언제나 SM_CXMINIMIZED 그리고 SM_CYMINIMIZED보다 크거나 같습니다
30, 31 | SM_CXSIZE, SM_CYSIZE: 창의 캡션이나 타이틀 바에 있는 버튼의 너비와 높이, 픽셀 단위.
32, 33 | SM_CXSIZEFRAME, SM_CYSIZEFRAME: 크기 조절이 가능한 창 외곽의 크기 조절 테두리의 두께, 픽셀 단위. SM_CXSIZEFRAME는 수평 테두리의 너비이고, SM_CYSIZEFRAME는 수직 테두리의 높이입니다. SM_CXFRAME 그리고 SM_CYFRAME와 동의어.
49, 50 | SM_CXSMICON, SM_CYSMICON: 작은 아이콘에 추천하는 크기, 픽셀 단위. 작은 아이콘은 전형적으로 창 캡션과 작은 아이콘 뷰에 나타납니다.
52, 53 | SM_CXSMSIZE SM_CYSMSIZE: 작은 캡션 버튼의 크기, 픽셀 단위.
2, 20 | SM_CXVSCROLL, SM_CYVSCROLL: 수직 스크롤바의 너비, 픽셀 단위; 그리고 수직 스크롤 바의 화살표 비트맵의 높이, 픽셀 단위.
4 | SM_CYCAPTION: 캡션 구역의 높이, 픽셀 단위.
18 | SM_CYKANJIWINDOW: 2 바이트 문자 세트 버전의 시스템에 대하여, 화면 하단의 한자 창의 높이입니다. 픽셀 단위.
15 | SM_CYMENU: 한 줄 메뉴바의 높이, 픽셀 단위.
51 | SM_CYSMCAPTION: 작은 캡션의 높이, 픽셀 단위.
9 | SM_CYVTHUMB: 수직 스크롤 바의 엄지 박스의 높이, 픽셀 단위.
42 | SM_DBCSENABLED: User32.dll가 DBCS를 지원하면 0 아닌 값; 그렇지 않으면 0.
22 | SM_DEBUG: 디버그 버전의 User.exe가 설치되어 있으면 0 아닌 값; 그렇지 않으면 0.
82 | SM_IMMENABLED: 다국어 입력이 가능하면 0이 아닌 값; 그렇지 않으면 0. SM_IMMENABLED는 시스템이 유니코드 어플리케이션에서 유니코드 기반의 IME를 사용할 준비가 되어 있는지 알려 줍니다. 언어-종속적 IME가 작동하는지 확인하려면, SM_DBCSENABLED와 시스템 ANSI 코드 페이지를 점검하십시오. 그렇지 않으면 ANSI-to-Unicode 변환이 올바르게 수행되지 않을 수 있습니다. 아니면 글꼴이나 레지스트리 설정과 같은 구성요소가 존재하지 않을 수 있습니다.
87 | SM_MEDIACENTER: 현재 운영 체제가 Windows XP, Media Center Edition이면 0 아닌 값, 그렇지 않으면 0.
40 | SM_MENUDROPALIGNMENT: 드롭-다운 메뉴가 상응하는 메뉴 바 항목과 함께 오른쪽 정렬 되어 있으면 0 아닌 값, 메뉴가 왼쪽 정렬되어 있으면 0.
74 | SM_MIDEASTENABLED: 시스템에 Hebrew 그리고 Arabic 언어가 사용 가능하면 0 아닌 값, 그렇지 않으면 0.
41 | SM_PENWINDOWS: 펜 컴퓨팅 확장이 설치되어 있으면 0 아닌 값; 그렇지 않으면 0.
44 | SM_SECURE: 보안이 설정되어 있으면 0 아닌 값; 그렇지 않으면 0.
81 | SM_SAMEDISPLAYFORMAT: 모든 디스플레이 모니터가 같은 컬러 포맷이면 0 아닌 값, 그렇지 않으면 0. 두 개의 디스플레이가 비트 깊이는 같지만 컬러 포맷은 다를 수 있다는 것에 주목하십시오. 예를 들어, 적, 녹, 청 픽셀은 다른 개수의 비트로 인코드될 수 있습니다. 또는 그런 비트들은 한 픽셀의 컬러 값으로 다른 장소에 위치할 수 있습니다.
86 | SM_TABLETPC: 현재 운영 체제가 Windows XP Tablet PC 에디션이면 0 아닌 값, 그렇지 않으면 0입니다.

논평

내장 변수 A_ScreenWidth와 A_ScreenHeight에 픽셀 단위로 기본 모니터의 크기가 들어 있습니다.

관련 항목

DllCall, WinGet

예제

; 예제 #1:
SysGet, MouseButtonCount, 43
SysGet, VirtualScreenWidth, 78
SysGet, VirtualScreenHeight, 79

; Example #2: 이 스크립트는 각 모니터의 정보를 보여줍니다:
SysGet, MonitorCount, MonitorCount
SysGet, MonitorPrimary, MonitorPrimary
MsgBox, Monitor Count:`t%MonitorCount%`nPrimary Monitor:`t%MonitorPrimary%
Loop, %MonitorCount%
{
    SysGet, MonitorName, MonitorName, %A_Index%
    SysGet, Monitor, Monitor, %A_Index%
    SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
    MsgBox, Monitor:`t#%A_Index%`nName:`t%MonitorName%`nLeft:`t%MonitorLeft% (%MonitorWorkAreaLeft% work)`nTop:`t%MonitorTop% (%MonitorWorkAreaTop% work)`nRight:`t%MonitorRight% (%MonitorWorkAreaRight% work)`nBottom:`t%MonitorBottom% (%MonitorWorkAreaBottom% work)
}


Thread

쓰레드의 우선 순위와 인터럽트 허용 여부를 설정합니다. 또 임시로 모든 타이머를 끌 수 있습니다.

Thread, NoTimers [, false]
Thread, Priority, n
Thread, Interrupt [, Duration, LineCount]

Thread, NoTimers [, false]: 현재 쓰레드가 종료하거나, Thread, NoTimers, false를 실행하거나, 또는 타이머를 허용하는 또다른 쓰레드에 의하여 인터럽트될 때까지 다른 타이머의 인터럽트를 막습니다 (타이머를 허용하는 쓰레드라면 인터럽트한 쓰레드를 종료할 때까지 인터럽트 할 수 있습니다).

자동-실행 섹션 (스크립트의 상단)에서 Thread NoTimers가 사용되지 않았다면, 모든 쓰레드는 타이머가 인터럽트 할 수 있는 상태로 시작합니다 (물론 Thread Interrupt [아래]의 설정은 여전히 적용됩니다). 대조적으로, 자동-실행 섹션이 NoTimers 위에서 실행되지만 타이머는 끄지 않았다면, 새로 기동된 쓰레드마다 (예를 들어 핫키, 맞춤 메뉴 항목, 또는 타이머) 다른 타이머의 인터럽트에 면역 상태로 시작합니다.

기본 설정에 상관 없이, 스크립트에 쓰레드가 없다면 타이머는 언제나 작동합니다 (단, Pause가 켜진 경우는 예외입니다).

Thread, NoTimers는 Thread, NoTimers, true와 동등합니다. 게다가, true/false 맥개변수는 표현식이므로, true는 1로, 그리고 false는 0으로 결정됩니다.

Thread, Priority, n: n에 -2147483648부터 2147483647 사이의 정수를 (또는 표현식 가능) 지정하면 현재 쓰레드의 새 우선 순위를 나타낼 수 있습니다. 다른 쓰레드에는 영향을 주지 않습니다. 자세한 정보는 쓰레드를 참조하십시오.

이벤트를 버퍼 처리할 수 있기 때문에, 명령어 Critical은 일반적으로 Thread Priority보다 우선 순위가 높습니다.

관련하여, OS의 우선 순위 레벨은 전체 스크립트에 대하여 다음 예제와 같이 바꿀 수 있습니다: Process, Priority,, High.

Thread, Interrupt [, Duration, LineCount]: 이 명령어는 아껴서 사용해야 합니다. 왜냐하면 대부분의 스크립트는 기본값에 가깝게 설정할 수록 더 일관성이 있게 수행되기 때문입니다.

기본값으로, 새로 기동된 쓰레드는 15밀리 초 동안(Duration) 또는 1000 스크립트 줄(LineCount) 동안 인터럽트 할 수 없습니다. 쓰레드 우선 순위에 상관이 없습니다. 이 덕분에 쓰레드는 끝낼 기회가 있습니다. 그렇지 않으면 기동되기를 기다리고 있는 또다른 쓰레드에 의하여 즉시 인터럽트 되어 버릴 것입니다 (예를 들어 버퍼 처리된 핫키 또는 실행이 예약되어 있는 일련의 타이머 서브루틴).

둘 중의 하나가 0이면, 새로 기동된 쓰레드마다 즉시 인터럽트가 가능합니다. 둘 중 하나가 -1이면, 그 때문에 그 쓰레드를 인터럽트할 수 없습니다. 둘 다 최대값은 2147483647입니다.

인터럽트 설정은 전역적입니다. 그 다음에 일어나는 모든 쓰레드는 그 설정을 준수합니다. 설정이 자동-실행 섹션이 아닌 다른 곳에서 바뀌더라도 마찬가지 입니다. 그렇지만, 인터럽트 된 쓰레드는 영향을 받지 않습니다. 왜냐하면 인터럽트 불가능 기한이 이미 경과했기 때문입니다. 비슷하게, 현재 쓰레드는 영향을 받지 않습니다. 단, LineCount가 바뀌는 순간 인터럽트 할 수 없다면 예외입니다. 이 경우 새 LineCount가 거기에 설정됩니다.

현재 쓰레드가 인터럽트 불가능한 동안에 핫키가 눌리거나 맞춤 메뉴 항목이 선택되면, 그 이벤트는 버퍼 처리됩니다. 다른 말로, 현재 쓰레드가 종료하거나 인터럽트가 가능해지면 기동됩니다. 이에 대한 예외는 현재 쓰레드가 끝나기 전에 인터럽트가 가능해질 때 입니다. 이 때는 버퍼 처리된 이벤트 보다 우선 순위가 더 높습니다; 이 경우 버퍼에 있는 이벤트는 페기됩니다.

이 설정에 상관 없이, 쓰레드는 MsgBox, InputBox, FileSelectFile, 또는 FileSelectFolder 대화상자를 보여주는 순간 인터럽트가 가능해집니다.

둘 중 어느 쪽이라도 비워 두면 바뀌는 것을 막을 수 있습니다.

논평

이벤트를 버퍼 처리하는 그의 놀라운 유연성과 능력 덕분에, 명령어 Critical은 보통 Thread Interrupt와 Thread Priority 보다 더 유용합니다.

관련 항목

Critical, Threads, Hotkey, Menu, SetTimer, Process

예제

Thread, priority, 1 ; 현재 쓰레드의 우선 순위를 보통보다 약간 더 높게 만듭니다.
Thread, interrupt, 0  ; 새로 기동된 쓰레드마다 즉시 인터럽트 가능하도록 만듭니다:
Thread, interrupt, 50, 2000  ; 우선 순위에 상관 없이 각 쓰레드를 50ms 또는 2000 줄 이후에 인터럽트 가능하도록 만듭니다.


Throw

Throw [v1.1.04+]

에러의 출현을 알려줍니다. 이 신호는 try-catch 서술문으로 잡을 수 있습니다.

Throw [, Expression]

매개변수

Expression

catch의 OutputVar에 저장할 값.

이 매개변수는 표현식이기 때문에, 다음은 모두 유효한 예제입니다:

throw 3
throw "literal string"
throw MyVar
throw i + 1
throw { what: "Custom error", file: A_LineFile, line: A_LineNumber } ; 객체를 던집니다.

이 매개변수는 언제나 표현식입니다. 그래서 변수 참조는 퍼센트 사인으로 둘러싸면 안됩니다. 단, double-deref를 수행할 때는 예외입니다.

[v1.1.05+]: 생략되면, 기본 메시지와 함께 예외 객체가 던져집니다.

Exception(Message [, What, Extra])

다음 특성을 가진 객체를 만듭니다. 또한 실행시간 에러가 만든 예외에 흔합니다:

  • Message: 에러 메시지 또는ErrorLevel 값.
  • What: 에러가 일어날 때 실행 중인 또는 실행될 함수나 라벨 또는 명령어의 이름.
  • Extra: 에러에 관한 추가 정보.
  • File: 에러가 일어난 줄이 있는 스크립트 파일의 전체 경로를 자동으로 설정됩니다.
  • Line: 에러가 일어난 줄 번호를 자동으로 설정합니다.

What이 생략되면, 현재 함수나 서브루틴의 이름이 기본값이 됩니다. 그렇지 않으면 문자열이거나 또는 호출 스택의 위쪽으로부터 아래로 음의 오프셋일 수 있습니다. 예를 들어, 값이 -1이면 Exception.What에 현재 함수나 서브루틴을 설정하고 Exception.Line에 그를 호출한 줄을 설정합니다. 그렇지만, 스크립트가 컴파일 되었거나 오프셋이 유효하지 않으면, What은 그냥 문자열로 변환됩니다.

Message와 Extra는 문자열로 변환됩니다. 이것들은 예외가 던져졌는데 잡지 못하면 에러 대화상자에 보여집니다.

try
    BadlyCodedFunc()
catch e
    MsgBox % "Error in " e.What ", which was called at line " e.Line

BadlyCodedFunc() {
    throw Exception("Fail", -1)
}

관련 항목

Try, Catch, Finally

예제

Try를 참조하십시오.


ToolTip

화면 아무데나 항상-위에 창을 만듭니다.

ToolTip [, Text, X, Y, WhichToolTip]

매개변수

Text

비어 있거나 생략되면, 기존의 툴팁이 숨습니다. 그렇지 않으면, 이 매개변수는 툴팁에 보여줄 텍스트입니다. 여러-줄 툴팁을 생성하려면, 라인피드 문자(`n)를 각 줄 사이에 사용하십시오. 예, Line1`nLine2.

Text가 길면, 게속 섹션을 수단으로 여러 개의 짧은 줄로 분리할 수 있습니다. 이렇게 하면 가독성과 유지관리성이 향상됩니다.

X, Y

툴팁의 X와 Y의 위치. 활성 창에 상대적입니다 (화면 좌표를 변경하려면 CoordMode, ToolTip을 사용하십시오). 좌표가 생략되면, 툴팁은 마우스 근처에 나타납니다. X와 Y는 표현식이 가능합니다.

WhichToolTip

여러 툴팁을 동시에 보여줄 필요가 없다면 이 매개변수를 생략하십시오. 그렇지 않으면, 이것은 1부터 20 사이의 숫자로 어느 툴팁 창에 작용해야 하는지 나타냅니다. 이것이 지정되지 않으면, 그 번호는 1입니다 (첫 번째). 이 매개변수는 표현식이 가능합니다.

논평

X & Y 좌표가 툴팁을 화면 밖에 나타나도록 만든다면, 완전히 보이게 좌표가 재설정됩니다.

툴팁은 다음 중 하나가 일어날 때까지 보여집니다:

  • 스크립트가 종료합니다.
  • 툴팁 명령어가 빈 Text 매개변수와 함께 다시 실행되었습니다.
  • 사용자가 툴팁에 클릭합니다 (이 행위는 운영 체제의 버전에 따라 다릅니다).

GUI 창을 Gui +OwnDialogs를 수단으로 툴팁의 소유주로 만들 수 있습니다. 그런 툴팁은 소유주가 파괴될 때 자동으로 파괴됩니다.

관련 항목

CoordMode, TrayTip, GUI, Progress, SplashTextOn, MsgBox, InputBox, FileSelectFile, FileSelectFolder

예제

ToolTip, 여러 줄`n툴팁 데모, 100, 150

; 툴팁을 일정 시간 후에 사라지게 만듭니다
; Sleep을 사용할 필요가 없습니다 (이것은 현재 쓰레드를 멈춥니다):
#Persistent
ToolTip, 시간 제한이 있는 툴팁`n이 툴팁은 5 초 후에 사라집니다.
SetTimer, RemoveToolTip, 5000
return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return


Transform

다양한 수학 기능과 비트별 연산 그리고 ASCII/Unicode 변환 같은 작업을 수행합니다.

Transform, OutputVar, Cmd, Value1 [, Value2]

매개변수

OutputVar

Cmd의 결과를 저장할 변수의 이름. SetFormat은 정수가 십육진수로 저장될지 아니면 십진수로 저장될지 결정합니다.

Cmd, Value1/2

아래 리스트 참조.

Cmd, Value1, Value2

Cmd, Value1 그리고 Value2 매개변수는 서로 의존적입니다. 그리고 그 사용법은 아래에 기술합니다.

Unicode [, String]: (이 명령어는 유니코드 버전의 오토핫키에는 없습니다.) 클립보드의 유니코드 텍스트를 열람하거나 저장합니다. 주의: 전체 클립보드는 ClipboardAll을 사용하여 열람하고 저장할 수 있습니다. 이렇게 하면 클립보드의 원본 내용의 손실 없이 "Transform Unicode"가 작동할 수 있습니다.

다음 예제에 보여주는 바와 같이 두 가지 연산 모드가 있습니다:

Transform, OutputVar, Unicode  ; 클립보드의 유니코드 텍스트를 UTF-8 문자열로 열람합니다.
Transform, Clipboard, Unicode, %MyUTF_String%  ; 유니코드 텍스트를 클립보드에 배치합니다.

위의 두 번째 예제에서 %MyUTF_String% 대신에, 기호 그대로의 UTF-8 문자열을 선택적으로 사용할 수 있습니다.

다음과 같은 핫키를 사용하면 주어진 유니코드 문자열에 상응하는 UTF-8 문자열을 알아낼 수 있습니다:

^!u::  ; Control+Alt+U 핫키.
MsgBox 유니코드 텍스트를 클립보드에 복사한 다음, 이 창으로 돌아옵니다. 계속하려면 OK를 누르십시오.
Transform, ClipUTF, Unicode
Clipboard = Transform, Clipboard, Unicode, %ClipUTF%`r`n
MsgBox 클립보드에 이제 다음 줄이 담겨 있습니다. 스크립트에 붙여 넣을 수 있습니다. 실행하면, 이 줄은 여러분이 복사한 원래의 유니코드 문자열을 클립보드에 배치합니다:`n`n%Clipboard%
return

주의: Send {U+nnnn} 명령어는 유니코드 문자를 생산하는 또다른 방법입니다.

Asc, String: String의 첫 문자에 대하여 ASCII 코드를 열람합니다 (1부터 255 사이의 숫자). String이 비어 있으면, OutputVar도 비워집니다. 예를 들어: Transform, OutputVar, Asc, %VarContainingString%. 상응하는 함수: Asc(String).

Chr, Value1: Value1로 지정한 ASCII 코드에 상응하는 문자 하나를 열람합니다. Value1이 1과 255 사이에 있지 않으면, OutputVar는 비워져서 문제가 있음을 나타냅니다. 예를 들어: Transform, OutputVar, Chr, 130. 상응하는 함수: Chr(Number).

Deref, String: 변수 참조 그리고 다른 변수 안에 들어 있는 피신 연속열을 확대합니다. 형식이 나쁜 변수 참조는 확대 결과에서 생략됩니다. OutputVar가 자신으로 확대되는 경우에도 마찬가지입니다; 다른 말로, String의 변수 안에서 OutputVar를 참조하면 확대 결과로부터 제외됩니다 (그렇지만 String 자체는 %OutputVar%가 될 수 있습니다). 다음 예제에서, var1에 문자열 "test"가 담겨 있고 var2에 기호 그대로의 문자열 "%var1%"이 담겨 있다면, OutputVar는 문자열 "test"가 설정될 것입니다: Transform, OutputVar, deref, %var2%. 함수 안에서, String 안의 각 변수는 언제나 지역 변수로 결정납니다. 단, 그런 변수가 없을 경우는 전역 변수로 결정됩니다 (또는 아무것도 없다면 비워집니다).

HTML, String [, Flags]:

ANSI 실행파일에 대하여: 문자열(String)을 그의 HTML 동등물로 변환합니다. ASCII 값이 127이 넘는 문자를 상응하는 HTML 이름으로 변환합니다 (예, £는 &pound;가 됩니다). 게다가, 다음 네 개의 "&<> 문자는 &quot;&amp;&lt;&gt;로 변환됩니다. 마지막으로, 각 라인피드(`n)는 <br>`n으로 변환됩니다 (즉, <br> 다음에 라인피드). Flags 매개변수는 무시됩니다.

유니코드 실행파일에 대하여: 위의 기능 말고도, Flags는 0이 되거나 아니면 다음 값들이 조합(합)이 될 수 있습니다. 생략하면, 기본값은 1입니다.

  • 1: 어떤 문자들을 이름붙인 표현식으로 변환합니다. 예, €는 &euro;으로 변환됩니다
  • 2: 어떤 문자들을 번호붙인 표현식으로 변환합니다. 예, €는 &#8364;으로 변환됩니다

오직 비-ASCII 문자만 영향을 받습니다. Flags = 3이면, 번호붙인 표현식은 이름붙인 표현식이 사용 불가능할 경우에만 사용됩니다. 다음 문자들은 언제나 변환됩니다: <>"& 그리고 `n (라인피드).

FromCodePage / ToCodePage: 비추천. 대신 StrPut() / StrGet()을 사용하십시오.

Mod, Dividend, Divisor: 나뉘는수(Dividend)를 나누는수(Divisor)로 나눈 나머지를 열람합니다. Divisor가 0이면, OutputVar는 비워집니다. Dividend와 Divisor가 모두 소수점을 담을 수 있습니다. 음수이면, Divisor는 계산을 위해 양수로 취급됩니다. 다음 예제에서, 결과는 2입니다: Transform, OutputVar, mod, 5, 3. 상응하는 함수: Mod(Dividend, Divisor).

Pow, Base, Exponent: 밑수(Base)를 지수(Exponent) 제곱하여 열람합니다. Base와 Exponent 모두 소수점을 포함할 수 있습니다. Exponent가 음수이면, OutputVar는 부동 소수점 수로 포맷됩니다. Base와 Exponent 둘 다 정수라도 마찬가지입니다. 1.5와 같이 소수형 지수(Exponent)와 결합된 음의 Base는 지원하지 않습니다; 그러면 OutputVar가 비워집니다. 또 다음도 참조하십시오: ** operator.

Exp, N: e를 (대략 2.71828182845905) N 제곱해 열람합니다. N은 음수일 수 있으며 소수 점을 포함할 수 있습니다. 상응하는 함수: Exp(N).

Sqrt, Value1: Value1의 제곱근을 구합니다. Value1가 음수이면, OutputVar는 비워집니다. 상응하는 함수: Sqrt(Number).

Log, Value1: Value1의 (밑수가 10인) 상용 로그를 구합니다. Value1가 음수이면, OutputVar는 비워집니다. 상응하는 함수: Log(Number).

Ln, Vaue1: Value1의 (밑수가 e인) 자연 로그를 열람합니다. Value1이 음수이면, OutputVar는 비워집니다. 상응하는 함수: Ln(Number).

Round, Value1 [, N]: N을 생략하면, OutputVar는 Value1이 가장 가까운 정수로 반올림되어 설정됩니다. N이 양수이면, Value1은 N 소수점 자리에서 반올림됩니다. N이 음수이면, Value1는 N 자리만큼 소수점 왼쪽에서 반올림됩니다. 예를 들어, -1이면 첫 째 자리에서 반올림되고, -2이면 10이 자리에서, 그리고 -3이면 백의 자리에서 반올림됩니다. 주의: Round는 소수 자리에서 반올림할 때 뒤에 따르는 0을 제거하지 않습니다. 예를 들어, 12.333을 소수 첫 째 자리에서 반올림하면 12.300000이 됩니다. 이 행위는 연산을 하기 전에SetFormat, Float, 0.1과 같이 설정하면 바꿀 수 있습니다 (실제로, SetFormat을 사용하면 첫 째 자리에서 Round를 사용할 필요조차 없습니다). 상응하는 함수: Round(Number [, N]).

Ceil, Value1: Value1을 가장 가까운 정수로 올림하여 열람합니다. 상응하는 함수: Ceil(Number).

Floor, Value1: Value1을 가장 가까운 정수로 내림하여 열람합니다. 상응하는 함수: Floor(Number).

Abs, Value1: Value1의 절대 값을 열람합니다. Value1에서 마이너스가 앞에 있다면 제거해 버리고 돌려줍니다. 상응하는 함수: Abs(Number).

Sin, Value1: Value1의 사인 값을 열람합니다. Value1은 호도로 표현되어야 합니다. 상응하는 함수: Sin(Number).

Cos, Value1: Value1의 코사인 값을 열람합니다. Value1은 호도로 표현되어야 합니다. 상응하는 함수: Cos(Number).

Tan, Value1: em>Value1의 탄젠트 값을 열람합니다. Value1은 호도로 표현되어야 합니다. 상응하는 함수: Tan(Number).

ASin, Value1: 호도 단위로 아크사인 값을 열람합니다 (Value1은 사인 값). Value1가 -1보다 작거나 1보다 크면, OutputVar는 비워집니다. 상응하는 함수: ASin(Number).

ACos, Value1: 호도 단위로 아크코사인을 열람합니다 (Value1은 코사인 값). Value1이 -1보다 작거나 1보다 크면, OutputVar는 비워집니다. 상응하는 함수: ACos(Number).

ATan, Value1: 호도 단위로 아크탄젠트를 열람합니다 (Value1은 탄젠트 값). 상응하는 함수: ATan(Number).

주의: 다음의 비트별 연산은 표현식에 사용하기 위해 더 간결한 비트별 연산자를 가지고 있습니다.

BitNot, Value1: Value1을 비트별로 뒤집어서 OutputVar에 저장합니다 (Value1이 부동 소수점 수이면, 계산 전에 정수로 잘라냅니다). Value1이 0부터 4294967295 (0xffffffff) 사이이면, 부호 없는 32-비트 값으로 취급됩니다. 그렇지 않으면 부호 있는 64-비트 값으로 취급됩니다. 다음 예제에서, 그 결과는 0xfffff0f0 (4294963440)입니다: Transform, OutputVar, BitNot, 0xf0f.

BitAnd, Value1, Value2: Value1과 Value2를 비트별-AND한 결과를 열람합니다 (부동 소수점 값은 계산 전에 정수로 잘려 나갑니다). 다음 예제에서, 그 결과는 0xff00 (65280)입니다: Transform, OutputVar, BitAnd, 0xff0f, 0xfff0.

BitOr, Value1, Value2: Value1과 Value2를 비트별-OR한 결과를 열람합니다 (부동 소수점 값은 정수로 잘라 낸 다음 계산합니다). 다음 예제에서 그 결과는 0xf0f0 (61680)입니다: Transform, OutputVar, BitOr, 0xf000, 0x00f0.

BitXOr, Value1, Value2:Value1고 Value2를 비트별-EXCLUSIVE-OR한 결과를 열람합니다 (부동 소수점 값은 정수로 잘라낸 다음 계산합니다). 다음 예제에서 그 결과는 0xff00 (65280)입니다: Transform, OutputVar, BitXOr, 0xf00f, 0x0f0f.

BitShiftLeft, Value1, Value2: Value1을 왼쪽으로 Value2 비트 위치 만큼 이동한 결과를 열람합니다. 이 값은 Value1을 "Value2 제곱만큼 곱한" 것과 동등합니다. (부동 소수점 값은 정수로 잘라낸 다음 계산합니다). 다음 예제에서 그 결과는 8입니다: Transform, OutputVar, BitShiftLeft, 1, 3.

BitShiftRight, Value1, Value2: Value1을 오른쪽으로 Value2 비트 위치만큼 이동한 결과를 열람합니다. 이 값은 Value1을 " Value2 제곱만큼 나눈" 것과 동등합니다. 나머지는 잘라내 버립니다. (부동 소수점 값은 정수로 잘라낸 다음 계산합니다). 다음 예제에서 그 결과는 2입니다: Transform, OutputVar, BitShiftRight, 17, 3.

논평

숫치 매개변수를 받는 부-명령어는 그런 매개변수에 대하여 표현식도 받을 수 있습니다.

Value1 또는 Value2가 부동 소수점 수이면, 다음 명령어(Cmd)들은 정수가 아니라 부동 소수점 수를 열람합니다: Mod, Pow, Round, 그리고 Abs. 열람된 소수 부분의 자리수는 SetFormat으로 결정됩니다.

호도 값을 각도로 변환하려면, 180/pi (대략 57.29578)를 곱하십시오. 각도를 호도로 변환하려면 pi/180 (대략 0.01745329252)를 곱하십시오.

pi의 값은 (대략 3.141592653589793) 1 아크탄젠트의 4 배입니다.

관련 항목

SetFormat, 표현식, EnvMult, EnvDiv, StringLower, if var is type

예제

Transform, OutputVar, Asc, A  ; 기호 A의 ASCII 코드를 얻습니다.


TrayTip

트레이 아이콘 근처에 풍선 메시지 창을 생성합니다.

TrayTip [, Title, Text, Seconds, Options]

매개변수

Title

매개변수를 모두 생략하면, 현재 보여지는 TrayTip 창이 제거됩니다.

그렇지 않으면, 이 매개변수는 창의 제목으로서, 73 문자까지 허용됩니다 (이 길이를 넘어간 문자는 보이지 않습니다).

Title이 비어 있으면, 제목 줄은 완전히 풍선 창으로부터 제거되고, 그 때문에 수직으로 더 짧게 됩니다.

Text

이 매개변수를 생략하거나 비어 있으면, 현재 보여지는 TrayTip 창이 제거됩니다.

그렇지 않으면, 보여줄 메시지를 지정하십시오. Title 아래에 나타납니다. Text의 앞쪽 265 개의 문자만 보입니다. 캐리지 리턴 (`r) 또는 라인피드 (`n)를 사용하면 여러 줄의 텍스트를 만들 수 있습니다. 예를 들어: Line1`nLine2.

Text가 길면, 계속 섹션을 수단으로 더 짧은 줄로 가를 수 있습니다. 그러면 가독성과 유지관성이 더욱 향상될 것입니다.

Seconds

창을 보여줄 대략적인 초의 개수. 그 이후는 자동으로 OS가 제거합니다. 10보다 작거나 30보다 크면 대신에 보통 최소 시간 (10) 또는 최대 시간 (30)을 보여주는 시간으로 사용됩니다. 비어 있거나 생략하면, 최소 시간이 보통 사용됩니다. 이 매개변수는 표현식일 수 있습니다.

실제 시간제한은 지정한 시간과 다를 수 있습니다. 마이크로소프트사의 설명에 의하면, "사용자가 컴퓨터를 사용하고 있는 듯 보이면, 시스템은 시간제한을 향하여 이 시간을 세지 않습니다." (기술적인 상세는 여기를 참조하십시오). 그러므로, 얼마나 오랫동안 TrayTip을 보여줄 지 정밀하게 제어하려면, Sleep 명령어 다음에 매개변수 없이 TrayTip을 사용하거나, 아니면 아래의 예제 섹션에서 시연하듯이 SetTimer를 사용하십시오.

Options

Options 매개변수는 다음 값들의 조합(합)일 수 있습니다:

기능 | 십진 값 | 십육진 값
정보(Info) 아이콘 | 1 | 0x1
경고(Warning) 아이콘 | 2 | 0x2
에러(Error) 아이콘 | 3 | 0x3
Windows XP 이후: 고지 사운드를 연주하지 않습니다. | 16 | 0x10
Windows Vista 이후: 큰 버전의 아이콘을 사용합니다. | 32 | 0x20

생략하면 기본값은 0이고, 이것은 아이콘이 없다는 뜻입니다. 아이콘은 Title이 생략되면 보이지 않습니다.

이 매개변수는 표현식일 수 있습니다.

논평

TrayTip 풍선 창은 스크립트에 (#NoTrayIcon 또는 Menu, tray, NoIcon을 사용해) 트레이 아이콘이 없으면 보이지 않습니다. 비슷하게, 다음 REG_DWORD 값이 존재하고 0으로 설정되어 있으면, TrayTip은 작동하지 않습니다:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced >> EnableBalloonTips

관련하여 말씀 드리자면, 사용자가 마우스를 스크립트의 트레이 아이콘 위에 올릴 때마다 툴팁이 보여집니다. 이 툴팁의 내용은 다음과 같이 바꿀 수 있습니다: Menu, Tray, Tip, My New Text.

관련 항목

ToolTip, SetTimer, Menu, SplashTextOn, MsgBox, InputBox, FileSelectFile, FileSelectFolder

예제

TrayTip, My Title, Multiline`nText, 20, 17

; (현재 쓰레드를 멈추는) Sleep을 사용할 필요 없이
; 보여주는 시간을 더 정밀하게 제어하려면:
#Persistent
TrayTip, Timed TrayTip, 이것은 5 초간 화면에 보여집니다.
SetTimer, RemoveTrayTip, 5000
return

RemoveTrayTip:
SetTimer, RemoveTrayTip, Off
TrayTip
return

; TrayTip을 영원히 보여주려면, 타이머를 사용하여 주기적으로 갱신하십시오:
SetTimer, RefreshTrayTip, 1000
Gosub, RefreshTrayTip  ; 한 번만 호출하면 즉시 시작합니다.
return

RefreshTrayTip:
TrayTip, Refreshed TrayTip, 이것은 거의 영구적인 TrayTip입니다., , 16
return


TreeView (GUI)

TreeView [v1.0.44+]

목차

  • 소개와 간단한 예제
  • 옵션과 스타일
  • 내장 함수:
    • 항목 추가/변경/삭제
    • TreeView로부터 데이터 얻기
  • G-라벨 고지
  • 논평
  • 긴 예제

간단한 예제와 소개

Tree-View는 계통적 항목들을 부모 아래의 자손들은 한 단계 들여 넣어 보여줍니다. 가장 흔한 예는 익스플로러의 드라이브와 폴더 트리입니다.

TreeView를 생성하는 구문은 다음과 같습니다:

Gui, Add, TreeView, Options

다음 스크립트는 간단한 계통적 항목들을 생성하고 보여줍니다:

Gui, Add, TreeView
P1 := TV_Add("First parent")
P1C1 := TV_Add("Parent 1's first child", P1)  ; P1을 이 항목의 부모로 지정합니다.
P2 := TV_Add("Second parent")
P2C1 := TV_Add("Parent 2's first child", P2)
P2C2 := TV_Add("Parent 2's second child", P2)
P2C2C1 := TV_Add("Child 2's first child", P2C2)

Gui, Show  ; 창과 그의 TreeView를 보여줍니다.
return

GuiClose:  ; 사용자가 TreeView의 GUI 창을 닫으면 스크립트를 종료합니다.
ExitApp

"Gui, Add, TreeView, Options"에 대한 옵션과 스타일

AltSubmit: 스크립트에 정상보다 더 많은 유형의 TreeView 이벤트에 대하여 고지합니다. 다른 말로, g-라벨이 더 자주 기동합니다. 자세한 것은 TreeView Notifications을 참조하십시오.

Background: 단어 Background와 다음에 바로 컬러 이름을 지정하거나 (컬러 차트 참조) RGB 값을 지정하십시오 (0x 접두사는 선택적입니다). 예제: BackgroundSilver, BackgroundFFDD99. 이 옵션이 존재하지 않으면, TreeView는 처음에 기본값이. Gui Color의 마지막 매개변수로 설정된 배경색입니다 (또는 없으면, 시스템의 기본 배경 색입니다). BackgroundDefault를 지정하면 시스템의 기본 배경색이 적용됩니다 (보통 흰색). 예를 들어, GuiControl, +BackgroundDefault, MyTreeView를 통하여 TreeView를 기본값으로 복구할 수 있습니다.

Buttons: -Buttons (마이너스 버튼)을 지정하면 플러스나 마이너스 사인이 자손이 있는 각 항목의 왼쪽에 나타나는 것을 막을 수 있습니다.

C: 텍스트 컬러. 기호 C 다음에 즉시 컬러 이름 (컬러 차트 참조) 또는 RGB 값을 지정하십시오 (0x 접두사는 선택적입니다). 예를 들어: cRed, cFF2211, c0xFF2211, cDefault.

Checked: 각 항목의 왼쪽에 체크박스를 제공합니다. 항목을 추가할 때, 단어 Check를 그의 옵션에 지정하면 박스를 체크한 상태로 시작할 수 있습니다. 사용자는 체크박스크를 클릭하거나 스페이스를 바를 눌러 항목을 체크하거나 해제할 수 있습니다. 어느 항목이 현재 TreeView에 체크되어 있는지 알아 보려면, TV_GetNext() 또는 TV_Get()을 호출하십시오.

HScroll: -HScroll (마이너스 HScroll)을 지정하면 수평 스크롤을 불능으로 만들 수 있습니다 (게다가, 콘트롤은 수평 바를 보여주지 않습니다).

ImageList: 이 방법으로 아이콘을 TreeView에 추가합니다. 단어 ImageList 다음에 바로 이전에 IL_Create()를 호출해 돌려 받은 ImageListID를 지정하십시오. 이 옵션은 TreeView를 생성할 때에만 효과가 있습니다 (그렇지만, TV_SetImageList()는 이 제한이 없습니다). 다음은 작동하는 예제입니다:

ImageListID := IL_Create(10)  ; 최초 가용능력이 10개의 아이콘인 ImageList를 생성합니다.
Loop 10  ; ImageList에 표준 시스템 아이콘을 적재합니다.
    IL_Add(ImageListID, "shell32.dll", A_Index)
Gui, Add, TreeView, ImageList%ImageListID%
TV_Add("Name of Item", 0, "Icon4")  ; 항목을 TreeView에 추가하고 거기에 폴더 아이콘을 부여합니다.
Gui Show

Lines: -Lines (마이너스 Lines)를 지정하면 부모 항목을 자손 항목과 연결하는 줄들을 보여주지 않습니다. 그렇지만, 이 줄을 제거하면 최상위 레벨의 항목에 플러스/마이너스 버튼도 보이지 않게 됩니다.

ReadOnly: -ReadOnly (마이너스 ReadOnly)를 지정하면 각 항목의 텍스트/이름의 편집을 허용합니다. 항목을 편집하려면, 선택한 다음 F2 키를 누르십시오. 다른 방법으로, 항목을 한 번 클릭하여 선택할 수 있습니다. 약 반초 기다린 다음, 같은 항목을 다시 클릭해 편집할 수 있습니다. 편집이 끝난 후, 항목은 다음 예제를 통하여 그의 형제들 사이에 알파벳 순서로 재배치됩니다:

Gui, Add, TreeView, -ReadOnly gMyTree
; ...
MyTree:
if (A_GuiEvent == "e")  ; 사용자가 항목 편집을 마쳤습니다 (대소문자를 구분해 비교합니다).
    TV_Modify(TV_GetParent(A_EventInfo), "Sort")  ; 이것은 편집 항목에 부모가 없더라도 작동합니다.
return

R: 줄 높이 (생성시). 기호 R 다음에 즉시 콘트롤 안에 여유를 둘 줄의 개수를 지정합니다. 예를 들어, R10이면 콘트롤을 10개의 항목 높이로 만듭니다.

WantF2: -WantF2 (마이너스 WantF2)를 지정하면 F2 키눌림으로 현재 선택된 항목을 편집하지 못하도록 막습니다. 이 설정은 -ReadOnly도 켜져 있지 않는 한 무시됩니다. 이 설정에 상관없이, g-라벨은 여전히 F2 고지를 받습니다.

(이름없는 숫자 스타일): 위에 언급된 스타일 말고는 다른 스타일은 거의 사용되지 않으므로, 이름이 없습니다. 리스트는 TreeView 스타일 테이블을 참조하십시오.

TreeViews용 내장 함수

모든 TreeView 함수는 현재 쓰레드의 기본 GUI 창에 작동합니다 (기본 구이 창은 Gui, 2:Default를 통하여 바꿀 수 있습니다). 기본 창이 존재하지 않거나 TreeView 콘트롤이 없다면, 모든 함수는 0을 돌려주어 문제를 나타냅니다.

창에 여러 TreeView 콘트롤이 있다면, 기본값으로 함수들은 가장 최근에 추가된 콘트롤에 작동합니다. 이를 바꾸려면, Gui, TreeView, TreeViewName를 지정하십시오. 여기에서 TreeViewName는 TreeView의 연관 변수이름이거나, Window Spy로 노출되는 ClassNN이거나, 또는 (v1.1.04+에서) 그의 HWND입니다. 일단 바뀌면, 기존의 모든 그리고 미래의 쓰레드는 지시한 TreeView를 사용합니다.

TV_SetImageList(ImageListID [, 0|2]) [v1.1.02+]

TreeView의 ImageList를 설정하거나 삭제합니다. ImageListID는 이전에 IL_Create()를 호출해 돌려 받은 번호입니다. 두 번째 매개변수는 보통 생략됩니다. 이 경우 기본값은 0입니다. 그렇지 않으면, 2를 상태 아이콘에 지정하십시오 (아직 직접적으로 지원하지는 않지만, SendMessage를 통하여 사용할 수 있습니다). 성공하면, TV_SetImageList()는 이전에 TreeView에 연관되어 있는 ImageListID를 돌려줍니다 (연관된게 없으면 0을 돌려줍니다). 그렇게 떼어낸 ImageList는 보통 IL_Destroy(ImageListID)를 통하여 파괴합니다.

항목을 추가하고, 변경하고, 삭제하기

TV_Add(Name, [ParentItemID, Options])

TreeView에 새 항목을 추가하고 그의 유일한 Item ID 번호를 돌려줍니다 (또는 실패시 0을 돌려줍니다). Name은 항목을 보여주는 텍스트이며, 텍스트이거나 숫자일 수 있습니다 (숫치 표현식의 결과도 포함). ParentItemID는 새 항목의 부모 ID 번호입니다 (생략하거나 0을 지정하면 그 항목을 최상위 레벨에 추가합니다). 방대한 개수의 항목을 추가할 때, 수행성능을 개선할 수 있습니다. 항목을 추가하기 전에 GuiControl, -Redraw, MyTreeView를 사용하고 끝난 후에 GuiControl, +Redraw, MyTreeView를 사용하면 됩니다.

TV_Add() 그리고 TV_Modify()용 옵션

Options 매개변수는 아래 리스트의 단어로 구성된 문자열입니다 (대소문자 구분 안함). 별도의 각 단어마다 다음 단어와 스페이스나 탭으로 가르십시오. 옵션을 제거하려면, 앞에 마이너스 사인을 붙이십시오. 옵션을 추가하려면, 플러스 사인은 허용하지만 필수는 아닙니다.

Bold: 항목의 이름을 볼드체로 보여줍니다. 나중에 해제하려면, TV_Modify(ItemID, "-Bold")를 사용하십시오.

Check: (TreeView에 체크박스가 있다면) 체크 표식을 항목의 왼쪽에 보여줍니다. 나중에 해제하려면, TV_Modify(ItemID, "-Check")을 사용하십시오. 단어 Check는 선택적으로 다음에 즉시 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다. 다른 말로, "Check"와 "Check" . VarContainingOne 모두 같습니다 (여기에서 점은 결합 연산자입니다).

Expand: 항목을 확대해 (있다면) 그의 자손을 노출시킵니다. 나중에 항목을 축소하려면, TV_Modify(ItemID, "-Expand")를 사용하십시오. 자손이 없다면, TV_Modify()는 그 항목의 ID 대신에 0을 돌려줍니다. 대조적으로, TV_Add()는 항목에 자손이 나중에 거기에 추가될 경우 확대 표식을 합니다. (아래의) "Select"와 다르게, 항목이 확대되더라도 그의 부모가 자동으로 확대되지는 않습니다. 마지막으로, 단어 Expand 다음에 선택적으로 0 또는 1이 따라와 시작 상태를 나타낼 수 있습니다. 다른 말로, "Expand"와 "Expand" . VarContainingOne는 같습니다.

First | Sort | N: 이 옵션들은 TV_Add()에만 적용됩니다. 새 항목의 위치를 그의 형제에 상대적으로 지정합니다 (형제(sibling)란 같은 레벨에 있는 다른 항목들입니다). 이 옵션들 모두 존재하지 않으면, 마지막/막내 형제로 새 항목이 추가됩니다. 그렇지 않으면, First를 추가해 그 항목을 첫째/장남 형제로 추가할 수 있습니다. 또는Sort를 지정하면 그 항목을 그의 형제들 사이에 알파벳 순서로 삽입할 수 있습니다. 평범한 정수가 (N) 지정되면, 그 다음에 새 항목을 추가할 형제의 ID 번호로 간주됩니다 (정수 N이 유일한 옵션이라면, 따옴표로 둘러쌀 필요가 없습니다).

Icon: 단어 Icon 다음에 이 항목의 아이콘 번호를 지정하십시오. 이 아이콘은 항목의 이름 왼쪽에 보여집니다. 이 옵션이 없으면, ImageList에서 첫 번째 아이콘이 사용됩니다. 빈 아이콘을 보여주려면, ImageList 안에 있는 아이콘보다 큰 숫자를 지정하면 됩니다. 콘트롤에 ImageList가 없으면, 아이콘도 보이지 않고 아이콘을 위한 스페이스도 보존되지 않습니다.

Select: 항목을 선택합니다. 한 번에 오직 하나의 항목만 선택할 수 있기 때문에, 이전에 선택된 항목은 자동으로 해제됩니다. 게다가, 이 옵션은 필요하면 그의 부모를 확대해서 새로 선택된 항목을 노출시킵니다. 현재 선택을 알아 내려면, TV_GetSelection()를 호출하십시오.

Sort: TV_Modify()에 대하여, 이 옵션은 알파벳 순서로 지정된 항목의 자손들을 정렬합니다. 대신에 모든 최상위 레벨의 항목들을 정렬하려면, TV_Modify(0, "Sort")를 사용하십시오. 자손이 없다면, 변경된 항목의 ID 대신에 0을 돌려줍니다.

Vis: TreeView를 스크롤하거나 필요하면 그의 부모를 확대해서 항목이 완전히 보이도록 확인합니다.

VisFirst: 위와 같지만 TreeView도 스크롤되어 가능하면 그 항목이 항상 위에 보이도록 합니다. 이 옵션은 전형적으로 TV_Add() 보다 TV_Modify()와 사용할 때 더 효율적입니다.

TV_Modify(ItemID [, Options, NewName])

항목의 이름과 속성을 변경합니다. 성공하면 항목 자신의 ID를 돌려줍니다. 실패시 (또는 부분적 실패시) 0을 돌려줍니다. 첫 매개변수만 있으면, 지정된 항목이 선택됩니다. NewName을 생략하면, 현재 이름을 바꾸지 않고 그대로 둡니다. Options에 관해서는 위의 리스트를 참조하십시오.

TV_Delete([ItemID])

ItemID을 생략하면, TreeView 안의 모든 항목이 삭제됩니다. 그렇지 않으면, 오직 지정된 ItemID만 삭제됩니다. 성공하면 1을 돌려주고 실패시 0을 돌려줍니다.

TreeView로부터 데이터 얻기

TV_GetSelection()

선택된 항목의 ID 번호를 돌려줍니다.

TV_GetCount()

콘트롤에 있는 항목의 총 개수를 돌려줍니다. 이 함수는 언제나 순간적입니다. 왜냐하면 콘트롤의 개수를 추적관리하기 때문입니다.

TV_GetParent(ItemID)

지정된 항목의 부모를 항목 ID로 돌려줍니다. 최상위 레벨의 항목들은 부모가 없으므로 0을 돌려줍니다.

TV_GetChild(ParentItemID)

지정된 항목의 첫째/최상위 자손의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다).

TV_GetPrev(ItemID)

지정된 항목 위의 형제의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다).

TV_GetNext([ItemID, "Checked | Full"])

다음 모드가 있습니다:

  1. 모든 매개변수를 생략하면, TreeView에서 첫째/최상위 항목의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다).
  2. 오직 첫 번째 매개변수 (ItemID)만 있으면, 지정된 항목 아래 형제의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다). 첫 번째 매개변수가 0이면, TreeView에서 첫째/최상위 항목의 ID 번호를 돌려줍니다 (없으면 0을 돌려줍니다).
  3. 두 번째 매개변수가 "Full" 또는 "F"이면, 지정된 항목과의 관계에 상관없이 다음 항목을 열람합니다. 이렇게 하면 스크립트는 쉽게 전체 트리를 항목별로 순회할 수 있습니다. 예를 들어:
    ItemID = 0  ; 회돌이의 첫 번째 반복이 트리의 최상단에서 검색을 시작하도록 만듭니다.
Loop
{
    ItemID := TV_GetNext(ItemID, "Full")  ; 체크표식된 항목을 모두 찾으려면 "Full"을 "Checked"로 교체하십시오..
    if not ItemID  ; 트리에 더 이상 항목이 없습니다.
        break
    TV_GetText(ItemText, ItemID)
    MsgBox The next Item is %ItemID%, whose text is "%ItemText%".
}
  4. 두 번째 매개변수가 "Check", "Checked", 또는 "C"이면, 위와 같은 행위를 합니다. 단, 체크표식이 없는 항목은 건너 뜁니다. 이렇게 하면 TreeView에 체크표식된 모든 항목을 하나씩 열람할 수 있습니다.

TV_GetText(OutputVar, ItemID)

지정된 ItemID의 텍스트/이름을 열람하고 그것을 OutputVar에 저장합니다. 텍스트가 8191 길이를 넘으면, 오직 앞쪽 8191 문자만 열람됩니다. 성공하면, 함수는 그 항목의 ID를 돌려줍니다. 실패하면, 0을 돌려줍니다 (그리고 OutputVar도 비워집니다).

TV_Get(ItemID, "Expand | Check | Bold")

지정된 항목에 지정된 속성이 없으면, 그 자신의 ItemID가 반환됩니다. 그렇지 않으면 0이 반환됩니다. 두 번째 매개변수에 대하여, "E", "Expand", 또는 "Expanded"을 지정하면 항목이 현재 확대되어 있는지 알아낼 수 있습니다 (즉, 그의 자손이 보여지고 있는지를 알아낼 수 있습니다); "C", "Check", 또는 "Checked"를 지정하면 항목에 체크표식이 있는지 알아낼 수 있습니다; 또는 "B"나 "Bold"를 지정하면 현재 항목의 글꼴이 볼드체인지 알아낼 수 있습니다.

팁: IF-서술문은 0 아닌 값을 참("true")으로 간주하므로, 다음의 두 줄은 기능적으로 동일합니다:

  1. if TV_Get(ItemID, "Checked") = ItemID
  2. if TV_Get(ItemID, "Checked")

G-라벨 고지 (Primary)

gMySubroutine과 같은 g-라벨은 콘트롤의 옵션에 나열할 수 있습니다. 이렇게 하면 사용자가 콘트롤에 조치를 수행할 때마다 MySubroutine 라벨이 자동으로 기동됩니다. 이 서브루틴은 내장 함수 A_Gui 그리고 A_GuiControl 을 참고해 어느 창과 어느 TreeView가 이벤트를 발생시켰는지 알아냅니다. 더 중요한 것은 A_GuiEvent를 참고할 수 있습니다. 안에 다음 문자열 또는 기호 중 하나가 들어 있습니다 (미래 버전과의 호환을 위해, 스크립트는 이것들만 유일한 값이라고 간주하면 안됩니다):

DoubleClick: 사용자가 항목을 더블클릭했습니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

D: 사용자가 항목을 끌려고 시도했습니다 (현재 이를 내부적으로 지원하지 않습니다). 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

d (소문자 D): 위와 같지만 왼클릭 끌기가 아니라 우클릭 끌기입니다.

e (소문자 E): 사용자가 항목 편집을 끝마쳤습니다 (사용자는 TreeView 옵션에 -ReadOnly일 경우에만 항목을 편집할 수 있습니다). 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

S: 사용자 또는 스크립트 자체에서 새 항목을 선택했습니다. 변수 A_EventInfo에 새로 선택된 그 항목의 ID가 담깁니다.

G-라벨 고지 (Secondary)

TreeView의 옵션에 단어 AltSubmit이 있다면, 그의g-라벨은 더 자주 기동되고 A_GuiEvent에는 다음의 값이 추가로 담길 수 있습니다:

Normal: 사용자가 항목을 왼클릭 했습니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

RightClick: 사용자가 항목을 우클릭했습니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다. 대부분의 경우, 이에 반응하여 메뉴를 보여주지 않는 것이 제일 좋습니다. 대신에, GuiContextMenu 라벨을 사용하십시오. 왜냐하면 Apps 키도 인지하기 때문입니다. 예를 들어:

GuiContextMenu:  ; 우클릭에 응답하여 기동되거나 Apps 누름에 응답하여 기동됩.
if A_GuiControl <> MyTreeView  ; 이 점검은 선택적입니다. TreeView 안에 클릭할 때만 메뉴를 보여줍니다.
    return
; 제공된 A_GuiX 그리고 A_GuiY 좌표에 메뉴를 보여줍니다.
; 사용자가 Apps 키를 누르더라도 올바를 좌표를 제공하기 때무에 이것을 사용해야 합니다:
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return

E: 사용자가 항목 편집을 시작했습니다 (사용자는 TreeView 옵션에 -ReadOnly이 있을 경우에만 항목을 편집할 수 있습니다). 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

F: TreeView가 키보드 초점을 받았습니다.

f (소문자 F): TreeView 가 키보드 초점을 잃어버렸습니다.

K: TreeView가 초점이 있는 동안 사용자가 키를 눌렀습니다. A_EventInfo에 키의 가상 키 코드가 담깁니다. 범위는 1부터 255까지입니다. 키가 알파벳이면, 대부분의 키보드 레이아웃에서 Chr(A_EventInfo)를 통하여 상응하는 문자로 변환할 수 있습니다. F2 키눌림은 WantF2에 상관없이 받습니다. 그렇지만, Enter 키눌림은 받지 않습니다; 이 키를 받으려면, 아래에 기술하는 바와 같이 기본 버튼을 사용하십시오.

+ (플러스 사인): 항목이 확대되어 그의 자손을 보여줍니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

- (마이너스 사인): 항목이 축소되어 그의 자손을 감춥니다. 변수 A_EventInfo에 그 항목의 ID가 담깁니다.

논평

Gui Submit 명령어는 TreeView 콘트롤에 아무 효과가 없습니다. 그러므로, 스크립트는 (있다면) TreeView의 연관 변수를 사용해 기타 데이터를 저장할 수 있습니다. 덮어쓸까봐 걱정할 필요가 없습니다.

TreeView에 초점이 있는 동안 사용자가 Enter를 눌렀는지 탐지하려면, 기본 버튼을 사용하십시오 (원하면 감출 수 있습니다). 예를 들어:

Gui, Add, Button, Hidden Default, OK
...
ButtonOK:
GuiControlGet, FocusedControl, FocusV
if FocusedControl <> MyTreeView
    return
MsgBox % "Enter was pressed. The selected item ID is " . TV_GetSelection()
return

키보드로 한 항목에서 다른 항목으로 항해하는 것 말고도, 사용자는 한 항목의 이름의 첫 문자를 타자하여 점진 검색을 수행할 수도 있습니다. 이렇게 하면 선택이 부합하는 가장 가까운 항목으로 점프합니다.

길이에 상관없이 텍스트를 TreeView의 각 항목에 저장할 수 있지만, 오직 앞쪽 260 글자만 보여줍니다.

이론적으로 TreeView에서 항목의 개수는 최대 65536이지만, 항목을 추가할 수록 얼마 가지 않아 수행성능이 눈에 띄게 줄어듭니다. TV_Add()에 기술된 다시 그리기 팁을 사용하면 이를 약간 줄일 수 있습니다.

ListViews와 다르게, TreeView의 ImageList는 TreeView가 파괴될 때 자동으로 파괴되지 않습니다. 그러므로, 스크립트는 TreeView의 창을 파괴하고 나면 반드시 IL_Destroy(ImageListID)를 호출해야 합니다. ImageList를 다른 곳에 사용할 생각이 없다면 말입니다. 그렇지만, 스크립트가 곧 끝날 경우라면 불필요합니다. 왜냐하면 그 때 모든 ImageLists도 자동으로 파괴되기 때문입니다.

스크립트는 창 당 하나 이상의 TreeView를 생성할 수 있습니다. 기본 말고 다른 TreeView를 처리하려면, 내장 함수를 참조하십시오.

TreeView의 글꼴을 바꾸거나 크기를 바꾸거나 숨기려면 GuiControl을 사용하십시오.

트리뷰 확장(Tree View eXtension (TVX))으로 TreeViews를 이동하고 삽입하고 제거할 수 있습니다. 다음 데모를 참조하십시오: www.autohotkey.com/forum/topic19021.html

관련 항목

ListView, Other Control Types, Gui, GuiContextMenu, GuiControl, GuiControlGet, TreeView 스타일 테이블

예제

; 다음 스크립트는 이 페이지 위에 있는 예제보다 더 정교합니다.
; 모든-사용자 시작 메뉴의 모든 폴더를 담은 TreeView를 생성하고 부여줍니다.
; 사용자가 폴더를 선택하면, 그의 내용이 ListView 오른쪽에 나타납니다 (윈도우즈의 탐색기처럼).
; 게다가, StatusBar 콘트롤에 현재 선택된 폴더에 관한 정보를 보여줍니다.

; 다음 폴더는 TreeView에 대하여 루트 폴더가 됩니다.
; C:\와 같이 전체 드라이브를 지정하면 약간 적재 시간이 걸립니다:
TreeRoot = %A_StartMenuCommon%
TreeViewWidth := 280
ListViewWidth := A_ScreenWidth - TreeViewWidth - 30

; 사용자가 창을 끌어 크기를 바꿀 수 있도록 허용합니다:
Gui +Resize

; ImageList를 만들고 거기에 표준 시스템 아이콘을 배정합니다:
ImageListID := IL_Create(5)
Loop 5
    IL_Add(ImageListID, "shell32.dll", A_Index)
; TreeView와 ListView를 나란히 만들어 마치 윈도우즈의 탐색기처럼 행위합니다:
Gui, Add, TreeView, vMyTreeView r20 w%TreeViewWidth% gMyTreeView ImageList%ImageListID%
Gui, Add, ListView, vMyListView r20 w%ListViewWidth% x+10, Name|Modified

; ListView의 컬럼 너비를 설정합니다 (이것은 선택적입니다):
Col2Width = 70  ; 오직 YYYYMMDD 부분만 보이도록 너비를 줄입니다.
LV_ModifyCol(1, ListViewWidth - Col2Width - 30)  ; 수직 스크롤바를 위해 공간을 허용합니다.
LV_ModifyCol(2, Col2Width)

; 파일의 개수와 그의 총 크기에 관한 정보를 보여줄 상태 바를 생성합니다:
Gui, Add, StatusBar
SB_SetParts(60, 85)  ; 바를 세 부분으로 생성합니다 (세 번째 부분에 나머지 너비를 모두 채웁니다).

; 폴더와 그의 부폴더덜을 트리에 추가합니다. 적재 시간이 걸릴 경우는 현재 상태를 보여줍니다:
SplashTextOn, 200, 25, TreeView and StatusBar Example, Loading the tree...
AddSubFoldersToTree(TreeRoot)
SplashTextOff

; 창을 보여주고 돌아갑니다. OS는 스크립트에게 사용자가 적절한 행위를 수행할 때마다 고지합니다:
Gui, Show,, %TreeRoot%  ; 제목 바에 소스 디렉토리를 보여줍니다 (TreeRoot).
return

AddSubFoldersToTree(Folder, ParentItemID = 0)
{
    ; 이 함수는 지정된 폴더의 모든 부폴더를 TreeView에 추가합니다..
    ; 또한 깊이에 상관없이 자기 자신을 재귀해 내포된 폴더들을 수집합니다.
    Loop %Folder%\*.*, 2  ; 모든 폴더의 부폴더들을 열람합니다.
        AddSubFoldersToTree(A_LoopFileFullPath, TV_Add(A_LoopFileName, ParentItemID, "Icon4"))
}

MyTreeView:  ; 이 서브루틴은 사용자 행위를 처리합니다 (예를 들어 클릭).
if A_GuiEvent <> S  ; 즉, "새로운 트리 항목 선택"이 아닌 이벤트.
    return  ; 아무것도 하지 않음.
; 그렇지 않으면, ListView 내용을 선택된 폴더로 채웁니다.
; 먼처 선택된 폴더의 완전한 경로를 알아냅니다:
TV_GetText(SelectedItemText, A_EventInfo)
ParentID := A_EventInfo
Loop  ; 선택된 폴더에 대한 전체 경로를 구성합니다.
{
    ParentID := TV_GetParent(ParentID)
    if not ParentID  ; 더 이상 조상 없음.
        break
    TV_GetText(ParentText, ParentID)
    SelectedItemText = %ParentText%\%SelectedItemText%
}
SelectedFullPath = %TreeRoot%\%SelectedItemText%

; 파일들을 ListView 안에 삽입합니다:
LV_Delete()  ; 모든 행들을 지웁니다.
GuiControl, -Redraw, MyListView  ; 적재하는 동안 다시 그리기를 막아서 수행성능을 향상시킵니다.
FileCount = 0  ; 아래 회돌이를 시작하기 전에 초기화합니다.
TotalSize = 0
Loop %SelectedFullPath%\*.*  ; 간단하게 처리하기 위해, 폴더를 생략하고 ListView에 있는 파일들만 보입니다.
{
    LV_Add("", A_LoopFileName, A_LoopFileTimeModified)
    FileCount += 1
    TotalSize += A_LoopFileSize
}
GuiControl, +Redraw, MyListView

; 상태 바의 세 부분을 업데이트해 현재 선택된 폴더에 관한 정보를 보여줍니다:
SB_SetText(FileCount . " files", 1)
SB_SetText(Round(TotalSize / 1024, 1) . " KB", 2)
SB_SetText(SelectedFullPath, 3)
return

GuiSize:  ; 사용자의 창 크기 변경에 응답하여 ListView와 TreeView 크기를 조절합니다.
if A_EventInfo = 1  ; 창이 최소화되었습니다. 아무 조치도 필요하지 않습니다.
    return
; 그렇지 않으면, 창은 크기가 변경되거나 최대화되었습니다. 부합하는 콘트롤들의 크기를 조절합니다.
GuiControl, Move, MyTreeView, % "H" . (A_GuiHeight - 30)  ; StatusBar와 여백에 -30을 지정합니다.
GuiControl, Move, MyListView, % "H" . (A_GuiHeight - 30) . " W" . (A_GuiWidth - TreeViewWidth - 30)
return

GuiClose:  ; 사용자가 TreeView의 GUI 창을 닫으면 스크립트를 종료합니다.
ExitApp


Trim

Trim [AHK_L 31+]

문자열의 앞뒤로부터 문자들을 걷어냅니다.

Result :=  Trim(String, OmitChars = " `t")
Result := LTrim(String, OmitChars = " `t")
Result := RTrim(String, OmitChars = " `t")

매개변수

String

문자열 값이나 변수. 숫자는 지원하지 않습니다.

OmitChars

String의 앞뒤로부터 배제할 선택적인 문자 리스트 (대소문자 구분). 생략되면, 스페이스와 탭이 제거됩니다.

예제

text := "  text  "
MsgBox % "No trim:`t '" text "'"
    . "`nTrim:`t '" Trim(text) "'"
    . "`nLTrim:`t '" LTrim(text) "'"
    . "`nRTrim:`t '" RTrim(text) "'"
MsgBox % LTrim("00000123","0")


Try

Try [v1.1.04+]

하나 이상의 서술문들을 (명령어나 표현식을) throw 명령어가 던지는 실행시간 에러와 예외로부터 보호합니다.

Try Statement
Try
{
    Statements
}

논평

try 명령어는 보통 다음에 블록이 따라옵니다 - 활괄호로 둘러 싸인 하나 이상의 서술문 (명령어나 표현식). 하나의 서술문만 실행한다면, try와 같은 줄 또는 다음 줄에 배치할 수 있고, 활괄호를 생략할 수 있습니다. try가 에러를 잡을 때 정확하게 한 번만 실행되는 코드를 지정하려면, catch 명령어를 사용하십시오.

실행시간 에러가 일어나면 throw 명령어 또는 프로그램이 예외를 던질 수 있습니다. try 블록 안에서 또는 블록에서 호출한 함수 안에서 예외가 던져질 때, 다음과 같은 일이 일어납니다:

  • 상응하는 catch 서술문이 있다면, 실행은 거기에서 계속됩니다.
  • catch 서술문은 없지만 finally 서술문이 있다면, 그것이 실행됩니다. 그러나 일단 끝나면 예외는 자동으로 다시 던져집니다.
  • catch 서술문도 없고 finally 서술문도 없다면, 실행은 다음 줄 try 블록 밖으로 계속됩니다.

try 블록이 실행 중이지 않은 동안에 예외가 던져지면, 에러 메시지를 보여주고 현재 쓰레드를 종료합니다.

One True Brace (OTB) 스타일을 선택적으로 try 명령어에 사용할 수 있습니다. 예를 들어:

try {
    ...
} catch e {
    ...
}

관련 항목

Catch, Throw, Finally, 블록

예제

; 예제 #1: try/catch/throw의 기본 개념.

try  ; 코드를 실행해 봅니다.
{
    HelloWorld()
    MakeToast()
}
catch e  ;  위의 블록에서 일으킨 첫 번째 에러/에외를 처리합니다.
{
    MsgBox, 예외가 던져졌습니다!`n구체적으로 다음과 같습니다: %e%
    Exit
}

HelloWorld()  ; 언제나 성공합니다.
{
    MsgBox, Hello, world!
}

MakeToast()  ; 언제나 실패합니다.
{
    ; try 블록의 에러 처리에 곧바로 점프합니다:
    throw A_ThisFunc " is not implemented, sorry"
}

; 예제 #2: ErrorLevel 대신에 try/catch 사용하기.

try
{
    ; 다음 예제는 어떤 유형의 파일을 백업합니다:
    FileCopy, %A_MyDocuments%\*.txt, D:\Backup\Text documents
    FileCopy, %A_MyDocuments%\*.doc, D:\Backup\Text documents
    FileCopy, %A_MyDocuments%\*.jpg, D:\Backup\Photos
}
catch
{
    MsgBox, 16,, 파일을 백업하는 동안 문제가 있었습니다!
    ExitApp
}

; 예제 #3: COM 에러 다루기.

try
{
    obj := ComObjCreate("ScriptControl")
    obj.ExecuteStatement("MsgBox ""This is embedded VBScript""")
    obj.InvalidMethod() ; 이 줄은 실행 시간 에러를 일으킵니다.
}
catch e
{
    ; e를 담고 있는 객체에 관한 더 자세한 정보는 Exception()를 참조하십시오.
    MsgBox, 16,, % "Exception thrown!`n`nwhat: " e.what "`nfile: " e.file
        . "`nline: " e.line "`nmessage: " e.message "`nextra: " e.extra
}

; 예제 #4: try-catch 서술문들을 내포하기.

try Example1() ; 한 줄 서술문은 Try 명령어와 같은 줄에 있을 수 있습니다.
catch e
    MsgBox, Example1() threw %e%.

Example1()
{
    try Example2()
    catch e
    {
        if e = 1
            throw e ; 예외를 다시 던져서 호출자가 받을 수 있도록 합니다.
        else
            MsgBox, Example2() threw %e%.
    }
}

Example2()
{
    Random, o, 1, 2
    throw o
}


Until

Until [AHK_L 59+]

Loop 또는 For-회돌이에 계속할지 말지 조건을 적용합니다.

Loop {
    ...
} Until Expression

매개변수

Expression

유효한 표현식.

논평

표현식은 각 반복 후에 한 번 평가됩니다. 그리고 continue가 사용되었어도 평가됩니다. 표현식이 거짓으로 평가되면 (빈 문자열 또는 숫자 0이면), 회돌이는 계속됩니다; 그렇지 않으면, 회돌이를 빠져 나와 다음 줄에서 실행을 계속합니다 Until.

Loop Until 은 다음을 단축해 표현한 것입니다:

Loop {
    ...
    if (Expression)
        break
}

그렇지만, Loop Until이 보통 더 이해하기 쉽습니다. 위와 다르게, 한 줄-행위와도 사용할 수 있습니다. 예를 들어:

Loop
    x *= 2
Until x > y

Until은 어떤 Loop 또는 For과도 사용이 가능합니다. 예를 들어:

Loop, Read, %A_ScriptFullPath%
    lines .= A_LoopReadLine . "`n"
Until A_Index=5  ; 앞쪽 다섯 줄을 읽습니다.
MsgBox % lines

A_Index가 표현식 안에 사용되면, 방금 끝낸 반복의 인덱스가 담깁니다.

관련 항목

Loop, While-회돌이, For-회돌이, Break, Continue, Blocks, 파일과 폴더 회돌이, 레지스트리 회돌이, 파일-읽기 회돌이, 파싱 회돌이, If (expression)


UrlDownloadToFile

파일을 인터넷에서 내려받습니다.

UrlDownloadToFile, URL, Filename

매개변수

URL

내려 받을 파일의 URL. 예를 들어, http://someorg.org는 그 회사의 환영 페이지를 열람합니다.

Filename

파일에 내려받기: 지역적으로 생성될 파일의 이름을 지정합니다. 절대 경로가 지정되지 않으면 %A_WorkingDir%에 있다고 간주됩니다. 기존의 파일은 이 새 파일로 덮어쓰기 됩니다.

변수에 내려받기: 아래의 예제를 참조하십시오.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1로 설정되고 성공하면 0이 설정됩니다.

논평

원격 파일이 존재하지 않더라도 내려받기는 마치 성공한 것처럼 보일 수 있습니다. 많은 웹 서버가 실패한 파일 대신에 에러 페이지를 보내기 때문입니다. 이 에러 페이지가 Filename 대신에 저장될 것입니다.

Internet Explorer 3 이상은 설치해야 이 기능이 작동합니다. 방화벽이나 여러 네트워크 어댑터 때문에 이 기능이 작동하지 않을 수 있습니다. 또, 어떤 웹 사이트는 이런 식의 내려받기를 금지하기도 합니다.

Caching:

  • v1.0.44.07+에서, URL은 원격 서버로부터 직접 열람됩니다 (즉, 인터넷 익스플로러의 캐쉬를 전혀 사용하지 않습니다). 캐쉬를 허용하려면, URL 앞에 *0과 스페이스 하나를 붙이십시오; 예를 들어: *0 http://someorg.org. 0 다음에 별표가 오면 유효한 dwFlag 번호로 교체됩니다. 자세한 것은 www.microsoft.com에서 InternetOpenUrl을 검색해 보십시오.
  • 1.0.44.07 이전에서, 파일은 가능하면 캐쉬로부터 열람합니다. 이를 피하려면 질의 문자열을 URL 끝에 지정하십시오. 예를 들어: http://www.someorg.org/doc.html?fakeParam=42. 주의: 같은 파일을 자주 내려받는다면, 질의 문자열은 반드시 다르게 해야 합니다.

Proxies: 마이크로소프트 인터넷 익스플로러의 설정에 프록시를 사용하도록 구성되어 있다면 UrlDownloadToFile은 프록시 서버를 사용하여 인터넷에 접근합니다.

FTP 그리고 Gopher: v1.0.48.04+는 FTP와 Gopher URL을 지원합니다. 예를 들어:

UrlDownloadToFile, ftp://example.com/home/My File.zip, C:\My Folder\My File.zip  ; 익명으로 로그인 합니다.
UrlDownloadToFile, ftp://user:pass@example.com:21/home/My File.zip, C:\My Folder\My File.zip  ; 특정 사용자로 로그인 합니다.
UrlDownloadToFile, ftp://user:pass@example.com/My Directory, C:\Dir Listing.html  ; 디렉토리 리스트를 HTML 형식으로 얻습니다.

관련 항목

FileRead, FileCopy

예제

UrlDownloadToFile, http://ahkscript.org/download/1.1/version.txt, C:\AutoHotkey Latest Version.txt
UrlDownloadToFile, http://someorg.org/archive.zip, C:\SomeOrg's Archive.zip
; 예제: 텍스트를 변수에 내려받습니다:
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "http://ahkscript.org/download/1.1/version.txt", true)
whr.Send()
; 위의 'true'를 사용하고 아래의 호출을 사용하여 스크립트에 반응하도록 만듭니다.
whr.WaitForResponse()
version := whr.ResponseText
MsgBox % version

; 예제: 비동기 HTTP 요청을 만듭니다.

req := ComObjCreate("Msxml2.XMLHTTP")
; async를 켜고 요청을 엽니다.
req.open("GET", "http://ahkscript.org/download/1.1/version.txt", true)
; 역호출 함수를 설정합니다 (v1.1.17+).
req.onreadystatechange := Func("Ready")
; 요청을 전송합니다. 완료되면 Ready()가 호출됩니다.
req.send()
/*
; 기다릴 생각이라면 onreadystatechange는 필요가 없습니다.
; async=true로 설정하고 기다리면 내려받기가 되는 동안에도
; 스크립트가 여전히 반응할 수 있습니다.
; 반면에 async=false로 설정하면 스크립트는 반응하지 않습니다.
while req.readyState != 4
    sleep 100
*/
#Persistent

Ready() {
    global req
    if (req.readyState != 4)  ; Not done yet.
        return
    if (req.status == 200 || req.status == 304) ; OK.
        MsgBox % "Latest AutoHotkey version: " req.responseText
    else
        MsgBox 16,, % "Status " req.status
    ExitApp
}


VarSetCapacity()

변수의 가용 능력을 키우거나 그의 메모리를 해제합니다. 보통, 이 명령어는 DllCall과 같이 비 정상적인 상황에서만 필요합니다.

GrantedCapacity := VarSetCapacity(UnquotedVarName [, RequestedCapacity, FillByte])

매개변수

GrantedCapacity

Var가 현재 보유할 수 있는 바이트 개수, RequestedCapacity보다 더 큽니다. VarName이 유효한 변수 이름이 아니면 (문자 그대로의 문자열 또는 숫자이면), 0이 반환됩니다. (아주 희귀하지만) 시스템에 충분한 메모리가 없어서 변경이 불가능하면, 에러 대화상자가 나타나고 현재 가용 능력이 반환됩니다 - 이 행위는 미래 버전에서는 바뀔 수 있습니다.

UnquotedVarName

변수의 이름 (겹따옴표로 둘러 싸지 않음). 예를 들어: VarSetCapacity(MyVar, 1000). Array%i%이나 함수의 ByRef 매개변수와 같이 동적 변수도 될 수 있습니다.

RequestedCapacity

생략하면, 변수의 현재 가용능력이 반환됩니다. 그리고 그의 내용은 변경되지 않습니다. 그렇지 않으면, 현재 변수에 있는 모든 것이 사라집니다 (변수가 비워집니다).

RequestedCapacity에 변수가 조정 후에 보유해야할 바이트 개수를 지정하십시오. 유니코드 문자열에 대하여, 이것은 그 길이의 두 배가 되어야 합니다. RequestedCapacity는 내부의 종료 문자를 포함하지 않습니다. 예를 들어 1로 설정하면 그 변수는 1 바이트에다 그의 종료 문자를 더 보유할 수 있습니다. 주의: 나중에 스크립트가 이 변수에 더 큰 값을 할당하면 자동으로 확장됩니다.

이 함수는 종종 그냥 변수가 최소한의 가용능력을 갖추었는지 확인하기 위하여 호출되기 때문에, 수행성능의 이유로, RequestedCapacity가 0일 때만 그 변수를 축소합니다. 다른 말로, 변수의 가용 능력이 이미 RequestedCapacity보다 크면, 축소되지 않습니다 (그러나 그 변수는 일관성을 위해 여전히 비워집니다).

그러므로, 명시적으로 변수를 축소하려면, 먼저 그의 메모리를 VarSetCapacity(Var, 0)으로 해제한 다음 VarSetCapacity(Var, NewCapacity)을 사용하십시오 -- 또는 그냥 필요하면 0으로부터 자동 확장되도록 그대로 두십시오

수행성능의 이유로, 이전의 가용능력이 64 문자보다 작은 (유니코드 빌드에서는 128 바이트보다 작은) 변수는 해제해도 아무 효과가 없을 수 있습니다. 왜냐하면 그의 메모리가 영구 유형이기 때문입니다. 이 경우, 0이 아니라 현재 가용능력이 반환됩니다.

수행성능의 이유로, 가용 능력이 4096 바이트보다 작은 변수의 메모리는 빈 문자열을 저장해도 해제되지 않습니다 (예, Var := ""). 그렇지만, VarSetCapacity(Var, 0)는 변수를 해제합니다.

v1.0.44.03+에서, -1을 RequestedCapacity에 지정하면 변수의 내부에 저장된 문자열 길이를 현재 내용의 길이로 갱신할 수 있습니다. 변수가 간접적으로 변경되는 경우에 유용합니다. 예를 들어 DllCall()를 통하여 그의 주소를 건네는 경우 유용합니다. 이 모드에서, VarSetCapacity()는 가용능력이 아니라 그 길이를 바이트 단위로 돌려줍니다.

FillByte

이 매개변수는 보통 생략됩니다. 생략되면 목표 변수의 메모리가 초기화되지 않습니다 (대신에, 그 변수는 단순히 위에 기술한 바와 같이 비워집니다). 그렇지 않으면, 0에서 255 사이의 숫자를 지정하십시오. 목표 변수의 메모리 구역이 (그의 현재 가용 능력, RequestedCapacity보다 더 클수 있습니다 매 바이트마다 그 숫자로 채워집니다). 0이 지금까지 가장 흔히 사용되는 값입니다. 이 값은 DllCall 구조와 같이 변수에 날 이진 데이터를 담아야 할 경우에 유용합니다.

논평

DllCall에 기술된 사용법 외에도, 이 함수는 점진적인 결합으로 문자열을 구성할 때 수행성능을 향상시키는 데에도 사용할 수 있습니다. 왜냐하면 그 문자열의 최종 길이가 얼마인지 알고 있다면 여러 자동 크기 변경 부담을 피할 수 있기 때문입니다. 그런 경우 RequestedCapacity는 정확할 필요가 없습니다 가용 능력이 작으면, 수행성능이 더욱 개선됩니다. 그리고 가용 능력이 소진될 때 자동으로 변수가 확장을 시작할 것입니다. 가용 능력이 크면, 메모리가 낭비됩니다. 그러나 잠시일 뿐입니다. 왜냐하면 연산 후에 VarSetCapacity(Var, 0) 또는 Var := ""를 수단으로 모든 메모리를 해제할 수 있기 때문입니다

#MaxMem는 변수가 스스로 행하는 자동 확장만 제한합니다. VarSetCapacity에 영향을 주지 않습니다.

관련 항목

DllCall, #MaxMem, NumPut, NumGet

예제

; MyVar가 작업에 충분한 여유 공간을 확보하고 있는지 확인하여 최적화합니다.
VarSetCapacity(MyVar, 10240000)  ; ~10 MB
Loop
{
    ...
    MyVar = %MyVar%%StringToConcatenate%
    ...
}
; 문자열에 대하여 필요한 버퍼 공간을 계산합니다.
bytes_per_char := A_IsUnicode ? 2 : 1
max_chars := 500
max_bytes := max_chars * bytes_per_char

Loop 2
{
    ; DllCall에 사용할 공간을 할당합니다.
    VarSetCapacity(buf, max_bytes)

    if A_Index = 1
        ; DllCall을 통하여 변수를 간접적으로 변경합니다.
        DllCall("wsprintf", "ptr", &buf, "str", "0x%08x", "uint", 4919)
    else
        ; 길이를 자동으로 갱신하려면 "str"를 사용합니다:
        DllCall("wsprintf", "str", buf, "str", "0x%08x", "uint", 4919)

    ; 왜 길이를 갱신한 필요가 있는지 보여주기 위해 문자열을 결합합니다:
    wrong_str := buf . "<end>"
    wrong_len := StrLen(buf)

    ; 변수의 길이를 갱신합니다.
    VarSetCapacity(buf, -1)

    right_str := buf . "<end>"
    right_len := StrLen(buf)

    MsgBox,
    (
    업데이트 전
      문자열: %wrong_str%
      길이: %wrong_len%

    업데이트 후
      문자열: %right_str%
      길이: %right_len%
    )
}


While-loop

While-회돌이 [v1.0.48+]

지정된 표현식이 거짓으로 평가될 때까지 일련의 명령어들을 반복적으로 실행합니다.

While Expression

매개변수

Expression

유효한 표현식. 예를 들어: while x < y.

논평

표현식은 반복을 하기 전에 각각 한 번씩 평가됩니다. 표현식이 참으로 평가되면 (그 결과가 빈문자열이나 0만 아니면), 회돌이의 몸체가 실행됩니다; 그렇지 않으면, 실행은 회돌이 몸체 다음 줄로 점프합니다.

while-회돌이는 보통 다음에 블록이 따라옵니다. 블록은 회돌이의 몸체를 형성하는 서술문의 집단입니다. 그렇지만, 서술문이 하나만 있는 회돌이는 블록을 요구하지 않습니다 (이런 목적으로 "if"와 그의 "else"는 하나의 서술문으로 간주됩니다).

선택적으로 One True Brace (OTB) 스타일을사용할 수 있습니다. 이 스타일은 줄 아래가 아니라 같은 줄에 여는 괄호를 허용합니다. 예를 들어: while x < y {.

내장 변수 A_Index는 현재 회돌이 횟수가 들어 있습니다. 1을 담고 있으면 처음으로 회돌이의 표현식과 몸체가 실행된 것입니다. 두 번째라면 2가 들어 있습니다; 등등. 안쪽 회돌이가 바깥쪽 회돌이에 둘러 싸여 있다면, 안쪽 회돌이가 우선권을 가집니다. A_Index는 모든 유형의 회돌이 안에서 작동하지만, 0이면 회돌이 바깥에 있는 것입니다.

모든 회돌이와 마찬가지로, Break는 회돌이를 일찍 빠져 나오는 데 사용할 수 있습니다. 또한, Continue는 현재 실행의 나머지를 건너 뛰는 데 사용할 수 있습니다. 그 때마다 A_Index는 1 만큼씩 증가하고 while-회돌이의 표현식이 재평가됩니다. 여전히 참이면, 새로 반복을 시작합니다; 그렇지 않으면 회돌이를 끝냅니다.

전문화된 회돌이: 회돌이는 파일, 폴더, 또는 레지스트리 항목을 자동으로 (한 번에 하나씩) 열람하는 데 사용할 수 있습니다. 자세한 것은 파일-회돌이와 레지스트리-회돌이를 참조하십시오. 게다가, 파일-읽기 회돌이는 파일 전체의 내용을, 한 번에 한 줄씩 처리할 수 있습니다. 마지막으로, 파싱 회돌이는 구분된 문자열 안의 각 필드를 처리할 수 있습니다.

관련 항목

Until, Break, Continue, Blocks, Loop, For-회돌이, 파일-폴더 회돌이, 레지스트리 회돌이, 파일-읽기 회돌이, 파싱 회돌이, If (expression)

예제

; 사용자가 왼버튼을 끄는 동안, ToolTip이 끌기-구역 안에 그 크기를 보여줍니다.

CoordMode, Mouse, Screen

~LButton::
    MouseGetPos, begin_x, begin_y
    while GetKeyState("LButton")
    {
        MouseGetPos, x, y
        ToolTip, % begin_x ", " begin_y "`n" Abs(begin_x-x) " x " Abs(begin_y-y)
        Sleep, 10
    }
    ToolTip
return


WinActivate

지정된 창을 활성화합니다 (가장 앞으로 나오게 합니다).

WinActivate [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

창 제목 또는 목표 창을 식별하는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText이 켜져 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시됩니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외됩니다.

논평

창이 최소화되어 있다면, 그 창을 활성화하기 전에 먼저 자동으로 복구합니다. v1.1.20 이후에서, 창이 이미 활성화되어 있어도 복구합니다.

목표 창을 복구하려는 시도를 60ms 동안 여섯 번 합니다. 그리하여, 보통 WinActivate 다음에 WinWaitActive이나 IfWinNotActive가 따라올 필요가 없습니다.

부합하는 창이 이미 활성화되어 있으면, 그 창이 활성화 상태를 유지합니다. 그 아래의 다른 부합하는 창들을 활성화하지 않습니다. 일반적으로, 여러 창이 부합하면, 최상위 (가장 최근에 사용된) 창이 활성화됩니다. 최하위 (가장 오랫동안 사용되지 않은) 창은 WinActivateBottom을 통하여 활성화할 수 있습니다.

[v1.1.20+]: 활성 창이 숨어 있고 DetectHiddenWindows가 꺼져 있으면, 전혀 부합 대상으로 고려되지 않습니다. 대신에, 보이는 창이 부합하면 그 창이 활성화됩니다.

다른 창을 활성화한 후 곧바로 창이 활성화될 때, 어떤 시스템에서는 태스크 바 버튼이 깜박이기 시작할 것입니다 (OS와 그의 환경 설정에 따라 다름). 이를 피하려면 #WinActivateForce를 사용하십시오.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

알려진 문제: 스크립트가 원격 데스크탑을 통하여 접근중인 컴퓨터 또는 서버 위에서 실행중이라면 , 그 원격 데스크탑 클라이언트가 최소화될 경우 WinActivate가 마비될 수 있습니다. 한 가지 우회책은 창 활성화를 요구하지 않는 명령어를 사용하는 것입니다. 예를 들어 ControlSend 그리고 ControlClick를 사용하십시오. 또다른 우회책은 다른 레지스트리 설정을 로컬/클라이언트 컴퓨터에 적용하는 것입니다:

; HKCU을 HKLM으로 바꾸어 시스템의 모든 사용자에게 영향을 줍니다.
RegWrite REG_DWORD, HKCU, Software\Microsoft\Terminal Server Client
    , RemoteDesktop_SuppressWhenMinimized, 2

관련 항목

WinActivateBottom, #WinActivateForce, SetTitleMatchMode, DetectHiddenWindows, 마지막 발견 창, IfWinExist, IfWinActive, WinWaitActive, WinWait, WinWaitClose, WinClose, GroupActivate, WinSet

예제

IfWinExist, Untitled - Notepad
    WinActivate ; 위에서 발견한 창을 사용합니다
else
    WinActivate, Calculator


WinActivateBottom

WinActivate와 동일하지만 최상단이 아니라 최하단 (가장 오랫동안 비활성 상태에) 부합하는 창을 활성화합니다.

WinActivateBottom [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출). 숨은 텍스트는 DetectHiddenText가 켜져 있어야 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

부합하는 창이 하나 밖에 없다면, WinActivateBottom은 WinActivate와 동일하게 행위합니다.

Window groups은 이 명령어보다 더 고급입니다. 그래서 더 유연한 특징이 필요하면 사용을 고려해 보십시오.

창이 최소화되어 있으면, 자동으로 복구한 다음 활성화합니다.

목표 창을 활성화하기 위해 60ms 동안 여섯 번 시도를 합니다. 그리하여, 보통 이 명령어 다음에 WinWaitActive 명령어가 따라올 필요가 없습니다.

WinActivate와 다르게, 마지막 발견 창은 최하단 창일 경우가 없기 때문에 사용할 수 없습니다. 그러므로, 적어도 매개변수 중 하나는 반드시 비어 있지 않아야 합니다.

또다른 창이 활성화된 후에 곧바로 이어서 창이 활성화되면, 대부분의 시스템에서 태스크 바 버튼이 깜박이기 시작할 것입니다 (OS와 그 환경 설정에 따라 다름) 이를 피하려면, #WinActivateForce를 사용하십시오.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows이 켜져 있어야 탐지됩니다.

관련 항목

WinActivate, #WinActivateForce, SetTitleMatchMode, DetectHiddenWindows, IfWinExist, IfWinActive, WinWaitActive, WinWait, WinWaitClose, GroupActivate

예제

; 이 핫키로 모든 열린 브라우저 창을 예전부터 새로운 순서로 방문할 수 있습니다:
#i::
SetTitleMatchMode, 2
WinActivateBottom, - Microsoft Internet Explorer
return


IfWinActive / IfWinNotActive / WinActive

지정된 창이 존재하는지 그리고 현재 활성화 상태인지 점검합니다 (최전방). 그렇다면, WinActive()는 그의 Unique ID (HWND)를 돌려줍니다.

IfWinActive [, WinTitle, WinText,  ExcludeTitle, ExcludeText]
IfWinNotActive [, WinTitle, WinText, ExcludeTitle, ExcludeText]
UniqueID := WinActive("WinTitle", "WinText", "ExcludeTitle", "ExcludeText")

매개변수

WinTitle

창 제목 또는 목표 창을 식별하는 다른 기준 WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있어야(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시됩니다. 주의: 하위 호환의 문제 때문에, IfWinActive와 IfWinNotActive는 명령어의 이름에 정확하게 부합하면 매개변수를 이 명령어로 이해합니다. 이를 우회하려면, 대신에 WinActive() 함수를 사용하십시오.

ExcludeText

텍스트에 이 값이 있는 창은 제외됩니다.

논평

모든 매개변수가 생략되면, 마지막 발견 창이 사용됩니다.

이 명령어 중 하나라도 활성창이 부합한다는 것을 알게 되면, 마지막 발견 창이 그 활성 창으로 갱신됩니다. 즉, IfWinActive가 참("true")으로 평가되거나 IfWinNotActive가 거짓("false")으로 평가되면, 마지막 발견 창이 갱신됩니다.

함수 WinActive()는 지정한 기준에 부합하는 활성 창의Unique ID (HWND)를 돌려줍니다. 없으면 0을 돌려줍니다. 0이-아닌 모든 숫자는 참("true")으로 간주되므로, 다음 서술문 if WinActive("WinTitle")는 WinTitle이 활성화되어 있으면 참입니다.

활성 창의 유일한 ID를 열람하는 쉬운 방법은 ActiveHwnd := WinExist("A")입니다.

SetWinDelay는 IfWinExist/IfWinActive에 적용되지 않습니다.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows이 켜져 있어야 탐지됩니다.

관련 항목

IfWinExist, SetTitleMatchMode, DetectHiddenWindows, Last Found Window, WinActivate, WinWaitActive, WinWait, WinWaitClose, #IfWinActive/Exist

예제

IfWinActive, Untitled - Notepad
{
    WinMaximize  ; 위에서 IfWinActive가 발견한 노트패드 창을 최대화합니다.
    Send, Some text.{Enter}
    return
}

if WinActive("ahk_class Notepad") or WinActive("ahk_class" . ClassName)  ; "ahk_class"는 뒤에 스페이스가 필요하지 않습니다.
    WinClose  ; 마지막 발견 창을 사용합니다.


WinClose

지정된 창을 닫습니다.

WinClose [, WinTitle, WinText, SecondsToWait, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면 목표 창 텍스트의 부문자열입니다 (Window Spy에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

SecondsToWait

생략되거나 비어 있으면, 전혀 기다리지 않습니다. 0이면 500ms 동안 기다립니다. 그렇지 않으면, 지정 개수의 초 동안 창이 닫히기를 기다립니다 (소수점을 허용하고 표현식도 가능합니다). 창이 그 동안 닫히지 않더라도, 스크립트는 실행을 계속합니다. ErrorLevel은 이 명령어로 설정되지 않습니다. 그래서 창이 닫혔는지 확실하게 알 필요가 있다면 IfWinExist나 WinWaitClose를 사용하십시오. 이 명령어가 기다리는 동안, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드를 기동할 수 있습니다.

ExcludeTitle

제목에 이 값이 있는 창은 무시합니다.

ExcludeText

텍스트에 이 값이 있는 창은 무시합니다.

논평

이 명령어는 창에 닫기 메시지를 전송합니다. 그 결과는 창에 따라 다릅니다 (데이터를 저장하도록 요구할 수 있습니다. 등등.)

부합하는 창이 활성화되어 있다면, 그 아래에 부합하는 어떤 창보다 우선 그 창이 닫힙니다. 일반적으로, 여러 창이 부합하면, 최상위 (가장 최근에 사용된) 창이 닫힙니다.

이 명령어는 부합하는 최상위 창에만 작동합니다. 단, WinTitle이 ahk_group GroupName일 경우는 제외합니다. 이 경우 그룹 안의 모든 창이 영향을 받습니다.

WinClose는 WM_CLOSE 메시지를 목표 창에 보냅니다. 약간 강제적인 방법으로 닫습니다. 다른 방법으로 닫으려면 다음 메시지를 보냅니다. 행위가 다를 수 있습니다. 왜냐하면. Alt-F4를 누르거나 제목 바에서 창의 닫기 버튼을 클릭한 것과 효과가 비슷하기 때문입니다:

PostMessage, 0x112, 0xF060,,, WinTitle, WinText  ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE

WinClose를 통하여 창이 닫히지 않으면, WinKill를 사용하여 강제로 닫을 수 있습니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있어야 탐지됩니다.

관련 항목

WinKill, WinWaitClose, Process, WinActivate, SetTitleMatchMode, DetectHiddenWindows, Last Found Window, IfWinExist, IfWinActive, WinWaitActive, WinWait, GroupActivate

예제

IfWinExist, Untitled - Notepad
    WinClose ; 위에서 발견한 창을 사용합니다
else
    WinClose, Calculator


IfWinExist / IfWinNotExist / WinExist

부합하는 창이 존재하는지 점검합니다. WinExist()는 첫 번째로 부합하는 창의 Unique ID (HWND)를 돌려줍니다.

IfWinExist [, WinTitle, WinText,  ExcludeTitle, ExcludeText]
IfWinNotExist [, WinTitle, WinText, ExcludeTitle, ExcludeText]
UniqueID := WinExist("WinTitle", "WinText", "ExcludeTitle", "ExcludeText")

매개변수

UniqueID

주어진 기준에 부합하는 첫 번째 창의 Unique ID (HWND) (십육진 정수)

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다. 주의: 하위 호환의 문제 때문에, IfWinExist와IfWinNotExist는 명령어의 이름에 정확하게 부합하면 이 매개변수를 명령어로 이해합니다. 이를 우회하려면, 대신에 WinExist() 함수를 사용하십시오.

ExcludeText

텍스트에 이 값이 없는 창은 무시합니다.

논평

모든 매개변수가 생략되면, 마지막 발견 창을 점검하여 여전히 존재하는지 (IfWinNotExist이라면 존재하지 않는지) 알아 봅니다.

이 명령어 중 하나라도 부합하는 창이 있다는 것을 알게 되면, 마지막 발견 창이 그 창으로 갱신됩니다. 즉, IfWinExist가 참으로 평가되거나 IfWinNotExist가 거짓으로 평가되면, 마지막 발견 창이 갱신됩니다.

함수 WinExist()는 첫 번째로 부합하는 창의 Unique ID (HWND)를 (없으면 0) 돌려줍니다. 0-아닌 모든 숫자는 참("true")으로 간주되므로, 다음 서술문 if WinExist("WinTitle")는WinTitle이 존재하면 참입니다.

콘트롤의 HWND를 발견하려면 (Post/SendMessage 또는 DllCall에 사용하기 위해), ControlGet Hwnd 또는 MouseGetPos를 사용하십시오.

SetWinDelay는 IfWinExist/IfWinActive에 적용되지 않습니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

IfWinActive, SetTitleMatchMode, DetectHiddenWindows, 마지막 발견 창, Process, WinActivate, WinWaitActive, WinWait, WinWaitClose, #IfWinActive/Exist

예제

; 예제 1
IfWinExist, Untitled - Notepad
{
    WinActivate  ; 위에서 발견한 창을 자동으로 사용합니다.
    WinMaximize  ; 위와 같습니다
    Send, Some text.{Enter}
    return
}

; 예제 2
IfWinNotExist, Calculator
    return
else
{
    WinActivate  ; 위의 "IfWinNotExist"는 또 "마지막 발견 창"을 갱신해 줍니다.
    WinMove, 40, 40  ; 새로운 위치로 이동합니다.
    return
}

; 예제 3
if WinExist("ahk_class Notepad") or WinExist("ahk_class" . ClassName)
    WinActivate  ; 마지막으로 발견된 창을 사용합니다.

MsgBox % "The active window's ID is " . WinExist("A")

; 예제 4: 다음과 동등합니다: IfWinNotExist, Calculator
If !WinExist("Calculator")
    return


WinGet

지정된 창의 유일한 ID, 프로세스 ID, 프로세스 이름, 또는 그의 콘트롤 목록을 열람합니다. 또한 지정된 기준에 부합하는 모든 창의 목록을 열람합니다.

WinGet, OutputVar [, Cmd, WinTitle, WinText, ExcludeTitle, ExcludeText]

Parameters

OutputVar

Cmd의 결과를 저장할 변수의 이름.

Cmd
아래 리스트 참조.
WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (Window Spy 유틸리티에 노출). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

Cmd는 수행할 연산입니다. 비어 있으면 ID가 기본값입니다. 다음 단어 중 하나가 될 수 있습니다:

ID: 창의 유일 ID 번호 (HWND/핸들)을 열람합니다. 부합하는 창이 없으면, OutputVar는 비워집니다. 함수 WinExist()와 WinActive()도 창의 ID를 열람하는 데 사용할 수 있습니다; 예를 들어, WinExist("A")는 활성 창의 ID를 얻는 가장 빠른 방법입니다. 콘트롤의 HWND를 발견하려면 (Post/SendMessage 또는 DllCall에 사용할 목적으로), ControlGet Hwnd 또는 MouseGetPos를 사용하십시오.

IDLast: 위와 동일하지만 부합하는 창이 여럿이면 가장 마지막/최하위 창의 ID를 열람합니다. 오직 하나만 일치하면, ID와 동일하게 수행합니다. 이 개념은 WinActivateBottom이 사용하는 개념과 비슷합니다.

PID: 창의 프로세스 ID (PID)를 열람합니다.

ProcessName: 창을 소유한 프로세스의 이름을 열람합니다 (예, notepad.exe). 부합하는 창이 없으면, OutputVar는 비워집니다.

ProcessPath [v1.1.01+]: ProcessName과 비슷하지만, 단지 이름이 아니라 프로세스의 전체 경로와 이름을 열람합니다.

Count: 기존 창에서 WinTitle, WinText, ExcludeTitle, 그리고 ExcludeText (없으면 0)에 부합하는 창의 개수를 열람합니다. 시스템의 모든 창을 열람하려면, 네 개의 매개변수를 모두 생략하십시오. 숨은 창은 DetectHiddenWindows이 켜져 있을 경우에만 포함됩니다.

List: 기존 창에서 지정된 WinTitle, WinText, ExcludeTitle, 그리고 ExcludeText에 부합하는 기존의 모든 창의 유일 ID 번호들을 열람합니다. (전체 시스템의 모든 창을 열람하려면, 네 개의 제목/텍스트 매개변수를 모두 생략하십시오). 각 ID 번호는 OutputVar의 이름으로 시작하는 변수에 저장됩니다 (의사-배열을 형성합니다). 반면에 OutputVar 자체에는 열람된 항목의 개수가 설정됩니다 (없으면 0입니다). 예를 들어, OutputVar가 MyArray이고 부합한 창이 두 개 발견되었다면, MyArray1은 첫 번째 창의 ID가 설정되고, MyArray2는 두 번째 창의 ID에 설정됩니다. 창은 (바탕화면에 어떻게 쌓여 있는가에 맞추어) 위에서 아래로 열람됩니다. 숨은 창은 DetectHiddenWindows이 켜져 있을 때만 탐지됩니다. 함수 안에서, 지역적이 아니라 전역적 의사-배열을 생성하려면, 이 명령어를 사용하기 전에 먼저 MyArray를 전역 변수로 선언하십시오 (전역-간주 함수에 대하여 그 반대도 마찬가지입니다). 그렇지만, 흔한 혼란의 근원 때문에, 종종 각 변수를 함수 안에 설정하는 것이 필수적인 경우도 있습니다.

MinMax: 창에 대하여 최소/최대 상태를 열람합니다. 부합하는 창이 없으면 OuputVar는 비워집니다; 그렇지 않으면 다음 숫자 중 하나가 설정됩니다:
-1: 창이 최소 상태입니다 (WinRestore로 복원할 수 있습니다).
1: 창이 최대 상태입니다 (WinRestore로 복원할 수 있습니다).
0: 창이 최대 상태도 아니고 최소 상태도 아닙니다.

ControlList: 창에 있는 모든 콘트롤의 이름을 열람합니다. 부합하는 창이 존재하지 않거나 창에 콘트롤이 없으면, OutputVar는 비워집니다. 그렇지 않으면, Window Spy에 보여지듯이, 각 콘트롤 이름은 그의 클래스 이름과 바로 다음에 연속 번호 (ClassNN)로 구성됩니다.

마지막 항목을 제외하고 각 항목은 라인피드로 끝납니다 (`n). 콘트롤 이름을 하나씩 조사하려면, 아래 예제 섹션에 보여주는 바와 같이 회돌이 파싱을 사용하십시오.

콘트롤은 Z-순서에 따라 정렬됩니다. 보통 창이 지원한다면 TAB 키로 초점을 이동하는 순서와 동일합니다.

현재 마우스 아래에 있는 콘트롤은 MouseGetPos로 열람할 수 있습니다.

ControlListHwnd [v1.0.43.06+]: 위와 같지만 각 콘트롤의 ClassNN이 아니라 창 핸들 (HWND)을 열람합니다.

Transparent: 창의 투명도를 열람합니다 (투명도를 설정하는 방법은 WinSet을 참조하십시오). 다음과 같은 경우 OutputVar이 비워집니다:

  1. OS가 Windows XP보다 구형입니다;
  2. 부합하는 창이 없습니다;
  3. 창에 투명도 레벨이 없습니다;
  4. (OS 행위로 야기된) 기타 조건. 예를 들어 창을 투명하게 만든 이후로 최소화, 복구, 또는 크기가 바뀌었습니다.
그렇지 않으면, 0부터 255 사이의 숫자가 저장됩니다. 0은 보이지 않는 창을 나타내고 255는 완전 불투명 창을 나타냅니다. 예를 들어:

MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin%  ; 마우스 아래의 창이 투명도.

TransColor: 창에서 투명으로 표식이 붙은 색을 열람합니다 (TransColor를 설정하는 법은 WinSet를 참조합니다.). OutputVar는 다음과 같은 경우 비워집니다:

  1. OS가 Windows XP보다 오래되었습니다;
  2. 부합하는 창이 없습니다;
  3. 창에 투명 색이 없습니다; 또는
  4. (OS 행위로 야기된) 기타 조건. 예를 들어 창을 투명하게 만든 이후로 최소화, 복구, 또는 크기가 바뀌었습니다.
그렇지 않으면, 여섯자리 십육진 RGB 색이 저장됩니다. 예, 0x00CC99. 예를 들어:

MouseGetPos,,, MouseWin
WinGet, TransColor, TransColor, ahk_id %MouseWin%  ; 마우스 커서 아래에 있는 창의 TransColor.

Style 또는 ExStyle: 창의 스타일 또는 확장 스타일을 나타내는 8-자리 십육진 수를 열람합니다. 부합하는 창이 없으면, OutputVar는 비워집니다. 다음 예제는 창에 WS_DISABLED 스타일이 있는지 알아봅니다:

WinGet, Style, Style, My Window Title
if (Style & 0x8000000)  ; 0x8000000 is WS_DISABLED.
  ... 창이 비활성 상태입니다. 그래서 적절한 조치를 수행합니다.

다음 예제는 창에 WS_EX_TOPMOST 스타일이 있는지 알아봅니다 (항상-위에):

WinGet, ExStyle, ExStyle, My Window Title
if (ExStyle & 0x8)  ; 0x8 is WS_EX_TOPMOST.
  ... 창이 항상 최상위 상태입니다. 그래서 적절한 조치를 수행합니다.

스타일 목록은 스타일 테이블을 참조하십시오.

논평

창의 ID 번호는 오직 창이 살아 있을 동안에만 유효합니다. 다른 말로, 어플리케이션이 재시작하면, 그의 모든 창은 새 ID 번호를 얻습니다.

이 명령어로 열람된 ID 번호는 숫자이고 (앞에 접두어 "ahk_id"를 포함하지 않음) 그리고 SetFormat의 설정에 상관없이 16진 형식으로 저장됩니다.

마우스 커서 아래에 있는 창의 ID는 MouseGetPos로 열람할 수 있습니다.

ID 번호는 현재 32-비트 부호없는 정수이지만, 앞으로 64-비트가 될 가능성이 있습니다. 그러므로, 이런 값들에 대해 덧셈을 하는 것과 같은 숫치 연산을 수행하는 것은 안전하지 않습니다. 왜냐하면 그런 연산은 입력 문자열을 부호없는 정수가 아니라 부호있는 정수로 해석할 필요가 있기 때문입니다.

창 제목과 텍스트는 대소문자에 민감합니다. 숨은 창은 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

WinGetClass, Process, WinGetTitle, MouseGetPos, ControlGet, ControlFocus, GroupAdd

예제

; 예제 #1: 활성 창을 최대화하고 그의 유일 ID를 보고합니다:
WinGet, active_id, ID, A
WinMaximize, ahk_id %active_id%
MsgBox, 활성 창의 ID는 "%active_id%"입니다.

; 예제 #2: 전체 시스템에서 모든 창을 방문하고 각 창에 대하여 다음 정보를 보여줍니다:
WinGet, id, list,,, Program Manager
Loop, %id%
{
    this_id := id%A_Index%
    WinActivate, ahk_id %this_id%
    WinGetClass, this_class, ahk_id %this_id%
    WinGetTitle, this_title, ahk_id %this_id%
    MsgBox, 4, , Visiting All Windows`n%a_index% of %id%`nahk_id %this_id%`nahk_class %this_class%`n%this_title%`n`nContinue?
    IfMsgBox, NO, break
}

; 예제 #3: ControlList으로부터 콘트롤 이름을 하나씩 추출합니다:
WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
    MsgBox, 4,, Control #%a_index% is "%A_LoopField%". Continue?
    IfMsgBox, No
        break
}

; 예제 #4: 실시간으로 활성 창의 콘트롤 리스트를 보여줍니다:
#Persistent
SetTimer, WatchActiveWindow, 200
return
WatchActiveWindow:
WinGet, ControlList, ControlList, A
ToolTip, %ControlList%
return


WinGetActiveStats

WinGetActiveTitle의 기능과 WinGetPos의 기능을 하나의 명령어로 조합합니다.

WinGetActiveStats, Title, Width, Height, X, Y

매개변수

Title

활성 창의 제목을 저장할 변수의 이름.

Width/Height

활성 창의 너비와 높이를 저장할 변수의 이름.

X, Y

활성 창의 좌상 모서리 X 좌표와 Y 좌표를 저장할 변수의 이름.

논평

부합하는 창이 없으면, 출력 변수는 비워집니다.

이 명령어는 다음 코드와 동등합니다:

WinGetTitle, Title, A
WinGetPos, X, Y, Width, Height, A

활성 창이 숨어 있고 DetectHiddenWindows가 꺼져 있으면 (기본값), WinShow를 제외하고 모든 명령어는 그 활성창을 "보지 못합니다". 이런 저런 이유로 활성 창이 없다면, 이 명령어는 그의 모든 출력 변수들을 비워버립니다.

관련 항목

WinGetPos, WinGetActiveTitle, WinGetTitle, WinGetClass, WinGetText, ControlGetText

예제

WinGetActiveStats, Title, Width, Height, X, Y
MsgBox, "%Title%" 활성 창은 너비가 %Width%이고`, 너비가 %Height%`, 그리고 %X%`,%Y%에 위치합니다.


WinGetActiveTitle

활성창의 제목을 열람합니다.

WinGetActiveTitle, OutputVar

매개변수

OutputVar

활성 창의 제목을 저장할 변수의 이름.

논평

이 명령어는 다음과 동등합니다: WinGetTitle, OutputVar, A.

관련 항목

WinGetPos, WinGetActiveStats, WinGetTitle, WinGetClass, WinGetText, ControlGetText

예제

WinGetActiveTitle, Title
MsgBox, 활성 창의 제목은 "%Title%"입니다.


WinGetClass

지정된 창의 클래스 이름을 열람합니다.

WinGetClass, OutputVar [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

열람된 클래스 이름을 저장할 변수의 이름.

WinTitle

목표 창을 식별할 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창의 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). DetectHiddenText이 켜져 있으면(ON) 숨은 텍스트가 탐지됩니다.

ExcludeTitle

제목에 이 값이 포함되어 있는 창은 제외됩니다.

ExcludeText

텍스트에 이 값이 포함되어 있는 창은 제외됩니다.

논평

클래스 이름만 열람됩니다 (접두어 "ahk_class"는 OutputVar에 포함되지 않습니다).

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows를 켜면 탐지됩니다.

관련 항목

WinGet, WinGetTitle

예제

WinGetClass, class, A
MsgBox, 활성 창의 클래스는 "%class%"입니다.


WinGetPos

지정된 창의 크기와 위치를 열람합니다.

WinGetPos [, X, Y, Width, Height, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

X, Y

목표 창의 좌상 모서리 X 좌표와 Y 좌표를 저장할 이름. 생략하면, 상응하는 값이 저장되지 않습니다.

Width/Height

목표 창의 높이와 너비를 저장할 변수의 이름. 생략하면 상응하는 값이 저장되지 않습니다.

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

부합하는 창이 없으면, 출력 변수는 비워집니다.

WinTitle "프로그램 관리자r"가 사용되면, 이 명령어는 바탕화면의 크기를 열람합니다. 이는 보통 현재 화면 해상도와 같습니다.

최소화된 창은 여전히 크기와 위치가 있습니다. 이 경우 반환된 값은 OS와 환경 구성에 따라 달라질 수 있습니다.

마우스가 현재 선회 중인 창의 이름과 콘트롤을 발견하려면, MouseGetPos를 사용하십시오.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

WinMove, ControlGetPos, WinGetActiveStats, WinGetActiveTitle, WinGetTitle, WinGetText, ControlGetText

예제

WinGetPos, X, Y, Width, Height, Calculator
MsgBox, Calculator is at %X%`,%Y%

WinGetPos, X, Y, , , A  ; "A"는 활성 창의 위치를 얻습니다.
MsgBox, 활성 창의 위치: %X%`,%Y%

IfWinExist, Untitled - Notepad
{
    WinGetPos, Xpos, Ypos  ; 위에서 발견한 창을 사용합니다.
    MsgBox, Notepad is at %Xpos%`,%Ypos%
}


WinGetText

지정된 창으로부터 텍스트를 열람합니다.

WinGetText, OutputVar [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

열람된 텍스트를 저장할 변수의 이름.

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있으면 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패하면 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있었으면 1,. 그렇지 않으면 0이 설정됩니다.

논평

열람된 텍스트는 일반적으로 Window Spy가 그 창에 대하여 보여주는 것과 동일합니다. 그렇지만, DetectHiddenText가 꺼져 있다면, 숨은 텍스트는 OutputVar에 포함되지 않습니다.

각 텍스트 원소는 캐리지 리턴과 라인피드 (CR+LF)로 끝납니다. 스크립트에서는 `r`n로 표기됩니다. 각 줄이나 부문자열을 추출하려면, StringGetPos 그리고 StringMid와 같은 명령어를 사용하십시오. 회돌이 파싱을 사용하면 각 줄이나 단어를 하나씩 조사할 수 있습니다.

열람된 텍스트가 (불완전하게) 잘려 나타나면, 먼저 VarSetCapacity(OutputVar, 55)를 사용한 다음 WinGetText를 시도하십시오 [잘려 나간 텍스트보다 훨씬 더 큰 크기로 55를 교체하십시오]. 어떤 어플리케이션은 WM_GETTEXTLENGTH 메시지에 적절하게 응답하지 않기 때문에, 오토핫키가 출력 변수를 너무 작게 만들어 모든 텍스트가 들어가지 못하기 때문에 필수적으로 이렇게 처리해야 합니다.

열람된 텍스트의 양은 변수의 최대 가용 능력에 제한을 받습니다 (#MaxMem 지시어를 통하여 바꿀 수 있습니다). 결과적으로, 이 명령어는 목표 창에 (예, 큰 문서를 열고 있는 편집기에) 방대한 양의 텍스트가 있다면 방대한 양의 RAM을 사용할 수 있습니다. 이를 피하려면, 창 텍스트의 포인터만 열람하는 것도 가능합니다. 대신에 ControlGetText를 사용하십시오. 어느 경우든, 변수의 메모리는 나중에 아무것도 할당하지 않으면 해제할 수 있습니다. 즉, OutputVar =이면 메모리가 해제됩니다.

창의 모든 콘트롤 목록을 열람하려면, 다음 예제를 따르십시오: WinGet, OutputVar, ControlList, WinTitle

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

ControlGetText, WinGetActiveStats, WinGetActiveTitle, WinGetTitle, WinGetPos, #MaxMem

예제

Run, Calc.exe
WinWait, Calculator
WinGetText, text  ; 위에서 발견한 창을 사용합니다.
MsgBox, The text is:`n%text%


WinGetTitle

지정된 창의 제목을 열람합니다.

WinGetTitle, OutputVar [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

OutputVar

열람한 제목을 저장할 변수의 이름.

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

마우스가 현재 올라 탄 창의 이름을 알려면, MouseGetPos를 사용합니다.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

WinGetActiveStats, WinGetActiveTitle, WinGetClass, WinGet, WinGetText, ControlGetText, WinGetPos

예제

WinGetTitle, Title, A
MsgBox, 활성 창은 "%Title%"입니다.


WinHide

지정된 창을 감춥니다.

WinHide [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

숨은 창을 보여주려면 WinShow를 사용합니다 (DetectHiddenWindows은 On 또는 Off일 수 있습니다).

이 명령어는 최상위에 부합하는 창에만 작동합니다. 단, WinTitle이 ahk_group GroupName인 경우는 제외합니다. 이 경우, 그룹 안의 모든 창이 영향을 받습니다.

태스크바 탐색기는 다음과 같이 보여주거나/감출 수 있습니다:

WinHide ahk_class Shell_TrayWnd
WinShow ahk_class Shell_TrayWnd

관련 항목

WinShow, SetTitleMatchMode, DetectHiddenWindows, 마지막 발견 창, WinSet

예제

Run, notepad.exe
WinWait, Untitled - Notepad
Sleep, 500
WinHide ; 위에서 발견한 창을 사용합니다
Sleep, 1000
WinShow


WinKill

지정된 창을 강제로 닫습니다.

WinKill [, WinTitle, WinText, SecondsToWait, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

SecondsToWait

생략되거나 비어 있으면, 전혀 기다리지 않습니다. 0이면 500ms를 기다리립니다. 그렇지 않으면, 창이 닫히기를 지정된 개수의 초 동안 기다립니다 (소수점을 허용하고 표현식도 가능합니다). 창이 그 기간 안에 닫히지 않더라도, 스크립트는 실행을 계속합니다. ErrorLevel은 이 명령어로 설정되지 않습니다. 그래서 창이 확실하게 닫혔는지 확인할 필요가 있다면 IfWinExist 또는 WinWaitClose를 사용하십시오.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

이 명령어는 먼저 창을 정상적으로 닫으려고 간략하게 시도합니다. 실패하면, 그의 프로세스를 종료하여 그 창을 강제로 닫으려고 시도합니다.

부합한 창이 활성화되어 있다면, 그 창은 그 아래에 부합한 다른 창보다 우선적으로 닫힙니다. 일반적으로, 여러 창이 부합하면, (가장 최근에 사용된) 최상위 창이 닫힙니다.

이 명령어는 최상위에 부합한 창에만 작동합니다. 단, WinTitle이 ahk_group GroupName인 경우는 제외합니다. 이 경우, 그룹 안의 모든 창이 영향을 받습니다.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 텍스트는 DetectHiddenWindows를 켜면 탐지됩니다.

관련 항목

WinClose, WinWaitClose, Process, WinActivate, SetTitleMatchMode, DetectHiddenWindows, Last Found Window, IfWinExist, IfWinActive, WinWaitActive, WinWait, GroupActivate

예제

IfWinExist, Untitled - Notepad
    WinKill ; 위에서 발견한 창을 사용합니다
else
    WinKill, Calculator


WinMaximize

지정된 창을 최대 크기로 확대합니다.

WinMaximize [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

창을 복구하려면 WinRestore를 사용하고 최소화하려면 WinMinimize를 사용합니다.

특정 유형의 창이 WinMaximize에 제대로 응답하지 않으면, 대신에 다음 방법을 사용해 보십시오:

PostMessage, 0x112, 0xF030,,, WinTitle, WinText  ; 0x112 = WM_SYSCOMMAND, 0xF030 = SC_MAXIMIZE

이 명령어는 최상위에 부합하는 창에만 작동합니다. 단, WinTitle이 ahk_group GroupName인 경우는 제외합니다. 이 경우, 그룹 안의 모든 창이 영향을 받습니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 텍스트는 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

WinRestore, WinMinimize

Example

Run, notepad.exe
WinWait, Untitled - Notepad
WinMaximize ; 위에서 발견한 창을 사용합니다

^Up::WinMaximize, A  ; 활성 창을 최대화 할 핫키를 할당합니다.


WinMenuSelectItem

지정된 창의 메뉴 바에 메뉴 항목을 요청합니다.

WinMenuSelectItem, WinTitle, WinText, Menu [, SubMenu1, SubMenu2, SubMenu3, SubMenu4, SubMenu5, SubMenu6, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

Menu

최상위 레벨 메뉴의 이름. 예, File, Edit, View. 메뉴 항목의 위치로 될 수 있습니다. 1&이면 첫 메뉴를 나타내고 2&이면 두 번째 메뉴를 나타냅니다 등등.

SubMenu1

선택할 메뉴 항목의 이름 또는 그의 위치 (위 참조).

SubMenu2

SubMenu1 자체에 메뉴가 포함되어 있으면, 이것이 그 메뉴 항목의 이름 또는 그의 위치입니다.

SubMenu3

위와 동일.

SubMenu4

위와 동일.

SubMenu5

위와 동일.

SubMenu6

위와 동일.

ExcludeTitle

제목에 이 값이 있는 창은 제외됩니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외됩니다.

ErrorLevel

[v1.1.04+] 이 명령어는 실패시 예외를 던질 수 있습니다. 더 자세한 정보는 실행시간 에러를 참조하십시오.

ErrorLevel은 문제가 있으면 1, 문제가 없으면 0이 설정됩니다.

논평

이 명령어가 작동하려면, 목표 창이 활성화되어 있지 않아야 합니다. 그렇지만 창은 최소화 상태가 아니어야 합니다.

이 명령어는 비 표준 메뉴 바를 사용하는 어플과 작동하지 않습니다. 예로는 Microsoft Outlook과 Outlook Express가 있는데, 이들은 메뉴바에 위장한 툴바를 사용합니다. 이런 경우, ControlSend나 PostMessage의 사용을 고려하십시오. 분명히 비-표준 메뉴바를 가진 어플과 상호작용할 수 있을 것입니다.

메뉴 이름 매개변수는 대소문자를 구분하지 않습니다 (즉, File->Save는 file->save와 동일합니다). 그리고 앰퍼센드 (&)를 사용해 메뉴 항목 첫 문자에 밑줄을 그어 표시하는 일은 필요하지 않습니다 (즉, &File은 File과 동일합니다).

메뉴 이름 매개변수는 또한 위치를 지정할 수도 있습니다. 이 방법은 (아마도 실제 텍스트보다 그림이 포함되어 있기 때문에) 텍스트가 없는 메뉴를 지원하기 위해 존재합니다. 위치 1&은 첫 메뉴 항목이고 (예, 첫 File 메뉴), 위치 2&는 두 번째 메뉴 항목입니다 (예, Edit 메뉴) 등등. 메뉴 가름 줄은 메뉴 항목으 위치를 결정하기 위한 목적으로 메뉴 항목 개수에 포함됩니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 텍스트는 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

ControlSend, PostMessage

예제

; 노트패드에서 File->Open이 선택됩니다:
WinMenuSelectItem, Untitled - Notepad, , File, Open

; 위와 동등하지만 이름이 아니라 위치로 선택됩니다:
WinMenuSelectItem, Untitled - Notepad, , 1&, 2&


WinMinimize

지정된 창을 태스크 바에 버튼으로 축소합니다.

WinMinimize [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 있는 창은 제외합니다.

논평

창을 복구하려면 WinRestore나 WinMaximize를 사용하십시오.

특정 유형의 창이 WinMinimize에 올바르게 응답하지 않으면, 대신 다음 방법을 시도하십시오:

PostMessage, 0x112, 0xF020,,, WinTitle, WinText ; 0x112 = WM_SYSCOMMAND, 0xF020 = SC_MINIMIZE

이 명령어는 최상위에 부합하는 창에만 작동합니다. 단, WinTitle이 ahk_group GroupName인 경우는 제외합니다. 이 경우는 그룹 안의 모든 창이 영향을 받습니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 텍스튼 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

WinRestore, WinMaximize, WinMinimizeAll

예제

Run, notepad.exe
WinWait, Untitled - Notepad
WinMinimize ; 위에서 발견한 창을 사용합니다

^Down::WinMinimize, A  ; 활성 창을 최소화 할 핫키를 할당합니다.


WinMinimizeAll / WinMinimizeAllUndo

모든 창을 최소화하거나 환원합니다.

WinMinimizeAll
WinMinimizeAllUndo

대부분의 시스템에서, 이것은 익스플로러의 Win-M 핫키 그리고 Win-D 핫키와 동등합니다.

관련 항목

WinMinimize, GroupAdd

예제

WinMinimizeAll
WinMinimizeAllUndo


WinMove

지정된 창의 위치와 크기를 변경합니다.

WinMove, X, Y
WinMove, WinTitle, WinText, X, Y [, Width, Height, ExcludeTitle, ExcludeText]

매개변수

X, Y

목표창의 새 위치의 좌상 모서리 X와 Y 좌표 (픽셀 단위). 이 값은 표현식일 수 있습니다. 화면의 좌상 픽셀 좌표는 0, 0입니다.

이 매개변수만 주어졌다면, 마지막 발견 창이 목표 창으로 사용됩니다.

그렇지 않으면, X와 Y를 생략할 수 있습니다. 이 경우 현재 위치가 사용됩니다.

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져(ON) 있으면 탐지됩니다.

Width, Height

창의 새 너비와 높이 (픽셀 단위), 이 값은 표현식일 수있습니다. 하나라도 생략되거나 비어 있거나 단어 DEFAULT이면, 해당 차원의 크기는 바뀌지 않습니다.

ExcludeTitle

제목에 이 값이 들어 있는 창은 제외됩니다.

ExcludeText

텍스트에 이 값이 들어 있는 창은 제외됩니다.

논평

Width와 Height가 너무 작다면 (또는 음수라면), 제목 바가 있는 대부분의 창은 일반적으로 112 x 27 픽셀보다 더 작아지지 않습니다 (그렇지만, 어떤 유형의 창은 따로 최소 크기를 가질 수 있습니다). Width와 Height가 너무 크면, 대부분의 창은 바탕화면 크기의 대략 12 픽셀을 넘어가지 않습니다.

x와 y좌표에 음수 값은 허용됩니다. 다중-모니터 시스템을 지원하고 창을 완전히 화면으로부터 멀리 이동시킬 수 있습니다.

WinMove는 최소화된 창을 이동할 수 없지만, 숨은 창은 이동시킬 수 있습니다. 물론 DetectHiddenWindows가 켜져 있어야 합니다.

WinMove의 속도는 SetWinDelay에 영향을 받습니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows이 켜져 있으면 탐지됩니다.

관련 항목

ControlMove, WinGetPos, WinHide, WinMinimize, WinMaximize, WinSet

예제

Run, calc.exe
WinWait, Calculator
WinMove, 0, 0 ; WinWait가 발견한 창을 화면의 좌상 모서리로 이동시킵니다.

SplashTextOn, 400, 300, Clipboard, 클립보드의 내용:`n%clipboard%
WinMove, Clipboard, , 0, 0 ; 스플레시 창을 좌상 모서리로 이동시킵니다.
Msgbox, SplashText를 끝내려면 OK를 누르십시오
SplashTextOff

; 다음 함수는 지정된 창을 화면 가운데에 배치합니다:
CenterWindow(WinTitle)
{
    WinGetPos,,, Width, Height, %WinTitle%
    WinMove, %WinTitle%,, (A_ScreenWidth/2)-(Width/2), (A_ScreenHeight/2)-(Height/2)
}


WinRestore

지정된 창이 최소 또는 최대 상태에 있으면 원래대로 복구합니다.

WinRestore [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 제목 창 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 포함되어 있는 창은 제외됩니다.

ExcludeText

텍스트에 이 값이 포함되어 있는 창은 제외됩니다.

논평

특정 유형의 창이 올바르게 WinRestore에 응답하지 않으면, 대신 다음을 시도해 보십시오:

PostMessage, 0x112, 0xF120,,, WinTitle, WinText  ; 0x112 = WM_SYSCOMMAND, 0xF120 = SC_RESTORE

이 명령어는 최상위 창이 부합할 경우에만 작동합니다. WinTitle이 ahk_group GroupName인 경우는 제외합니다. 이 경우 그룹 안의 모든 창이 영향을 받습니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 텍스트는 DetectHiddenWindows이 켜져 있으면 탐지됩니다.

관련 항목

WinMinimize, WinMaximize

예제

WinRestore, Untitled - Notepad


WinSet

지정된 창을 다양하게 변경합니다. 예를 들어 "항상 위에" 그리고 투명도.

WinSet, Attribute, Value [, WinTitle, WinText,  ExcludeTitle, ExcludeText]

매개변수

Attribute, Value

아래 리스트를 참조합니다.

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 들어 있으면 제외됩니다.

ExcludeText

텍스트에 이 값이 들어 있으면 제외됩니다.

Attribute, Value

AlwaysOnTop, [On|Off|Toggle]: 창을 다른 모든 창보다 위에 있도록 만듭니다. ON으로 켜고 OFF로 끕니다. 또는 TOGGLE을 사용하면 반대 상태로 현재 상태를 설정할 수 있습니다. 생략하면, 기본값은 TOGGLE입니다. 단어 Topmost를 AlwaysOnTop 대신 사용할 수 있습니다.

Bottom: 창을 스택 하단으로 보냅니다; 즉, 모든 창의 아래로 보냅니다. Alt-Escape를 누른 것과 효과가 비슷합니다. 예를 들어: WinSet, Bottom,, WinTitle.

Top: 창을 명시적으로 활성화하지 않고 스택 상단으로 올립니다. 그렇지만, 시스템의 기본 설정 때문에 아마도 대부분의 경우 활성화될 것입니다. 게다가, 이 명령어는 운영 체제의 보호 때문에 아무 효과가 없을 수 있습니다. 운영체제는 초점을 훔치려고 시도하는 어플리케이션으로부터 사용자를 보호합니다 ( 어떤 유형이 창이 현재 활성화되어 있는가 그리고 사용자가 어떤 일을 하는가와 같은 여러 요인에 따라 달라질 수 있습니다). 한 가지 가능한 우회책은 창을 잠시 AlwaysOnTop으로 만든 다음, AlwaysOnTop을 끄는 것입니다.

Disable 또는 Enable: 창을 켜거나 끕니다. 창이 꺼지면 사용자는 그의 콘트롤과 상호작용을 할 수 없고 창도 이동할 수 없습니다. 게다가, 꺼진 창은 알트-탭 리스트에서도 빠집니다.

Redraw: 창의 겉모습/내용을 갱신하려고 시도합니다. OS에게 창이 사각 구역을 다시 그릴 필요가 있다고 알려줍니다. 이 방법이 특정한 창에 작동하지 않으면, WinMove를 시도해 보십시오. 그 마저도 작동하지 않으면, 다음을 시도해 보십시오:

WinHide, WinTitle
WinShow, WinTitle

Style, N 또는 ExStyle, N: 창의 스타일 또는 확장 스타일을 변경합니다. N의 첫 문자가 플러스 또는 마이너스 사인이면, N에서 스타일이 제거되거나 추가됩니다. 첫 문자가 캐럿 (^)이면, N에서 스타일은 각각 반대 상태로 토글됩니다. 첫 문자가 숫자이면, 창의 스타일은 완전히 덮어씌여집니다; 즉, N이 됩니다.

ErrorLevel은 실패시 1 그리고 성공시 0이 설정됩니다. 목표 창이 발견되지 않으면 또는 스타일 적용을 허용하지 않으면 실패가 일어납니다.

어떤 스타일을 보이는 창에 적용하고 나면, 그 창을 다시 그릴 필요가 있습니다. WinSet Redraw를 사용합니다 (아래 참조). 마지막으로, 스타일 테이블에 흔히 사용되는 스타일 번호가 나열되어 있습니다. 예를 들어:

WinSet, Style, -0xC00000, A  ; 활성 창의 제목 바를 제거합니다 (WS_CAPTION).
WinSet, ExStyle, ^0x80, WinTitle  ; WS_EX_TOOLWINDOW 속성을 토글합니다. 알트-탭 리스트로부터 창이 제거되거나/추가됩니다.

WinSet, Region [, Options, WinTitle, ...]

창의 모습을 지정한 사각형, 타원 또는 다각형으로 변경합니다. Options 매개변수가 비어 있으면, 그 창은 원래의/기본 디스플레이 구역으로 복구됩니다. 그렇지 않으면, 다음 옵션 중 하나 이상을 조합해 지정할 수 있습니다. 각 옵션은 다음 옵션과 스페이스(들)로 구분합니다:

Wn: 사각형이나 타원의 너비. 예를 들어: w200.
Hn: 사각형이나 타원의 높이. 예를 들어: h300.
X-Y: 각각 X/Y 좌표쌍입니다. 예를 들어, 200-0는 200을 X 좌표에 그리고 0을 Y 좌표에 사용합니다.
E: 사각형이 아니라 타원으로 만듭니다. 이 옵션은 와 H 옵션이 존재할 경우에만 유효합니다.
R[w-h]: 둥근 모서리를 가진 사각형을 만듭니다. 예를 들어R30-30은 각 모서리에 30x30 타원을 사용합니다. w-h를 생략하면, 30-30이 사용됩니다. R은 W와 H 옵션이 존재할 경우에만 유효합니다.

사각형 또는 타원: W와 H 옵션이 존재하면, 새로운 디스플레이 구역이 사각형이 됩니다. 이 사각형의 좌상 모서리는 X-Y 좌표의 (유일한) 첫 번째 쌍으로 결정됩니다. 그렇지만, E 옵션도 존재하면, 그 디스플레이 구역은 사각형이 아니라 타원이 됩니다. 예를 들어: WinSet, Region, 50-0 W200 H250 E, WinTitle.

다각형: W와 H 옵션이 없으면, 새 디스플레이 구역은 다각형이 됩니다. 여러 쌍의 X-Y 좌표에 의해 결정됩니다 (각 좌표 쌍은 창 안의 좌상 모서리로부터 상대적인 점입니다.). 예를 들어, 세 쌍의 좌표가 지정되면, 그 새 디스플레이 구역은 대부분의 경우 세모가 됩니다. 좌표 쌍의 순서는 서로와 관련하여 종종 중요한 경우가 있습니다. 게다가, 단어 Wind가 Options 안에 존재할 수 있습니다. 이 경우 다각형의 범위를 결정하기 위해 alternating 방법 대신에 winding 방법을 사용합니다.

ErrorLevel은 실패시 1, 성공시 0이 설정됩니다. 실패가 일어나는 경우는:

  1. 목표 창이 존재하지 않는다;
  2. 하나 이상의 Options 옵션이 무효하다;
  3. 2000 쌍이 넘게 좌표를 지정했다;
  4. 지정된 범위가 무효하거나 목표 창에 적용할 수 없다.

이 페이지의 아래에서 이 명령어를 사용하는 방법에 관한 예제를 참조하십시오.

WinSet, Transparent, N, WinTitle

창을 반-투명하게 만듭니다. N에 0부터 255 사이의 숫자를 지정하면 투명도를 조절할 수 있습니다: 0이면 창이 보이지 않고 255이면 완전 불투명하게 됩니다. 투명도는 완전히 끌 수 있습니다. 창에 단어 OFF를 지정하면 됩니다. 이것은 255를 지정하는 것과는 다릅니다. 왜냐하면 수행성능을 향상시키고 시스템 자원을 절약하기 때문입니다.

Transparent 그리고 TransColor에 대하여 알려진 한계:

  • 캡션(타이틀바)가 없고 always-on-top 특성이 없는 창에는 효과가 없습니다. GUI 창에 대하여, 이 문제는 창을 투명하게 만든 다음에 캡션을 제거하면 해결할 수 있습니다. 대안으로, 다음 특성들은 투명 효과를 허용합니다: Gui -Caption +ToolWindow.
  • "Transparent"를 끄기 전에 255로 설정하면 창이 다시 그려져 검정색 배경화면이 보여지는 문제를 피할 수 있습니다. 창이 여전히 올바르게 다시 그려지는 데 실패하면, 가능한 우회책은 Redraw를 참조하십시오.
  • 창에서 기존의 TransColor를 변경하려면, 변경하기 전에 먼저 투명효과를 끌 필요가 있습니다.

팁: 태스크 바를 투명하게 만들려면 WinSet, Transparent, 150, ahk_class Shell_TrayWnd을 사용하십시오. 비슷하게, 시작 메뉴를 투명하게 만들려면, 다음 예제를 따르십시오:

DetectHiddenWindows, on
WinSet, Transparent, 150, ahk_class BaseBar  ; 시작 메뉴의 부메뉴도 투명하게 만들려면, 아래의 스크립트도 포함하십시오.

전체 시스템에서 선택된 모든 메뉴를 투명하게 하려면, 다음과 같은 스크립트를 항상 실행되도록 유지합니다. 이런 스크립트는 자신의 메뉴는 투명하게 만들지 못하지만 다른 스크립트의 메뉴는 투명하게 만들 수 있습니다:

#Persistent
SetTimer, WatchForMenu, 5
return  ; 자동 실행 섹션의 끝입니다.

WatchForMenu:
DetectHiddenWindows, on  ; 메뉴의 탐지를 곧 허용합니다.
IfWinExist, ahk_class #32768
    WinSet, Transparent, 150  ; 윗 줄에서 발견된 창을 사용합니다.
return

WinSet, TransColor, Color [N], WinTitle

선택된 색깔의 모든 픽셀을 목표 창에서 보이지 않게 만듭니다. 그러면 창의 내용 뒤를 통과해 볼수 있습니다. 사용자가 보이지 않는 픽셀을 클릭하면, 그 클릭은 창 뒤로 "뚫고 전달됩니다". Color에는 컬러 이름 또는 RGB 값을 지정합니다 (색상 차트를 참고하시거나 아니면 RGB 모드로 PixelGetColor를 사용하십시오). 창에서 보이는 부분을 부분적으로 투명하게 만들려면, 스페이스 (쉼표 안됨) 다음에 투명도 (0-255)를 지정하면 됩니다. 예를 들어: WinSet, TransColor, EEAA99 150, WinTitle.

TransColor는 종종 화면-위-그림 그리고 기타 시각 효과를 얻기 위해 사용됩니다. 화면-위-그림 예제는 Gui 페이지의 하단에 보여줍니다.

단어 OFF를 지정하면 창에 완전히 투명 효과를 끌 수 있습니다. 다음 두 코드는 모두 기능상 동등합니다:

WinSet, Transparent, Off, WinTitle
WinSet, TransColor, Off, WinTitle

알려진 한계: 위의 리스트를 참조하십시오.

논평

ErrorLevel은 위에 제시된 경우를 제외하고 이 명령어로 바뀌지 않습니다.

투명 효과는 Windows 2000/XP 이상이면 지원하지만, 창의 현재 투명도 설정을 열람하는 것은 (WinGet을 통하여) Windows XP 이상에서만 가능합니다.

스크립트의 SplashText 창은 다음을 통하여 비-AlwaysOnTop으로 만들 수 있습니다:

WinSet, AlwaysOnTop, Off, My Splash Window Title

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 창은 DetectHiddenWindows이 켜져 있으면 탐지됩니다.

관련 항목

WinGet, WinHide, WinSetTitle, WinMove, WinActivate, Control

예제

WinSet, Transparent, 200, Untitled - Notepad ; 창을 약간 투명하게 만듭니다.
WinSet, TransColor, White, Untitled - Notepad ; 모든 하얀 픽셀을 보지이 않게 만듭니다.
WinSet, AlwaysOnTop, toggle, Calculator ; 계산기의 always-on-top 상태를 토글합니다.

; 더 긴 예제:
; 다음은 "Transparent"와 "TransColor"의 효과를 보여주는 핫키들입니다.
;  주의: 핫 키중 하나를 눌렀는데 마우스 커서가
; TransColor의 결과로 보이지 않는 픽셀 위를 선회하고 있다면
; 그 픽셀 아래에 보이는 창이 대신 작동할 것입니다!  또한,
; Win+G는 Windows XP에만 효과가 있습니다.
; 왜냐하면 투명도 설정의 열람은 Windows 2000에서 지원되지 않기 때문입니다:

#t::  ; Win+T를 눌러 마우스 커서 아래의 컬러를 보이지 않게 만듭니다.
MouseGetPos, MouseX, MouseY, MouseWin
PixelGetColor, MouseRGB, %MouseX%, %MouseY%, RGB
; 기존의 투명 효과를 먼저 꺼야할 필요가 있어 보입니다:
WinSet, TransColor, Off, ahk_id %MouseWin%
WinSet, TransColor, %MouseRGB% 220, ahk_id %MouseWin%
return

#o::  ; Win+O를 눌러 마우스 아래의 창에 투명 효과를 끕니다.
MouseGetPos,,, MouseWin
WinSet, TransColor, Off, ahk_id %MouseWin%
return

#g::  ; Win+G를 눌러 마우스 아래에 있는 창의 현재 설정을 보여줍니다.
MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin%
WinGet, TransColor, TransColor, ahk_id %MouseWin%
ToolTip Translucency:`t%Transparent%`nTransColor:`t%TransColor%
return

; "WinSet Region" 예제:
WinSet, Region, 50-0 W200 H250, WinTitle  ; 창에서 이 사각형 밖에 있는 모든 부분을 보이지 않게 만듭니다.
WinSet, Region, 50-0 W200 H250 R40-40, WinTitle  ; 위와 같지만 모서리를 40x40으로 둥글게 만듭니다.
WinSet, Region, 50-0 W200 H250 E, WinTitle  ; 사각형 대신 타원형.
WinSet, Region, 50-0 250-0 150-250, WinTitle  ; 정점이 아래를 가리키는 삼각형.
WinSet, Region,, WinTitle ; 창을 원래/기본 디스플레이 구역으로 복구합니다.

; 다음은 좀 복잡한 구역입니다. 창 안에 뚫려 보이는 사각형을 만듭니다.
; 아래에 두 개의 사각형을 지정합니다: 바깥과 안쪽.  각 사각형은 5개의 X/Y 좌표 쌍으로 구성됩니다.
; 왜냐하면 첫 쌍은 끝에 반복되어 각 사각형을 "닫기" 때문입니다.
WinSet, Region, 0-0 300-0 300-300 0-300 0-0   100-100 200-100 200-200 100-200 100-100, WinTitle


WinSetTitle

지정된 창의 제목을 변경합니다.

WinSetTitle, NewTitle
WinSetTitle, WinTitle, WinText, NewTitle [, ExcludeTitle, ExcludeText]

매개변수

NewTitle

창에 대한 새 제목. 이 매개변수만 주어지면, 마지막 발견 창이 사용됩니다.

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

ExcludeTitle

제목에 이 값이 포함되어 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 포함되어 있는 창은 제외합니다.

논평

창 제목을 변경하더라도 잠시일 뿐입니다. 창을 소유한 어플리케이션이 자주 창 제목을 바꿀 수 있습니다.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows를 켜면 탐지할 수 있습니다.

관련 항목

WinMove, WinGetActiveStats, WinGetActiveTitle, WinGetText, ControlGetText, WinGetPos, WinSet

예제

WinSetTitle, Untitled - Notepad, , 새 제목입니다

; 대안:
Run, notepad.exe
WinWaitActive, Untitled - Notepad
WinSetTitle, This is a new title  ; 위에서 WinWaitActive가 발견한 창을 사용합니다.


WinShow

지정된 창을 다시 보여줍니다.

WinShow [, WinTitle, WinText, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 다른 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 활성화(ON)되어 있으면 탐지됩니다.

ExcludeTitle

제목에 이 값이 들어 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 들어 있는 창은 제외합니다.

논평

기본적으로, WinShow는 언제나 숨은 창을 탐지할 수 있는 유일한 명령어입니다. 다른 명령어들은 DetectHiddenWindows가 켜져 있을 경우에만 숨은 창을 탐지할 수 있습니다.

이 명령어는 최상위 창이 부합하는 경우에만 작동합니다. 단, WinTitle이 ahk_group GroupName일 경우는 제외합니다. 이 경우 그룹 안의 모든 창이 영향을 받습니다.

관련 항목

WinHide, SetTitleMatchMode, DetectHiddenWindows, 마지막 발견 창

예제

Run, notepad.exe
WinWait, Untitled - Notepad
Sleep, 500
WinHide  ; 매개변수가 생략되었기 때문에, 위에서 발견한 창을 사용합니다.
Sleep, 1000
WinShow


WinWait

지정된 창이 존재할 때까지 기다립니다.

WinWait [, WinTitle, WinText, Seconds, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목 또는 기타 기준. WinTitle 참조.

WinTitle는 WinText, ExcludeTitle, 또는 ExcludeText이 존해할 때만 비어 있을 수 있습니다.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉돈 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 켜져(ON) 있으면 탐지됩니다.

Seconds

시간 제한까지 기다릴 초의 개수 그리고 ErrorLevel을 1로 설정. 빈 채로 두면 무한정 기다립니다. 0을 설정하면 0.5를 설정한 것과 같습니다. 이 매개변수는 표현식일 수 있습니다.

ExcludeTitle

제목에 이 값이 들어 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 들어 있는 창은 제외합니다.

ErrorLevel

ErrorLevel은 이 명령어가 시간 제한에 걸리면 1, 그렇지 않으면 0이 설정됩니다.

논평

부합한 창이 존재하면, 명령어는 촉발을 위해 Seconds 초를 기다리지 않습니다. 대신에, 즉시 ErrorLevel에 0을 설정하고, 마지막 발견 창을 갱신하며, 그리고 스크립트는 실행을 계속합니다.

명령어가 대기 상태에 있는 동안, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드를 기동할 수 있습니다.

이 명령어의 매개변수에 사용된 변수의 내용을 또다른 쓰레드가 변경하더라도, 이 명령어는 그 변경을 보지 못합니다 -- 계속해서 처음 대기를 시작할 때 변수에 존재하던 원래 제목과 텍스트를 사용할 것입니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 텍스트는 DetectHiddenWindows를 켜면 탐지됩니다.

관련 항목

WinWaitActive, WinWaitClose, IfWinExist, IfWinActive, Process, SetTitleMatchMode, DetectHiddenWindows

예제

Run, notepad.exe
WinWait, Untitled - Notepad, , 3
if ErrorLevel
{
    MsgBox, WinWait timed out.
    return
}
else
    WinMinimize  ; WinWait가 발견한 창을 최소화합니다.


WinWaitActive / WinWaitNotActive

지정된 창이 활성화되거나 비활성화될 때까지 기다립니다.

WinWaitActive [, WinTitle, WinText, Seconds, ExcludeTitle, ExcludeText]
WinWaitNotActive [, WinTitle, WinText, Seconds, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별하는 창 제목이나 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText이 켜져(ON) 있으면 탐지됩니다.

Seconds

시간제한 까지 기다릴 초의 개수 그리고 ErrorLevel을 1로 설정. 빈 채로 두면 무한정 대기합니다. 0을 지정하면 0.5를 지정한 것과 동일합니다. 이 매개변수는 표현식이 가능합니다.

ExcludeTitle

제목에 이 값이 들어 있는 창은 제외합니다.

ExcludeText

텍스트에 이 값이 들어 있는 창은 제외합니다.

ErrorLevel

ErrorLevel은 명령어가 시간제한에 걸리면 1로 설정되고 그렇지 않으면 0으로 설정됩니다.

논평

부합하는 창이 명령어의 기대를 만족하면, 그 명령어는 이제 촉발을 위해 Seconds 초를 기다리지 않습니다. 대신에, 즉시 ErrorLevel에 0을 설정하고 스크립트는 실행을 계속합니다.

명령어가 시작할 때 기대를 만족하는 창이 활성화되면 WinWaitActive와 WinWaitNotActive 모두 마지막으로 발견된 창을 갱신합니다.

명령어가 대기 상태에 있는 동안, 핫키, 맞춤 메뉴 항목, 또는 타이머를 통하여 새 쓰레드를 기동할 수 있습니다.

이 명령어의 매개변수로 사용된 변수의 내용을 또다른 쓰레드가 변경하더라도, 이 명령어는 그 변경을 보지 못합니다 -- 명령어가 처음 대기를 시작할 때의 변수에 존재하는 원래 텍스트와 제목을 계속 사용합니다.

창 제목과 텍스트는 대소문자를 구별합니다. 숨은 창은 DetectHiddenWindows를 켜면 탐지됩니다.

관련 항목

WinWait, WinWaitClose, IfWinExist, IfWinActive, SetTitleMatchMode, DetectHiddenWindows

예제

Run, notepad.exe
WinWaitActive, Untitled - Notepad, , 2
if ErrorLevel
{
    MsgBox, WinWait timed out.
    return
}
else
    WinMinimize  ; WinWaitActive가 발견한 창을 최소화합니다.


WinWaitClose

지정된 창이 존재하지 않을 때까지 기다립니다.

WinWaitClose [, WinTitle, WinText, Seconds, ExcludeTitle, ExcludeText]

매개변수

WinTitle

목표 창을 식별할 수 있는 창 제목 또는 기타 기준. WinTitle 참조.

WinText

존재하면, 이 매개변수는 목표 창의 텍스트의 부문자열입니다 (동봉된 Window Spy 유틸리티에 노출됨). 숨은 텍스트는 DetectHiddenText가 켜져 있으면(ON) 탐지됩니다.

Seconds

시간 제한까지 기다릴 초의 개수 그리고 ErrorLevel을 1로 설정합니다. 빈 채로 두면 무한정 기다립니다. 0으로 설정하면 0.5를 지정한 것과 같습니다. 이 매개변수는 표현식이 가능합니다.

ExcludeTitle

제목에 이 값을 가진 창은 제외됩니다.

ExcludeText

텍스트에 이 값을 가진 창은 제외됩니다.

ErrorLevel

명령어가 시간 제한에 걸리면 ErrorLevel은 1에 설정됩니다. 그렇지 않으면 0이 설정됩니다.

논평

지정된 창의 실체가 존재하지 않을 때마다, 이 명령어는 Seconds 동안 시간 제한을 기다리지 않습니다. 대신에, 즉시 ErrorLevel에 0을 설정하고 스크립트는 실행을 계속합니다.

이 명령어가 대기 상태에 있다면, hotkey, custom menu item, 또는 timer를 통하여 새 쓰레드를 기동할 수 있습니다.

또다른 쓰레드가 이 명령어의 매개변수에 사용된 변수의 내용을 변경하더라도, 이 명령어는 변경된 것을 알지 못합니다 -- 계속해서 원래 이 명령어가 처음 기다리기 시작할 때의 변수에 존재하는 제목과 텍스트를 사용할 것입니다.

창 제목과 텍스트는 대소문자를 구분합니다. 숨은 텍스트는 DetectHiddenWindows가 켜져 있으면 탐지됩니다.

관련 항목

WinClose, WinWait, WinWaitActive, IfWinExist, IfWinActive, Process, SetTitleMatchMode, DetectHiddenWindows

예제

Run, notepad.exe
WinWait, Untitled - Notepad
WinWaitClose  ; WinWait가 발견한 창이 닫히기를 기다립니다.
MsgBox, 노트패드가 이제 닫혔습니다.


AutoHotkey Acknowledgements

감사의 말

이미 언급한 AutoIt 저자들 외에도 많은 분들이 수고해 주셨습니다:

Robert Yaklin: 적극적으로 버그를 솎아내 주셨고, 훌륭한 설치기의 초안을 작성해 주셨으며, 뿐만 아니라 명령어가 어떻게 작동해야 하는가에 관하여 조언을 해 주셨습니다:)

Jason Payam Ahdoot: 부동 소수점 수를 기술하고 제안해 주셨습니다.

Jay D. Novak: Send 명령어, Capslock, 그리고 핫키 수식자와 관련하여 Win9x 문제를 발견하여 주셨습니다; 그리고 고맙게도 그의 풍성한 코드를 공유해 주셨고 핫키와 핫스트링 그리고 갈고리 사용법과 타이핑 속도 개선에 대한 지혜를 나누어 주셨습니다.

Rajat: 원래의 AHK 아이콘을 멋진 아이콘으로 교체해 주셨습니다; 멋진 제품 로고를 제공해 주셨습니다; TextPad를 위한 텍스트 구문을 재단하여 주셨습니다; 레지스트리 명령어와 AutoIt v2 호환성에 관련된 버그를 발견하여 주셨습니다; SmartGUI Creator를 만들어 주셨습니다; 기타 등등 많은 공헌을 하여 주셨습니다.

Thaddeus Beck (Beardboy): NT4를 테스트해 GetKeyState와 Send 명령어를 교정해 주셨습니다; 포럼에 많은 도움을 주셨습니다; 그리고 많은 제안과 버그 보고를 하여 주셨습니다.

Gregory F. Hogg of Hogg's Software: SysGet 명령어에 다중 모니터를 위한 소스 코드를 작성하여 주셨습니다.

Aurelian Maga: ImageSearch와 더 빠른 PixelSearch의 소스 코드를 작성하여 주셨습니다.

Joost Mulders: 표현식의 바탕이 되는 소스 코드를 제공하여 주셨습니다.

Laszlo Hars: 데이터 구조와 알고리즘에 관한 조언을 하여 주셨습니다. 배열과 동적 변수의 속도를 극적으로 높이는데 도움이 되었습니다.

Marcus Sonntag (Ultra): DllCall을 연구, 디자인, 코딩, 그리고 테스트해 주셨습니다.

Gena Shimanovich: 디버깅과 코딩 지원을 하여 주셨습니다; 앞으로 미래의 특징이 기반할 수 있도록 고급의 프로토타입 스크립트를 제공하여 주셨습니다.

Eric Morin (numEric): 수학에 관하여 조언하여 주셨습니다; OnMessage, 부동 소수점 수 계산, 그리고 마우스 이동과 같은 영역에 빠르게 디버깅을 하여 주셨습니다; 그리고 전체적인 품질을 향상시켜 주셨습니다.

Philip Hazel: Perl-호환의 정규 표현식 (PCRE)을 제공하셨습니다.

Titan/polyethene: autohotkey.net에 공동체 호스팅을 제공하여 주셨고, 많은 유용한 스크립트와 라이브러리를 만들어 주셨으며, 그리고 자바스크립트로 포럼에 코드 주석에 색깔을 입혀 주시는 등 많은 공헌을 하여 주셨습니다.

Philippe Lhoste (PhiLho): 적극적으로 포럼에 중용을 지키고 지원하여 주셨습니다. RegEx에 조언과 테스트, 구문과 디자인 아이디어 그리고 기타 등등을 공헌하여 주셨습니다.

John Biederman: 문서의 모습과 인체 공학을 크게 개선하여 주셨습니다.

Jonathan Rennison (JGR): RegisterCallback()를 개발하여 주셨고, 고마운 조언을 해주셨습니다.

Steve Gray (Lexikos): 동적인 함수 호출과 기타 새로운 특징들을 개발해 주셨습니다; 버그를 분석하고 고쳐주셨습니다; 그리고 포롬을 방문하는 수 많은 사람들에게 귀중한 지원과 조언을 제공해 주셨습니다.

AutoHotkey_L:

jackeiku: Unicode 개발과 기타 새로운 특징의 개발을 지원해 주셨습니다.

fincs: 고유의 64-비트 지원과 try/catch/throw를 개발, 그리고 구형 컴파일러를 신형으로 작성해 주셨고, 버그를 분석하고 수정해 주셨습니다.

Sean: 내장 COM 기능을 개발하고 COM에 대한 귀중한 통찰을 제공하여 주셨습니다.

TheGood: 설치 스크립트를 적용하고 문서를 병합해 주셨습니다.

ac: #Warn을 개발해 주셨습니다.

Russell Davis: A_PriorKey, ahk_path (WinTitle 매개변수에서 ahk_exe가 의존), #InputLevel 그리고 SendLevel 를 개발해 주셨습니다.

Christian Sander: SysLink 콘트롤 개발을 지원해 주셨습니다.

그 밖에 버그를 보고해 주시고 제안을 해 주신 모든 공헌자 여러분께 감사의 말씀을 전합니다: 고맙습니다!


Arrays

배열

연관 배열 [AHK_L 31+]

Object()를 호출하면 자기 충족적 연관 배열을 생성할 수 있습니다. 예를 들어:

; 배열을 생성합니다. 최초는 비어 있습니다:
Array := Object()

; 배열에 씁니다:
Loop, Read, C:\Guest List.txt ; 이 회돌이는 파일로부터 각 줄을 한 번에 하나씩 열람합니다.
{
    Array.Insert(A_LoopReadLine) ; 이 줄을 배열에 추가합니다.
}

; 배열로부터 읽습니다:
; Loop % Array.MaxIndex()   ; 좀 전통적인 접근법.
for index, element in Array ; 대부분의 경우 권장하는 접근법.
{
    ; "Loop"를 사용하면, 인덱스는 1 부터 배열의 원소의 개수까지.
    ; 연속적인 숫자가 되어야 합니다 (또는 회돌이 안에서 계산되어야 합니다).
    ; MsgBox % "Element number " . A_Index . " is " . Array[A_Index]

    ; "for"를 사용하면, 인덱스 (또는 "키")와 그에 연관된 값이 제공됩니다
    ; 그리고 인덱스는 선택에 따라 *어떤 값이든* 될 수 있습니다.
    MsgBox % "Element number " . index . " is " . element
}

이 정도는 객체가 제공하는 기능의 일부만 보여줄 뿐입니다 . 항목을 설정, 열람, 삽입, 제거 그리고 열거할 수 있습니다. 문자열과 객체는 숫자와 더불어 키로 사용할 수 있습니다. 객체는 값으로 다른 객체에 저장하고 함수의 매개변수 또는 반환 값으로 건넬 수 있습니다. 객체는 또 새로운 기능으로 확장할 수 있습니다.

Insert()와 열거자는 각자 자신의 사용법이 있지만, 어떤 사용자는 전통적인 접근법을 더 쉽게 생각합니다:

  ; 각 배열은 사용하기 전에 초기화해야 합니다:
  Array := Object()

; Array%j% := A_LoopField
  Array[j] := A_LoopField

; Array%j%_%k% := A_LoopReadLine
  Array[j, k] := A_LoopReadLine

  ArrayCount := 0
  Loop, Read, C:\Guest List.txt
  {
      ArrayCount += 1
    ; Array%ArrayCount% := A_LoopReadLine
      Array[ArrayCount] := A_LoopReadLine
  }

  Loop %ArrayCount%
  {
    ; element := Array%A_Index%
      element := Array[A_Index]
    ; MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
      MsgBox % "Element number " . A_Index . " is " . Array[A_Index]
  }

ArrayCount는 편의를 위해 변수로 남겨 두었지만, 배열 자체에 Array.Count := n로 저장하거나 아니면 제거하고 그 자리에 Array._MaxIndex()를 사용해도 됩니다. 시작 위치를 1 말고 다른 것으로 하고 싶다면, Array._MinIndex()를 사용할 수 있습니다.

의사-배열

의사 배열은 대단히 개념적입니다: 각 배열은 실제로 그저 연속적으로 번호가 붙은, 그리고 각각 배열의 원소로 인지되는 변수나 함수 집단에 불과합니다. 오토핫키는 이 원소들을 어떤 식으로든 하나로 연결하지 않습니다.

StringSplit과 "WinGet List"같은 배열-생성 명령어 말고도, OutputVar를 받는 명령어나 값을 변수에 할당하는 명령어라면 무엇이든 배열을 생성하는데 사용할 수 있습니다. 가장 간단한 예는 아래에 보여주는 바와 같이 할당 연산자 (:=)입니다:

Array%j% := A_LoopField

다차원 배열은 선택한 가름 문자를 인덱스 사이에 사용하면 가능합니다. 예를 들어:

Array%j%_%k% := A_LoopReadLine

다음 예제는 배열을 만들고 접근하는 법을 보여줍니다. 이 경우 배열은 텍스트로부터 열람한 일련의 이름입니다:

; 배열에 쓰기:
ArrayCount = 0
Loop, Read, C:\Guest List.txt   ; 이 회돌이는 파일로부터 한 번에 하나씩 각 줄을 열람합니다.
{
    ArrayCount += 1  ; 배열에 얼마나 많은 항목이 있는 추적 관리합니다.
    Array%ArrayCount% := A_LoopReadLine  ; 이 줄을 다음 배열 원소에 저장합니다.
}

; 배열로부터 읽습니다:
Loop %ArrayCount%
{
    ; 다음 줄은 := 연산자를 사용하여 배열 원소를 열람합니다:
    element := Array%A_Index%  ; A_Index는 내장 변수입니다.
    ; 다른 방법으로, "% " 접두사를 사용하여 MsgBox나 기타 다른 명령어를 표현식으로 만듭니다:
    MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
}

배열에 관련된 개념은 NumPut()과 NumGet()을 사용해 이진 형태의 숫자 집단을 저장하고 열람하는 것입니다. 이것은 수행성능과 메모리 보전이 중요한 경우에 도움이 될 수 있습니다.


AutoIt v2 Compatibility

AutoIt v2와의 호환성

AutoHotkey v1.1.09 이후는 AutoIt v2 (.aut) 스크립트를 지원하지 않습니다. 예전 버전의 오토핫키는 기본 설정과 약간의 명령어의 행위를 바꾸어서 AutoIt v2 스크립트를 지원합니다. 이 페이지는 문서의 다른 페이지로부터 제거된 정보를 담고 있습니다.

다음은 오직 .aut 파일만 지원합니다. 그리고 오직 v1.1.08.01 이전 버전에서만 지원합니다.

#AllowSameLineComments | 기본값으로, 주석은 명령어와 같은 줄에 허용되지 않습니다.
A_ScriptDir | 마지막 역사선을 포함합니다.
DetectHiddenText | 기본값은 꺼져 있습니다.
#EscapeChar | 기본값은 역사선 (\)입니다.
FileCopy | 파일을 복사할 수 없으면 ErrorLevel을 1로 설정합니다.
IniDelete | ErrorLevel는 변하지 않습니다.
IniRead | Default 매개변수를 지원하지 않습니다; 값을 읽는데 문제가 있으면 문자열 ERROR가 언제나 OutputVar에 저장됩니다.
IniWrite | ErrorLevel은 변하지 않습니다.
InputBox | 사용자가 CANCEL 버튼을 누르면, OutputVar를 비웁니다. ErrorLevel은 대화상자가 시간 제한에 걸리지 않는 한 변하지 않습니다.
SetBatchLines | 기본값은 1입니다. 그 때문에 스크립트가 매 줄마다 잠을 잡니다.
SetKeyDelay | 전통적인 SendEvent 모드에 대한 기본 Delay는 20입니다.
Send | 문자 #은 무시됩니다.
SplashTextOn | Height는 창의 타이틀 바를 포함합니다.

피신 문자 변환

AutoHotkey v1.1.08.01 이전에서 확장자 .aut.ahk를 가지고 스크립트 파일을 실행하면 실행이 되지 않습니다; 대신에 그 스크립트를 AutoIt v2 기본 피신 문자로부터 (역사선) 오토핫키의 기본 피신 문자 (백틱)으로 변환합니다.

폐기된 명령어들

다음 명령어는 자동으로 오토핫키 명령어에 상응하는 명령어로 변환됩니다 (그리고 이전에는 이 사실이 문서에 명기되어 있지 않았습니다): LeftClick, LeftClickDrag, RightClick, RightClickDrag, HideAutoItWin, Repeat, EndRepeat. 이 자동 변환 기능은 v1.1.09에서 제거되었습니다.


Clipboard and ClipboardAll

Clipboard 그리고 ClipboardAll

Clipboard는 내장 변수로서 창의 클립보드의 현재 내용을 반영합니다. 그 내용이 텍스트로 표현 가능하면 말입니다. 대조적으로, ClipboardAll은 그림이든 구조적 텍스트이든 무엇이든 클립보드에 담을 수 있습니다.

Clipboard에서 텍스트의 각 줄은 전형적으로 캐리지 리턴과 라인피드(CR+LF)로 끝납니다. 스크립트에서는 `r`n으로 표현할 수 있습니다. (탐색기 창으로부터 Control-C를 통하여 복사된) 파일은 텍스트로 간주됩니다: 스크립트에서 Clipboard를 참조할 때마다 자동으로 (완전한 경로와 함께) 그의 파일이름으로 변환됩니다. 파일을 하나씩 추출하려면 다음 예제를 따르십시오:

Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , File number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}

파일 이름을 알파벳 순서로 정렬하려면, Sort 명령어를 사용합니다. 클립보드에 존재하는 파일 이름을 파일에 쓰려면, FileAppend, %clipboard%`r`n, C:\My File.txt를 사용합니다. 얼마나 오랫동안 스크립트가 클립보드를 열려고 시도할 지 변경하려면 -- 다른 어플리케이션에서 사용하고 있는 경우 -- #ClipboardTimeOut을 사용합니다.

기본 예제:
clipboard = my text   ; 클립보드에 완전히 새로운 내용을 부여합니다.
clipboard =   ; Empty the clipboard.
clipboard = %clipboard%   ; 복사된 파일, HTML, 또는 기타 형식의 텍스트를 평범한 텍스트로 변환합니다.
clipboard = %clipboard% Text to append.   ; 텍스트를 클립보드에 추가합니다.
StringReplace, clipboard, clipboard, ABC, DEF, All   ; ABC가 나타나면 모두 DEF로 바꿉니다 (또 클립보드를 평범한 텍스트로 변환합니다).

ClipWait를 사용하여 스크립트의 신뢰성 높이기:

clipboard =  ; 텍스트가 도착할 때를 탐지하도록 하기 위해 ClipWait를 비운 채로 시작합니다.
Send ^c
ClipWait  ; 클립보드에 텍스트가 담기기를 기다립니다.
MsgBox Control-C 다음 내용이 클립보드에 복사되었습니다:`n`n%clipboard%

ClipboardAll (클립보드에 무엇이든 저장하고 복구하기)

ClipboardAll은 클립보드에 무엇이든 담습니다 (그림과 구조화 텍스트). 클립보드의 내용을 저장하는데 주로 사용됩니다. 스크립트가 임시로 그 클립보드를 연산에 사용할 수 있습니다. 연산이 완료되면, 스크립트는 원래의 클립보드 내용을 아래에 보여주는 바와 같이 복구합니다:

ClipSaved := ClipboardAll   ; 전체 클립보드를 여러분의 변수에 저장합니다.
; ... 여기에서 임시로 클립보드를 사용합니다. 예를 들어 Transform Unicode를 통하여 유니코드 텍스트를 해석할 수 있습니다 ...
Clipboard := ClipSaved   ; 원래 클립보드를 복구합니다. ( ClipboardAll이 아니라) Clipboard의 사용에 주목하십시오.
ClipSaved =   ; 클립보드가 아주 큰 경우 메모리를 해제합니다.

ClipboardAll를 파일에 저장할 수도 있습니다 (이 모드에서, FileAppend는 언제나 기존의 파일을 덮어씁니다):

FileAppend, %ClipboardAll%, C:\Company Logo.clip ; 파일 확장자는 문제가 되지 않습니다.

나중에 다시 그 파일을 클립보드로 (또는 변수 안으로) 적재하려면, 다음 예제를 따르십시오:

FileRead, Clipboard, *c C:\Company Logo.clip ; *c의 사용에 주목하십시오. 반드시 파일이름 앞에 와야 합니다.

주의

ClipboardAll는 위에 기술된 방식 외에 다른 방식으로 사용되면 비어 있습니다. 게다가, ClipboardAll는 쉼표로-가른 표현식 안에서 지원하지 않습니다. 즉, ClipSaved := ClipboardAll과 같이 한 줄에 자체만 할당해야 합니다.

ClipboardAll이 할당된 변수는 이진 형식이며 그래서 MsgBox같은 것으로 보면 쓰레기처럼 보입니다. 또, 이진-클립보드 변수 (StringReplace와 같은 수단으로) 보통 변수로 환원하면, 결과적으로 그의 클립보드 데이터가 소실됩니다. v1.0.46+에서, 이진-클립보드 변수는 값으로 함수에 건네도 됩니다 (이전에는 ByRef로만 작동했습니다).

ClipboardAll이 클립보드에서 하나 이상의 데이터 객체(구조적 텍스트)를 열람할 수 없으면, 그것은 생략되지만 나머지 객체는 그대로 저장됩니다.

클립보드 데이터를 담고 있는 변수는 다음 예제와 같이 다른 변수에 복사할 수 있습니다: ClipSaved2 := ClipSaved.

ClipWait을 사용하면 클립보드에 데이터가 담기는 때를 탐지할 수 있습니다 (선택적으로 텍스트-아닌 데이터 포함).

StrLen / StringLen를 사용하면 ClipboardAll이 할당된 변수의 총 크기를 발견할 수 있습니다. 그렇지만, 유니코드 버전의 핫키에서 바이트 단위로 그 크기를 얻으려면, 그 크기에 2를 곱해야 얻을 수 있습니다. A_IsUnicode를 사용하면 ANSI와 Unicode 버전을 다음 예제와 같이 선택적으로 지원할 수 있습니다: size := StrLen(ClipSaved) * (A_IsUnicode ? 2 : 1).

ClipboardAll이 할당된 변수는 <> 그리고 = 연산자를 사용하여 다른 변수와 비교할 수 있습니다 (그러나 직접 ClipboardAll과 비교할 수는 없습니다. 다음 예제에서, 각 변수의 크기를 먼저 점검합니다. 크기가 충분하지 않아 결정할 수 없으면, 그 내용을 비교해 승부를 결정지을 수 있습니다:

if ClipSaved1 <> %ClipSaved2%   ; 이것은  예전 스타일의 IF 서술문입니다. 표현식이 아닙니다.
    MsgBox 저장된 두 개의 클립보드가 서로 다릅니다.

ClipboardAll을 변수에 저장하는 것은 #MaxMem에 설정된 메모리 한계에 제한을 받지 않습니다.

저장된 클립보드 파일은 내부적으로 4 바이트 포맷 유형, 다음에 4 바이트 데이터 블록 크기, 그 다음에 그 포맷에 대한 데이터 블록으로 구성됩니다. 클립보드에 하나 이상의 포맷이 들어 있다면 (거의 모든 경우에 그렇습니다), 이 세 개의 항목은 모든 포맷이 포함될 때까지 반복됩니다. 파일은 4 바이트 포맷 유형이 0으로 끝납니다.

알려진 한계: 마이크로소프트 엑셀의 셀이 클립보드에 있을 때 ClipboardAll를 열람하면 엑셀이 "프린터 없음" 대화상자를 보여주는 버그가 있습니다.

오토핫키로 작성된 클립보드 유틸리티:

  • Deluxe Clipboard: 무제한 개수의 사적인, 이름붙은 클립보드를 제공합니다. 선택된 텍스트를 Copy, Cut, Paste, Append 또는 CutAppend 할 수 있습니다. www.autohotkey.com/forum/topic2665.html
  • ClipStep: 여러 클립보드를 제어합니다. 오직 키보드의 Ctrl-X-C-V 만 사용합니다. www.autohotkey.com/forum/topic4836.html

OnClipboardChange

OnClipboardChange를 사용하면 스크립트는 클립보드의 내용이 변하면 탐지할 수 있습니다.


CLSID List (Windows Class Identifiers)

CLSID List (윈도우즈 클래스 식별자)

운영체제 안의 어떤 특수 폴더는 유일한 문자열로 식별됩니다. 이 문자열은 FileSelectFile, FileSelectFolder, 그리고 Run에 사용할 수 있습니다. 예를 들어:

FileSelectFile, OutputVar,, ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 휴지통 안에서 파일 하나를 선택합니다.
FileSelectFolder, OutputVar, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; 내 컴퓨터 안에서 폴더를 하나 선택합니다.

CLSID | 의미/위치 | Run 지원 여부?
::{d20ea4e1-3957-11d2-a40b-0c5020524153} | 관리 도구 |
::{85bbd92o-42a0-1o69-a2e4-08002b30309d} | 서류가방 |
::{21ec2o2o-3aea-1o69-a2dd-08002b30309d} | 제어판 |
::{d20ea4e1-3957-11d2-a40b-0c5020524152} | 글꼴 |
::{ff393560-c2a7-11cf-bff4-444553540000} | 이력 |
::{00020d75-0000-0000-c000-000000000046} | 받은 편지함 |
::{00028b00-0000-0000-c000-000000000046} | 마이크로소프트 네트워크 |
::{20d04fe0-3aea-1069-a2d8-08002b30309d} | 내 컴퓨터 | Yes
::{450d8fba-ad25-11d0-98a8-0800361b1103} | 내 문서 | Yes
::{208d2c60-3aea-1069-a2d7-08002b30309d} | 내 네트워크 위치 | Yes
::{1f4de370-d627-11d1-ba4f-00a0c91eedba} | 네트워크 컴퓨터 | Yes
::{7007acc7-3202-11d1-aad2-00805fc1270e} | 네트워크 접속 | Yes
::{2227a280-3aea-1069-a2de-08002b30309d} | 프린터와 팩스 | Yes
::{7be9d83c-a729-4d97-b5a7-1b7313c39e0a} | 프로그램 폴더 |
::{645ff040-5081-101b-9f08-00aa002f954e} | 쓰레기통 | Yes
::{e211b736-43fd-11d1-9efb-0000f8757fcd} | 스캐너와 카메라 |
::{d6277990-4c6a-11cf-8d87-00aa0060f5bf} | 일정 | Yes
::{48e7caab-b918-4e58-a94d-505519c795dc} | 시작 메뉴 폴더 |
::{7bd29e00-76c1-11cf-9dd0-00a0c9034933} | 임시 인터넷 파일 |
::{bdeadf00-c265-11d0-bced-00a0c90ab50f} | 웹 폴더 |

마지막 컬럼에 있는 "Yes" 엔트리들은 절대적이 아닙니다: Run 명령어는 시스템 환경 구성에 따라 다른 CLSID를 지원할 수도 있습니다. Run을 통하여 CLSID를 열려면, 그냥 첫 매개변수로 CLSID를 지정하면 됩니다. 예를 들어:

Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; "내 컴퓨터" 폴더를 엽니다.
Run ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 휴지통을 엽니다.
Run ::{450d8fba-ad25-11d0-98a8-0800361b1103}\My Folder  ; "내 문서" 안에 존재하는 폴더를 엽니다.
Run %A_MyDocuments%\My Folder  ; 대부분의 시스템에서 위와 같습니다.


ErrorLevel

명령어의 성공 여부를 알리기 위해 설정되는 내장 변수 입니다 (모든 명령어가 ErrorLevel의 값을 변경하는 것은 아닙니다). 값이 0이면 보통 성공을 나타내고, 다른 값은 보통 실패를 나타냅니다. ErrorLevel의 값을 직접 설정해도 됩니다.

RunWait가 자신이 실행한 프로그램의 종료 코드가 되도록 ErrorLevel를 설정하는 것은 특별히 흥미롭습니다. 대부분의 프로그램은 성공적으로 완료하면 종료 코드를 0으로 산출합니다.

각 쓰레드마다 자신의 ErrorLevel을 보유합니다. 현재 쓰레드가 다른 쓰레드에 의해 인터럽트 되더라도, 원래 쓰레드가 재개하면, 여전히 자신의 원래 ErrorLevel을 보유합니다. 인터럽트 한 쓰레드가 설정한 ErrorLevel이 아니라는 뜻입니다.

주의: 어떤 명령어는 ErrorLevel에 1보다 큰 값을 설정하므로, ErrorLevel이 1인가를 점검하지 말고, 대신에 ErrorLevel이 0이 아닌가를 점검하는 것이 좋습니다.

예제

WinWait, MyWindow, , 1
if ErrorLevel   ; 즉, 비어 있지 않거나 0이면.
    MsgBox, 창이 존재하지 않습니다.
else
    MsgBox, 창이 존재합니다.


Standard Windows Fonts

표준 윈도우즈 글꼴

Progress, GUI, 그리고 SplashImage 명령어에 사용합니다.

권장 글꼴은 노란색으로 강조하였습니다.

글꼴 이름 | Win95 | WinNT | Win98 | Win2000 | WinMe | WinXP
Abadi MT Condensed Light |  |  | x |  |  |
Arial | x | x | x | x | x | x
Arial Alternative Regular |  |  |  |  | x |
Arial Alternative Symbol |  |  |  |  | x |
Arial Black |  |  | x | x | x | x
Arial Bold | x | x | x | x | x | x
Arial Bold Italic | x | x | x | x | x | x
Arial Italic | x | x | x | x | x | x
Book Antiqua |  |  | x |  |  |
Calisto MT |  |  | x |  |  |
Century Gothic |  |  | x |  |  |
Century Gothic Bold |  |  | x |  |  |
Century Gothic Bold Italic |  |  | x |  |  |
Century Gothic Italic |  |  | x |  |  |
Comic Sans MS |  |  | x | x | x |
Comic Sans MS Bold |  |  | x | x | x | x
Copperplate Gothic Bold |  |  | x |  |  |
Copperplate Gothic Light |  |  | x |  |  |
Courier | x | x | x | x | x | x
Courier New | x | x | x | x | x | x
Courier New Bold | x | x | x | x | x | x
Courier New Bold Italic | x | x | x | x | x | x
Courier New Italic | x | x | x | x | x | x
Estrangelo Edessa |  |  |  |  |  | x
Franklin Gothic Medium |  |  |  |  |  | x
Franklin Gothic Medium Italic |  |  |  |  | x |
Gautami |  |  |  |  |  | x
Georgia |  |  |  | x |  | x
Georgia Bold |  |  |  | x |  | x
Georgia Bold Italic |  |  |  | x |  | x
Georgia Italic |  |  |  | x |  | x
Georgia Italic Impact |  |  |  |  |  | x
Impact |  |  | x | x | x |
Latha |  |  |  |  |  | x
Lucida Console |  | x | x | x | x | x
Lucida Handwriting Italic |  |  | x |  |  |
Lucida Sans Italic |  |  | x |  |  |
Lucida Sans Unicode |  |  | x | x |  | x
Marlett |  |  | x |  | x |
Matisse ITC |  |  | x |  |  |
Modern | x | x | x | x |  |
Modern MS Sans Serif |  |  |  |  |  | x
MS Sans Serif | x | x | x | x | x | x
MS Serif | x | x | x | x | x |
Mv Boli |  |  |  |  |  | x
News Gothic MT |  |  | x |  |  |
News Gothic MT Bold |  |  | x |  |  |
News Gothic MT Italic |  |  | x |  |  |
OCR A Extended |  |  | x |  |  |
Palatino Linotype |  |  |  | x |  | x
Palatino Linotype Bold |  |  |  | x |  | x
Palatino Linotype Bold Italic |  |  | x |  | x |
Palatino Linotype Italic |  |  |  | x |  | x
Roman |  | x |  | x |  | x
Script |  | x |  | x |  | x
Small Fonts |  | x |  | x |  | x
Smallfonts | x |  | x |  | x |
Symbol | x | x | x | x | x | x
Tahoma |  |  | x | x | x | x
Tahoma Bold |  |  | x | x | x | x
Tempus Sans ITC |  |  | x | x |  |
Times New Roman | x | x | x | x | x | x
Times New Roman Bold | x | x | x | x | x | x
Times New Roman Bold Italic | x | x | x | x | x | x
Times New Roman Italic | x | x | x | x | x | x
Trebuchet |  |  |  |  | x |
Trebuchet Bold |  |  |  |  | x |
Trebuchet Bold Italic |  |  |  |  | x |
Trebuchet Italic |  |  |  |  | x |
Trebuchet MS |  |  |  | x |  | x
Trebuchet MS Bold |  |  |  | x |  | x
Trebuchet MS Bold Italic |  |  |  | x |  | x
Trebuchet MS Italic |  |  |  | x |  | x
Tunga |  |  |  |  |  | x
Verdana (included with MSIE 3+) |  |  | x | x | x | x
Verdana Bold |  |  | x | x | x | x
Verdana Bold Italic |  |  | x | x | x | x
Verdana Italic |  |  | x | x | x | x
Webdings |  |  | x | x | x | x
Westminster |  |  | x |  | x | x
Wingdings | x | x |  | x |  | x
WST_Czech |  |  |  |  |  | x
WST_Engl |  |  |  |  |  | x
WST_Fren |  |  |  |  |  | x
WST_Germ |  |  |  |  |  | x
WST_Ital |  |  |  |  |  | x
WST_Span |  |  |  |  |  | x
WST_Swed |  |  |  |  |  | x

이 목록은 KaysKreations 그리고 AutoIt Team이 편집했습니다.


Labels

라벨

라벨은 코드 한 줄을 식별합니다. Goto의 목표나 서브루틴을 형성하는 데 사용할 수 있습니다.

LabelName:

라벨을 만들려면, 위에 보여주는 바와 같이 라벨 이름 다음에 쌍점을 적습니다. 공백문자와 주석 외에, 다른 코드는 같은 줄에 쓸 수 없습니다.

이름: 라벨 이름은 대소문자를 구분하지 않으며, 스페이스나 탭 그리고 쉼표와 피신 문자 (`)를 제외하고 어떤 문자로도 구성할 수 있습니다. 그렇지만, 스타일 관례 때문에, 일반적으로 오직 기호와 숫자 그리고 밑줄 문자를 사용하는 편이 좋습니다 (예를 들어: MyListView, Menu_File_Open, and outer_loop). 라벨 이름은 전체 스크립트를 통해 유일해야 합니다.

예약된 이름은 없지만, 다음 이름은 사용하지 않기를 강력하게 권고합니다: On, Off, Toggle, AltTab, ShiftAltTab, AltTabAndMenu 그리고 AltTabMenuDismiss. 이런 값들은 Hotkey 명령어에 특별한 의미가 있습니다.

목표: 라벨의 목표는 실행 코드의 다음 줄입니다. 실행 코드에는 명령어, 할당, 표현식 그리고 블록이 담길 수 있지만, 지시어나 라벨, 핫키와 핫스트링은 안됩니다. 다음 예제에서, run_notepad와 #n는 모두 Run 라인을 가리킵니다:

run_notepad:
#n::
    Run Notepad
    return

실행: 지시어처럼, 라벨은 정상 실행 흐름에 도달하면 아무 효과도 없습니다. 다음 예제에서 메시지 박스는 두번 나타납니다 - 한 번은 Gosub에 의한 서브루틴의 실행 동안에, 그리고 다시 서브루틴이 반환된 후에 나타납니다:

gosub Label1

Label1:
MsgBox %A_ThisLabel%
return

서브루틴

서브루틴은 특정한 작업을 위해 호출할 수 있는 코드 일부입니다. 서브루틴의 실행은 라벨이 목표에서 시작해서 Return이나 Exit을 만날 때까지 계속됩니다. 서브루틴의 종료는 실행 흐름에 달려 있기 때문에, 어떤 라벨이든 Goto 목표와 서브루틴의 시작으로 행위할 수 있습니다.

동적인 라벨

라벨을 받는 많은 명령어들은 또 %MyLabel%와 같이 변수 참조도 받을 수 있습니다. 이 경우 변수에 저장된 이름이 목표로 사용됩니다. 그렇지만, 수행성능은 약간 감소합니다. 왜냐하면 스크립트가 처음 적재될 때 한 번이 아니라 목표를 매번 "찾아 보아야"하기 때문입니다.

핫키와 핫스트링

핫키와 핫스트링 라벨도 Goto, Gosub 그리고 기타 명령어에 대하여 유효합니다. 그렇지만, 핫키나 핫스트링에 여러 변종이 있다면, 스크립트의 상단에 제일 가까운 변종이 사용됩니다. 핫키의 수식자나 핫스트링의 옵션은 모두 라벨의 이름의 일부입니다. 그러나 마지막 겹-쌍점 (::)은 생략합니다.

이름있는 회돌이

라벨은 또 Continue와 Break 명령어에 대하여 회돌이를 식별하는 데에도 사용할 수 있습니다. 스크립트는 쉽게 깊이에 상관없이 내포 회돌이를 계속하거나 빠져 나올 수 있습니다.

함수

[v1.1.20] 이후에, 함수는 많은 경우 라벨을 대신해 사용할 수 있습니다. 여기에는:

  • Gui 이벤트 예, GuiClose
  • Gui 제어 이벤트 (g-labels)
  • Hotkey
  • Menu
  • SetTimer

함수의 혜택은 지역 변수를 사용할 수 있다는 것입니다. (Gui 제어 이벤트와 같이) 어떤 경우 유용한 정보를 담고 있는 매개변수를 받기도 합니다.

관련 항목

IsLabel(), A_ThisLabel, Gosub, Goto, OnExit, SetTimer, Hotkey, Gui Events, g-label, OnClipboardChange


Language Codes

언어 코드

다음 목록은 각 언어 코드에 상응하는 언어 이름을 담고 있습니다. A_Language 변수에 할당됩니다. 언어 코드 자체는 아래에서 등호 사인의 왼쪽에서 뒤 네 개의 숫자입니다. 예를 들어, A_Language에 0436이 담겨 있다면, 시스템의 기본 언어는 Afrikaans입니다. 주의: 코드에 기호가 포함되면 대문자나 소문자 상관없습니다.

A_Language를 아래의 네 자리 코드와 직접적으로 비교할 수 있습니다; 예를 들어: if (A_Language = "0436"). 대안으로, 전체 리스트를 스크립트 안에 복사해 넣고 현재 언어의 이름에 접근합니다. 리스트 아래의 예제에 보여주는 것처럼 접근할 수 있습니다.

languageCode_0436 = Afrikaans
languageCode_041c = Albanian
languageCode_0401 = Arabic_Saudi_Arabia
languageCode_0801 = Arabic_Iraq
languageCode_0c01 = Arabic_Egypt
languageCode_0401 = Arabic_Saudi_Arabia
languageCode_0801 = Arabic_Iraq
languageCode_0c01 = Arabic_Egypt
languageCode_1001 = Arabic_Libya
languageCode_1401 = Arabic_Algeria
languageCode_1801 = Arabic_Morocco
languageCode_1c01 = Arabic_Tunisia
languageCode_2001 = Arabic_Oman
languageCode_2401 = Arabic_Yemen
languageCode_2801 = Arabic_Syria
languageCode_2c01 = Arabic_Jordan
languageCode_3001 = Arabic_Lebanon
languageCode_3401 = Arabic_Kuwait
languageCode_3801 = Arabic_UAE
languageCode_3c01 = Arabic_Bahrain
languageCode_4001 = Arabic_Qatar
languageCode_042b = Armenian
languageCode_042c = Azeri_Latin
languageCode_082c = Azeri_Cyrillic
languageCode_042d = Basque
languageCode_0423 = Belarusian
languageCode_0402 = Bulgarian
languageCode_0403 = Catalan
languageCode_0404 = Chinese_Taiwan
languageCode_0804 = Chinese_PRC
languageCode_0c04 = Chinese_Hong_Kong
languageCode_1004 = Chinese_Singapore
languageCode_1404 = Chinese_Macau
languageCode_041a = Croatian
languageCode_0405 = Czech
languageCode_0406 = Danish
languageCode_0413 = Dutch_Standard
languageCode_0813 = Dutch_Belgian
languageCode_0409 = English_United_States
languageCode_0809 = English_United_Kingdom
languageCode_0c09 = English_Australian
languageCode_1009 = English_Canadian
languageCode_1409 = English_New_Zealand
languageCode_1809 = English_Irish
languageCode_1c09 = English_South_Africa
languageCode_2009 = English_Jamaica
languageCode_2409 = English_Caribbean
languageCode_2809 = English_Belize
languageCode_2c09 = English_Trinidad
languageCode_3009 = English_Zimbabwe
languageCode_3409 = English_Philippines
languageCode_0425 = Estonian
languageCode_0438 = Faeroese
languageCode_0429 = Farsi
languageCode_040b = Finnish
languageCode_040c = French_Standard
languageCode_080c = French_Belgian
languageCode_0c0c = French_Canadian
languageCode_100c = French_Swiss
languageCode_140c = French_Luxembourg
languageCode_180c = French_Monaco
languageCode_0437 = Georgian
languageCode_0407 = German_Standard
languageCode_0807 = German_Swiss
languageCode_0c07 = German_Austrian
languageCode_1007 = German_Luxembourg
languageCode_1407 = German_Liechtenstein
languageCode_0408 = Greek
languageCode_040d = Hebrew
languageCode_0439 = Hindi
languageCode_040e = Hungarian
languageCode_040f = Icelandic
languageCode_0421 = Indonesian
languageCode_0410 = Italian_Standard
languageCode_0810 = Italian_Swiss
languageCode_0411 = Japanese
languageCode_043f = Kazakh
languageCode_0457 = Konkani
languageCode_0412 = Korean
languageCode_0426 = Latvian
languageCode_0427 = Lithuanian
languageCode_042f = Macedonian
languageCode_043e = Malay_Malaysia
languageCode_083e = Malay_Brunei_Darussalam
languageCode_044e = Marathi
languageCode_0414 = Norwegian_Bokmal
languageCode_0814 = Norwegian_Nynorsk
languageCode_0415 = Polish
languageCode_0416 = Portuguese_Brazilian
languageCode_0816 = Portuguese_Standard
languageCode_0418 = Romanian
languageCode_0419 = Russian
languageCode_044f = Sanskrit
languageCode_081a = Serbian_Latin
languageCode_0c1a = Serbian_Cyrillic
languageCode_041b = Slovak
languageCode_0424 = Slovenian
languageCode_040a = Spanish_Traditional_Sort
languageCode_080a = Spanish_Mexican
languageCode_0c0a = Spanish_Modern_Sort
languageCode_100a = Spanish_Guatemala
languageCode_140a = Spanish_Costa_Rica
languageCode_180a = Spanish_Panama
languageCode_1c0a = Spanish_Dominican_Republic
languageCode_200a = Spanish_Venezuela
languageCode_240a = Spanish_Colombia
languageCode_280a = Spanish_Peru
languageCode_2c0a = Spanish_Argentina
languageCode_300a = Spanish_Ecuador
languageCode_340a = Spanish_Chile
languageCode_380a = Spanish_Uruguay
languageCode_3c0a = Spanish_Paraguay
languageCode_400a = Spanish_Bolivia
languageCode_440a = Spanish_El_Salvador
languageCode_480a = Spanish_Honduras
languageCode_4c0a = Spanish_Nicaragua
languageCode_500a = Spanish_Puerto_Rico
languageCode_0441 = Swahili
languageCode_041d = Swedish
languageCode_081d = Swedish_Finland
languageCode_0449 = Tamil
languageCode_0444 = Tatar
languageCode_041e = Thai
languageCode_041f = Turkish
languageCode_0422 = Ukrainian
languageCode_0420 = Urdu
languageCode_0443 = Uzbek_Latin
languageCode_0843 = Uzbek_Cyrillic
languageCode_042a = Vietnamese

the_language := languageCode_%A_Language%  ; 시스템의 기본 언어 이름을 얻습니다.
MsgBox %the_language%  ; 그 언어 이름을 화면에 보여줍니다.


Creating a Keyboard Macro or Mouse Macro

키보드 매크로나 마우스 매크로 만들기

매크로는 요구하면 "플레이되는" 스크립트된 일련의 조치입니다; 가장 흔한 매크로 조치는 하나 이상의 창에 흉내낸 키눌림 그리고 마우스 클릭을 전송하는 것입니다. 그런 창은 각 키눌림과 마우스 클릭에 마치 여러분이 손수 수행한 것처럼 반응합니다. 그러므로 반복 작업을 빠르게 그리고 신뢰성 있게 자동화할 수 있습니다.

매크로는 손으로 작성할 수 있지만, 기다란 매크로를 작성하려면 매크로 레코더의 도움을 받은 편이 쉬울 것입니다. 예를 들어 Titan/polyethene가 작성한 레코더 스크립트가 있습니다. 여러분이 타자하고 클릭하는 것을 지켜 보면서 활성 창을 추적 관리합니다. 이 조치를 작동하는 매크로로 변환하면 나중에 더 빠른 속도로 "다시 플레이 할" 수 있습니다.

매크로를 다시 플레이하는 가장 편리한 방법중 하나는 그것을 핫키나 핫스트링에 할당하는 것입니다. 예를 들어, 다음 핫키는 빈 이메일 메시지를 생성하고 그것을 특정 유형의 수신인을 위해 준비합니다. 그것을 보내기 전에 개별적으로 바꿀 수 있습니다:

^!s::  ; Control+Alt+S 핫키.
IfWinNotExist Inbox - Microsoft Outlook
    return  ; Outlook이 오른쪽에 열리지 않았습니다. 그래서 아무것도 하지 않습니다.
WinActivate  ; 위의 명령어로 발견한 창을 활성화합니다.
Send ^n  ; Control+N을 통하여 새로 빈 이메일을 생성합니다.
WinWaitActive Untitled Message
Send {Tab 2}Product Recall for ACME Rocket Skates  ; 제목 줄을 설정합니다.
Send {Tab}Dear Sir or Madam,{Enter 2}We have recently discovered a minor defect ...  ; 등등.
return  ; 이 줄은 핫키를 종료하는 데 기여합니다.

위와 같은 핫키 매크로는 매일 자주 수행해야 하는 작업에 특히 유용합니다. 대조적으로, 자주 사용하지 않는 매크로는 각각 별도의 파일에 보관하고 바탕화면이나 시작 메뉴의 단축 아이콘을 통하여 접근합니다.

매크로나 핫키를 지금 즉시 만들고 싶다면, 빠르게 시작하기 자습서를 읽어 보십시오.

-- 홈으로 --


Overriding Hotkeys

핫키를 불능화하거나 오버라이드하기

Win+L과 Win+U를 제외하고 모든 내장 윈도우즈 핫키를 끌 수 있습니다. 레지스트를 다음과 같이 변경하면 됩니다 (이 방법은 모든 운영체제에 작동하겠지만, 아마도 리부트가 필요할 것입니다):

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
NoWinKeys REG_DWORD 0x00000001 (1)

그러나 단순히 불능화하는 것 말고 더 많은 것을 원한다면 계속 읽어 보십시오.

또다른 어플리케이션이 소유한 핫키를 오버라이드 하거나 불능으로 만들 수 있습니다. 그냥 스크립트에서 거기에 다른 조치를 할당하기만 하면 됩니다. 이 특징을 가장 많이 사용하는 예는 윈도우즈 자체에 내장된 핫키를 바꾸는 것입니다. 예를 들어, Win+E (윈도우즈 탐색기를 기동하는 단축 키)를 다른 행위를 수행하도록 만들고 싶다면, 다음을 사용하십시오:

#e::
MsgBox 이 핫키는 이제 스크립트가 소유합니다.
return

다음 예제에서, RUN 창을 여는 Win+R 핫키는 완전히 불능화됩니다:

#r::return

비슷하게, 두 윈도우즈 키를 모두 끄려면, 다음을 사용하십시오:

Lwin::return
Rwin::return

어플리케이션의 비-전역 핫키를 바꾸거나 끄려면 (즉, 어플리케이션이 활성 창일 경우에만 작동하는 단축 키), 다음 예제에서 노트패드에만 Control+P (Print)를 끄는 방법을 연구해 보십시오. 다른 모든 창에는 단축 키가 여전히 효과가 있도록 그대로 둡니다:

$^p::
IfWinActive ahk_class Notepad
    return  ; 즉, 아무것도 하지 않습니다. Control-P가 Notepad에서 아무일도 하지 않게 됩니다.
Send ^p
return

위의 예제에서, $ 접두 심볼이 있어야 핫키가 자신을 활성화 시키지 않고 "자신을 전송"할 수 있습니다 (그렇지 않으면 무한 회돌이 관하여 경고 상자가 촉발됩니다). 다음도 참조하십시오: 문맥-감지 핫키.

위의 모든 예제를 시험해 볼 수 있습니다. "Override.ahk"와 같은 새 텍스트 파일 안으로 복사해 넣고, 파일을 기동해 보십시오.


Performance

스크립트 수행성능

수행성능을 극대화하려면, SetFormat의 사용을 자제하고 (빠른 모드 제외) 다음 줄을 각 스크립트의 상단 근처에 포함하십시오:

#NoEnv
SetBatchLines -1
ListLines Off

게다가, 다음 명령어를 사용하면 스크립트의 성질에 따라 수행성능에 영향을 미칩니다: SendMode, SetKeyDelay, SetMouseDelay, SetWinDelay, SetControlDelay, 그리고 SetDefaultMouseSpeed.

내장 수행성능 특징

스크립트는 적재되는 동안 그리고 구문을 점검하는 동안 유사-컴파일됩니다. 유사-컴파일은 스크립트가 소모하는 메모리를 줄이는 외에도, 극적으로 수행성능을 향상시킵니다.

다음은 테크니컬한 최적화 과정을 기술합니다 (유사-컴파일링):

  • 입력 변수와 출력 변수 (이름에 다른 변수를 가리키는 참조 주소가 들어있지 않을 때) 그리고 그룹 이름은 메모리 주소로 결정됩니다.
  • Loops, blocks, IFs, 그리고 ELSEs에는 스크립트에서 그와 관련된 점프 지점의 메모리 주소가 부여됩니다.
  • 각 핫키, Gosub, 그리고 Goto의 목적지는 변수가 아닌 한 메모리 주소로 결정됩니다.
  • 각 명령어 이름은 점프 테이블의 주소로 교체됩니다.
  • 각 줄은 미리-해석되어 매개변수 리스트로 들어갑니다. (있다면) 각 매개변수는 미리 해석되어 변수 리스트로 들어갑니다.
  • 각 표현식은 토큰화되어 중위식에서 후위식으로 변환됩니다.
  • 변수나 함수를 가리키는 참조 주소는 메모리 주소로 결정됩니다.
  • 표현식에서 문자 그대로의 정수와 수학/비교 명령어는 이진 정수로 교체됩니다.

게다가, 스크립트를 실행하는 동안, 이진 숫자들은 변수에 캐쉬가 되어 문자열로/으로부터 변환을 피합니다. 자세한 것은 SetFormat을 참조하십시오.


Regular Expressions (RegEx) - Quick Reference

정규표현식 (RegEx) - 간편 참조서

기본 지식

어디에나 부합: 기본값으로, 정규 표현식에서 부분문자열은 검색될 문자열 안 어디에나 부합합니다. 예를 들어, 정규 표현식 abc는 abc123, 123abc, 그리고 123abcxyz에 부합합니다. 부합을 처음이나 끝에서만 일어나도록 하려면 닻을 사용합니다.

피신 문자: abc123과 같이 대부분의 문자는 정규 표현식 안에 문자 그대로 사용할 수 있습니다. 그렇지만, \.*?+[{|()^$의 문자들은 반드시 앞에 역사선을 배치해야 문자 그대로 보일 수 있습니다. 예를 들어, \.는 문자 그대로의 마침표이고 \\는 문자 그대로의 역사선입니다. 피신을 피하려면 \Q...\E을 사용합니다. 예를 들어: \QLiteral Text\E.

대소문자 구분: 기본값으로 정규 표현식은 대소문자를 구분합니다. 이 행위는 "i" 옵션으로 바꿀 수 있습니다. 예를 들어, 패턴 i)abc는 대소문자를 구분하지 않고 "abc"를 검색합니다. 다른 수식자들은 아래를 참조하십시오.

옵션 (대소문자 구분)

정규 표현식 맨 앞에 다음 옵션을 지정하고 다음에 반괄호로 닫아 옵션을 지정합니다. 예를 들어, 패턴 "im)abc"는 여러 줄 옵션을 가지고 대소문자를 구분하여 abc를 검색합니다 (아무 옵션이 없으면 닫는 반괄호는 생략합니다.). 이 구문은 전통을 어기지만, 특수한 구분자를 요구하지 않습니다 (예를 들어 역사선). 그래서 패턴 안에서 그런 구분자를 피신시킬 필요가 없습니다. 게다가 수행성능이 향상됩니다. 왜냐하면 옵션을 해석하기가 더 쉽기 때문입니다.

i | 대소문자를 구분하지 않고 부합합니다. 기호 A부터 Z를 소문자와 동일하게 취급합니다.
m

여러 줄에 부합합니다. (새줄 문자가 포함되어 있다면) 목표 문자열(Haystack)을 하나의 연속적인 줄로 보지 않고 각 줄이 모인 집단으로 봅니다. 특히, 다음과 같이 변경됩니다:

1) 윗꺽쇠(^)는 모든 내부 새줄 문자 뒤에 즉시 부합합니다 -- 뿐만 아니라 Haystack의 시작에도 언제나 부합합니다 (그러나 Haystack의 맨 끝에 있는 새줄 문자 다음에는 부합하지 않습니다).

2) 달러 사인 ($)은 Haystack 안의 어떤 새줄 문자 앞에도 부합합니다. (뿐만 아니라 맨 끝의 새줄 문자에도 언제나 부합합니다).

예를 들어, 패턴 "m)^abc$"는 "m" 옵션이 존재하지 않으면 목표문자열(Haystack) "xyz`r`nabc"에 부합하지 않습니다.

"D" 옵션은 "m" 옵션이 있으면 무시됩니다.
s | DotAll. 마침표 (.)가 새줄문자를 포함하여 모든 문자에 일치합니다 (보통, 새줄문자에는 일치하지 않습니다). 그렇지만, 새줄 문자가 기본값으로 CRLF (`r`n)이면, 두 개의 점이 있어어 부합합니다 (하나만으로는 부합하지 않습니다). 이 옵션과 상관없이, [^a]같은 부정 부류는 언제나 새줄문자에 부합합니다.
x | 문자 부류 안이나 피신시킨 경우를 제외하고 패턴에서 공백 문자를 무시합니다. 문자 `n과 `t이 무시되는데 왜냐하면 PCRE에 도착할 때 쯤이면, 이미 날/기호 공백 문자이기 때문입니다 (대조적으로, \n와 \t는 PCRE 피신 연속열이기 때문에 무시되지 않습니다). x 옵션은 또 문자 부류 밖의 피신되지 않은 #부터 다음 새줄문자(포함) 사이의 문자들을 무시합니다. 이 덕분에 복잡한 패턴 안에 주석을 삽입할 수 있습니다. 그렇지만, 이것은 오직 데이터 문자에만 적용됩니다; 조건적 부패턴을 시작하는 (?(와 같은 특수 문자 연속열 안에 공백문자는 나타나지 않습니다.
A | 패턴을 강제로 고정합니다; 즉, Haystack의 시작에만 부합할 수 있습니다. 대부분의 상황에서, 이것은 "^"와 같은 수단을 사용하여 명시적으로 패턴을 고정한 것과 동등합니다.
D | 달러 사인($)을 강제로 목표 문자열(Haystack)의 맨 끝에 부합시킵니다. 목표 문자열(Haystack)의 마지막이 새줄 문자여도 부합합니다. 이 옵션에 없다면, 대신에 $는 (있다면) 마지막 새줄 문자 바로 앞에 부합합니다. 주의: 이 옵션은 "m" 옵션이 있으면 무시됩니다.
J | 이름붙인 부패턴의 중복을 허용합니다. 이것은 같은-이름의 부패턴 중 하나만 부합할 수 있는 패턴에 유용하게 사용할 수 있습니다. 주의: 무엇이든 특정 이름이 한 번 이상 부합하면, 왼쪽에 있는 것만 저장됩니다. 또, 변수 이름은 대소문자를 구분하지 않습니다.
U | 비탐욕적. 수량자 *+?{}가 부합을 형성하는데 절대적으로 필요한 문자들만 소비합니다. 나머지 부합은 다음 패턴을 위해 남겨둡니다. "U" 옵션이 효과가 없으면, 각 수량자 다음에 물음표를 추가하면 비탐욕적으로 만들 수 있습니다. 반대로, "U"가 효과가 있으면, 물음표는 각 수량자를 탐욕적으로 만듭니다.
X | PCRE_EXTRA. 펄과 호환되지 않는 PCRE 특징을 활성화합니다. 현재, 지원되는 유일한 특징은 다음과 같습니다. 패턴에서 역사선 다음에 아무 특수 의미가 없는 기호가 따라오면 부합은 실패하고 그에 맞게 ErrorLevel이 설정됩니다. 이 옵션은 사용하지 않는 역사선 문자열을 미래에 사용하기 위해 예약하는데 도움을 줍니다. 이 옵션이 없다면, 역사선 다음에 아무 특수 의미가 없는 기호가 따라오면 기호 그대로 취급합니다 (예, \g와 g는 모두 기호 그대로의 g로 인식됩니다). 이 옵션에 상관없이, 아무 의미가 없는 알파벳-아닌 연속열은 언제나 기호 그대로 취급됩니다 (예, \/ 그리고 / 는 모두 정사선으로 인지됩니다).
P | 위치 모드. 이 모드는 RegExMatch()가 부합한 부문자열이 아니라 그의 부패턴과 부합의 위치와 길이를 산출하도록 만듭니다. 자세한 것은 UnquotedOutputVar를 참조하십시오.
S | 패턴을 연구하여 수행성능을 향상시키려고 시도합니다. 이 특징은 특정 패턴이 (특히 복잡한 패턴이) 여러 번 수행될 때 유용합니다. PCRE가 수행성능을 향상시키는 법을 발견하면, 그 발견은 패턴과 함께 캐쉬에 저장됩니다. 같은 패턴이 연이어 실행되면 저장된 발견을 사용합니다. (패턴을 연이어 사용하면 S 옵션을 지정해야 합니다. 왜냐하면 캐쉬에서 부합을 발견하려면 그 옵션 기호가 정확하게 일치해야 하며, 순서까지 일치해야 하기 때문입니다).
C | 자동-callout 모드를 켭니다. 더 자세한 정보는 정규 표현식 외부호출을 참조하십시오.
`n | 기본 새줄 문자(`r`n)를 단독 라인피드 (`n)로 전환합니다. 이 줄끝 문자는 UNIX 시스템의 표준입니다. 선택된 새줄 문자는 닻 (^와 $) 그리고 점(dot/period) 패턴의 행위에 영향을 미칩니다.
`r | 기본 새줄 문자 (`r`n)를 단독 캐리지 리턴 (`r)으로 전환합니다.
`a | v1.0.46.06+에서, `a는 새줄이면 어떤 종류든지 모두 인지합니다. 즉, `r, `n, `r`n, `v/VT/vertical tab/chr(0xB), `f/FF/formfeed/chr(0xC), 그리고 NEL/next-line/chr(0x85). v1.0.47.05+에서, 새줄은 CR, LF, 그리고 CRLF로 제한할 수 있습니다. 패턴의 시작에 (옵션 뒤에) 대문자로 (*ANYCRLF)를 지정하면 됩니다; 예, im)(*ANYCRLF)^abc$.

주의: 각 옵션을 다음 옵션과 가르는데 스페이스와 탭을 선택적으로 사용할 수 있습니다.

자주 사용되는 심볼과 구문

. 기본값으로, 점은 문자 하나에 부합합니다. 새줄문자 (`r`n) 연속열은 제외합니다. 그러나 DotAll (s), 라인피드 (`n), 캐리지 리턴 (`r), `a 또는 (*ANYCRLF) 옵션을 사용하여 이 행위를 변경할 수 있습니다. 예를 들어, ab.는 abc and abz 그리고 ab_에 부합합니다.
*

별표는 0개 이상의 이전 문자, 부류, 또는 부패턴에 부합합니다. 예를 들어, a*는 ab 그리고 aaab에 부합합니다. 또 "a"가 전혀 없는 문자열의 맨 앞에도 부합합니다.

만능문자: 점-별 패턴 .*은 가장 많이 사용되는 패턴입니다. 왜냐하면 어떤 문자든지 0 회 이상 부합하기 때문입니다 (새줄 문자는 제외합니다: `r 그리고 `n). 예를 들어, abc.*123은 abcAnything123는 물론 abc123에도 부합합니다.
? 물음표는 이전 문자, 부류, 또는 부패턴이 0 또는 1개에 부합합니다. 이것을 "앞의 문자는 선택적이다"라고 간주하십시오; 예를 들어, colou?r는 color와 colour에 모두 부합합니다 왜냐하면 "u"가 선택적이기 때문입니다.
+ 덧셈 부호는 하나 이상의 이전 문자, 부류, 또는 부패턴에 부합합니다. 예를 들어 a+는 ab 그리고 aaab에 부합합니다. 그러나 a* 그리고 a?와 다르게, 패턴 a+는 "a"가 없는 문자열의 선두에 부합하지 않습니다.
{min,max}

이전의 문자, 부류, 또는 부패턴이 최소 min회 그리고 최대 max회 나타나면 부합합니다. 예를 들어, a{1,2}는 ab에 부합하지만 aaab에서 오직 앞의 두 a에만 부합합니다.

또, {3}는 정확하게 3 회 나타나야 한다는 뜻이고, {3,}는 3 회 이상을 의미합니다. 주의: 지정된 횟수는 65536보다 작아야 합니다. 그리고 앞의 숫자는 뒤의 숫자보다 같거나 작아야 합니다.
[...]

문자 부류: 각괄호는 문자의 범위나 리스트를 둘러쌉니다 (또는 둘 다). 예를 들어, [abc]는 " a, b 또는 c중 어느 문자에나 부합한다"는 뜻입니다. 사이에 옆줄 문자를 사용하면 범위가 생성됩니다; 예를 들어, [a-z]는 "소문자 a부터 z까지의 (포함) 모든 문자 하나에 부합한다"는 뜻입니다. 리스트와 범위는 조합할 수 있습니다; 예를 들어 [a-zA-Z0-9_]는 "모든 알파벳과 숫자 또는 밑줄 문자"를 뜻합니다.

문자 부류 다음에 *, ?, +, 또는 {min,max}가 따라올 수 있습니다. 예를 들어, [0-9]+는 숫자가 하나 이상 나타나면 부합합니다; 그래서 xyz123에는 부합하지만 abcxyz에는 부합하지 않습니다.

다음 POSIX 이름 집합도 지원합니다. 형태는 [[:xxx:]]와 같으며, 여기에서 xxx는 다음 단어 중 하나입니다: alnum, alpha, ascii (0-127), blank (스페이스 또는 탭), cntrl (제어 문자), digit (0-9), xdigit (십육진수), print, graph (스페이스를 제외하고 인쇄 가능 문자), punct, lower, upper, space (공백문자), word (\w와 동일).

문자 부류 안에서, 문자들은 피신시킬 필요가 없습니다. 부류 안에서 특별한 의미를 가질 경우는 제외합니다; 예를 들어, [\^a], [a\-b], [a\]], 그리고 [\\a].
[^...] 부류에 없는 문자에 부합합니다. 예를 들어, [^/]*는 정사선이 아닌문자가 0회 이상 나타나면 부합합니다. 예를 들어 http://. 비슷하게, [^0-9xyz]는 숫자가 아니고 소문자 x, y, 또는 z가 아니면 부합합니다.
\d | 숫자 하나에 부합합니다 (문자 부류 [0-9]와 동등합니다). 역으로, 대문자 \D는 "숫자가 아닌-문자 하나"에 부합합니다. 이것과 아래의 두 개는 부류 안에 사용할 수 있습니다; 예를 들어, [\d.-]는 "숫자, 마침표, 또는 뺄셈 기호"를 뜻합니다.
\s | 공백 문자에 부합합니다. 주로 스페이스, 탭, 그리고 새줄문자 (`r 그리고 `n)에 부합합니다. 반대로, 대문자 \S는 "공백 문자가 아닌-문자"를 뜻합니다.
\w | "단어" 문자에 부합합니다. 즉 알파벳숫자나 밑줄문자에 부합합니다. 이것은 문자부류 [a-zA-Z0-9_]와 동등합니다. 역으로, 대문자 \W는 "단어 문자가 아닌-문자"를 뜻합니다.
^
$

윗꺽쇠 (^)와 달러 사인($)은 닻(anchors)라고 부릅니다. 왜냐하면 문자를 소비하지 않기 때문입니다; 대신에, 패턴을 검색될 문자열의 선두 또는 후미에 고정합니다.

^는 패턴의 선두에 나타나면 부합이 한 줄의 맨 앞에서 일어나야 합니다. 예를 들어, ^abc는 abc123에는 부합하지만 123abc에는 부합하지 않습니다.

$가 패턴의 후미에 나타나면 부합이 한 줄의 맨 뒤에서 일어나야 합니다. 예를 들어, abc$는 123abc에는 부합하지만 abc123에는 부합하지 않습니다.

두 개의 닻을 조합해 사용할 수 있습니다. 예를 들어, ^abc$는 abc에만 부합합니다 (즉, 앞 뒤에 아무 문자도 없어야 합니다).

검색될 텍스트에 여러 줄이 포함되어 있다면, "m" 옵션을 수단으로 닻을 텍스트 전체가 아니라 각 줄에 적용할 수 있습니다. 예를 들어, m)^abc$는 123`r`nabc`r`n789에 부합합니다. 그러나 "m" 옵션이 없다면, 부합하지 않습니다.
\b | \b는 "단어 경계"를 뜻하는데, 문자를 소비하지 않기 때문에 닻과 비슷합니다. 현재 문자의 상태가 단어 문자(\w)의 반대가 되기를 요구합니다. 전형적으로 다른 단어 안에 나타나는 단어에 우발적으로 부합하는 것을 피하기 위해 사용됩니다. 예를 들어, \bcat\b는 catfish에 부합하지 않지만, cat에는 그 둘레에 구두점 기호가 있든 공백문자가 있든 상관없이 부합합니다. 대문자 \B는 그 반대입니다: 현재 문자가 단어 경계에 있지 않기를 요구합니다.
| 수직 막대는 두 개 이상의 대안을 가릅니다. 대안 중 어느 것이라도 만족하면 부합합니다. 예를 들어, gray|grey는 gray와 grey에 모두 부합합니다. 비슷하게, 패턴 gr(a|e)y는 아래에 기술한 반괄호의 도움으로 같은 일을 합니다.
(...)

괄호로 둘러싸인 항목은 다음에 주로 많이 사용됩니다:

  • 평가의 순서를 결정합니다. 예를 들어, (Sun|Mon|Tues|Wednes|Thurs|Fri|Satur)day는 요일 이름에 부합합니다.
  • *, ?, +, 또는 {min,max}를 문자 하나가 아니라 일련의 문자에 적용합니다. 예를 들어, (abc)+는 문자열 "abc"가 하나 이상 나타나면 부합합니다; 그래서 abcabc123는 부합하지만 ab123이나 bc123에는 부합하지 않습니다.
  • abc(.*)xyz에서 점-별과 같이 부패턴을 나포합니다. 예를 들어, RegExMatch()는 각 패턴에 부합하는 부문자열을 자신의 출력 배열에 저장합니다. 비슷하게, RegExReplace()는 $1와 같은 역참조를 통하여, 각 부패턴에 부합하는 부문자열을 결과에 삽입할 수 있습니다. 부패턴을 나포하는 부작용 없이 반괄호를 사용하려면, ?:를 앞쪽 두 개의 문자로 하여 괄호 안에 지정하십시오; 예를 들어: (?:.*)
  • 바로바로 옵션을 변경합니다. 예를 들어, (?im)는 패턴의 나머지에 대하여 (또는 부패턴 안에서 일어나면 부패턴에) 대소문자 구별과 여러 줄 옵션을 켭니다. 역으로, (?-im)는 그 둘을 다 끕니다. DPS`r`n`a를 제외하고 모든 옵션을 지원합니다.
\t
\r
etc.

이 피신 연속열은 특수 문자를 의미합니다. 가장 많이 사용되는 것은 \t (탭), \r (캐리지 리턴), 그리고 \n (줄넘김)입니다. 오토핫키에서 액센트 (`)는 선택적으로 이런 경우 역사선 대신 사용할 수 있습니다. \xhh 형태의 피신 연속열도 지원합니다. 여기에서 hh는 00부터 FF 사이의 ANSI 문자의 십육진 코드입니다.

v1.0.46.06+에서, \R는 "종류에 상관없이 새줄 하나"를 뜻합니다. 즉, `a 옵션에 나열되어 있는 줄들을 뜻합니다 (그렇지만, 문자 부류 안에서 \R은 그저 기호 "R"에 불과합니다). v1.0.47.05+에서, \R를 CR, LF, 그리고 CRLF로 제한할 수 있습니다. (옵션 바로 뒤) 패턴의 앞에 대문자로 (*BSR_ANYCRLF)를 지정하면 됩니다; 예, im)(*BSR_ANYCRLF)abc\Rxyz
\p{xx}
\P{xx}
\X

[AHK_L 61+]: 유니코드 문자 특성. ANSI 빌드는 지원하지 않습니다. \p{xx}는 xx 특성이 있는 문자에 부합합니다. 반면에 \P{xx}는 xx 특성이 없는 문자에 부합합니다. 예를 들어, \pL는 어느 기호에나 부합하고 \p{Lu}는 대문자 기호이면 부합합니다. \X는 확장 유니코드 연속열을 형성하기만 하면 문자의 개수에 상관없이 부합합니다.

지원되는 특성 이름과 기타 자세한 정보를 담은 완전한 목록은 www.pcre.org/pcre.txt에서 "\p{xx}"를 검색해 보십시오.
(*UCP)

[AHK_L 61+]: 수행성능을 위해, \d, \D, \s, \S, \w, \W, \b 그리고 \B는 기본값으로 ASCII 문자만 인지합니다. 유니코드 빌드도 마찬가지입니다. 패턴이 (*UCP)로 시작하면, 유니코드 특성을 사용하여 어느 문자에 부합할지 결정합니다. 예를 들어, , \w는 [\p{L}\p{N}_]와 동등해지고 \d는 \p{Nd}와 동등해집니다.

탐욕적: 기본값입니다, *, ?, +, 그리고 {min,max}는 탐욕적입니다. 왜냐하면 여전히 전체 패턴을 만족시키기만 하면 마지막 가능한 문자까지 모든 문자를 소비하기 때문입니다. 대신에 가능한 첫 문자에 멈추게 하고 싶다면, 다음에 물음표를 덧붙이십시오. 예를 들어, (물음표 없는) 패턴 <.+>는 다음과 같은 뜻입니다: "<를 찾고, 다음에 하나 이상의 문자들이 따라오고, 다음에 >이 따라오는 문자열을 찾아라". 이 패턴이 전체 문자열 <em>text</em>에 부합하지 못하도록 막으려면, 물음표를 덧셈 부호 뒤에 추가하십시오: <.+?>. 이렇게 하면 부합이 첫 번째 '>'에서 멈추고 그리하여 첫 번째 태그 <em>에만 부합합니다.

내다-보기와 돌아-보기 표명: 그룹 (?=...), (?!...), (?<=...), 그리고 (?<!...)는 표명(assertions)이라고 부릅니다. 왜냐하면 조건은 만족하도록 요구하지만 문자를 전혀 소비하지 않기 때문입니다. 예를 들어, abc(?=.*xyz) 는 내다-보기 표명입니다. 문자열 xyz가 문자열 abc의 오른쪽 어딘가에서 끝나기를 요구합니다 (그렇지 않다면, 전체 패턴을 부합한 것으로 간주하지 않습니다). (?=...)는 긍정 내다-보기로 부릅니다. 왜냐하면 지정된 패턴이 존재하기를 요구하기 때문입니다. 반대로, (?!...)는 부정 내다-보기 입니다. 왜냐하면 지정한 패턴이 존재하지 않기를 요구합니다. 비슷하게, (?<=...)와 (?<!...)는 (각각) 긍정 그리고 부정 돌아-보기입니다. 왜냐하면 현재 위치에서 오른쪽이 아니라 왼쪽을 돌아 보기 때문입니다. 돌아-보기는 내다-보기보다 제한이 더 많습니다. 왜냐하면 *, ?, 그리고 +와 같은 다양한 크기의 수량자를 지원하지 않기 때문입니다. 피신 연속열 \K는 돌아-보기 표명과 비슷해 보입니다. 왜냐하면 이전에-부합된 문자를 최종 부합 결과에서 빼버리기 때문입니다. 예를 들어, foo\Kbar는 "foobar"에 부합하지만 "bar"에 부합했다고 보고합니다.

관련 항목: 정규 표현식은 RegExMatch(), RegExReplace(), 그리고 SetTitleMatchMode가 지원합니다.

마지막 당부: 이 페이지가 아주 사용되는 RegEx 특징의 대부분을 다루고 있지만, 이 말고도 조건적 부분 패턴 같이, 탐험해 볼 만한 수 많은 특징이 있습니다. 완전한 PCRE 매뉴얼은 www.pcre.org/pcre.txt에 있습니다.


Regular Expression Callouts

정규 표현식 Callouts [AHK_L 14+]

외부호출(Callouts)은 정규 표현식 일치 작업 중간에 임시로 제어를 스크립트에 넘기는 수단을 제공합니다. PCRE-표준 callout 특징에 관한 더 자세한 정보는 pcre.txt를 참조하십시오.

콜아웃은 현재 RegExMatch 그리고 RegExReplace만 지원합니다.

구문

오토핫키에서 callout 구문은 (?CNumber:Function)입니다. Number와 Function 모두 선택적입니다. 쌍점 ':'은 Function가 지정되었을 경우에만 허용됩니다. Number를 생략하면 선택적입니다. Function가 지정되었지만 사용자-정의 함수의 이름이 아니면, 컴파일 에러가 일어나고 패턴-일치가 시작되지 않습니다.

Function을 생략하면, 함수 이름을 븐드시 pcre_callout이라는 이름의 변수에 지정해야 합니다. 이 이름으로 전역 변수와 지역 변수가 모두 존재하면, 지역 변수가 우선 순위를 갖습니다. pcre_callout에 사용자-정의 함수 이름이 없으면, Function이 생략된 callouts은 무시됩니다.

Callout 함수

Function(Match, CalloutNumber, FoundPos, Haystack, NeedleRegEx)
{
    ...
}

Callout 함수는 매개변수를 5 개 까지 정의할 수 있습니다:

  • Match: 필요하면 배열 변수의 생성도 포함해서 RegExMatch의 UnquotedOutputVar와 동등합니다.
  • CalloutNumber: 콜아웃의 Number를 받습니다.
  • FoundPos: 현재의 잠재적인 부합의 위치를 받습니다.
  • Haystack: RegExMatch 또는 RegExReplace에 건네어진 Haystack을 받습니다.
  • NeedleRegEx: RegExMatch 또는 RegExReplaceReceives에 건네어진 NeedleRegEx를 받습니다.

이 이름들은 그냥 제시 용일 뿐입니다. 실제 이름은 다를 수 있습니다.

패턴-일치는 콜아웃 함수의 결과에 따라 계속 진행되거나 실패합니다:

  • 콜아웃 함수가 0을 돌려주거나 숫치 값을 돌려주지 않으면, 부합은 정상대로 진행됩니다.
  • 함수가 1 이상을 돌려주면, 현재 위치의 부합은 실패합니다. 그러나 다른 부합의 가능성 테스트는 계속 진행됩니다.
  • 함수가 -1을 돌려주면, 부합을 포기합니다.
  • 함수가 -1보다 작은 값을 돌려주면, PCRE 에러 코드로 간주하고 부합을 포기합니다. RegExMatch는 빈 문자열을 돌려주는 반면에, RegExReplace는 원래의 Haystack을 돌려줍니다. 어느 경우든, ErrorLevel에 에러 코드가 담깁니다.

예를 들어:

Haystack = The quick brown fox jumps over the lazy dog.
RegExMatch(Haystack, "i)(The) (\w+)\b(?CCallout)")
Callout(m) {
    MsgBox m=%m%`nm1=%m1%`nm2=%m2%
    return 1
}

위의 예제에서, Func는 콜아웃 앞의 패턴 일부에 부합하는 부문자열마다 한 번씩 호출됩니다. \b는 부합에서 불완전한 단어들을 배제하는 데 사용됩니다. 예를 들어 The quic, The qui, The qu, 등등은 단어가 아니므로 제외됩니다.

EventInfo

A_EventInfo를 통하여 pcre_callout_block 구조체에 접근하면 추가 정보를 얻을 수 있습니다 .

version           := NumGet(A_EventInfo,  0, "Int")
callout_number    := NumGet(A_EventInfo,  4, "Int")
offset_vector     := NumGet(A_EventInfo,  8)
subject           := NumGet(A_EventInfo,  8 + A_PtrSize)
subject_length    := NumGet(A_EventInfo,  8 + A_PtrSize*2, "Int")
start_match       := NumGet(A_EventInfo, 12 + A_PtrSize*2, "Int")
current_position  := NumGet(A_EventInfo, 16 + A_PtrSize*2, "Int")
capture_top       := NumGet(A_EventInfo, 20 + A_PtrSize*2, "Int")
capture_last      := NumGet(A_EventInfo, 24 + A_PtrSize*2, "Int")
pad := A_PtrSize=8 ? 4 : 0  ; Compensate for 64-bit data alignment.
callout_data      := NumGet(A_EventInfo, 28 + pad + A_PtrSize*2)
pattern_position  := NumGet(A_EventInfo, 28 + pad + A_PtrSize*3, "Int")
next_item_length  := NumGet(A_EventInfo, 32 + pad + A_PtrSize*3, "Int")
if version >= 2
    mark   := StrGet(NumGet(A_EventInfo, 36 + pad + A_PtrSize*3, "Int"), "UTF-8")

더 자세한 정보는 pcre.txt, NumGet 그리고 A_PtrSize를 참조하십시오.

Auto-Callout

패턴의 옵션에 C를 포함하면 auto-callout 모드가 켜집니다. 이 모드에서 (?C255)와 동등한 콜아웃이 패턴의 각 항목 앞에 삽입됩니다. 예를 들어, 다음 템플릿을 사용하면 정규 표현식을 디버그할 수 있습니다:

; 기본 콜아웃 함수를 설정합니다.
pcre_callout = DebugRegEx

; 자동-콜아웃 옵션 C를 가지고 RegExMatch를 호출합니다.
RegExMatch("xxxabc123xyz", "C)abc.*xyz")

DebugRegEx(Match, CalloutNumber, FoundPos, Haystack, NeedleRegEx)
{
    ; 다음 필드들에 대한 설명은 pcre.txt를 참조하십시오.
    start_match       := NumGet(A_EventInfo, 12 + A_PtrSize*2, "Int")
    current_position  := NumGet(A_EventInfo, 16 + A_PtrSize*2, "Int")
    pad := A_PtrSize=8 ? 4 : 0
    pattern_position  := NumGet(A_EventInfo, 28 + pad + A_PtrSize*3, "Int")
    next_item_length  := NumGet(A_EventInfo, 32 + pad + A_PtrSize*3, "Int")

    ; 다음과 같이 표시: >>현재 부합<<.
    _HAYSTACK:=SubStr(Haystack, 1, start_match)
        . ">>" SubStr(Haystack, start_match + 1, current_position - start_match)
        . "<<" SubStr(Haystack, current_position + 1)

    ; 다음과 같이 표시: >>평가될 다음 항목<<.
    _NEEDLE:=  SubStr(NeedleRegEx, 1, pattern_position)
        . ">>" SubStr(NeedleRegEx, pattern_position + 1, next_item_length)
        . "<<" SubStr(NeedleRegEx, pattern_position + 1 + next_item_length)

    ListVars
    ; 계속하려면 Pause를 누르십시오.
    Pause
}

논평

콜아웃은 현재의 의사-쓰레드에서 실행됩니다. 그러나 콜아웃 함수가 반환된 후에 A_EventInfo의 이전 값이 복구됩니다. RegExMatch 또는 RegExReplace가 돌아오기 바로 전까지 ErrorLevel은 설정되지 않습니다.

PCRE는 어떤 경우에 부합이 불가능하다고 판단하면 일찍 취소되도록 최적화되어 있습니다. 그런 경우라면 모든 콜아웃에 대하여 이런 최적화를 끌 필요가 있습니다. 패턴의 처음에 (*NO_START_OPT) 를 지정하면 됩니다. 이 기능은 v1.1.05 이상을 요구합니다.


Remapping Keys and Buttons

키와 버튼 리맵하기

들어가는 말

한계: 아래에 기술하는 오토핫키의 리맵핑 특징은 일반적으로 윈도우즈 레지스트리를 통하여 리맵핑 하는 것에 비해 순수하지 못하며 효과도 그에 못 미칩니다. 각 접근법의 장점과 단점에 관한 것은 레지스트리 리맵핑을 참조하십시오.

키보드와 마우스 리맵하기

내장 리맵핑 특징의 구문은 OriginKey::DestinationKey입니다. 예를 들어, 다음 줄만 들어있는 스크립트는 "a" 키를 마치 "b" 키처럼 행동하게 만듭니다:

a::b

위의 예제는 "b" 키 자체를 변경하지 않습니다. "b" 키는 계속해서 "b" 키눌림을 전송합니다. 다음 예제와 같이 다른 것에 리맵하지만 않는다면 말입니다:

a::b
b::a

위의 예제는 소문자를 사용합니다. 대부분의 목적에 소문자를 권합니다. 왜냐하면 상응하는 대문자도 리맵되기 때문입니다 (즉, Capslock이 "켜져" 있거나 Shift 키가 눌리면 대문자가 전송됩니다). 대조적으로, 대문자를 오른쪽에 지정하면 대문자를 강제합니다. 예를 들어, 다음 줄은 (Capslock이 꺼져 있는 한) "a"나 "A"를 누를 때 대문자 B를 생산합니다:

a::B

마우스 리맵핑: 키보드 대신에 마우스를 리맵하려면 같은 접근법을 사용합니다. 예를 들어:

MButton::Shift | 가운데 버튼을 마치 Shift 키처럼 행동하게 만듭니다.
XButton1::LButton | 네 번째 마우스 버튼을 왼쪽 버튼처럼 행위하게 만듭니다.
RAlt::RButton | 오른쪽 Alt 키를 오른쪽 마우스 버튼 처럼 행위하게 만듭니다.

다른 유용한 리맵핑:

Capslock::Ctrl | Capslock을 Control 키가 되도록 만듭니다. Capslock을 그대로 켜고 끌 수 있도록 하기 위해, 먼저 +Capslock::Capslock 리맵핑을 추가합니다. 이렇게 하면 Shift 키를 누른 채 Capslock을 누를 때 Capslock을 토글합니다. 두 리맵핑 모두 추가 수식키가 눌려 있는 것을 허용하기 때문에, 더 구체적으로 +Capslock::Capslock 리맵핑을 먼저 배치해야 Capslock::Ctrl이 작동할 수 있습니다.
XButton2::^LButton | 다섯 번째 마우스 버튼을 (XButton2) Control-LeftClick이 되도록 만듭니다.
RAlt::AppsKey | 오른쪽 Alt 키는Apps 키가 됩니다 (문맥 메뉴를 여는 키입니다).
RCtrl::RWin | 오른쪽 Control 키를 오른쪽 Windows 키가 되도록 만듭니다.
Ctrl::Alt | Control 키를 Alt 키처럼 행위하도록 만듭니다. 그렇지만, alt-tab 문제를 참조하십시오.
^x::^c | Control-X가 Control-C를 생산합니다. 또 Control-Alt-X는 Control-Alt-C, 등등을 생산합니다.
RWin::Return | 오른쪽 Windows 키를 불능으로 만듭니다. 단순히 return을 할당했습니다.

이 예제들을 시험해 볼 수 있습니다. 새 텍스트 파일로 "Remap.ahk"와 같이 복사한 다음, 그 파일을 기동시킵니다.

완전한 키목록과 마우스 버튼 이름 목록은 키 리스트를 참조하십시오.

논평

지시어 #IfWinActive/Exist를 사용하면 선택된 리맵핑을 지정한 창에 대해서만 켤 수 있습니다. 예를 들어:

#IfWinActive ahk_class Notepad
a::b  ;  'a'키가 'b' 키를 전송하도록 만들지만, 오직 노트 패드 안에서만 일어납니다.
#IfWinActive  ; 잇다르는 리맵핑과 핫키가 모든 창에 효력을 미칩니다.

키나 마우스를 리맵핑 하는 일은 다음과 같은 관점에서 "완벽합니다":

  • Control나 Shift 같은 수식 키를 누른 채로 원래의 키를 타자하면 그 수식키가 목표 키에 효과를 발휘합니다. 예를 들어, b::a는 Control-B를 누르면 Control-A를 생산합니다 .
  • Capslock은 일반적으로 리맵된 키에 정상 키와 마찬가지 방식으로 영향을 미칩니다.
  • 원래 키를 계속 누르고 있는 동안 목표 키나 목표 버튼이 눌려집니다. 그렇지만, 어떤 게임은 리맵핑을 지원하지 않습니다; 그런 경우, 키보드와 마우스는 리맵되지 않은 것처럼 행위합니다.
  • 리맵된 키는 눌려 있는 동안 자동으로 반복합니다 (마우스 버튼이 되도록 리맵된 키는 제외).

리맵된 키를 정상 키처럼 촉발시킬 수 있지만, 기본값으로 마우스 핫키나 갈고리 핫키는 촉발시킬 수 없습니다. (ListHotkeys를 사용하면 어느 핫키가 "갈고리")인지 알 수 있습니다. 예를 들어, 리맵핑 a::b가 작동 중일 때, Ctrl-Alt-A를 누르면 ^!b 핫키가 촉발됩니다. 오직 ^!b가 갈고리 핫키가 아닐 경우에만 그렇습니다. ^!b가 갈고리 핫키일 경우, ^!a를 핫키로 정의하면 Ctrl-Alt-A 는 Ctrl-Alt-B와 같은 행위를 수행합니다. 예를 들어:

a::b
^!a::
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

대안적으로, v1.1.06 이후에서, #InputLevel를 사용하면 기본 행위를 오버라이드할 수 있습니다. 예를 들어:

#InputLevel 1
a::b

#InputLevel 0
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

SendMode가 자동 실행 섹션에 사용중이면 (스크립트 상단 부분), 모든 리맵핑에 영향을 미칩니다. 그렇지만, 리맵핑은 Send {Blind}를 사용하고 SendPlay mode는 완전하게 {Blind}를 지원하지는 못하기 때문에, 어떤 리맵핑은 SendPlay 모드에서 제대로 작동하지 않을 수도 있습니다 (특, Control, Shift, Alt, 그리고 Win). 이를 돌아가려면, 리맵핑을 사용할 때 SendPlay를 자동-실행 섹션에 사용하지 마십시오; 그 다음부터 다른 곳에는 명령어 SendPlay vs. Send를 사용하시면 됩니다. 대안적으로, 리맵핑을 핫키로 번역할 수 있습니다. (아래에 기술하는 바와 같이) 명시적으로 SendEvent vs. Send를 호출합니다.

스크립트가 기동할 때, 각 리맵핑은 한 쌍의 핫키로 번역됩니다. 예를 들어, a::b가 들어있는 스크립트는 실제로는 대신에 다음의 두 핫키가 들어 있습니다:

*a::
SetKeyDelay -1   ; 목표 키가 마우스 버튼이면, 대신에 SetMouseDelay가 사용됩니다.
Send {Blind}{b DownTemp}  ; DownTemp는 Down과 같습니다. 단 다른 Send 명령어는 "b" 가 Send하는 동안 눌려 있을 것이라고 가정하지 않습니다.
return

*a up::
SetKeyDelay -1  ; 왜 눌림-지속시간이 이 SetKeyDelays 중 하나로 지정되지 않는지 그 이유는 아래를 보십시오.
Send {Blind}{b Up}
return

그렇지만, 위의 핫키는 다음과 같은 상황에서 달라집니다:

  1. 소스 키가 LCtrl이고 목표 키가 Alt 키일 때, 줄 Send {Blind}{LAlt DownTemp}는 Send {Blind}{LCtrl Up}{LAlt DownTemp}로 교체됩니다. 소스가 RCtrl일 경우도 마찬가지입니다. 단, {RCtrl up}이 사용되는 경우는 예외입니다.
  2. 키보드 키가 마우스 버튼으로 리맵중일 때 (예, RCtrl::RButton), 위의 핫키는 SetKeyDelay 대신에 SetMouseDelay를 사용합니다. 게다가, 위의 첫 핫키는 다음으로 교체됩니다. 이 때문에 키보드의 자동-반복 특징은 반복적인 마우스 클릭을 만들어 내지 못합니다:
    *RCtrl::
SetMouseDelay -1
if not GetKeyState("RButton")  ; 즉, 오른쪽 버튼이 아직 눌리지 않았습다.
    Send {Blind}{RButton DownTemp}
return

SetKeyDelay의 두 번째 매개변수는 (눌림 지속 시간) 위의 핫키에서 생략됩니다. {b down}과 {b up}과 같이 누름만 있거나 뗌만 있는 이벤트에는 눌림 지속 시간이 적용되지 않기 때문입니다. 그렇지만, Shift/Ctrl/Alt/Win 키의 상태 변화에는 적용됩니다. 예를 들어 a::B나 a::^b와 같은 리맵핑에 영향을 미칩니다. 결론적으로, 스크립트가 자동-실행 섹션를 통하여 효과를 준 모든 누름 지속 시간은 모든 리맵핑에 적용됩니다.

한 쌍의 키를 직접적으로 하나의 키에 리맵할 수는 없지만 (예, a & c::b과 같이 작성하는 것은 무효입니다), 명시적으로 저 위에 있는 예제로부터 위 아래 핫키를 추가하면 이 효과를 얻을 수 있습니다: 그냥 *a::를 with a & c::로, 그리고 *a up::를 a & c up::로 교체하기만 하면 됩니다.

리맵핑은 위에 기술한 바와 같이 핫키로 번역되기 때문에, Suspend 명령어에 영향을 받습니다. 비슷하게, Hotkey 명령어는 리맵핑을 변경하거나 끌 수 있습니다. 예를 들어, 다음 두 명령어는 리맵핑 a::b를 끕니다.

Hotkey, *a, off
Hotkey, *a up, off

Alt-tab 문제: 키나 마우스 버튼을 Alt 키가 되도록 리맵했다면, 그 키는 아마도 제대로 alt-tab을 작동시키지 못할 것입니다. 가능한 해결책은 핫키 *Tab::Send {Blind}{Tab}를 추가하는 것입니다 -- 그러나 진짜 핫키가 알트 탭을 수행할 때 간섭을 일으킬 가능성이 높다는 점을 명심하십시오. 그러므로, 오직 리맵된 alt-tab 핫키만 단독으로 사용할 경우에만 사용을 고려해야 합니다.

키 리스트 페이지에 나열된 키와 마우스 버튼 말고도, 소스 키로는 가상 키 (VKnn) 또는 스캔 코드 (SCnnn)도 가능합니다. 이는 특수 키 페이지에 기술되어 있습니다. 목표 키도 마찬가지입니다. 단, 목표 키는 선택적으로 가상 키 다음에 스캔 코드를 지정할 수도 있습니다. 예를 들어, sc01e::vk42sc030는 대부분의 키보드 배치도에서 a::b과 동등합니다.

키를 리맵하기 보다 끄려면, 그냥 반환되는 핫키로 만들면 됩니다. 예를 들어, F1::return는 F1 키를 불능으로 만듭니다.

다음 키는 내장 리맵핑 메쏘드가 지원하지 않습니다:

  • 마우스 휠 (WheelUp/Down/Left/Right).
  • Pause 그리고 Break를 목표 키로 불가 (명령어 이름에 일치하기 때문에 불가).
  • 활괄호 {}를 목표 키로 불가. 대신에 VK/SC 방법을 사용하십시오; 예, x::+sc01A 그리고 y::+sc01B.
  • 퍼센트 사인(%)을 목표 키로 불가. 대신에 VK/SC 방법을 사용하십시오.
  • "Return"을 목표 키로 불가. 대신에 "Enter"를 사용하십시오.

키보드로 마우스 커서 이동하기

키보드를 사용하여 마우스 커서를 이동할 수 있습니다. 예제는 완벽하게 기능을 갖춘 Keyboard-To-Mouse 스크립트를 보십시오. 스크립트는 부드러운 마우스 이동과, 가속, 기타 특징을 제공하기 때문에, 키보드로 마우스 작업을 많이 할 계획이 있다면 권장하는 접근법입니다. 대조적으로, 다음 예제는 좀 간단합니다:

*#up::MouseMove, 0, -10, 0, R  ; Win+UpArrow hotkey => 커서를 위로 이동시킵니다
*#Down::MouseMove, 0, 10, 0, R  ; Win+DownArrow => 커서를 아래로 이동시킵니다
*#Left::MouseMove, -10, 0, 0, R  ; Win+LeftArrow => 커서를 위로 왼쪽으로시킵니다
*#Right::MouseMove, 10, 0, 0, R  ; Win+RightArrow => 커서를 위로 오른쪽으로시킵니다

*<#RCtrl::  ; LeftWin + RightControl => Left-click (Control/Shift을 누른 채로 Control-Click 또는 Shift-Click).
SendEvent {Blind}{LButton down}
KeyWait RCtrl  ; 키보드 자동-반복이 마우스 클릭을 반복시키지 못하도록 막습니다.
SendEvent {Blind}{LButton up}
return

*<#AppsKey::  ; LeftWin + AppsKey => Right-click
SendEvent {Blind}{RButton down}
KeyWait AppsKey  ; 키보드 자동-반복이 마우스 클릭을 반복시키지 못하도록 막습니다.
SendEvent {Blind}{RButton up}
return

레지스트리의 "스캔코드 맵" 리맵핑하기

장점:

  • 레지스트리 리맵핑은 일반적으로 오토핫키의 리맵핑보다 더 순수하고 효과적입니다. 예를 들어 더 넓은 범위의 게임에 작동하고, alt-tab 문제도 없는 것으로 알려져 있으며, 그리고 AutoHotkey의 갈고리 핫키를 촉발시킬 수 있습니다 (반면 오토핫키의 리맵핑은 우회책이 필요합니다).
  • 레지스트리 엔트리를 손수 만들기로 결정했더라도 (아래에 설명), 키보드를 리맵하는데 절대 외부 소프트웨어가 필요하지 않습니다.KeyTweak을 사용하여 레지스트리 엔트리를 만든다고 할지라도, KeyTweak이 항상 실행중이어야 할 필요는 없습니다 (AutoHotkey와 다릅니다).

단점:

  • 레지스트리 리맵핑은 상대적으로 영구적입니다: 변경을 언두하거나 새 변경이 효과가 있으려면 재부팅해야 할 필요가 있습니다.
  • 그의 효과는 전역적입니다: 특정한 사용자나 어플리케이션 또는 로케일에 맞게 리맵핑을 만드는 것은 불가능합니다.
  • Shift, Control, Alt, 또는 AltGr 으로 수식된 키눌림은 전송하지 않습니다. 예를 들어, 소문자를 대문자로 리맵할 수 없습니다.
  • 키보드만 지원합니다 (AutoHotkey는 마우스 리맵핑과 제한적이나마 조이스틱 리맵핑을 지원합니다).

레지스트리에 변경을 적용하는 법: 레지스트리를 통하여 키를 리맵하는 데 적어도 두 가지 방법이 있습니다:

  1. KeyTweak (무료웨어)와 같은 프로그램을 사용하여 시각적으로 키를 리맵합니다. 대신 레지스트리를 변경해 줍니다.
  2. 수동으로 키를 리맵합니다. .reg 파일 (평범한 텍스트)를 만들어 레지스트리 안으로 적재하면 됩니다. 이 방법은 www.autohotkey.com/forum/post-56216.html#56216에 예시되어 있습니다.

관련 주제

키와 마우스 버튼 목록
GetKeyState
조이스틱 리맵핑하기


Remapping a Joystick to Keyboard or Mouse

조이스틱을 키보드나 마우스에 리맵하기

목차

  • 중요한 고지 사항
  • 조이스틱 버튼이 키눌림이나 마우스 클릭을 전송하게 만들기
  • 조이스틱 Axis 또는 POV Hat이 키눌림이나 마우스 클릭을 전송하게 만들기
  • 논평

중요한 고지 사항

  • 모든 조이스틱 버튼이나 축을 키나 마우스 버튼이 되도록 리맵할 수는 있지만, 어떤 조이스틱 버튼이나 축은 리맵할 수 없습니다. 그럴 경우는 PPJoy 같은 조이스틱 에뮬레이터의 도움을 받아야만 합니다.
  • 오토핫키는 조이스틱의 각 버튼을 1과 32 사이의 번호로 식별합니다. 이 번호를 결정하려면 조이스틱 테스트 스크립트를 사용하십시오.

조이스틱 버튼이 키눌림이나 마우스 클릭을 보내도록 만들기

아래에 세 가지 접근법이 있습니다. 가장 쉬운 방법에서 시작하여 가장 복잡한 방법으로 끝납니다. 복잡한 방법은 광범위한 상황에 작동합니다 (예를 들어 키나 마우스 버튼을 누른 채로 있기를 요구하는 게임).

방법 #1: 이 방법은 간단한 키눌림과 마우스 클릭을 전송합니다. 예를 들어:

Joy1::Send {Left}  ; 버튼 #1이 왼쪽 화살표 키 눌림을 전송하도록 만듭니다.
Joy2::Click  ; 버튼 #2가 왼쪽 마우스 버튼 클릭을 전송하도록 만듭니다.
Joy3::Send a{Esc}{Space}{Enter}  ; 버튼 #3이 기호 "a" 와 다음에 피신 문자, 스페이스, 그리고 엔터를 전송하도록 만듭니다.
Joy4::Send Sincerely,{Enter}John Smith  ; 버튼 #4가 두 줄의 서명을 보내도록 만듭니다.

버튼에게 하나 이상의 명령어를 수행하도록 만들려면, 첫 명령어를 버튼 이름 아래에 두고 마지막 명령어를 return으로 만들면 됩니다. 예를 들어:

Joy5::
Run Notepad
WinWait Untitled - Notepad
WinActivate
Send 이 텍스트는 노트패드에 나타납니다.{Enter}
return

완전한 키와 마우스/조이스틱 버튼에 대한 키 목록을 참조하십시오.

방법 #2: 이 방법은 조이스틱 버튼을 누르고 있는 동안 키나 마우스 버튼이 반드시 눌려 있어야 하는 경우에 필수입니다. 다음 예제는 조이스틱의 두 번째 버튼이 왼쪽 화살표 키가 되도록 만듭니다:

Joy2::
Send {Left down}  ; 왼쪽 화살표 키를 누릅니다.
KeyWait Joy2  ; 사용자가 조이스틱 버튼을 뗄 때까지 기다립니다.
Send {Left up}  ; 왼쪽 화살표 키를 뗍니다.
return

방법 #3: 이 방법은 방법 #2에 기술된 유형의 조이스틱 핫키가 하나 이상 있고, 종종 그런 핫키를 동시에 누르고 떼어야 할 경우에 필수입니다. 다음 예제는 조이스틱의 세번째 버튼이 왼쪽 마우스 버튼이 되도록 만듭니다:

Joy3::
Send {LButton down}   ; 왼쪽 마우스 버튼을 누릅니다.
SetTimer, WaitForButtonUp3, 10
return

WaitForButtonUp3:
if GetKeyState("Joy3")  ; 버튼이 여전히 눌려 있습니다. 그래서 계속 기다립니다.
    return
; 그렇지 않으면, 버튼을 뗐습니다.
Send {LButton up}  ; 왼쪽 마우스 버튼을 뗍니다.
SetTimer, WaitForButtonUp3, off
return

자동-반복 키눌림: 어떤 프로그램이나 게임은 (마치 키보드를 계속 누른 채로 있는 것처럼) 키가 반복적으로 전송되기를 요구합니다. 다음 예제는 조이스틱의 두 번째 버튼을 누르고 있는 동안 스페이스바 키눌림을 반복적으로 전송합니다:

Joy2::
Send {Space down}   ; 스페이바를 누릅니다.
SetTimer, WaitForJoy2, 30  ; 번호를 30에서 20이나 10으로 줄여 더 빠르게 키를 전송합니다. 더 증가시키면 더 느리게 전송됩니다.
return

WaitForJoy2:
if not GetKeyState("Joy2")  ; 버튼을 뗐습니다.
{
    Send {Space up}  ; 스페이스바를 뗍니다.
    SetTimer, WaitForJoy2, off  ; 버튼 관제를 멈춥니다.
    return
}
; 위는 "반환되지 않았기 때문에", 버튼은 여전히 눌린 채로 있습니다.
Send {Space down}  ; 또다른 스페이스바 키눌림을 전송합니다.
return

문맥-감지 조이스틱 버튼: 지시어 #IfWinActive/Exist를 사용하면 선택된 조이스틱 버튼이 활성화 상태 또는 존재하는 창의 종류에 따라 다른 행위를 수행하도록 (또는 전혀 못하도록) 만들 수 있습니다.

조이스틱을 마우스처럼 사용하기: Joystick-To-Mouse 스크립트는 조이스틱을 그의 버튼과 축 콘트롤을 리맵핑하여 마우스로 탈바꿈시킵니다.

조이스틱 축 또는 POV Hat이 키눌림이나 마우스 클릭을 전송하도록 만들기

스크립트가 조이스틱 축이나 POV hat의 움직임에 반응하도록 만들려면, SetTimer과 GetKeyState를 사용하십시오. 다음 예제는 조이스틱의 X와 Y 축을 마치 키보드 위의 화살표 키 군처럼 행위하게 만듭니다 (상하좌우):

#Persistent  ; 스크립트를 사용자가 명시적으로 종료할 때까지 실행합니다.
SetTimer, WatchAxis, 5
return

WatchAxis:
GetKeyState, JoyX, JoyX  ; X 축의 위치를 얻습니다.
GetKeyState, JoyY, JoyY  ; Y 축의 위치를 얻습니다.
KeyToHoldDownPrev = %KeyToHoldDown%  ; Prev는 이제 이전에 놀린 키를 (있다면) 보유합니다.

if JoyX > 70
    KeyToHoldDown = Right
else if JoyX < 30
    KeyToHoldDown = Left
else if JoyY > 70
    KeyToHoldDown = Down
else if JoyY < 30
    KeyToHoldDown = Up
else
    KeyToHoldDown =

if KeyToHoldDown = %KeyToHoldDownPrev%  ; 올바른 키가 이미 눌려 있습니다 (또는 아무 키도 필요하지 않습니다).
    return  ; 아무것도 하지 않습니다.

; 그렇지 않으면, 이전의 키를 떼고 새로운 키를 누릅니다:
SetKeyDelay -1  ; 키눌림 사이에 지연을 피합니다.
if KeyToHoldDownPrev   ; 떼야 할 이전의 키가 있습니다.
    Send, {%KeyToHoldDownPrev% up}  ; 그 키를 뗍니다.
if KeyToHoldDown   ; 누를 키가 있습니다.
    Send, {%KeyToHoldDown% down}  ; 그 키를 누릅니다.
return

다음 예제는 조이스틱의 POV hat이 마치 키보드의 화살표 군처럼 행위하게 만듭니다; 즉, POV hat은 화살표 키눌림을 전송합니다 (상하좌우):

#Persistent  ; 사용자가 명시적으로 종료할 때까지 스크립트를 계속 실행합니다.
SetTimer, WatchPOV, 5
return

WatchPOV:
GetKeyState, POV, JoyPOV  ; POV 콘트롤의 위치를 얻습니다.
KeyToHoldDownPrev = %KeyToHoldDown%  ; Prev는 이제 이전에 눌린 키를 (있다면) 보유합니다.

; 어떤 조이스틱은 고정 증가되지 않고 부드러운/연속적인 POV를 가집니다.
; 그들 모두를 지원하려면, 범위를 사용하십시오:
if POV < 0   ; 보고할 각도가 없습니다
    KeyToHoldDown =
else if POV > 31500                 ; 315 도부터 360 도까지: 앞으로
    KeyToHoldDown = Up
else if POV between 0 and 4500      ; 0 도부터 45 도까지: 앞으로
    KeyToHoldDown = Up
else if POV between 4501 and 13500  ; 45 도부터 135 도까지: 오른쪽으로
    KeyToHoldDown = Right
else if POV between 13501 and 22500 ; 135 도부터 225 도까지: 아랫쪽으로
    KeyToHoldDown = Down
else                                ; 225 도부터 315 도까지: 왼쪽으로
    KeyToHoldDown = Left

if KeyToHoldDown = %KeyToHoldDownPrev%  ; 올바른 키가 이미 눌려 있습니다 (또는 아무 키도 필요하지 않습니다).
    return  ; 아무것도 하지 않습니다.

; 그렇지 않으면, 이전의 키를 떼고 새 키를 누릅니다:
SetKeyDelay -1  ; 키눌림 사이에 지연을 피합니다.
if KeyToHoldDownPrev   ; 떼야 할 이전의 키가 있습니다.
    Send, {%KeyToHoldDownPrev% up}  ; 그 키를 뗍니다.
if KeyToHoldDown   ; 누를 키가 있습니다.
    Send, {%KeyToHoldDown% down}  ; 그 키를 누릅니다.
return

키눌림 자동-반복하기: 두 예제 모두 단순히 키를 누르고 있는게 아니라 키를 반복적으로 전송하도록 변경할 수 있습니다 (즉, 키보드에서 물리적으로 키를 누르고 있는 것처럼 흉내낼 수 있습니다). 이렇게 하려면, 다음 줄을:

return  ; 아무것도 하지 않습니다.

다음과 같이 교체하십시오:

{
    if KeyToHoldDown
        Send, {%KeyToHoldDown% down}  ; 키눌림을 자동으로 반복합니다.
    return
}

논평

첫 번째 말고 다른 조이스틱을 사용할 수 있습니다. 버튼 이름이나 축 이름 앞에 조이스틱 버튼 번호를 주면 됩니다. 예를 들어, 2Joy1은 두 번째 조이스틱의 첫 번째 버튼입니다.

다른 유용한 조이스틱 스크립트를 발굴하려면 AutoHotkey 포럼을 방문하십시오. Joystick and GetKeyState and Send와 같은 키워드 검색이면 흥미로운 주제들을 얻을 수 있습니다.

관련 주제

Joystick-To-Mouse 스크립트 (조이스틱을 마우스로 사용하기)
조이스틱 버튼, 축, 그리고 콘트롤 리스트
GetKeyState
키보드와 마우스 리맵핑하기


PostMessage/SendMessage Tutorial

메시지를 창이나 그의 콘트롤에 보내기
by Rajat

이 페이지는 PostMessage와 SendMessage 명령어를 연구하고 다음과 같은 질문에 답합니다:

"어떻게 최소화된 창에 버튼을 누르는가?"
"WinMenuSelectItem이 메뉴 항목과 작동하지 않을 때 어떻게 메뉴 항목을 선택하는가?!"
"이것은 겉모습을 바꿀 수 있는 창이다.... 어떻게 해야 항상 작동하는 명령어를 전송하는가?"
"숨은 창은 어떻게 하는가?!"

필수 조건: AutoHotkey v1.0.09+ 그리고 Winspector Spy (http://www.softpedia.com/get/Security/Security-Related/Winspector.shtml)

첫 예제로서, WinMenuSelectItem가 아웃룩 익스프레스의 "New Message" 창의 메뉴 바와 작동하는 데 실패한다는 사실을 주목하십시오; 다시 말해, 다음 코드는 작동하지 않습니다:

WinMenuSelectItem, New Message,, &Insert, &Picture...

그러나 PostMessage가 그 일을 해 줄 수 있습니다:

PostMessage, 0x111, 40239, 0, , New Message

마법처럼 작동합니다! 그러나 도데체 이것은 무엇인가? 0x111는 wm_command 메시지의 십육진 코드이고 40239는 이 특정한 창이 메뉴 항목 'Insert Picture' 선택으로 이해하는 코드입니다. 이제 어떻게 40239와 같은 값을 찾는지 알려 드리겠습니다:

  1. Winspector Spy를 열고 "New Message" 창을 엽니다.
  2. 십자가 표식을 Winspector Spy 창으로부터 "New Message" 창의 타이틀바로 끕니다 (Winspector Spy에 덮히지 않는 부분으로 끄십시오).
  3. 왼쪽에 있는 리스트에서 선택된 창을 우클릭하고 'Messages'를 선택합니다.
  4. 빈 창에 우클릭하고 'Edit message filter'를 선택합니다.
  5. 'filter all' 버튼을 클릭한 다음 왼쪽 리스트에서 'wm_command'를 더블클릭합니다. 이런 식으로 하면 오직 이 메시지만 관제할 수 있습니다.
  6. 이제 "New Message" 창으로 가서 메뉴 바로부터 Insert > Picture를 선택합니다.
  7. 다시 Winspector Spy로 돌아와 신호등 버튼을 눌러 관제를 정지합니다.
  8. 그 동안 축적된 wm_command 메시지들을 확대합니다 (다른 것은 있더라도 무시합니다).
  9. (보통) 보고 싶은 것은 코드 0 메시지입니다. 종종 wm_command 메시지에 'win activated' or 'win destroyed' 기타 등등이 있을 수 있는데.. 필요하지 않습니다. 'Control ID: 40239'라고 말해주는 메시지를 발견했다면 ...바로 그것입니다!
  10. 이제 그것을 위의 명령어에 배치하면 완성입니다! 그것이 바로 wParam 값입니다.

다음 예제로 페인트 프로그램을 택하겠습니다. 왜냐하면 누구나가 있을 것이기 때문입니다. 이제 어플이 하나 있는데 오토핫키를 사용하여 툴바로부터 툴을 하나 선택해야 한다고 가정해 보겠습니다.

다음은 무엇을 할 것인가? 대부분은 아마도 툴바 버튼에 마우스 클릭을 예상할 겁니다. 그러나 툴바는 이동하고 숨을 수 있습니다! 페인트 툴바도 마찬가지입니다. 그래서 해당 사용자가 이렇게 구성해 두었다면, 스크립트는 그 시점에 바로 실패합니다. 그러나 다음 명령어는 여전히 작동합니다:

PostMessage, 0x111, 639,,,untitled - Paint

PostMessage의 또다른 장점은 창이 배경에 있을 수 있다는 것입니다; 대조적으로, 마우스 클릭은 창이 활성화되어 있기를 요구합니다.

다음에 몇 가지 예를 더 보여드리겠습니다. 주의: 필자는 WinXP Pro (SP1)을 사용합니다 ... 다른 OS를 사용한다면 매개변수가 다를 수 있습니다 (윈도우즈에 따라 오는 Wordpad 그리고 Notepad에만 적용할 수 있습니다; 다른 것은 매개변수가 다르지 않을 것입니다):

;Wordpad 에 군청색 쓰기를 설정합니다
PostMessage, 0x111, 32788, 0, , Document - WordPad
;Notepad의 관하여 상자를 엽니다
PostMessage, 0x111, 65, 0, , Untitled - Notepad
;Notepad에 워드랩을 토글합니다
PostMessage, 0x111, 32, 0, , Untitled - Notepad
;미디어 플레이어를 연주/정지합니다
PostMessage, 0x111, 32808, 0, , Windows Media Player
;실행 중인 AHK 스크립트의 핫키들을 보류합니다
DetectHiddenWindows, on
SetTitleMatchMode, 2
PostMessage, 0x111, 65305,,, MyScript.ahk - AutoHotkey ; 65306를 사용하면 정지(Pause) vs. 보류(Suspend)할 수 있습니다.

위는 PostMessage용이었습니다. SendMessage도 똑같이 작동하지만 추가로 반환 값을 기다립니다. 이 값을 사용하면 Winamp에서 현재 연주 중인 트랙을 얻을 수 있습니다 (예제는 Winamp 자동화하기를 참조하십시오).

다음에 몇 가지 더 주의 사항이 있습니다:

  • 위에서 OS가 XP이고 메시지 값이 OS 마다 다를 수 있다고 주의를 준 것은 순전히 경계 차원입니다. 여러분의 시스템에서 (특정 소프트웨어 버전과 함께) 작동하는 메시지를 발견했다면. 다른 시스템에도 같은 버전이 역시 작동할 것이라고 확신할 수 있습니다. 게다가, 대부분의 어플은 버전이 다르더라도 이 메시지 값을 똑 같이 유지합니다 (예, Windows Media Player 그리고 Winamp).
  • Winspector Spy 필터를 설정해 오직 wm_command만 보여주려고 하는데 여전히 한 무더기 메시지가 나온다면 그 메시지에 우클릭하고 hide (메지지 이름)을 선택하십시오... 목표 소프트웨어와 상호작용을 하지 않는 메시지들이 나타나기를 원하지는 않을 것입니다.
  • Winspector Spy에서 오른쪽 지시 화살표를 클릭하면 메시지 값들을 보여주고 흐릿한 왼쪽 지시 화살표는 반환 값을 보여줍니다. 0 (영) 값은 기본적으로 '에러 없음'으로 간주해도 안전합니다 (그것을 SendMessage에 사용하면, 반환값은 %ErrorLevel%에 담깁니다).
  • 제목에 부분적으로 부합시키려면 다음 코드를 스크립트에 추가하십시오:
    SetTitleMatchMode, 2
  • 숨은 창을 포스트하려면 다음 코드를 추가하십시오:
    DetectHiddenWindows, On

주의: 이 테크닉으로도 작동하지 않는 어플이 있습니다. VB 어플과 Delphi 어플에서 그런 경우를 만났습니다. 이 테크닉은 C, C++ 어플에 사용하는 것이 제일 좋습니다. VB 어플은 같은 명령어인데도 'LParam'이 실행할 때마다 끊임없이 변합니다. Delphi 어플은 GUI가 전혀 wm_command를 사용하지 않기도 합니다. 아마도 마우스의 위치와 클릭을 사용하는 듯 보입니다.

오토핫키 포럼에 가셔서 탐험해 보고 여러분의 경험을 공유하십시오. 피드백은 언제나 환영합니다!

이 자습서는 초보자를 위한 것이 아닙니다 (기분 나쁘게 할 의도는 없습니다). 왜냐하면 이 명령어들은 고급 특징으로 간주되기 때문입니다. 그래서 위의 글을 읽어 본 후에 잘 모르겠다면, 그냥 잊어 버리십시오.

-Rajat


List of Windows Messages

윈도우즈 메시지 목록

아래는 PostMessage와 SendMessage의 Msg 매개변수에 대한 값의 목록입니다. 특정 메시지를 사용하는 방법에 관한 더 많은 정보는 (예, WM_VSCROLL) http://msdn.microsoft.com을 검색해 보시거나 검색 엔진을 사용하십시오. 또, 메시지 자습서를 참조하십시오.

WM_NULL = 0x00
WM_CREATE = 0x01
WM_DESTROY = 0x02
WM_MOVE = 0x03
WM_SIZE = 0x05
WM_ACTIVATE = 0x06
WM_SETFOCUS = 0x07
WM_KILLFOCUS = 0x08
WM_ENABLE = 0x0A
WM_SETREDRAW = 0x0B
WM_SETTEXT = 0x0C
WM_GETTEXT = 0x0D
WM_GETTEXTLENGTH = 0x0E
WM_PAINT = 0x0F
WM_CLOSE = 0x10
WM_QUERYENDSESSION = 0x11
WM_QUIT = 0x12
WM_QUERYOPEN = 0x13
WM_ERASEBKGND = 0x14
WM_SYSCOLORCHANGE = 0x15
WM_ENDSESSION = 0x16
WM_SYSTEMERROR = 0x17
WM_SHOWWINDOW = 0x18
WM_CTLCOLOR = 0x19
WM_WININICHANGE = 0x1A
WM_SETTINGCHANGE = 0x1A
WM_DEVMODECHANGE = 0x1B
WM_ACTIVATEAPP = 0x1C
WM_FONTCHANGE = 0x1D
WM_TIMECHANGE = 0x1E
WM_CANCELMODE = 0x1F
WM_SETCURSOR = 0x20
WM_MOUSEACTIVATE = 0x21
WM_CHILDACTIVATE = 0x22
WM_QUEUESYNC = 0x23
WM_GETMINMAXINFO = 0x24
WM_PAINTICON = 0x26
WM_ICONERASEBKGND = 0x27
WM_NEXTDLGCTL = 0x28
WM_SPOOLERSTATUS = 0x2A
WM_DRAWITEM = 0x2B
WM_MEASUREITEM = 0x2C
WM_DELETEITEM = 0x2D
WM_VKEYTOITEM = 0x2E
WM_CHARTOITEM = 0x2F

WM_SETFONT = 0x30
WM_GETFONT = 0x31
WM_SETHOTKEY = 0x32
WM_GETHOTKEY = 0x33
WM_QUERYDRAGICON = 0x37
WM_COMPAREITEM = 0x39
WM_COMPACTING = 0x41
WM_WINDOWPOSCHANGING = 0x46
WM_WINDOWPOSCHANGED = 0x47
WM_POWER = 0x48
WM_COPYDATA = 0x4A
WM_CANCELJOURNAL = 0x4B
WM_NOTIFY = 0x4E
WM_INPUTLANGCHANGEREQUEST = 0x50
WM_INPUTLANGCHANGE = 0x51
WM_TCARD = 0x52
WM_HELP = 0x53
WM_USERCHANGED = 0x54
WM_NOTIFYFORMAT = 0x55
WM_CONTEXTMENU = 0x7B
WM_STYLECHANGING = 0x7C
WM_STYLECHANGED = 0x7D
WM_DISPLAYCHANGE = 0x7E
WM_GETICON = 0x7F
WM_SETICON = 0x80

WM_NCCREATE = 0x81
WM_NCDESTROY = 0x82
WM_NCCALCSIZE = 0x83
WM_NCHITTEST = 0x84
WM_NCPAINT = 0x85
WM_NCACTIVATE = 0x86
WM_GETDLGCODE = 0x87
WM_NCMOUSEMOVE = 0xA0
WM_NCLBUTTONDOWN = 0xA1
WM_NCLBUTTONUP = 0xA2
WM_NCLBUTTONDBLCLK = 0xA3
WM_NCRBUTTONDOWN = 0xA4
WM_NCRBUTTONUP = 0xA5
WM_NCRBUTTONDBLCLK = 0xA6
WM_NCMBUTTONDOWN = 0xA7
WM_NCMBUTTONUP = 0xA8
WM_NCMBUTTONDBLCLK = 0xA9

WM_KEYFIRST = 0x100
WM_KEYDOWN = 0x100
WM_KEYUP = 0x101
WM_CHAR = 0x102
WM_DEADCHAR = 0x103
WM_SYSKEYDOWN = 0x104
WM_SYSKEYUP = 0x105
WM_SYSCHAR = 0x106
WM_SYSDEADCHAR = 0x107
WM_KEYLAST = 0x108

WM_IME_STARTCOMPOSITION = 0x10D
WM_IME_ENDCOMPOSITION = 0x10E
WM_IME_COMPOSITION = 0x10F
WM_IME_KEYLAST = 0x10F

WM_INITDIALOG = 0x110
WM_COMMAND = 0x111
WM_SYSCOMMAND = 0x112
WM_TIMER = 0x113
WM_HSCROLL = 0x114
WM_VSCROLL = 0x115
WM_INITMENU = 0x116
WM_INITMENUPOPUP = 0x117
WM_MENUSELECT = 0x11F
WM_MENUCHAR = 0x120
WM_ENTERIDLE = 0x121

WM_CTLCOLORMSGBOX = 0x132
WM_CTLCOLOREDIT = 0x133
WM_CTLCOLORLISTBOX = 0x134
WM_CTLCOLORBTN = 0x135
WM_CTLCOLORDLG = 0x136
WM_CTLCOLORSCROLLBAR = 0x137
WM_CTLCOLORSTATIC = 0x138

WM_MOUSEFIRST = 0x200
WM_MOUSEMOVE = 0x200
WM_LBUTTONDOWN = 0x201
WM_LBUTTONUP = 0x202
WM_LBUTTONDBLCLK = 0x203
WM_RBUTTONDOWN = 0x204
WM_RBUTTONUP = 0x205
WM_RBUTTONDBLCLK = 0x206
WM_MBUTTONDOWN = 0x207
WM_MBUTTONUP = 0x208
WM_MBUTTONDBLCLK = 0x209
WM_MOUSEWHEEL = 0x20A
WM_MOUSEHWHEEL = 0x20E

WM_PARENTNOTIFY = 0x210
WM_ENTERMENULOOP = 0x211
WM_EXITMENULOOP = 0x212
WM_NEXTMENU = 0x213
WM_SIZING = 0x214
WM_CAPTURECHANGED = 0x215
WM_MOVING = 0x216
WM_POWERBROADCAST = 0x218
WM_DEVICECHANGE = 0x219

WM_MDICREATE = 0x220
WM_MDIDESTROY = 0x221
WM_MDIACTIVATE = 0x222
WM_MDIRESTORE = 0x223
WM_MDINEXT = 0x224
WM_MDIMAXIMIZE = 0x225
WM_MDITILE = 0x226
WM_MDICASCADE = 0x227
WM_MDIICONARRANGE = 0x228
WM_MDIGETACTIVE = 0x229
WM_MDISETMENU = 0x230
WM_ENTERSIZEMOVE = 0x231
WM_EXITSIZEMOVE = 0x232
WM_DROPFILES = 0x233
WM_MDIREFRESHMENU = 0x234

WM_IME_SETCONTEXT = 0x281
WM_IME_NOTIFY = 0x282
WM_IME_CONTROL = 0x283
WM_IME_COMPOSITIONFULL = 0x284
WM_IME_SELECT = 0x285
WM_IME_CHAR = 0x286
WM_IME_KEYDOWN = 0x290
WM_IME_KEYUP = 0x291

WM_MOUSEHOVER = 0x2A1
WM_NCMOUSELEAVE = 0x2A2
WM_MOUSELEAVE = 0x2A3

WM_CUT = 0x300
WM_COPY = 0x301
WM_PASTE = 0x302
WM_CLEAR = 0x303
WM_UNDO = 0x304

WM_RENDERFORMAT = 0x305
WM_RENDERALLFORMATS = 0x306
WM_DESTROYCLIPBOARD = 0x307
WM_DRAWCLIPBOARD = 0x308
WM_PAINTCLIPBOARD = 0x309
WM_VSCROLLCLIPBOARD = 0x30A
WM_SIZECLIPBOARD = 0x30B
WM_ASKCBFORMATNAME = 0x30C
WM_CHANGECBCHAIN = 0x30D
WM_HSCROLLCLIPBOARD = 0x30E
WM_QUERYNEWPALETTE = 0x30F
WM_PALETTEISCHANGING = 0x310
WM_PALETTECHANGED = 0x311

WM_HOTKEY = 0x312
WM_PRINT = 0x317
WM_PRINTCLIENT = 0x318

WM_HANDHELDFIRST = 0x358
WM_HANDHELDLAST = 0x35F
WM_PENWINFIRST = 0x380
WM_PENWINLAST = 0x38F
WM_COALESCE_FIRST = 0x390
WM_COALESCE_LAST = 0x39F
WM_DDE_FIRST = 0x3E0
WM_DDE_INITIATE = 0x3E0
WM_DDE_TERMINATE = 0x3E1
WM_DDE_ADVISE = 0x3E2
WM_DDE_UNADVISE = 0x3E3
WM_DDE_ACK = 0x3E4
WM_DDE_DATA = 0x3E5
WM_DDE_REQUEST = 0x3E6
WM_DDE_POKE = 0x3E7
WM_DDE_EXECUTE = 0x3E8
WM_DDE_LAST = 0x3E8

WM_USER = 0x400
WM_APP = 0x8000


GUI Styles

Gui 그리고 GuiControl 명령어가 사용하는 스타일

목차

  • Gui/Parent 창과 대부분의 콘트롤 유형에 많이 사용되는 스타일
  • Text | Edit | UpDown | Picture
  • Button | Checkbox | Radio | GroupBox
  • DropDownList | ComboBox
  • ListBox | ListView | TreeView
  • DateTime | MonthCal
  • Slider | Progress | Tab | StatusBar

스타일 | 값 | 설명
GUI 창 기본값 |  | WS_POPUP, WS_CAPTION, WS_SYSMENU, WS_MINIMIZEBOX
GUI 창에 강제 |  | WS_CLIPSIBLINGS
WS_BORDER | 0x800000 | +/-Border. 얇은 테두리의 창을 만듭니다.
WS_POPUP | 0x80000000 | 팝업 창을 만듭니다. 이 스타일은 WS_CHILD 스타일과 함께 사용할 수 없습니다.
WS_CAPTION | 0xC00000 | +/-Caption. 타이틀바를 가진 창을 만듭니다. 이 스타일은 WS_BORDER 그리고 WS_DLGFRAME를 숫치적으로 조합합니다.
WS_DISABLED | 0x8000000 | +/-Disabled. 처음에 비활성 상태로 창을 만듭니다.
WS_DLGFRAME | 0x400000 | 테두리 스타일을 가진 창을 만듭니다. 보통 대화상자에 많이 사용됩니다.
WS_GROUP | 0x20000 | +/-Group. 이 콘트롤이 콘트롤 그룹에서 첫 번째 콘트롤이라는 것을 나타냅니다. 이 스타일은 자동으로 라디오 버튼의 "한 번에 오직 하나만" 행위를 관리하도록 적용됩니다. 아주 희귀한 경우로 두 그룹의 라디오 버튼이 연속적으로 (사이에 다른 콘트롤 유형이 없이) 추가되면, 이 스타일은 두 번째 라디오 그룹의 첫 콘트롤에만 적용됩니다. 따라서 첫 번째 그룹과 분리되어 버립니다.
WS_HSCROLL | 0x100000 | 수평 스크롤바를 가진 창을 만듭니다.
WS_MAXIMIZE | 0x1000000 | 처음에 최대화 상태로 창을 만듭니다.
WS_MAXIMIZEBOX | 0x10000 | +/-MaximizeBox. 최대화 버튼이 있는 창을 만듭니다. WS_EX_CONTEXTHELP 스타일과 함께 사용할 수 없습니다. WS_SYSMENU 스타일도 역시 지정해야 합니다.
WS_MINIMIZE | 0x20000000 | 처음에 최소화 상태로 창을 만듭니다.
WS_MINIMIZEBOX | 0x20000 | +/-MinimizeBox. 최소화 버튼을 가진 창을 만듭니다. WS_EX_CONTEXTHELP 스타일과 함께 사용할 수 없습니다. WS_SYSMENU 스타일도 역시 지정해야 합니다.
WS_OVERLAPPED | 0 | 중첩 창을 만듭니다. 중첩 창은 타이틀바와 테두리를 가집니다. WS_TILED 스타일과 동일합니다.
WS_OVERLAPPEDWINDOW | 0xCF0000 | WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, 그리고 WS_MAXIMIZEBOX 스타일을 사용해 중첩 창을 만듭니다. WS_TILEDWINDOW 스타일과 동일합니다.
WS_POPUPWINDOW | 0x80880000 | WS_BORDER, WS_POPUP, 그리고 WS_SYSMENU 스타일을 사용해 팝업 창을 만듭니다. The WS_CAPTION과 WS_POPUPWINDOW 스타일을 조합하여 창 메뉴를 보여주어야 합니다.
WS_SIZEBOX | 0x40000 | +/-Resize. 크기조절 테두리를 가진 창을 만듭니다. WS_THICKFRAME 스타일과 동일합니다.
WS_SYSMENU | 0x80000 | +/-SysMenu. 타이틀 바에 창 메뉴를 가진 창을 만듭니다. WS_CAPTION 스타일도 지정해야 합니다.
WS_TABSTOP | 0x10000 | +/-Tabstop. 사용자가 TAB 키를 누를 때 키보드 초점을 받을 수 있는 콘트롤을 지정합니다. TAB 키를 누르면 WS_TABSTOP 스타일과 함께 키보드 초점이 다음 콘트롤로 바뀝니다.
WS_THICKFRAME | 0x40000 | 크기조절 테두리를 가진 창을 만듭니다. WS_SIZEBOX 스타일과 동일합니다
WS_VSCROLL | 0x200000 | 수직 스크롤바를 가진 창을 만듭니다.
WS_VISIBLE | 0x10000000 | 처음에 보이는 상태로 창을 만듭니다.
WS_CHILD | 0x40000000 | 자손 창을 만듭니다. 이 스타일의 창은 메뉴바를 가질 수 없습니다. 이 스타일은 WS_POPUP 스타일과 함께 사용할 수 없습니다.

Text 스타일 | 값 | 설명
default |  | None
forced |  | None
SS_BLACKFRAME | 0x7 | 박스를 지정합니다. 창 프레임과 같은 색으로 그립니다. 이 색은 기본 컬러 체계에 대하여 검정색입니다.
SS_BLACKRECT | 0x4 | 현재 창 프레임 색으로 채워진 사각형을 지정합니다. 이 색은 기본 컬러 체계에 대하여 검정색입니다.
SS_CENTER | 0x1 | +/-Center. 간단한 사각형을 지정하고 에러 값 텍스트를 그 가운데에 배치합니다. 콘트롤은 줄 끝을 지나 다음 줄의 처음까지 걸치는 단어들을 자동으로 넘깁니다.
SS_ETCHEDFRAME | 0x12 | 정적 콘트롤의 프레임을 그립니다. EDGE_ETCHED 테투리 스타일을 사용합니다.
SS_ETCHEDHORZ | 0x10 | 정적 콘트롤의 위 아래 테두리를 그립니다. EDGE_ETCHED 테두리 스타일을 사용합니다.
SS_ETCHEDVERT | 0x11 | 정적 콘트롤의 좌우 테두리를 그립니다. EDGE_ETCHED 테두리 스타일을 사용합니다.
SS_GRAYFRAME | 0x8 | 프레임을 가진 박스를 지정합니다. 화면(바탕화면) 배경색과 같은 색으로 그려집니다. 이 색은 기본 컬러 체계에서 회색입니다.
SS_GRAYRECT | 0x5 | 현재 화면 배경 색으로 채워진 사각형을 지정합니다. 이 색은 기본 컬러 체계에서 회색입니다.
SS_LEFT | 0 | +/-Left. 이것이 기본값입니다. 간단한 사각형을 지정하고 안의 텍스트를 왼쪽으로 정렬합니다. 텍스트를 보여주기 전에 먼저 포맷합니다. 줄 끝을 지나 확장된 단어들은 자동으로 다음 줄에 왼쪽 정렬됩니다. 콘트롤의 너비보다 더 긴 단어들은 잘려 나갑니다.
SS_LEFTNOWORDWRAP | 0xC | +/-Wrap. 사각형을 지정하고 안의 텍스트를 왼쪽 정렬합니다. 탭은 확장되지만, 단어들은 랩되지 않습니다. 줄끝을 지나 확장된 텍스트는 잘려나갑니다.
SS_NOPREFIX | 0x80 | 콘트롤의 텍스트에서 앰퍼센드(&) 문자를 가속 접두 문자로 번역하지 못하도록 막습니다. 이것은 앰퍼센드 (&)가 포함되어 있는 파일 이름이나 다른 문자열을 보여주어야 할 경우에 유용합니다
SS_NOTIFY | 0x100 | 사용자가 콘트롤을 클릭할 때 부모 창에 STN_CLICKED 고지를 전송합니다.
SS_RIGHT | 0x2 | +/-Right. 사각형을 지정하고 그 안의 텍스트를 오른쪽 정렬합니다.
SS_SUNKEN | 0x1000 | 정적 콘트롤 둘레에 반쯤 눌려진 테두리를 그립니다.
SS_WHITEFRAME | 0x9 | 프레임을 가진 박스를 지정합니다. 창 배경과 같은 색으로 그려집니다. 이 색은 기본 컬러 체계에서 하얀색입니다.
SS_WHITERECT | 0x6 | 현재 창의 배경색으로 채워진 사각형을 지정합니다. 이 색은 기본 컬러 체계에서 하얀색입니다.

Edit 스타일 | 값 | 설명
default |  | WS_TABSTOP 그리고 WS_EX_CLIENTEDGE (확장 스타일 E0x200) Edit 콘트롤이 여러-줄로 자동 탐지됩니다. 시작부터 내용에 여러 줄이 담겨 있거나, 그의 높이가 1 행보다 크거나, 아니면 그의 행 개수가 명시적으로 1보다 크게 지정되어 있기 때문입니다. 다음 스타일이 기본으로 적용됩니다: WS_VSCROLL, ES_WANTRETURN, 그리고 ES_AUTOVSCROLL Edit이 한 줄로 자동 탐지되면, 기본값은 ES_AUTOHSCROLL입니다.
forced |  | None
ES_AUTOHSCROLL | 0x80 | +/-Wrap 여러-줄 편집, 그리고 +/-Limit 한-줄 편집. 사용자가 줄 끝에서 문자를 하나 타자하면 자동으로 오른쪽으로 10 문자 만큼 감습니다. 사용자가 ENTER 키를 누를 때, 모든 텍스트를 다시 0 위치로 감습니다.
ES_AUTOVSCROLL | 0x40 | 사용자가 마지막 줄에서 ENTER 키를 누르면 텍스트를 한 페이지 감아 올립니다.
ES_CENTER | 0x1 | +/-Center. 여러 줄 콘트롤에서 텍스트를 가운데 정렬합니다.
ES_LOWERCASE | 0x10 | +/-Lowercase. 편집 콘트롤 안으로 문자가 타자되어 들어오면 모두 소문자로 변환합니다.
ES_NOHIDESEL | 0x100 | 기본 행위를 부인합니다. 기본 행위는 콘트롤이 입력 초점을 잃어 버릴 때 선택을 감추고 입력 초점을 받을 때 선택을 역상으로 보여줍니다. ES_NOHIDESEL을 지정했다면, 콘트롤에 초점이 없더라도 선택된 텍스트가 역상으로 보입니다.
ES_NUMBER | 0x2000 | +/-Number. 사용자가 숫자가 아닌 다른 것은 타자하지 못하도록 막습니다.
ES_OEMCONVERT | 0x400 | 이 스타일은 파일 이름이 포함된 편집 콘트롤에 아주 유용합니다.
ES_MULTILINE | 0x4 | +/-Multi. 여러줄 편집 콘트롤을 지정합니다. 기본값은 한줄 편집 콘트롤입니다.
ES_PASSWORD | 0x20 | +/-Password. 타자되어 들어오는 각 문자 대신에 은폐 문자를 보여줍니다. 텍스트를 감춥니다.
ES_READONLY | 0x800 | +/-ReadOnly. 사용자가 편집 콘트롤에 타자하거나 편집하지 못하도록 막습니다.
ES_RIGHT | 0x2 | +/-Right. 여러줄 편집 콘트롤에 우측 정렬합니다.
ES_UPPERCASE | 0x8 | +/-Uppercase. 편집 콘트롤 안으로 문자가 타자되어 들어오면 모두 대문자로 변환합니다.
ES_WANTRETURN | 0x1000 | +/-WantReturn. 대화상자에서 여러줄 편집 콘트롤 안으로 텍스트를 타자하는 동안 사용자가 ENTER 키를 누를 때 캐리지 리턴이 삽입되도록 지정합니다. 이 스타일을 지정하지 않은 경우, ENTER 키를 누르면 대화상자의 기본 푸시 버튼을 누른 것과 효과가 동일합니다. 이 스타일은 한-줄 편집 콘트롤에는 아무 효과가 없습니다.

UpDown 스타일 | 값 | 설명
default | UDS_ARROWKEYS, UDS_ALIGNRIGHT, UDS_SETBUDDYINT, 그리고 UDS_AUTOBUDDY.
forced | None
UDS_WRAP | 0x1 | 이름있는 옵션 "Wrap". 콘트롤은 사용자가 최대 최소 값을 넘어서려고 하면 그의 범위의 다른 쪽 끝으로 되돌립니다. Wrap이 없다면, 최대 최소 값에 도달하면 멈춥니다.
UDS_SETBUDDYINT | 0x2 | 위치가 바뀔 때 UpDown 콘트롤은 (WM_SETTEXT 메시지를 사용하여) 친구 콘트롤의 텍스트를 설정합니다. 그렇지만, 친구가 ListBox라면, 그 ListBox의 현재 선택이 대신 바뀝니다.
UDS_ALIGNRIGHT | 0x4 | 이름있는 옵션 "Right" (기본값). UpDown을 친구 콘트롤의 오른쪽에 배치합니다.
UDS_ALIGNLEFT | 0x8 | 이름있는 옵션 "Left". UpDown을 친구 콘트롤의 왼쪽에 배치합니다.
UDS_AUTOBUDDY | 0x10 | 자동으로 UpDown 콘트롤의 친구 콘트롤로 z-순서로 이전의 콘트롤을 선택합니다.
UDS_ARROWKEYS | 0x20 | 사용자는 키보드에서 Up 또는 Down 화살표 키를 눌러 UpDown 콘트롤이 위치를 변경할 수 있습니다.
UDS_HORZ | 0x40 | 이름있는 옵션 "Horz". 콘트롤의 화살표가 위 아래가 아니라 좌우를 가리킵니다.
UDS_NOTHOUSANDS | 0x80 | 친구 콘트롤에 세자리마다 사이에 천의 자리 가름자를 삽입하지 않습니다.
UDS_HOTTRACK | 0x100 | 콘트롤은 "핫 트래킹" 행위를 합니다. 즉, 마우스가 지나갈 때 콘트롤 버튼을 강조합니다. 이 옵션은 Windows XP에서 바탕화면 테마가 오버라이드 하면 무시됩니다.
(hex)

친구 콘트롤 안에 보여지는 숫자 형식은 십진 형식에서 십육진 형식으로 바꿀 수 있습니다. 다음 예제를 따르면 됩니다:

Gui +LastFound
SendMessage, 1133, 16, 0, msctls_updown321 ; 1133은 UDM_SETBASE입니다

그렇지만, 이것은 친구 콘트롤에만 영향을 줍니다. UpDown의 보고된 위치에는 영향을 미치지 않습니다.

Picture 스타일 | 값 | 설명
default |  | None
forced |  | 아이콘과 커서는 SS_ICON. 다른 이미지 유형은 SS_BITMAP.
SS_REALSIZECONTROL | 0x40 | [Windows XP 이후] 비트맵을 콘트롤의 크기에 맞춥니다.
SS_CENTERIMAGE | 0x200 | 비트맵을 가운데 정렬합니다. 비트맵이 너무 크면 잘려 나갑니다. 텍스트 콘트롤에 대하여 콘트롤에 한줄의 텍스트가 들어 있으면, 텍스트는 가능한 높이 안에서 수직으로 가운데 정렬됩니다. Microsoft Windows XP: 이 스타일은 사용되지 않는 부분을 더 이상 비트맵이나 아이콘의 좌상 픽셀의 색으로 채우지 않습니다. 사용되지 않는 부분은 여전히 배경색으로 남아 있습니다.

Button, Checkbox, Radio, 그리고 GroupBox 스타일 | 값 | 설명
default

BS_MULTILINE (GroupBox 제외, 버튼 제외, 체크박스 제외, 그리고 명시적으로 너비와 높이가 설정되지 않은 라디오 버튼 제외, 텍스트 안에 CR/LF 문자가 있어도 제외)

WS_TABSTOP (GroupBox 제외) -- 그렇지만, 각 라디오 그룹에서 첫 번째 버튼만 기본으로 WS_TABSTOP이 있습니다. 게다가, 라디오 버튼은 BS_NOTIFY이 있어서 더블 클릭을 탐지할 수 있습니다.
forced 버튼: BS_PUSHBUTTON 또는 BS_DEFPUSHBUTTON
라디오: BS_AUTORADIOBUTTON
체크박스: BS_AUTOCHECKBOX 또는 BS_AUTO3STATE
그룹박스: BS_GROUPBOX
BS_LEFT | 0x100 | +/-Left. 텍스트를 왼쪽 정렬합니다.
BS_PUSHLIKE | 0x1000 | 체크박스나 라디오 버튼이 푸시 버튼처럼 보이고 행동하게 만듭니다. 버튼은 눌려 있지 않거나 체크되어 있지 않으면 튀어 나와 보입니다. 누르거나 체크할 때 쑥 들어갑니다.
BS_RIGHT | 0x200 | +/-Right. 텍스트를 우측 정렬합니다.
BS_RIGHTBUTTON | 0x20 | +Right (즉, +Right는 BS_RIGHT 그리고 BS_RIGHTBUTTON를 둘 다 포함하지만, -Right는 BS_RIGHT만 제거합니다. BS_RIGHTBUTTON는 제거하지 않습니다). 체크박스 네모 또는 라디오 버튼 동그라미를 콘트롤의 왼쪽 대신에 오른쪽에 배치합니다.
BS_BOTTOM | 0x800 | 텍스트를 콘트롤 높이의 아래에 배치합니다.
BS_CENTER | 0x300 | +/-Center. 텍스트를 콘트롤 너비의 중앙에 수평으로 배치합니다.
BS_DEFPUSHBUTTON | 0x1 | +/-Default. 두꺼운 검정색 테두리를 가진 푸쉬 버튼을 생성합니다. 버튼이 대화상자 안에 있으면, 사용자는 그 버튼에 입력 초점이 없더라도 ENTER 키를 눌러 그 버튼을 선택할 수 있습니다. 이 스타일로 사용자는 즉시 대부분의 가능한 옵션을 선택할 수 있습니다.
BS_MULTILINE | 0x2000 | +/-Wrap. 텍스트를 여러줄로 넘깁니다. 텍스트가 콘트롤 너비보다 너무 길어 한 줄에 맞출 수 없으면 또한 라인피드를 허용해서 (`n) 새 줄의 텍스트를 시작할 수 있습니다.
BS_TOP | 0x400 | 텍스트를 콘트롤 높이의 상단에 배치합니다.
BS_VCENTER | 0xC00 | 콘트롤의 높이에 수직으로 텍스트를 중앙에 배치합니다.
BS_FLAT | 0x8000 | 버튼이 평면임을 지정합니다; 3-D 효과를 위해 기본 쉐이딩을 사용하지 않습니다.

DropDownList 그리고 ComboBox 스타일 | 값 | 설명
default |  | WS_TABSTOP (+/-Tabstop) DropDownList: WS_VSCROLL ComboBox: WS_VSCROLL, CBS_AUTOHSCROLL
forced |  | DropDownList: CBS_DROPDOWNLIST ComboBox: Either CBS_DROPDOWN 또는 CBS_SIMPLE
CBS_AUTOHSCROLL | 0x40 | +/-Limit. 사용자가 줄끝에 문자를 타자하면 자동으로 텍스트를 편집 콘트롤 안에서 오른쪽으로 감습니다. 이 스타일 설정되어 있지 않으면, 오직 사각 경계 안에 맞는 텍스트만 보입니다.
CBS_DISABLENOSCROLL | 0x800 | 스크롤 할 만큼 충분히 항목이 없을 때 비활성화 된 수직 스크롤 바를 리스트 박스에 보여줍니다. 이 스타일이 없다면, 충분히 항목이 없을 때 스크롤 바가 보이지 않습니다.
CBS_LOWERCASE | 0x4000 | +/-Lowercase. 콤보 박스의 편집 콘트롤 안으로 타자되어 들어가는 대문자를 소문자로 변환합니다.
CBS_NOINTEGRALHEIGHT | 0x400 | 콤보 박스를 만들 때 어플이 지정한 크기대로 정확하게 같은 크기가 되도록 지정합니다. 보통, Windows CE는 콤보 박스를 부분적으로 항목을 보여주지 않도록 크기를 지정합니다.
CBS_OEMCONVERT | 0x80 | 콤보 박스의 편집 콘트롤에 타자되어 들어가는 텍스트를 Windows CE 문자 집합으로부터 OEM 문자 집합으로 그리고 다시 Windows CE 문자 집합으로 변환합니다. 이 스타일은 파일 이름이 들어 있는 콤보 박스에 아주 유용합니다. CBS_DROPDOWN 스타일로 생성된 콤보 박스에만 적용됩니다.
CBS_SIMPLE | 0x1 | +/-Simple (콤보박스 전용). 리스트 박스를 언제나 보여줍니다. 리스트 박스의 현재 선택은 편집 콘트롤 안에 보여집니다.
CBS_SORT | 0x100 | +/-Sort. 드롭 리스트의 항목들을 알파벳 순서로 설정합니다.
CBS_UPPERCASE | 0x2000 | +/-Uppercase. 콤보 박스의 편집 콘트롤 안으로 타자되어 들어오는 소문자를 대문자로 변경합니다.

ListBox 스타일 | 값 | 기술
default |  | WS_TABSTOP, LBS_USETABSTOPS, WS_VSCROLL, 그리고 WS_EX_CLIENTEDGE (확장 스타일 E0x200).
forced |  | LBS_NOTIFY (더블 클릭 탐지 지원)
LBS_DISABLENOSCROLL | 0x1000 | 박스에 항목이 충분하지 않아 스크롤 할 수 없을 때 불능화 된 수직 스크롤 바를 보여줍니다. 이 스타일을 지정하지 않으면, 스크롤바는 리스트 박스에 충분한 항목이 없을 때 보이지 않습니다.
LBS_NOINTEGRALHEIGHT | 0x100 | 리스트 박스가 어플리케이션에 의하여 생성될 때 지정된 크기를 정확하게 가지도록 지정합니다.
LBS_EXTENDEDSEL | 0x800 | +/-Multi. 콘트롤 클릭 그리고 쉬프트 클릭으로 다중 선택을 허용합니다.
LBS_MULTIPLESEL | 0x8 | 다중 선택을 간략화한 버전. control-click과 shift-click이 불필요합니다. 보통의 왼클릭만으로 선택을 확장하거나 선택된 항목을 해제할 수 있습니다.
LBS_NOSEL | 0x4000 | +/-ReadOnly. 사용자는 리스트 박스 문자열을 볼 수는 있지만 선택할 수는 없습니다.
LBS_SORT | 0x2 | +/-Sort. 리스트 박스 안의 항목을 알파벳 순으로 정렬합니다.
LBS_USETABSTOPS | 0x80 | 문자열을 그릴 때 ListBox가 탭 문자를 인지하고 확대할 수 있습니다. 기본 탭 위치는 32 대화상자 박스 단위입니다. 대화상자 박스 단위(dialog box unit)는 현재 대화상자의 기본 너비 단위의 1/4와 동일합니다.

ListView 스타일 | 값 | 기술
default | WS_TABSTOP, LVS_REPORT, LVS_SHOWSELALWAYS, LVS_EX_FULLROWSELECT, LVS_EX_HEADERDRAGDROP, WS_EX_CLIENTEDGE (E0x200)
forced | None
LVS_ALIGNLEFT | 0x800 | 아이콘 창에서 항목들은 왼쪽 정렬됩니다.
LVS_ALIGNTOP | 0 | 아이콘 창에서 항목들은 위쪽에 정렬됩니다. 기본값입니다.
LVS_AUTOARRANGE | 0x100 | 아이콘은 자동으로 정렬됩니다.
LVS_EDITLABELS | 0x200 | +/-ReadOnly. -ReadOnly (또는 +0x200)을 지정하면 사용자는 각 행의 첫 필드를 제자리에서 편집할 수 있습니다.
LVS_ICON | 0 | +Icon. 큰-아이콘 보기를 지정합니다.
LVS_LIST | 0x3 | +List. 리스트 보기를 지정합니다.
LVS_NOCOLUMNHEADER | 0x4000 | +/-Hdr. 보고서 보기에 열 헤더를 보여주지 않습니다.
LVS_NOLABELWRAP | 0x80 | 아이콘 보기에서 Item 텍스트를 한 줄에 보여줍니다. 기본값으로, 항목은 아이콘 보기에서 줄넘기기 됩니다.
LVS_NOSCROLL | 0x2000 | 스크롤을 끕니다. 모든 항목은 클라이언트 구역 안에 있어야 합니다. 이 스타일은 LVS_LIST 또는 LVS_REPORT 스타일과 호환되지 않습니다.
LVS_NOSORTHEADER | 0x8000 | +/-NoSortHdr. 열 헤더가 버튼처럼 작동하지 않습니다. 보고서 보기에서 열 헤더를 클릭해도 아무 조치도 하지 않을 경우에 이 스타일을 사용할 수 있습니다.
LVS_OWNERDATA | 0x1000 | 이 스타일은 가상 리스트 뷰 콘트롤을 지정합니다. (오토핫키가 직접 지원하지 않습니다).
LVS_OWNERDRAWFIXED | 0x400 | 사용자 창이 WM_DRAWITEM 메시지에 응답하여 보고서 보기로 항목들을 그립니다. (오토핫키가 직접 지원하지 않습니다).
LVS_REPORT | 0x1 | +Report. 보고서 보기를 지정합니다.
LVS_SHAREIMAGELISTS | 0x40 | 콘트롤이 파괴되더라도 이미지 리스트가 삭제되지 않습니다. 이 스타일은 다중 리스트 뷰 콘트롤에 같은 이미지를 사용할 수 있습니다.
LVS_SHOWSELALWAYS | 0x8 | 선택이 언제나 보입니다. 콘트롤에 키보드 초점이 없더라도 마찬가지입니다.
LVS_SINGLESEL | 0x4 | +/-Multi. 한 번에 오직 한 항목만 선택할 수 있습니다. 기본값으로 여러 항목을 선택할 수 있습니다.
LVS_SMALLICON | 0x2 | +IconSmall. 작은 아이콘 보기를 지정합니다.
LVS_SORTASCENDING | 0x10 | +/-Sort. 행들은 첫 필드의 내용에 기반하여 오름차순으로 정렬됩니다.
LVS_SORTDESCENDING | 0x20 | +/-SortDesc. 위와 같지만 내림차순입니다.
LVS_EX_BORDERSELECT | LV0x8000 | 항목이 선택될 때 항목이 강조되는 것이 아니라 항목의 테두리 색이 바뀝니다 (최신 운영 체제에서는 작동하지 않을 수 있습니다).
LVS_EX_CHECKBOXES LV0x4

+/-Checked. 각 항목마다 체크박스를 보여줍니다. 이 스타일을 설정하면, 콘트롤은 DrawFrameControl를 사용하여 두 개의 이미지를 가진 상태 이미지 리스트를 생성하고 설정합니다. 상태 이미지 1은 체크 표시가 없는 박스이고, 상태 이미지 2는 체크 표시된 박스입니다. 상태 이미지를 0으로 설정하면 체크 박스가 완전히 제거됩니다.

Windows XP 이후: 체크박스는 모든 리스트 뷰 모드에서 보이고 작동합니다. 단, Windows XP에서 도입된 타일뷰는 제외합니다. 체크박스를 타일 보기 모드에서 클릭하면 항목만 선택됩니다; 상태는 바뀌지 않습니다.
LVS_EX_FLATSB | LV0x100 | 리스트 뷰에서 평평한 스크롤 바를 켭니다.
LVS_EX_FULLROWSELECT | LV0x20 | 행이 선택될 때, 그의 모든 필드가 강조됩니다. 이 스타일은 LVS_REPORT 스타일고 조합해서만 사용할 수 있습니다.
LVS_EX_GRIDLINES | LV0x1 | +/-Grid. 격자 줄을 행과 열에 보여줍니다. 이 스타일은 LVS_REPORT 과 조합해서만 사용할 수 있습니다.
LVS_EX_HEADERDRAGDROP | LV0x10 | 리스트 뷰 콘트롤에서 끌어 떨구기로 열을 재배치할 수 있습니다. 이 스타일은 LVS_REPORT 스타일을 사용하는 리스트 뷰 콘트롤에서만 사용할 수 있습니다.
LVS_EX_INFOTIP | LV0x400 | 리스트 뷰 콘트롤이 LVS_EX_INFOTIP 스타일을 사용할 때, 항목의 툴팁을 보여주기 전에 LVN_GETINFOTIP 고지 메시지가 부모 창에 전송됩니다.
LVS_EX_LABELTIP | LV0x4000 | 리스트 뷰 모드에서 부분적으로 숨은 라벨에 툴팁 텍스트가 없다면, 그 라벨을 언폴드합니다. 이 스타일이 설정되지 않으면, 리스트 뷰 콘트롤은 오직 큰 아이콘 모드에 대해서만 부분적으로 숨은 라벨을 언폴드합니다. Windows XP 이상을 요구합니다. 아니면 Internet Explorer 5.0 이상과 배포되는 DLL이 필요합니다. 주의: 어떤 윈도우즈 버전에서는 GUI 창이 항상 위에 오도록 설정되어 있을 경우 이 스타일 제대로 작동하지 않을 수 있습니다.
LVS_EX_MULTIWORKAREAS | LV0x2000 | 리스트-뷰 콘트롤에 LVS_AUTOARRANGE 스타일이 있다면, 그 콘트롤은 하나 이상의 작업 구역이 정의될 때까지 그의 아이콘들을 자동 정렬하지 않습니다 (LVM_SETWORKAREAS 참조). 이 스타일은 작업 구역이 정의되기 전에 그리고 콘트롤에 항목들이 모두 추가되기 전에 설정해야 효과가 있습니다.
LVS_EX_ONECLICKACTIVATE | LV0x40 | 사용자가 항목을 클릭하면 부모 창에 LVN_ITEMACTIVATE 고지 메시지를 전송합니다. 이 스타일은 또 리스트 뷰 콘트롤에 핫 트래킹을 활성화 합니다. 핫 트래킹이란 마우스나 항목 위를 지나갈 때, 강조를 하지만 선택하지는 않는 기능입니다.
LVS_EX_REGIONAL | LV0x200 | 리스트 뷰 창 구역에 SetWindowRgn을 사용하여 오직 항목 아이콘과 텍스트만 포함하도록 지정합니다. 항목의 일부가 아닌 부분들은 창 구역에서 배제됩니다. 이 스타일은 LVS_ICON 스타일을 사용하는 리스트 뷰 콘트롤에만 사용할 수 있습니다.
LVS_EX_SIMPLESELECT | LV0x100000 | 아이콘 보기에서, 콘트롤의 상태 이미지를 큰 입체 아이콘의 우상으로 이동시킵니다. 다른 보기 모드에서는 아무 변화가 없습니다. 사용자가 스페이스 바를 눌러 상태를 바꿀 때, 초점이 있는 항목이 아니라 선택된 모든 항목이 상태를 바꿉니다. Windows XP 이상을 요구합니다.
LVS_EX_SUBITEMIMAGES | LV0x2 | 이미지를 첫 필드를 넘어서 보여줍니다. 이 스타일은 LVS_REPORT 스타일과 조합해서만 사용할 수 있습니다.
LVS_EX_TRACKSELECT | LV0x8 | 리스트 뷰 콘트롤에 핫 트랙 선택을 활성화 합니다. 핫 트랙 선택은 항 항목이 마우스가 항목 위에 일정 시간 이상 머무르면 자동으로 선택되는 것입니다. LVM_SETHOVERTIME 메시지로 머뭄 시간은 기본 시스템 설정으로부터 바꿀 수 있습니다. 이 스타일은 리스트 뷰 콘트롤의 모든 스타일에 적용됩니다. 핫 트랙 선택이 켜져 있는지 확인하려면 SystemParametersInfo를 호출해 보면 알 수 있습니다.
LVS_EX_TWOCLICKACTIVATE | LV0x80 | 사용자가 항목을 더블 클릭할 때 리스트-뷰 콘트롤은 LVN_ITEMACTIVATE 고지 메시지를 부모 창에 전송합니다. 이 스타일은 또 리스트 뷰 콘트롤에 핫 트래킹을 활성화 합니다. 핫 트래킹이란 마우스가 항목 위를 지나면, 강조하는 것입니다. 단, 선택하지는 않습니다.
LVS_EX_UNDERLINECOLD | LV0x1000 | 활성화가 가능한 비-핫 항목들을 밑줄 그은 텍스트와 함께 보여줍니다. 이 스타일은 LVS_EX_TWOCLICKACTIVATE도 설정되어 있어야 합니다.
LVS_EX_UNDERLINEHOT | LV0x800 | 활성화가 가능한 핫 항목들은 밑줄 그은 텍스트와 함께 보여줍니다. 이 스타일은 LVS_EX_ONECLICKACTIVATE 또는 LVS_EX_TWOCLICKACTIVATE도 설정되어 있기를 요구합니다.

TreeView 스타일 | 값 | 설명
default |  | WS_TABSTOP, TVS_SHOWSELALWAYS, TVS_HASLINES, TVS_LINESATROOT, TVS_HASBUTTONS, WS_EX_CLIENTEDGE (E0x200)
forced |  | None
TVS_CHECKBOXES | 0x100 | +/-Checked. 각 항목 옆에 체크박스를 보여줍니다.
TVS_DISABLEDRAGDROP | 0x10 | 트리 뷰 콘트롤이 TVN_BEGINDRAG 고지 메시지를 전송하지 못하도록 막습니다.
TVS_EDITLABELS | 0x8 | +/-ReadOnly. 사용자가 트리 뷰 항목의 이름을 편집하도록 허용합니다.
TVS_FULLROWSELECT | 0x1000 | 트리 뷰에서 전체 행을 선택할 수 있습니다. 선택된 항목의 전체 행이 강조되고, 한 항목의 아무데나 클릭하면 전체 행이 선택됩니다. 이 스타일은 TVS_HASLINES 스타일과 조합하여 함께 사용할 수 없습니다.
TVS_HASBUTTONS | 0x1 | +/-Buttons. 플러스 (+) 그리고 마이너스 (-) 버튼을 부모 항목 옆에 보여줍니다. 사용자는 그 버튼을 클릭하여 부모 항목의 자손 항목 리스트를 펼치거나 접을 수 있습니다. 항목 버튼을 트리 뷰의 루트에 포함시키려면, TVS_LINESATROOT도 지정해야 합니다.
TVS_HASLINES | 0x2 | +/-Lines. 항목의 계통을 줄을 사용하여 보여줍니다.
TVS_INFOTIP | 0x800 | TVN_GETINFOTIP 고지를 전송해 툴팁 정보를 얻습니다.
TVS_LINESATROOT | 0x4 | +/-Lines. 트리 뷰 콘트롤의 루트에 항목들을 줄을 사용해 연결합니다. 이 값은 TVS_HASLINES도 설정되어 있지 않으면 무시됩니다.
TVS_NOHSCROLL | 0x8000 | +/-HScroll. 수평 스크롤을 금지합니다. 수평 스크롤바를 보여주지 않습니다.
TVS_NONEVENHEIGHT | 0x4000 | TVM_SETITEMHEIGHT 메시지로 항목의 높이를 홀수 높이로 설정합니다. 기본적으로 항목의 높이는 짝수 값이어야 합니다.
TVS_NOSCROLL | 0x2000 | 수평 수직 스크롤을 모두 금지합니다. 스크롤바가 전혀 없습니다.
TVS_NOTOOLTIPS | 0x80 | 툴팁을 금지합니다.
TVS_RTLREADING | 0x40 | 텍스트를 오른쪽에서 왼쪽으로 보여줍니다(right-to-left (RTL)). 보통, 창은 텍스트를 왼쪽에서 오른쪽으로 보여줍니다(left-to-right (LTR)).
TVS_SHOWSELALWAYS | 0x20 | 트리 뷰 콘트롤이 초점을 잃어도 선택된 항목을 선택된 채로 있게 합니다.
TVS_SINGLEEXPAND | 0x400 | 선택할 때 선택된 항목은 확대하고 선택되지 않은 항목들을 축소합니다. 사용자가 CTRL 키를 누른 채로 항목을 선택하면, 선택되지 않은 항목이 축소되지 않습니다.
TVS_TRACKSELECT | 0x200 | 마우스 핫 트래킹을 활성화합니다.

DateTime 스타일 | 값 | 설명
기본값 | DTS_SHORTDATECENTURYFORMAT 그리고 WS_TABSTOP (+/-Tabstop)
강제 | 없음
DTS_UPDOWN | 0x1 | 날짜-시간 값을 변경할 업-다운 콘트롤을 콘트롤의 오른쪽에 배치합니다. 드롭-다운 달력을 교체합니다.
DTS_SHOWNONE | 0x2 | 체크박스를 콘트롤 안에 보여줍니다. 사용자는 체크를 해제해 콘트롤에 날짜/시간을 선택하지 않을 수 있습니다. 콘트롤에 날짜/시간이 없으면, Gui Submit 그리고 GuiControlGet은 빈 값을 열람합니다 (빈 문자열).
DTS_SHORTDATEFORMAT | 0x0 | 날짜를 짧은 형식으로 보여줍니다. 어떤 로케일에서는 6/1/05 또는 6/1/2005와 같이 보입니다. 예전의 운영 체제에서는 두 자리 해를 보여줄 수도 있습니다. 이것은 DTS_SHORTDATECENTURYFORMAT이 기본값이고 DTS_SHORTDATEFORMAT이 아니기 때문입니다.
DTS_LONGDATEFORMAT | 0x4 | 형식 옵션 "LongDate". 날짜를 긴 형식으로 보여줍니다. 어떤 로케일에서는 Wednesday, June 01, 2005처럼 보입니다.
DTS_SHORTDATECENTURYFORMAT | 0xC | 형식 옵션 비어있거나/생략됨. 날짜를 짧은 형식의 네 자리 해로 보여 줍니다. 어떤 로케일에서는 6/1/2005처럼 보입니다. Comctl32.dll의 시스템 버전이 5.8 미만이면, 이 스타일을 지원하지 않습니다. 그리고 자동으로 DTS_SHORTDATEFORMAT이 대신합니다.
DTS_TIMEFORMAT | 0x9 | 형식 옵션 "Time". 시간만 보여줍니다. 어떤 로케일에서는 5:31:42 PM처럼 보입니다.
DTS_APPCANPARSE | 0x10 | 아직 지원 안됨. 사용자에게 사용자 입력을 해석해서 필요한 조치를 취하도록 허용합니다. 사용자는 F2 키를 눌러 콘트롤의 클라이언트 구역 안에서 편집할 수 있습니다. 사용자가 일을 마치면 콘트롤은 DTN_USERSTRING 고지 메시지를 전송합니다.
DTS_RIGHTALIGN | 0x20 | +/-Right. 달력은 콘트롤의 왼쪽이 아니라 오른쪽에 드롭 다운됩니다.
(드롭 다운 달력 안의 컬러) 드롭-다운 달력 안의 날짜의 컬러는 Gui Font 명령어 또는 c (Color) 옵션으로 설정된 색을 준수합니다. 달력의 다른 부분의 컬러를 바꾸려면, 다음 예제를 따르십시오:
Gui +LastFound
SendMessage, 0x1006, 4, 0xFFAA99, SysDateTimePick321 ; 0x1006은 DTM_SETMCCOLOR입니다. 4는 MCSC_MONTHBK입니다 (배경색). 컬러는 BGR vs. RGB 형식으로 지정해야 합니다 (적청 교체에 주의).

MonthCal 스타일 | 값 | 설명
default | WS_TABSTOP ([v1.1.22+]전용, Windows 이후 전용)
forced | None
MCS_DAYSTATE | 0x1 | 콘트롤이 MCN_GETDAYSTATE 고지를 전송하도록 만듭니다. 어느 날짜를 볼드체로 보여주어야 하는지에 관한 정보를 요구합니다. [아직 지원하지 않음]
MCS_MULTISELECT 0x2 이름있는 옵션 "Multi". 사용자는 날짜 하나로 제한되지 않고 한 범위의 날짜를 선택할 수 있습니다. 기본값으로, 최대 범위는 366 일입니다. 범위는 MCM_SETMAXSELCOUNT 메시지를 보내 바꿀 수 있습니다. 예를 들어:
Gui +LastFound
SendMessage, 0x1004, 7, 0, SysMonthCal321 ; 7 days. 0x1004 is MCM_SETMAXSELCOUNT.
MCS_WEEKNUMBERS | 0x4 | 주 번호(1-52)을 각각의 날짜 줄 왼쪽에 보여줍니다. Week 1은 적어도 네 개의 날이 있는 주를 첫 주로 정의합니다.
MCS_NOTODAYCIRCLE | 0x8 | 콘트롤 안에서 오늘 날짜의 순환을 막습니다.
MCS_NOTODAY | 0x10 | 오늘 날짜가 콘트롤 하단에 나타나지 않도록 막습니다.
(colors) 달력 안에서 날짜 번호의 색은 Gui Font 명령어나 c (Color) 옵션의 설정을 준수합니다. 달력의 다른 부분의 색을 변경하려면, 다음 예제를 따르십시오:
Gui +LastFound
SendMessage, 0x100A, 5, 0xFFAA99, SysMonthCal321 ; 0x100A는 MCM_SETCOLOR입니다. 5는 MCSC_TITLETEXT입니다 (제목 텍스트 색). 컬러는 BGR vs. RGB 형식으로 지정해야 합니다 (적청 교체에 주의).

Slider 스타일 | 값 | 설명
default | WS_TABSTOP (+/-Tabstop)
forced | None
TBS_VERT | 0x2 | +/-Vertical. 콘트롤이 수직 방향입니다.
TBS_LEFT | 0x4 | +/-Left. 콘트롤은 상단에 틱 표식을 보여줍니다 (또는 TBS_VERT이 존재한다면 왼쪽에). TBS_TOP와 동일합니다.
TBS_TOP | 0x4 | same as TBS_LEFT.
TBS_BOTH | 0x8 | +/-Center. 틱 표식을 콘트롤 좌우에 보여줍니다. TBS_HORZ가 사용되면 상하에 TBS_VERT가 사용되면 좌우에 보여줍니다.
TBS_AUTOTICKS | 0x1 | 값의 범위 안에 각 증가 위치마다 틱 표식이 있습니다. +/-TickInterval를 사용하면 더 유연합니다.
TBS_ENABLESELRANGE 0x20

선택 범위만 보여줍니다. 선택 범위의 시작과 끝에 위치한 틱 표식은 (수직 대쉬 대신에) 삼각형으로 보여줍니다. 그리고 선택 범위가 강조됩니다 (강조를 하려면 Gui -theme를 통하여 테마를 제거할 필요가 있을 수도 있습니다).

선택 범위를 설정하려면, 다음 예제를 따르십시오. 시작 위치를 55에 그리고 끝 위치를 66에 설정합니다:

SendMessage, 1035, 1, 55, msctls_trackbar321, WinTitle
SendMessage, 1036, 1, 66, msctls_trackbar321, WinTitle
TBS_FIXEDLENGTH | 0x40 | +/-Thick. 엄지 손잡이 크기를 바꿀 수 있습니다.
TBS_NOTHUMB | 0x80 | 이동 가능한 바를 보여 주지 않습니다.
TBS_NOTICKS | 0x10 | +/-NoTicks. 틱 표식을 보여 주지 않습니다.
TBS_TOOLTIPS | 0x100 | +/-Tooltip. 툴팁을 지원합니다. 콘트롤이 이 스타일을 사용하여 생성될 때, 자동으로 기본 툴팁 콘트롤을 생성해 슬라이더의 현재 위치를 보여줍니다. 툴팁을 보여줄 곳은 TBM_SETTIPSIDE 메시지를 사용하여 바꿀 수 있습니다.
TBS_REVERSED | 0x200 | 안타깝게도, 이 스타일은 콘트롤의 실제 행위에 아무 효과가 없습니다. 그래서 사용하는 의미가 없을 것입니다 (대신에, 콘트롤 옵션에 +Invert를 사용하면 뒤집을 수 있습니다). OS 버전에 따라, 이 스타일은 인터넷 익스플로서 5.0 이상을 요구합니다.
TBS_DOWNISLEFT | 0x400 | 안타깝게도, 이 스타일은 콘트롤의 실제 행위에 아무 영향을 주지 않습니다. 그래서 아마도 사용하는 의미가 없을 것입니다. OS 버전에 따라, 이 스타일은 Internet Explorer 5.01 이상을 요구합니다.

Progress 스타일 | 값 | 설명
default |  | PBS_SMOOTH
forced |  | None
PBS_SMOOTH | 0x1 | +/-Smooth. 프로그레스 바는 진행 상태를 기본 구획 바 대신에 부드러운 스크롤 바에 보여줍니다. 이 스타일이 존재할 때, Windows XP 이후에서 스크롤은 자동으로 고전 테마 모습에 의존합니다.
PBS_VERTICAL | 0x4 | +/-Vertical. 아래에서 위로 수직으로 진행 상태를 보여줍니다.
PBS_MARQUEE | 0x8 | [Windows XP 이후 전용] 프로그레스 바는 마르키처럼 이동합니다; 즉, 위치가 변할 때마다 바가 이동하다가 끝에 도달하면 다시 반대 쪽으로 이동합니다. 이 스타일의 바는 위치가 정의되어 있지 않습니다. 그 위치를 변경하려고 시도하면 대신에 바가 한 눈금씩 슬라이드됩니다. 이 스타일은 전형적으로 완료 시간을 알 수 없는 작업의 진행 상황을 나타내는 데 사용됩니다.

Tab 스타일 | 값 | 설명
default | WS_TABSTOP 그리고 TCS_MULTILINE
forced WS_CLIPSIBLINGS
TCS_OWNERDRAWFIXED: 콘트롤의 배경색 그리고 텍스트 컬러가 요구하는 대로 강제로 켜거나 끕니다.
TCS_SCROLLOPPOSITE | 0x1 | 불필요한 탭들은 탭이 선택될 때 콘트롤의 반대쪽으로 스크롤됩니다.
TCS_BOTTOM | 0x2 | +/-Bottom. 탭이 콘트롤 상단이 아니라 하단에 나타납니다.
TCS_RIGHT | 0x2 | 탭이 오른쪽에 수직으로 나타납니다. TCS_VERTICAL 스타일을 사용합니다.
TCS_MULTISELECT | 0x4 | 여러 탭을 선택할 수 있습니다. CTRL 키를 누르고 클릭하면 됩니다. 이 스타일은 TCS_BUTTONS 스타일과 함께 사용해야 합니다.
TCS_FLATBUTTONS | 0x8 | 선택된 탭이 배경 뒤로 눌려 나타납니다. 반면에 다른 탭들은 그대로 같은 평면에 같은 색으로 나타납니다. 이 스타일은 TCS_BUTTONS 스타일과 함께 사용해야만 탭 콘트롤에 효과가 있습니다.
TCS_FORCEICONLEFT | 0x10 | 아이콘은 고정-너비의 탭마다 왼쪽으로 정렬됩니다. 이 스타일은TCS_FIXEDWIDTH 스타일에만 조합해 사용할 수 있습니다.
TCS_FORCELABELLEFT 0x20 라벨은 고정-너비의 탭마다 왼쪽에 정렬됩니다; 즉, 라벨은 아이콘 바로 오른쪽에 보여집니다. 가운데가 아닙니다.

이 스타일은 TCS_FIXEDWIDTH 스타일에만 조합해 사용할 수 있습니다. 그리고 TCS_FIXEDWIDTH 스타일은 TCS_FORCEICONLEFT 스타일을 암시합니다.
TCS_HOTTRACK | 0x40 | 포인터 아래의 항목들은 자동으로 강조됩니다
TCS_VERTICAL 0x80

+/-Left 또는 +/-Right. 탭이 콘트롤의 왼쪽에 나타납니다. 텍스트는 수직으로 보여집니다. 이 스타일은 오직 TCS_MULTILINE 스타일과 사용할 때만 효과가 있습니다. 탭을 콘트롤의 오른쪽에 보여주려면, TCS_RIGHT 스타일을 사용합니다.

이 스타일은 맞춤 배경 색이나 텍스트 색이 영향을 미치면 올바르게 탭을 보여주지 못합니다. 이를 우회하려면, 탭 콘트롤 옵션에 -Background 그리고/또는 cDefault를 지정하십시오.
TCS_BUTTONS | 0x100 | +/-Buttons. 탭이 버튼으로 나타납니다. 테두리가 그려지지 않습니다.
TCS_SINGLELINE | 0 | +/-Wrap. 오직 한 줄의 탭만 보여집니다. 사용자는 감아서 탭을 더 볼 수 있습니다. 이 스타일이 기본값입니다.
TCS_MULTILINE | 0x200 | +/-Wrap. 여러 줄 탭을 보여줍니다. 그래서 모든 탭을 한 번에 볼 수 있습니다.
TCS_RIGHTJUSTIFY 0 기본값입니다. 각 탭의 너비는 필요하면 증가됩니다. 그래서 각 줄의 탭은 탭 콘트롤의 전체 너비를 채웁니다.

이 창 스타일은 TCS_MULTILINE 스타일도 지정해야 효과가 있습니다.
TCS_FIXEDWIDTH | 0x400 | 모든 탭이 너비가 같습니다. 이 스타일은 TCS_RIGHTJUSTIFY 스타일과 조합해 사용할 수 없습니다.
TCS_RAGGEDRIGHT | 0x800 | 탭 줄은 콘트롤의 전체 너비를 채우기 위해 늘어나지 않습니다. 이 스타일이 기본값입니다.
TCS_FOCUSONBUTTONDOWN | 0x1000 | 탭 콘트롤은 클릭될 때 입력 초점을 받습니다.
TCS_OWNERDRAWFIXED | 0x2000 | 부모 창이 책임지고 탭을 그립니다.
TCS_TOOLTIPS | 0x4000 | 탭 콘트롤에 툴팁 콘트롤을 연관짓습니다.
TCS_FOCUSNEVER | 0x8000 | 탭 콘트롤은 클릭될 때 입력 초점을 받지 않습니다.

StatusBar 스타일 | 값 | 설명
기본값 | SBARS_TOOLTIPS 그리고 SBARS_SIZEGRIP (창의 크기 변경이 가능할 경우에만).
forced | None
SBARS_TOOLTIPS 0x800

마우스가 상태바의 일부에 올라오면 툴팁을 보여줍니다:

  1. 너무 보여줄 텍스트가 많을 때;
  2. 또는 아이콘은 있으나 텍스트가 없을 때

툴팁의 텍스트는 다음을 통하여 설정합니다:

Gui +LastFound
SendMessage, 0x410, 0, "Text to display", msctls_statusbar321

위에서 볼드체 0은 0-기반의 구역 번호입니다. 첫 번째 말고 다른 구역을 사용하려면, 두 번째 구역은 1, 세 번째 구역은 2 등등을 지정합니다. 주의: 어떤 운영체제에서는 툴팁이 전혀 나타나지 않을 수도 있습니다.
SBARS_SIZEGRIP | 0x100 | 상태 바의 오른쪽 끝에 크기변경 손잡이를 포함합니다. 크기변경 손잡이는 크기조절 테두리와 비슷합니다; 사각 구역에 사용자가 클릭하면 부모 창을 끌 수 있습니다.


Threads

쓰레드

현재 쓰레드는 최근의 이벤트가 요청한 실행 흐름으로 정의됩니다; 예로는 핫키, SetTimer 서브루틴, 맞춤 메뉴 항목, 그리고 GUI 이벤트가 포함됩니다. 현재 쓰레드는 자신의 서브루틴 안 또는 그 서브루틴을 호출한 다른 서브루틴 안에서 명령어를 실행할 수 있습니다.

오토핫키는 실제로 다중 스레드를 사용하지 않지만, 그 몇 가지 행위는 흉내를 냅니다: 두 번째 쓰레드가 시작되면 -- 예를 들어 이전의 핫키가 여전히 실행 중인 동안 또다른 핫키를 눌러서 -- 현재 쓰레드가 인터럽트 되어 (임시로 정지되어) 새 쓰레드가 현재 쓰레드가 됩니다. 두 번째 쓰레드가 실행 중인 동안 세 번째 쓰레드가 시작되면, 첫 번째와 두 번째 쓰레드 모두 동면 상태로 들어갑니다. 등등.

현재 쓰레드가 끝나면, 가장 최근에 인터럽트된 쓰레드가 재개됩니다. 등등. 모든 쓰레드가 결국 다 끝날 때까지 계속됩니다. 재개되면, ErrorLevel과 SendMode에 대한 쓰레드의 설정이 자동으로 인터럽트 전과 똑 같은 상태로 복구됩니다; 다른 말로, 쓰레드는 인터럽트 되어도 부작용을 경험하지 않습니다 (단, 활성 창에 가한 변경은 예외입니다).

주의: KeyHistory 명령어/메뉴-항목은 얼마나 많은 쓰레드가 인터럽드된 상태에 있는지를 보여줍니다. ListHotkeys 명령어/메뉴-항목은 어느 핫키가 쓰레드를 가졌는지 보여줍니다.

스크립트 하나가 동시에 MsgBox, InputBox, FileSelectFile, 그리고 FileSelectFolder 대화상자를 여러 개 가질 수 있습니다. 이전 쓰레드가 이미 대화상자를 보여주고 있는 동안에 (핫키, 시간제한 서브루틴, 맞춤 메뉴 항목, 등등을 통하여.). 새 쓰레드를 또 기동하면 됩니다

기본값으로, 주어진 핫키나 핫스트링 서브루틴은 이미 실행 중이면 두 번째로 시작할 수 없습니다. 이 행위를 바꾸려면 #MaxThreadsPerHotkey를 사용하십시오.

쓰레드 우선 순위

어떤 쓰레드이든 (핫키, 시간제한 서브루틴, 맞춤 메뉴 항목, 등등.) 현재 쓰레드보다 우선 순위보다 낮으면 인터럽트 할 수 없습니다. 그 시간 동안, 타이머는 실행되지 않으며, 사용자가 (핫키나 GUI 버튼을 눌러서) 새로운 쓰레드를 만들려는 시도도 아무 효과가 없습니다. 버퍼 처리조차 되지 않습니다. 이 때문에, 보통 최고 우선순위의 쓰레드를 빨리 끝내도록 설계하는 것이 가장 좋습니다. 아니면 최고 우선 순위를 주지 말고 Critical을 사용하십시오.

우선 순위 기본값은 0입니다. 모든 쓰레드는 기본 우선 순위를 사용합니다. 단, 다음 방식 중 하나 때문에 바뀌는 경우는 예외입니다:
1) 시간제한 서브루틴은 SetTimer를 통하여 특정한 우선 순위가 부여됩니다.
2) 핫키는 Hotkey 명령어를 통하여 특정한 우선 순위가 부여됩니다.
3) 핫스트링은 #Hotstring 지시어를 통하여 또는 정의될 때 특정한 우선 순위가 부여됩니다.
4) 맞춤 메뉴 항목은 Menu 명령어를 통하여 특정 우선 순위가 부여됩니다.
5) 현재 쓰레드는 Thread 명령어를 통하여 자신의 우선 순위를 지정합니다.

OnExit 서브루틴은 (있다면) 언제나 호출되면 현재 쓰레드의 우선 순위에 상관없이 바로 실행됩니다.


Automating Winamp

Winamp 자동화하기

이 섹션은 핫키를 통하여 Winamp를 제어하는 법을 보여줍니다. 최소화되어 있든 비활성화 상태이든 상관없이 제어할 수 있습니다. 이 정보는 Winamp 2.78c로 검증되었지만 다른 배포본에도 역시 잘 작동할 것이라 믿습니다. 변경을 하였거나 개선을 하였으면 포롬에 게시해 주시거나 저자에게 연락을 주십시오.

다음 예제는 Ctrl+Alt+P 핫키를 Winamp의 pause/unpause 버튼을 누른 것과 동등하게 만듭니다:

^!p::
IfWinNotExist ahk_class Winamp v1.x
    return
; 그렇지 않으면, 위에서 "가장 마지막에 발견된" 창을 아래에 사용하도록 설정했습니다.
ControlSend, ahk_parent, c  ; Pause/Unpause
return

다음은 Winamp 2.x에서 사용가능한 몇 가지 키보드 단축키입니다 (다른 버전에서도 작동할 것입니다). 위의 예제는 다음 키들을 사용하도록 개정할 수 있습니다:

보낼 키 | 효과
c | 정지/재개
x | 플레이/재시작/재개
v | 멈춤
+v | 소리를 죽이며 천천히 멈춤
^v | 현재 트랙이 끝나면 멈춤
b | 다음 트랙으로
z | 이전 트랙으로
{left} | 5 초 되감음
{right} | 빠르게 5초 앞으로 감음
{up} | 볼륨 높게
{down} | 볼륨 낮게

; 다음 예제는 Winamp에게 현재 어느 트랙이 활성화되어 있는지 묻습니다:
SendMessage, 1024, 0, 120, ahk_class Winamp v1.x
if ErrorLevel <> FAIL
{
    ErrorLevel += 1  ; Winamp의 카운트는 0부터 시작합니다. 그래서 1 만큼 조정합니다.
    MsgBox, #%ErrorLevel% 번 트랙이 현재 연주 중입니다.
}


WinTitle & Last Found Window

WinTitle 매개변수 & 가장 마지막으로 발견된 창

많은 명령어와 몇몇 함수는 WinTitle 매개변수가 있습니다. 이 매개변수는 작업할 창을 식별하는 데 사용됩니다. 이 매개변수는 창의 제목 또는 제목 일부일 수도 있고 이 페이지에 기술된 다른 기준일 수도 있습니다.

간편 참조
Title | 부합 행위
A | 활성 창
ahk_class | 창 클래스
ahk_id | 유일한 ID/HWND
ahk_pid | 프로세스 ID
ahk_exe | 프로세스 이름/경로
ahk_group | 창 그룹
 | 다중 기준
(All empty) | 마지막으로 발견된 창

부합 행위

SetTitleMatchMode은 각 창의 제목에 부분 또는 전체 제목을 어떻게 비교할지 제어합니다. 설정에 따라, WinTitle은 정화하게 일치하는 제목이 될 수도 있고, 아니면 제목에 어디에나 나타나는 부문자열, 또는 RegEx 패턴이 될 수 있습니다. 이 설정은 또 ahk_class를 정확한 클래스 이름으로 이해할지 아니면 RegEx 패턴으로 이해할지 제어합니다.

숨은 창은 DetectHiddenWindows이 켜져 있을 때만 탐지됩니다. 언제나 숨을 참을 탐지하는 WinShow는 제외합니다.

여러 창이 WinTitle과 기타 기준에 부합하면, 가장 위에 부합한 창이 사용됩니다. 활성 창이 기준에 부합하면, 보통 다른 모든 창보다 위에 있기 때문에 우선 순위를 갖습니다. 그렇지만, 항상 최상단 창이 부합하면 (그리고 활성 창은 최상단 창이 아니면), 대신에 그것이 사용됩니다.

활성 창 (A)

WinTitle이 기호 A이고 다른 세 개의 창 매개변수가 비어 있거나 생략되면, 그 활성 창이 사용됩니다 (WinText, ExcludeTitle 그리고 ExcludeText).

; 활성 창의 ID/HWND를 열람합니다
id := WinExist("A")
MsgBox % id

; Win+&uarr을 눌러; 활성 창을 최대화합니다
#Up::WinMaximize, A

ahk_class 창 클래스

창 클래스는 시스템이 창을 생성하기 위하여 주형틀로 사용하는 속성의 집합입니다. 다른 말로, 창의 클래스 이름은 어떤 유형의 창인지 식별합니다. 창 클래스를 사용하려면, Window Spy가 보여주는 것처럼 ahk_class ExactClassName를 사용하십시오. ExactClassName은 WinGetClass로 열람할 수 있습니다.

RegEx 제목 부합 모드가 켜져 있으면, ahk_class는 정규 표현식을 받습니다.

; 콘솔 창을 활성화합니다 (예, cmd.exe)
WinActivate, ahk_class ConsoleWindowClass

ahk_id Unique ID / HWND

각 창이나 콘트롤에 유일한 ID가 있습니다. 이를 HWND (Handle to WiNDow)라고도 합니다. 이 ID를 사용하면 제목이 변해도 창이나 콘트롤을 식별할 수 있습니다. 창의 ID는 전형적으로 WinExist()나 WinGet을 통하여 열람합니다. 콘트롤의 ID는 전형적으로 ControlGet Hwnd, MouseGetPos, 또는 DllCall을 통하여 열람합니다. 또한, ahk_id는 콘트롤이 보이지 않아도 작동합니다; 즉, DetectHiddenWindows 설정은 콘트롤에 문제가 되지 않습니다.

WinActivate, ahk_id %VarContainingID%

ahk_pid 프로세스 ID

ahk_pid를 사용하면 특정 프로세스에 속한 창을 식별할 수 있습니다. 프로세스 식별자 (PID)는 전형적으로 WinGet, Run 또는 Process으로 열람합니다.

WinActivate, ahk_pid %VarContainingPID%

ahk_exe 프로세스 이름/경로 [v1.1.01+]

ahk_exe를 사용하면 주어진 경로나 이름의 프로세스에 속한 창을 식별할 수 있습니다.

ahk_pid는 특정한 프로세스 하나로 제한되는 반면에, ahk_exe는 주어진 문자열에 부합하는 이름 또는 전체 경로를 가진 모든 프로세스를 고려합니다. RegEx 제목 일치 모드가 켜져 있다면, ahk_exe는 정규 표현식을 받습니다. 그렇지 않으면, ahk_exe는 대소문자를 구분하는 이름이나 전체 경로를 받습니다; 예를 들어, ahk_exe notepad.exe는 ahk_exe C:\Windows\Notepad.exe, ahk_exe C:\Windows\System32\Notepad.exe 그리고 기타 변종들을 포괄합니다.

; 기존의 notepad.exe 창을 활성화하거나, 새로 엽니다
if WinExist("ahk_exe notepad.exe")
    WinActivate, ahk_exe notepad.exe
else
    Run, notepad.exe

ahk_group 창 그룹

ahk_group을 사용하면 이전에 정의된 창 그룹에 포함된 규칙에 부합하는창을 식별할 수 있습니다.

WinMinimize, WinMaximize, WinRestore, WinHide, WinShow, WinClose, 그리고 WinKill 명령어는 모든 그룹 창에 작동합니다. 대조적으로, WinActivate와 IfWinExist 같은 다른 창 명령어는 그룹의 최상위 창에만 작동합니다.

; 그룹을 정의합니다: 윈도우즈 탐색기 창
GroupAdd, Explorer, ahk_class ExploreWClass ; 비스타 이후에 사용안됨
GroupAdd, Explorer, ahk_class CabinetWClass

; 위의 기준에 부합하는 창은 모두 활성화합니다
WinActivate, ahk_group Explorer

다중 기준

(검색을 확대하는) ahk_group과 대조적으로, WinTitle 매개변수 안에 하나 이상의 기준을 특정해 검색의 범위를 좁힐 수 있습니다. 다음 예제에서, 스크립트는 제목에 My File.txt이 포함되어 있고 그리고 그의 클래스가 Notepad인 창을 기다립니다:

WinWait My File.txt ahk_class Notepad
WinActivate  ; 발견된 창을 활성화합니다.

이 모드를 사용할 때, 제목 텍스트를 (원하는 순서대로) 제일 먼저 나열해야 하고, 다음에 하나 이상의 기준이 따라 와야 합니다. 첫 번째 기준 이후로는 서로 정확하게 하나의 스페이스나 탭으로 갈라야 합니다 (다른 스페이스나 탭은 이전 기준의 기호 그대로의 부분으로 취급됩니다).

ahk_id를 다른 기준과 조합해 창 제목, 클래스 또는 기타 특성을 테스트할 수 있습니다:

MouseGetPos,,, id
if WinExist("ahk_class Notepad ahk_id " id)
    MsgBox 마우스가 노트패드 위에 있습니다.

"가장 마지막으로 발견된" 창

이것은 다음이 가장 마지막으로 발견한 창입니다: IfWin[Not]Exist, WinExist(), IfWin[Not]Active, WinActive(), WinWait[Not]Active, 또는 WinWait.

스크립트를 쉽게 만들고 관리할 수 있습니다. 왜냐하면 목표 창의 WinTitle과 WinText가 매 창 명령어마다 반복될 필요가 없기 때문입니다. 게다가, 스크립트의 수행성능도 더 좋아집니다. 왜냐하면 목표 창을 처음 발견하면 그 다음부터는 반복해서 검색할 필요가 없기 때문입니다.

"가장 마지막에 발견된" 창은 WinWait, WinActivateBottom, 그리고 GroupAdd를 제외하고 다른 모든 창 관련 명령어가 사용할 수 있습니다. 사용하려면, 그냥 네 개의 창 매개변수를 생략하면 됩니다 (WinTitle, WinText, ExcludeTitle, 그리고 ExcludeText).

각 쓰레드마다 자신의 "마지막으로 발견된" 창의 값을 유지합니다. 즉, 현재 쓰레드 또다른 쓰레드에 의해 인터럽트 되더라도, 원래 쓰레드가 재개할 때 인터럽트한 쓰레드의 것이 아니라 여전히 원래의 "마지막으로 발견된" 창의 값을 가진다는 뜻입니다..

마지막으로 발견된 창이 보이지 않는 Gui 창이면, DetectHiddenWindows가 꺼져 있더라도 사용할 수 있습니다. 이것은 종종 Gui +LastFound와 함께 조합해서 사용됩니다.

Run Notepad
WinWait Untitled - Notepad
WinActivate  ; 가장 마지막에 발견된 창을 사용합니다.

IfWinExist, Untitled - Notepad
{
    WinActivate  ; 위에서 발견된 창을 자동으로 사용합니다.
    WinMaximize  ; 같습니다
    Send, Some text.{Enter}
    return
}

IfWinNotExist, Calculator
    return
else
{
    WinActivate  ; 위의 "IfWinNotExist"는 또  "가장 마지막 발견" 창을 설정합니다.
    WinMove, 40, 40  ; 새 위치로 이동합니다.
    return
}


Enumerator

열거 객체 [AHK_L 49+]

집단 안의 항목들을 열거합니다.

Next

다음으로 열거된 항목을 열람합니다.

Enum.Next(OutputVar1 [, OutputVar2, ...])
OutputVar1, OutputVar2 | 구현에-종속적인 값을 열람합니다.
... | 지원되면, 추가 매개변수.
Returns | 성공하면 0-아닌 정수, 항목이 남아 있지 않으면 0, 또는 매개변수가 올바르지 않으면 빈 문자열을 돌려줍니다.

객체

ObjNewEnum()가 돌려주는 열거자는 키-값 쌍마다 한 번식 호출됩니다. 매개변수는 두 개까지 허용합니다:

OutputVar1 | 키-값 쌍에서 키(key)를 받습니다.
OutputVar2 | OutputVar1와 연관된 값(value)를 받습니다.

키-값 쌍은 구현에-정의된 순서로 반환됩니다. 즉, 전형적으로 할당된 순서와 같은 순서로 반환되지 않습니다. 기존의 키-값 쌍은 열거 중에 변경할 수는 있지만, 키를 삽입하거나 삭제하면 항목들이 여러 번 열거되거나 전혀 열거되지 않거나 뒤죽박죽이 됩니다.

관련 항목

For-회돌이, Object.NewEnum()

예제

; 샘플 데이터를 만듭니다.
obj := Object("red", 0xFF0000, "blue", 0x0000FF, "green", 0x00FF00)

; 열거합니다!
enum := obj._NewEnum()
While enum[k, v]
    t .= k "=" v "`n"
MsgBox % t

; AHK_L 59+
For k, v in obj
    s .= k "=" v "`n"
MsgBox % s


File Object

파일 객체 [AHK_L 42+]

파일 입/출력을 위한 인터페이스를 제공합니다. FileOpen이 이 유형의 객체를 돌려줍니다.

Read

문자열을 파일로부터 읽고 파일 포인터를 앞으로 이동시킵니다.

String := File.Read([Characters])
Characters | 읽을 문자의 최대 개수. 생략하면, 파일 나머지를 읽어서 하나의 문자열로 돌려줍니다. 콘솔 버퍼나 파이프 같이 포인터를 앞뒤로 이동시킬 수 없는 핸들로부터 파일 객체가 생성되었을 경우, 이 매개변수를 생략하면 메쏘드가 실패하거나 또는 현재 사용이 가능한 데이터만 돌려줄 가능성이 있습니다.
Returns | 문자열.

Write

문자열을 파일에 쓰고 파일 포인터를 앞으로 이동시킵니다.

File.Write(String)
String | 문자열.
Returns | 씌여진 바이트 개수 (문자 개수가 아님).

ReadLine

파일로부터 텍스트 한 줄을 읽고 파일 포인터를 앞으로 이동시킵니다.

Line := File.ReadLine()
Returns 텍스트 한 줄. 여기에는 파일과 그 파일을 여는 데 사용된 EOL 플래그에 따라 `n, `r`n 또는 `r이 포함될 수 있습니다.

WriteLine

문자열을 씁니다. 파일을 여는 데 사용된 플래그에 따라 다음에 `n 또는 `r`n이 따라옵니다. 파일 포인터를 앞으로 이동시킵니다.

File.WriteLine([String])
String | 선택적인 문자열.
Returns | 씌여진 바이트 개수 (문자 개수가 아님).

ReadNum

지정한 바이트 개수만큼 파일로부터 읽고 파일 포인터를 앞으로 이동시킵니다.

Num := File.ReadNumType()
NumType | 다음 중 하나를 함수 이름에 직접 지정합니다: UInt, Int, Int64, Short, UShort, Char, UChar, Double, 또는 Float.
Returns | 성공하면 바이트 개수, 그렇지 않으면 빈 문자열을 돌려줍니다.

WriteNum

지정된 바이트 개수 만큼 쓰고 파일 포인터를 앞으로 이동시킵니다.

File.WriteNumType(Num)
NumType | 다음 중 하나를 함수 이름에 직접 지정합니다: UInt, Int, Int64, Short, UShort, Char, UChar, Double, 또는 Float.
Num | 숫자.
Returns | 씌여진 바이트 개수. 예를 들면 WriteUInt는 성공하면 4를 돌려줍니다.

RawRead

날 이진 데이터를 파일로부터 메모리로 읽어 들입니다. 변수가 지정되어 있으면, 필요한 경우 자동으로 확대됩니다.

File.RawRead(VarOrAddress, Bytes)
VarOrAddress | 데이터가 복사될 변수 또는 메모리 주소. 사용법은 NumGet과 비슷합니다.
Bytes | 읽을 바이트의 최대 개수.
Returns | 읽은 바이트 개수.

RawWrite

날 이진 데이터를 파일에 씁니다.

File.RawWrite(VarOrAddress, Bytes)
VarOrAddress | 데이터를 담고 있는 변수 또는 메모리의 데이터 주소. 사용법은 NumPut과 비슷합니다.
Bytes | 쓸 바이트 개수.
Returns | 읽은 바이트 개수.

Seek

파일 포인터를 이동시킵니다.

File.Seek(Distance [, Origin = 0])
File.Position := Distance
File.Pos := Distance
Distance | 바이트 단위로 이동할 거리. 값이 낮을 수록 파일의 앞 쪽에 가깝습니다.
Origin 파일 포인터의 이동 시작 지점. 반드시 다음 하나가 되어야 합니다:
  • 0 (SEEK_SET): 파일의 처음. Distance는 0이상이어야 합니다.
  • 1 (SEEK_CUR): 파일 포인터의 현재 위치.
  • 2 (SEEK_END): 파일 끝. Distance는 보통 음의 정수입니다.
생략하면, Distance가 음의 정수일 때 Origin는 SEEK_END이 기본값이고 그렇지 않으면 SEEK_SET이 기본값입니다.
Returns | 성공하면 0-아닌 값을, 그렇지 않으면 0을 돌려줍니다.

Tell

Pos := File.Tell()
Pos := File.Position
Pos := File.Pos
Returns 파일 포인터의 현재 위치. 0이면 파일의 처음입니다.

Length

파일의 크기를 열람하거나 설정합니다.

FileSize := File.Length
File.Length := NewSize
NewSize | 바이트 단위로, 파일의 새 크기.
Returns | 바이트 단위로, 파일의 크기.

이 특성은 실제 파일에만 사용해야 합니다. 파일 객체가 파이프를 가리키는 핸들로부터 생성되었다면, 파이프의 내부 버퍼에서 현재 사용가능한 纛?데이터를 돌려줄 수 있지만, 이 행위는 보증하지 않습니다.

AtEOF

IsAtEOF := File.AtEOF
Returns 파일 포인터가 파일의 끝에 도달하면 0 아닌 값을, 그렇지 않으면 0을 돌려줍니다.

이 특성은 실제 파일에만 사용해야 합니다. 콘솔 버퍼나 파이프 같은 포인터-이동 없는 장치를 가리키는 핸들로부터 파일 객체가 생성되었다면, 반환 값은 의미가 없습니다. 그런 장치는 논리적으로 "파일 끝"이 없기 때문입니다.

Close

파일을 닫습니다. 캐쉬에 있는 데이터를 디스크로 비웁니다. 공유 잠금을 해제합니다. 객체가 해제되면 자동으로 파일이 닫히지만, 가능하면 빨리 닫기를 권장합니다.

File.Close()

매개변수도 없고 반환 값도 없습니다.

Encoding

이 파일 객체가 사용하는 텍스트 인코딩을 열람하거나 설정합니다.

Encoding := File.Encoding
File.Encoding := Encoding
Encoding 숫자 코드 페이지 식별자 (MSDN 참조) 또는 다음 문자열 중 하나:
  • UTF-8: Unicode UTF-8, CP65001와 동등함.
  • UTF-16: Unicode UTF-16 작은 값 종료형 바이트 순서r, CP1200와 동등함.
  • CPnnn: 숫치 식별자 nnn를 가진 코드 페이지.

인코딩은 -RAW 접미사를 붙이면 값을 돌려주지 않습니다. 파일이 어떻게 열렸든지 또는 안에 바이트 순서 표식 (BOM)이 들어 있든 말든 상관하지 않습니다. 인코딩 설정만으로 BOM이 붙거나 제거되지 않습니다. BOM은 보통 처음 파일이 생성될 때 씌여집니다.

v1.1.15.04+에서, 인코딩을 UTF-8-RAW이나 UTF-16-RAW으로 설정할 수 있습니다. 그러나 -RAW 접미사는 무시됩니다. 이전 버전에서, UTF-8-RAW와 UTF-16-RAW은 무효한 8-비트 인코딩처럼 행위하므로, 모든 비-ASCII 문자들이 폐기됩니다. 이것은 오직 File.Encoding에만 적용되지, FileOpen()에는 적용되지 않습니다.

__Handle

File.__Handle
Returns 시스템 파일 핸들, DllCall과 함께 사용하는 것이 목적입니다. CreateFile을 참조하십시오.

파일 객체는 내부적으로 읽기와 쓰기를 버퍼 처리합니다. 데이터가 객체의 내부 버퍼에 씌여졌다면, 핸들을 반환하기 전에 디스크에 써야 합니다. 버퍼에 파일로부터 읽은 데이터가 들어 있다면, 그 데이터는 폐기되고 File.Pos가 가리키는 실제 파일 포인터는 논리 위치로 재설정됩니다.


Func Object

Func Object [v1.1.00+]

스크립트가 호출할 수 있는 사용자-정의 함수나 내장 함수를 가리킵니다.

함수처럼 호출할 수 있는 다른 객체에 관한 정보는 함수 객체를 참조합니다.

함수 객체를 가리키는 참조는 함수 참조로 알려져 있습니다. 함수 참조를 열람하려면, 다음 예제와 같이 함수 객체를 사용하십시오:

; "StrLen"이라는 이름의 함수를 가리키는 참조를 열람합니다.
fn := Func("StrLen")

; 함수에 관한 정보를 보여줍니다.
MsgBox % fn.Name "() is " (fn.IsBuiltIn ? "built-in." : "user-defined.")

Call

함수를 호출합니다.

Func.Call(Parameters)  ; v1.1.19+
Func.(Parameters)  ; 예전 형식 - 비추천

매개변수와 반환 값은 함수가 정의합니다.

[v1.1.07+]: %Func%()를 사용하면 이름이나 참조로 함수를 호출할 수 있습니다. 또는 __Call 메타-함수를 구현한 객체를 호출할 수 있습니다. 가능하면 Func.() 대신에 이것을 사용해야 합니다.

Bind [v1.1.20+]

매개변수를 함수에 묶고 BoundFunc 객체를 돌려줍니다.

BoundFunc := Func.Bind(Parameters)

Parameters는 개수에 상관이 없습니다.

자세한 정보와 예제는 BoundFunc 객체를 참조하십시오.

Name

함수의 이름을 돌려줍니다.

Func.Name

IsBuiltIn

함수가 내장 함수이면 참(true)을 돌려주고 그렇지 않으면 거짓(false)을 돌려줍니다.

Func.IsBuiltIn

IsVariadic

함수가 가변 함수이면 참(true)을 돌려주고 그렇지 않으면 거짓(false)을 돌려줍니다.

Func.IsVariadic

MinParams

필수 매개변수의 개수를 돌려줍니다.

Func.MinParams

MaxParams

사용자 정의 함수에 공식적으로-선언된 매개변수의 개수를 돌려줍니다. 또는 내장 함수의 최대 매개변수 개수를 돌려줍니다.

Func.MaxParams

함수가 가변 함수이면, 반환 값은 "variadic*" 매개변수로 흘러 넘치지 않고 함수가 받아 들일 수 있는 매개변수의 최대 개수를 나타냅니다.

IsByRef()

매개변수가 ByRef인지 결정합니다.

Func.IsByRef(ParamIndex)
ParamIndex | 선택적입니다: 매개변수의 1 기반-인덱스. 생략되면, 반환 값은 함수에 ByRef 매개변수가 있는지 알려줍니다.
Returns | 함수가 내장 함수이거나 ParamIndex가 유효하지 않으면 빈 문자열을 돌려줍니다; 그렇지 않으면, 매개변수가 ByRef인지 나타내는 불리언 값을 돌려줍니다.

IsOptional()

매개변수가 선택적인지 결정합니다.

Func.IsOptional(ParamIndex)
ParamIndex | 선택적: 매개변수의 1-기반 인덱스. 생략되면, 반환 값은 함수에 선택적 매개변수가 있는지 알려줍니다.
Returns | ParamIndex가 유효하지 않으면 빈 문자열을 돌려주고; 그렇지 않으면, 매개변수가 선택적인지 알려주는 불리언 값을 돌려줍니다.

가변 함수인 경우 매개변수는 공식적으로 선언할 필요가 없습니다. 내장 함수를 지원합니다.


Function Objects

함수 객체

"함수 객체"는 보통 다음을 뜻합니다:

  • Func object를 가리키는 참조 주소. 실제 함수를 가리킵니다; 내장 함수 또는 스크립트에 정의된 함수.
  • 함수처럼 호출할 수 있는 사용자-정의 객체. 이는 종종 "functor"라고 지칭되기도 합니다.
  • 함수처럼 호출할 수 있는 다른 객체. 예를 들어 COM 메쏘드가 반환하는 BoundFunc object 또는 JavaScript 함수 객체.

함수 객체는 다음과 함께 사용할 수 있습니다:

  • 구이 콘트롤 이벤트 (g-labels)
  • 핫키
  • 메뉴
  • OnClipboardChange()
  • OnExit()
  • OnMessage()
  • SetTimer

사용자-정의 함수

사용자-정의 함수 객체는 다음 일반 패턴을 따라야 합니다:

class YourClassName {
    Call(a, b) {  ; 필요한 만큼 매개변수를 선언하거나, array*를 선언합니다.
        ;...
    }
    __Call(method, args*) {
        if (method = "")  ; For %fn%() or fn.()
            return this.Call(args*)
        if (IsObject(method))  ; 이 함수 객체가 메쏘드로 사용되면.
            return this.Call(method, args*)
    }
    ;...
}

정확하게 어느 부분이 필요한지는 사용법에 따라 다릅니다:

  • 스크립트가 %this%()나 this.()를 사용했다면 method는 빈 문자열입니다.
  • 이 함수 객체가 메쏘드로 사용중이라면, IsObject(method)는 참이고 method에는 목표 객체를 가리키는 참조 주소가 담깁니다. 예를 들어, x.y가 this 함수 객체를 가리키면, x.y() → this[x]() → this.__Call(x) → this.Call(x).
  • [v1.1.20+]: OnMessage나 SetTimer와 같이 역호출 함수를 받는 내장 함수 중 하나가 이 함수 객체를 사용중이면, Call 메쏘드만 필요합니다.

__Call으로 직접 같은 일을 할 수 있습니다. 그렇지만, __Call을 Call로 방향전환하기를 권장합니다. 쉽게 AutoHotkey v2로 이전할 수 있습니다. 오토핫키 v2에서 %this%()의 행위와 메쏘드 호출은 직접적으로 Call 메쏘드를 호출하도록 변경되었습니다.

BoundFunc Object [v1.1.20+]

함수처럼 행위합니다. 그러나 그저 미리 정의된 매개변수를 다른 함수로 건네는 역할만 합니다.

두 가지 방법으로 BoundFunc 객체를 생성할 수 있습니다:

  • Func.Bind() 메쏘드를 호출하면, 매개변수 값을 함수에 묶습니다.
  • ObjBindMethod()를 호출하면, 매개변수 값과 메쏘드 이름을 목표 객체에 묶습니다.

BoundFunc 객체는 아래 예제에 보여주는 바와 같이 호출할 수 있습니다. 다른 메쏘드는 지원하지 않습니다. BoundFunc가 호출될 때, 그에 묶인 함수나 메쏘드를 호출하면서, 묶인 매개변수와 그리고 호출자가 건넨 것을 모두 건넵니다. 예를 들어:

fn := Func("RealFn").Bind(1)

%fn%(2)    ; Shows "1, 2"
fn.Call(3) ; Shows "1, 3"

RealFn(a, b) {
    MsgBox %a%, %b%
}

ObjBindMethod()를 사용하면 메쏘드 자체를 가리키는 참조 주소를 열람할 수 없을 때 메쏘드에 묶을 수 있습니다. 예를 들어:

file := FileOpen(A_ScriptFullPath, "r")
getLine := ObjBindMethod(file, "ReadLine")
MsgBox % %getLine%()  ; 이 파일의 첫 줄을 보여줍니다.


Object

오토핫키의 기본 객체 데이터유형은 연관 배열입니다. 그의 행위를 재단할 수 있는 특징이 있습니다. 기본값으로, {}, [], Object() 그리고 Array()가 생성한 모든 객체는 다음 메쏘드를 지원합니다:

  • InsertAt / RemoveAt
  • Push / Pop
  • Delete
  • MinIndex / MaxIndex / Length
  • SetCapacity / GetCapacity
  • GetAddress
  • _NewEnum
  • HasKey
  • Clone
  • ObjRawSet (function)

비추천 (사용을 권장하지 않습니다):

  • Insert
  • Remove

각 메쏘드 마다 동등한 함수가 있습니다. 이 함수를 사용하면 다른 객체가 구현한 맞춤 행위를 우회할 수 있습니다 -- 이 함수들은 꼭 우회의 목적으로만 사용하시기를 권장합니다. 호출하려면, 메쏘드 이름 앞에 "Obj"를 붙인 다음 목표 객체를 첫 번째 매개변수로 건네십시오. 예를 들어:

array := [1, 2, 3]
MsgBox % ObjMaxIndex(array) " = " array.MaxIndex()

Obj 함수가 잘못된 유형의 객체 또는 값으로 호출되면, 빈 문자열을 돌려줍니다.

InsertAt [v1.1.21+]

하나 이상의 값을 선형 배열 안에 주어진 위치에 삽입합니다..

Object.InsertAt(Pos, Value1 [, Value2, ... ValueN])
Pos

Value1을 삽입할 위치. 연이은 값은 Pos+1, Pos+2, 등등에 삽입됩니다.

Value1 ...

삽입할 하나 이상의 값들. 값 배열을 삽입하려면, 마지막 매개변수로 theArray*를 건네십시오.

논평

InsertAt은 RemoveAt과 상대적입니다.

객체는 연관 배열이므로, Pos도 Value1 값과 연관되는 정수 키입니다. 이전에 Pos 위치와 그 오른쪽에 있는 항목들은 정확하게 매개변수의 갯수만큼 오른쪽으로 이동합니다. 그 결과 몇몇 값들이 소실될 수 있습니다 (즉, 이 객체는 희소 배열입니다). 예를 들어:

x := []
x.InsertAt(1, "A", "B") ; =>  ["A", "B"]
x.InsertAt(2, "C")      ; =>  ["A", "C", "B"]

; 성긴/할당되지 않은 원소는 보존됩니다:
x := ["A", , "C"]
x.InsertAt(2, "B")      ; =>  ["A", "B",    , "C"]

x := ["C"]
x.InsertAt(1, , "B")    ; =>  [   , "B", "C"]

InsertAt은 객체의 정수 키가 선형 배열 안의 위치를 나타내는 경우에만 사용해야 합니다. 그 객체에 ID나 핸들 같이 임의의 정수 키가 담겨 있면, InsertAt은 원치 않은 부작용을 야기할 가능성이 높습니다. 예를 들어:

x := [], handleX := 0x4321, handleY := 0x1234
x.InsertAt(handleX, "A")
MsgBox % x[handleX]  ; A - okay
x.InsertAt(handleY, "B")
MsgBox % x[handleX]  ; 비어 있습니다
MsgBox % x[handleX+1]  ; 이곳이 "B"의 새 "위치"입니다.

InsertAt은 문자열이나 객체 키에 영향을 주지 않습니다. 그래서 혼합 키 유형이 담긴 객체와 안전하게 사용할 수 있습니다.

RemoveAt [v1.1.21+]

선형 배열에서 주어진 위치로부터 항목을 제거합니다.

Object.RemoveAt(Pos [, Length])
Pos

제거할 값의 위치.

Length

제거할 값의 범위의 길이. Pos부터 Pos+Length-1까지의 항목이 제거됩니다. 생략하면, 하나의 항목만 제거됩니다.

Return Value

만약 Length가 생략되면, Pos으로 제거된 값이 반환됩니다 (없으면 비어 있습니다). 그렇지 않으면, 반환 값은 값을 가진 항목이 제거된 개수입니다. 이것은 희소 배열의 Length와 다르지만, 언제나 0부터Length (포함) 사이입니다.

Remarks

RemoveAt은 InsertAt에 상대적입니다.

Pos 오른쪽의 나머지 항목들은 왼쪽으로 Length 만큼 (또는 생략되면 1만큼) 이동합니다. 제거된 범위에서 어떤 항목들은 값이 없더라도 상관이 없습니다. 예를 들어:

x := ["A", "B"]
MsgBox % x.RemoveAt(1)  ; A
MsgBox % x[1]           ; B

x := ["A", , "C"]
MsgBox % x.RemoveAt(1, 2)  ; 1
MsgBox % x[1]              ; C

RemoveAt은 그 객체의 정수 키가 선형 배열에서 위치를 나타낼 경우에만 사용해야 합니다. 그 객체 안에 ID나 핸들 같이 임의의 정수키가 있다면, RemoveAt은 원하지 않는 부작용을 야기할 가능성이 높습니다. 예를 들어:

x := {0x4321: "A", 0x1234: "B"}
MsgBox % x.RemoveAt(0x1234) ; B
MsgBox % x[0x4321]          ; Empty
MsgBox % x[0x4321-1]        ; A

RemoveAt은 문자열이나 객체 키에 영향을 미치지 않습니다. 그래서 혼합 키 유형이 담긴 객체와 안전하게 사용할 수 있습니다.

Push [v1.1.21+]

배열의 끝에 값을 추가합니다.

Object.Push([ Value, Value2, ..., ValueN ])
Value ...

삽입할 하나 이상의 값. 값 배열을 삽입하려면, 마지막 매개변수로 theArray*를 건네십시오.

Return Value

가장 마지막으로 삽입된 값의 위치, 배열이 음수 지표에 원소를 가지고 있다면 음의 정수일 수 있습니다.

Remarks

배열이 비어 있거 또는 오직 문자열이나 객체 키만 담겨 있다면 첫 번째 값은 위치 1에 삽입됩니다.

그렇지 않으면, 첫 번째 값은 Object.MaxIndex() + 1에 삽입됩니다. 그 위치가 음수 또는 0이라도 상관없습니다. 이 위치가 마음에 안들고 객체에 음수 키가 들어 있을 수 있다면, 대신에 Object.InsertAt(Object.Length() + 1, ...)를 사용할 수 있습니다.

Pop [v1.1.21+]

마지막 배열 원소를 제거하고 돌려줍니다.

Value := Object.Pop()

배열 원소가 없다면, 반환 값은 빈 문자열입니다. 그렇지 않으면, 다음과 동등합니다:

Value := Object.RemoveAt(Object.Length())

Delete [v1.1.21+]

키-값 쌍을 객체로부터 제거합니다.

Object.Delete(Key)
Object.Delete(FirstKey, LastKey)
Key

Any single key.

FirstKey, LastKey

유효한 범위의 정수나 문자키. FirstKey <= LastKey. 두 키 모두 유형이 같아야 합니다.

Return Value

정확하게 매개변수가 하나만 있다면, 제거된 값이 반환됩니다 (없다면 비어 빈 값을 돌려줍니다). 그렇지 않으면 반환 값은 발견되거나 제거된 키의 개수입니다.

Remarks

RemoveAt와 다르게, Delete는 제거하지 않은 키-값 쌍에 영향을 주지 않습니다. 예를 들어:

x := ["A", "B"]
MsgBox % x.RemoveAt(1)  ; A
MsgBox % x[1]           ; B

x := ["A", "B"]
MsgBox % x.Delete(1)    ; A
MsgBox % x[1]           ; Empty

MinIndex / MaxIndex [AHK_L 31+]

MinIndex := Object.MinIndex()
MaxIndex := Object.MaxIndex()

정수 키가 존재하면, MinIndex는 가장 낮은 값을 돌려주고 MaxIndex는 가장 높은 값을 돌려줍니다. 그렇지 않으면 빈 문자열을 돌려줍니다.

Length [v1.1.21+]

Length := Object.Length()

위치 1에서 시작하여 선형 배열의 길이를 돌려줍니다; 즉, 객체 안에서 가장 높은 양의 정수 키를 돌려주고, 그게 없다면 0을 돌려줍니다.

MsgBox % ["A", "B", "C"].Length()  ;  3
MsgBox % ["A",    , "C"].Length()  ;  3
MsgBox % {-10: 0, 10: 0}.Length()  ; 10
MsgBox % {-10: 0, -1: 0}.Length()  ;  0

SetCapacity [AHK_L 31+]

객체의 또는 객체 필드의 가용 능력을 조정합니다.

Object.SetCapacity(MaxItems)
Object.SetCapacity(Key, ByteSize)
MaxItems | 객체가 담을 수 있는키-값 쌍의 최대 개수. 이 값을 넘어서면 자동으로 확대됩니다. 키-값 쌍의 현재 개수보다 작으면, 대신에 현재 개수가 사용되고, 사용되지 않는 공간은 모두 해제됩니다.
Key | 유효한 키면 모두.
ByteSize | 필드의 문자열 버퍼의 바이트 단위로 새 크기. 널 종료 문자는 제외합니다. 필드가 존재하지 않으면, 새로 생성됩니다. ByteSize가 0이면, 버퍼가 해제되지만 빈 필드는 제거되지 않습니다. ByteSize가 현재 크기보다 작으면, 초과된 데이터는 잘려 나갑니다; 그렇지 않으면 기존의 모든 데이터가 보존됩니다.
Returns | 성공하면 새 가용 능력, 그렇지 않으면 빈 문자열을 돌려줍니다.

GetCapacity [AHK_L 31+]

MaxItems := Object.GetCapacity()
ByteSize := Object.GetCapacity(Key)

객체나 객체 필드의 현재 가용 능력을 돌려줍니다.

GetAddress [AHK_L 31+]

Ptr := Object.GetAddress(Key)

있다면, 필드의 문자열 버퍼의 현재 주소를 돌려줍니다.

NewEnum [AHK_L 49+]

Enum := Object._NewEnum()

새 열거자(enumerator)를 돌려주어 이 객체의 키-값 쌍을 열거합니다. 이 메쏘드는 보통 직접 호출되지 않고, for-회돌이 안에서 사용됩니다.

HasKey [AHK_L 53+]

Object.HasKey(Key)

Key가 Object안의 값 (even "")에 연관되어 있으면 참을, 그렇지 않으면 거짓을 돌려줍니다.

Clone [AHK_L 60+]

Clone := Object.Clone()

객체의 얕은 사본을 돌려줍니다.

ObjRawSet

키-값 쌍을 객체에 저장하거나 덮어씁니다.

ObjRawSet(Object, Key, Value)

이 함수로 스크립트는 __Set 메타-함수를 우회할 수 있습니다. 필요하지 않으면, 대신에 정상적인 할당을 사용해야 합니다. 예를 들어: Object[Key] := Value

메타-함수를 우회하는 것이 목적이므로, 메쏘드가 아니라 함수입니다. 내장 메쏘드를 호출하면 일반적으로 __Call meta-함수가 호출됩니다.

Insert [AHK_L 31+]

비추천: Insert는 새 스크립트에 사용을 추천하지 않습니다. 대신에 InsertAt, Push, ObjRawSet 또는 그냥 단순하게 할당을 사용하십시오.

키-값 쌍을 객체에 삽입합니다. 정수 키가 주어지면 자동으로 기존의 키를 조정합니다.

Object.Insert(Pos, Value1 [, Value2, ... ValueN ])
Object.Insert(Value)
Object.Insert(StringOrObjectKey, Value)

Insert의 행위는 매개변수의 개수 그리고 유형에 따라 달라집니다:

  • 매개변수가 여러 개이고 첫 매개변수가 정수이면, Insert는 InsertAt처럼 행위합니다.
  • 맥개변수가 여러 개이고 첫 배개변수가 정수가 아니면, Insert는 ObjRawSet처럼 행위합니다.
  • 매개변수가 하나만 있으면, Insert는 Push처럼 행위합니다.

Insert는 true를 돌려줍니다. v1.1.21 이후에서, 메모리 할당이 실패하면 예외가 던져집니다. 이전 버전에서는 그 경우 빈 문자열을 돌려주었습니다.

Remove [AHK_L 31+]

비추천: Remove는 새 스크립트에 사용을 추천하지 않습니다. 대신에 RemoveAt, Delete 또는 Pop을 사용하십시오.

객체로부터 키-값 쌍을 제거합니다.

Object.Remove(FirstKey, LastKey)

Remove의 행위는 매개변수의 개수와 유형에 따라 달라집니다:

  • Object.Remove(Integer)는 Object.RemoveAt(Integer)처럼 행위합니다.
  • Object.Remove(Integer, "")는 Object.Delete(Integer)처럼 행위합니다.
  • Object.Remove(Integer1, Integer2)는 Object.RemoveAt(Integer1, Integer2 - Integer1 + 1)처럼 행위합니다.
  • Object.Remove()는 Object.Pop()처럼 행위합니다.
  • 다른 모든 매개변수 조합은 Delete처럼 행위합니다.


Context Sensitive Help in Any Editor -- by Rajat

문맥 감지 도움말 -- by Rajat

이 스크립트는 Ctrl+2 (선택에 따라 다른 핫키)를 누르면 선택된 오토핫키 명령어나 키워드에 대한 도움말을 보여줍니다. 아무것도 선택하지 않으면 명령어 이름을 현재 줄의 처음으로부터 추출합니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

; 아래의 핫키는 (ControlGet이 대부분의 고급 편집기와 작동하지 않기 때문에)
; 가능하면 많은 에디터와의 호환성을 위해 클립보드를 사용합니다.
; 원래 클립보드 내용을 나중에 복구하지만, 평범한 텍스트로 복구합니다.
; 그래도 없는 것보다는 낫습니다.

$^2::
; 다음 값들은 이 핫키의 쓰레드가 존재하는 동안에만 효과가 있습니다.
; 그러므로, 원래 값으로 다시 복구할 필요가 없습니다
; 왜냐하면 쓰레드가 끝나면 자동으로 복구되기 때문입니다:
SetWinDelay 10
SetKeyDelay 0
AutoTrim, On

if A_OSType = WIN32_WINDOWS  ; Windows 9x
    Sleep, 500  ; 사용자에게 키를 뗄 시간을 줍니다.

C_ClipboardPrev = %clipboard%
clipboard =
; 있다면 강조된 단어를 사용합니다.
; (어떤 경우 사용자는 명령어가 아닌 것을 의도적으로 강조할 수 있기 때문입니다):
Send, ^c
ClipWait, 0.1
if ErrorLevel <> 0
{
    ; 편집기는 커서 키를 다르게 취급하기 때문에 전체 줄을 얻습니다:
    Send, {home}+{end}^c
    ClipWait, 0.2
    if ErrorLevel <> 0  ; 거의 없는 경우이므로 에러를 보고하지 않습니다.
    {
        clipboard = %C_ClipboardPrev%
        return
    }
}
C_Cmd = %clipboard%  ; 이것으로 앞뒤의 탭과 & 스페이스가 제거됩니다.
clipboard = %C_ClipboardPrev%  ; 사용자를 위해 원래 클립보드를 복구합니다.
Loop, parse, C_Cmd, %A_Space%`,  ; 첫 번째 스페이스나 쉼표가 명령어의 끝입니다.
{
    C_Cmd = %A_LoopField%
    break ; 즉, 한 번만 반복하면 됩니다.
}
IfWinNotExist, AutoHotkey Help
{
    ; 오토핫키의 위치를 알아냅니다:
    RegRead, ahk_dir, HKEY_LOCAL_MACHINE, SOFTWARE\AutoHotkey, InstallDir
    if ErrorLevel  ; 발견이 안되면, 다른 위치에서 찾아봅니다.
    {
        if A_AhkPath
            SplitPath, A_AhkPath,, ahk_dir
        else IfExist ..\..\AutoHotkey.chm
            ahk_dir = ..\..
        else IfExist %A_ProgramFiles%\AutoHotkey\AutoHotkey.chm
            ahk_dir = %A_ProgramFiles%\AutoHotkey
        else
        {
            MsgBox 오토핫키 폴더를 발견하지 못했습니다.
            return
        }
    }
    Run %ahk_dir%\AutoHotkey.chm
    WinWait AutoHotkey Help
}
; 위에서 "마지막 발견" 창을 설정했고 그것을 아래에 사용합니다:
WinActivate
WinWaitActive
StringReplace, C_Cmd, C_Cmd, #, {#}
send, !n{home}+{end}%C_Cmd%{enter}
return


Easy Window Dragging (requires XP/2k/NT)

창을 쉽게 끄는 방법 (XP/2k/NT 이상)

보통, 창은 제목 바를 클릭해서 끌 수 있습니다. 이 스크립트는 창 안의 어느 지점에서든 끌 수 있도록 확장합니다. 이 모드를 활성화하려면, CapsLock 또는 가운데 버튼을 누르면서 클릭하면, 창을 새 위치까지 끌 수 있습니다.

이 스크립트 내려 받기 | 다른 샘플 스크립트 | 홈으로

; 주의: 선택적으로 계속 누르고 있을 필요 없이
; 마우스 버튼을 누른 다음에 Capslock 또는 가운데 버튼을 떼도 됩니다
; 이 스크립트는 v1.0.25+를 요구합니다..

~MButton & LButton::
CapsLock & LButton::
CoordMode, Mouse  ; 화면/절대 좌표를 변환합니다.
MouseGetPos, EWD_MouseStartX, EWD_MouseStartY, EWD_MouseWin
WinGetPos, EWD_OriginalPosX, EWD_OriginalPosY,,, ahk_id %EWD_MouseWin%
WinGet, EWD_WinState, MinMax, ahk_id %EWD_MouseWin%
if EWD_WinState = 0  ; 창이 최대화 되어 있지 않은 경우에만,
    SetTimer, EWD_WatchMouse, 10 ; 사용자가 마우스를 끄는 것을 추적합니다.
return

EWD_WatchMouse:
GetKeyState, EWD_LButtonState, LButton, P
if EWD_LButtonState = U  ; 버튼이 떼어졌습니다. 그래서 끌기가 완료 되었습니다.
{
    SetTimer, EWD_WatchMouse, off
    return
}
GetKeyState, EWD_EscapeState, Escape, P
if EWD_EscapeState = D  ; Escape이 눌렸습니다. 그래서 끌기가 취소 되었습니다.
{
    SetTimer, EWD_WatchMouse, off
    WinMove, ahk_id %EWD_MouseWin%,, %EWD_OriginalPosX%, %EWD_OriginalPosY%
    return
}
; 그렇지 않으면, 창을 다시 배치해
; 사용자가 마우스를 끌어 변경된 마우스 좌표를 반영합니다:
CoordMode, Mouse
MouseGetPos, EWD_MouseX, EWD_MouseY
WinGetPos, EWD_WinX, EWD_WinY,,, ahk_id %EWD_MouseWin%
SetWinDelay, -1   ; 아래를 더 부드럽게 더 빠르게 이동시킵니다.
WinMove, ahk_id %EWD_MouseWin%,, EWD_WinX + EWD_MouseX - EWD_MouseStartX, EWD_WinY + EWD_MouseY - EWD_MouseStartY
EWD_MouseStartX := EWD_MouseX  ; 이 서브루틴에 대한 다음 타이머 호출을 업데이트 합니다.
EWD_MouseStartY := EWD_MouseY
return


Easy Window Dragging -- KDE style (requires XP/2k/NT) -- by Jonny

창을 쉽게 끄는 방법 -- KDE 스타일 (XP/2k/NT 요구) -- by Jonny

이 스크립트는 훨씬 더 쉽게 창을 이동하거나 크기를 변경할 수 있도록 만들어 줍니다: 1) 창 안 아무데나 ALT 키와 LEFT-클릭을 누르고 창을 새 위치로 끌 수 있습니다; 2) 창 안 아무 곳이나 ALT와 RIGHT-클릭으로 끌어서 쉽게 크기를 변경할 수 있습니다; 3) ALT를 두 번, 그러나 두 번째를 놓기 전에, 왼클릭하면 마우스 커서 아래의 창을 최소화하고 우클릭하거나 또는 가운데 클릭하면 창을 닫을 수 있습니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

; 이 스크립트는 포럼에 있는 많은 분들로부터
; 영감을 얻어 작성되었습니다. 훌륭한 작품을 공개해 주신 ck, thinkstorm, Chris,
; 그리고 aurelian에게 감사의 말씀을 전합니다.

; 변경 이력:
; November 07, 2006: !RButton에서 크기 조절 코드 최적화, bluedawn 제공.
; February 05, 2006: 더블-alt (~Alt 핫키)가 최신 버전의 AHK에서 작동하도록 수정.

; 더블D-Alt 수식키는 알트 키를 두 번 누르면 활성화 됩니다.
; 더블 클릭과 많이 닮았습니다.
; 두 번째 알트 키는 클릭할 때까지 누르고 계십시오.
;
; 단축키:
;  Alt + Left Button  : 끌어 창을 이동.
;  Alt + Right Button : 끌어 창 크기를 변경.
;  Double-Alt + Left Button   : 창 최소화.
;  Double-Alt + Right Button  : 창 최대화/복구.
;  Double-Alt + Middle Button : 창 닫기.
;
; 선택적으로 첫 번째 클릭 다음에 알트 키를 놓을 수 있습니다.
; 계속 누르고 있을 필요가 없습니다.

If (A_AhkVersion < "1.0.39.00")
{
    MsgBox,20,,이 스크립트는 현재의 오토핫키 버전에서 제대로 작동하지 않을 가능성이 있습니다. 계속할까요?
    IfMsgBox,No
    ExitApp
}

; 다음은 필자의 시스템에서 가장 부드럽게 작동하는 설정입니다
; 여러분의 비디오 카드와 시피유 성능에 따라
; 이 값을 올리거나 내리면 됩니다.
SetWinDelay,2

CoordMode,Mouse
return

!LButton::
If DoubleAlt
{
    MouseGetPos,,,KDE_id
    ; 이 메시지는 거의 WinMinimize와 동등하지만,
    ; PSPad의 버그를 피합니다.
    PostMessage,0x112,0xf020,,,ahk_id %KDE_id%
    DoubleAlt := false
    return
}
; 최초의 마우스 위치와 창 아이디를 얻습니다.
; 창이 최대화되어 있다면 취소합니다.
MouseGetPos,KDE_X1,KDE_Y1,KDE_id
WinGet,KDE_Win,MinMax,ahk_id %KDE_id%
If KDE_Win
    return
; 최초의 창 위치를 얻습니다.
WinGetPos,KDE_WinX1,KDE_WinY1,,,ahk_id %KDE_id%
Loop
{
    GetKeyState,KDE_Button,LButton,P ; 버튼을 놓았다면 빠져 나갑니다.
    If KDE_Button = U
        break
    MouseGetPos,KDE_X2,KDE_Y2 ; 현재 마우스 위치를 얻습니다.
    KDE_X2 -= KDE_X1 ; 최초 마우스 위치로부터 상대거리(offset)를 얻습니다.
    KDE_Y2 -= KDE_Y1
    KDE_WinX2 := (KDE_WinX1 + KDE_X2) ; 이 상대거리를 창위 위치에 적용합니다.
    KDE_WinY2 := (KDE_WinY1 + KDE_Y2)
    WinMove,ahk_id %KDE_id%,,%KDE_WinX2%,%KDE_WinY2% ; 창을 새 위치로 이동시킵니다.
}
return

!RButton::
If DoubleAlt
{
    MouseGetPos,,,KDE_id
    ; 최대화 상태와 복구 상태 사이를 토글합니다.
    WinGet,KDE_Win,MinMax,ahk_id %KDE_id%
    If KDE_Win
        WinRestore,ahk_id %KDE_id%
    Else
        WinMaximize,ahk_id %KDE_id%
    DoubleAlt := false
    return
}
; 최초 마우스 위치와 창 아이디를 얻습니다.
; 창이 최대화 되어 있다면 취소합니다.
MouseGetPos,KDE_X1,KDE_Y1,KDE_id
WinGet,KDE_Win,MinMax,ahk_id %KDE_id%
If KDE_Win
    return
; 최초 창의 위치와 크기를 얻습니다.
WinGetPos,KDE_WinX1,KDE_WinY1,KDE_WinW,KDE_WinH,ahk_id %KDE_id%
; 현재 마우스가 있는 창 구역을 정의합니다.
; 네 구역은  좌상, 우상, 좌하, 우하입니다.
If (KDE_X1 < KDE_WinX1 + KDE_WinW / 2)
   KDE_WinLeft := 1
Else
   KDE_WinLeft := -1
If (KDE_Y1 < KDE_WinY1 + KDE_WinH / 2)
   KDE_WinUp := 1
Else
   KDE_WinUp := -1
Loop
{
    GetKeyState,KDE_Button,RButton,P ; 버튼이 눌려 있으면 빠져 나갑니다.
    If KDE_Button = U
        break
    MouseGetPos,KDE_X2,KDE_Y2 ; 현재 마우스 위치를 얻습니다.
    ; 현재 창의 위치와 크기를 얻습니다.
    WinGetPos,KDE_WinX1,KDE_WinY1,KDE_WinW,KDE_WinH,ahk_id %KDE_id%
    KDE_X2 -= KDE_X1 ; 최초 마우스 위치로부터 상대거리(offset)를 얻습니다.
    KDE_Y2 -= KDE_Y1
    ; 이제, 정의된 구역에 맞게 행위합니다.
    WinMove,ahk_id %KDE_id%,, KDE_WinX1 + (KDE_WinLeft+1)/2*KDE_X2  ; 크기 변경된 창의 X
                            , KDE_WinY1 +   (KDE_WinUp+1)/2*KDE_Y2  ; 크기 변경된 창의 Y
                            , KDE_WinW  -     KDE_WinLeft  *KDE_X2  ; 크기 변경된 창의 W
                            , KDE_WinH  -       KDE_WinUp  *KDE_Y2  ; 크기 변경된 창의 H
    KDE_X1 := (KDE_X2 + KDE_X1) ; 다음 반복을 위해 최초 위치로 리셋합니다.
    KDE_Y1 := (KDE_Y2 + KDE_Y1)
}
return

; "Alt + MButton"이 더 간단할 수 있지만,
; 필자는 다음과 같이 연산에
; 보안을 추가하는 것을 좋아합니다.
!MButton::
If DoubleAlt
{
    MouseGetPos,,,KDE_id
    WinClose,ahk_id %KDE_id%
    DoubleAlt := false
    return
}
return

; 다음은 알트 키의 "더블-클릭"을 탐지합니다.
~Alt::
DoubleAlt := A_PriorHotKey = "~Alt" AND A_TimeSincePriorHotkey < 400
Sleep 0
KeyWait Alt  ; 이렇게 하면 키보드의 자동 반복 특징 때문에 방해 받지 않습니다.
return


Easy Access to Favorite Folders -- by Savage

자주 가는 폴더에 쉽게 접근하는 법 -- by Savage

어떠 유형이 창이 활성화되어 있는 동안에 마우스 가운데 버튼을 클릭하면, 이 스크립트는 자주 가는 폴더의 메뉴를 보여줍니다. 자주 가는 폴더를 선택하는 순간 그 활성 창 안의 폴더로 순간 이동합니다. 다음 유형의 창을 지원합니다: 1) 표준 파일 열기 또는 저장 대화상자; 2) 탐색 창; 3) 콘솔 (명령어 프롬프트) 창. 메뉴는 또 선택적으로 지원되는 않는 유형의 창에 대해서도 보여줄 수 있습니다. 이 경우 선택된 폴더는 새 탐색 창에 열립니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | Home

; 주의: 탐색 창에서, "View > Toolbars > Address Bar"가 활성화되어 있지 않을 때
; 아래의 핫키에 틸드가 있는 경우 그 메뉴는 보여지지 않습니다.
; 틸드가 있어도 메뉴는 보일 수도 있지만
; 자주 가는 폴더는 새 탐색 창에 열립니다.
; 활성화되어 있는 창이 그 폴더로 전환되지 않습니다.

; CONFIG: 핫키를 고르십시오.
; 마우스에 3 버튼 이상이 있으면, MButton 대신에
; XButton1 (the 4th) 또는 XButton2 (the 5th)을 시도해 볼 수 있습니다.
; 또한 변형 마우스 버튼 (예, ^MButton) 또는 키보드 핫키를 사용할 수도 있습니다
; MButton의 경우, 틸드 (~) 접두 심볼을 사용하면
; 예를 들어 웹 브라우저 같은 다른 유형의 창을 클릭할 때,
; MButton버튼의 정상 기능이 소실되지 않습니다
; 틸드가 있으면 스크립트는 지원되지 않는 창 유형에는
; 메뉴를 보여주지 않습니다. 다른 말로, 틸드가 없다면,
; 핫키는 언제나 메뉴를 보여줍니다; 지원되지 않는 창 유형이
; 활성화되어 있는 동안 자주 가는 폴더를 선택하면
; 새 탐색 창이 열리고 그 폴더의 내용을
; 보여줍니다.
f_Hotkey = ~MButton

; CONFIG: 즐겨 찾기를 고르십시오
; 아래에 특별히 주석 처리한 부분을 업데이트 하면
; 자주 가는 폴더를 나열할 수 있습니다. 메뉴 항목의 이름을 먼저 지정하고
; 다음에 쌍반점, 그 다음에 실제 경로를 지정하십시오.
; 빈 줄을 사용하면 가름 줄을 만들 수 있습니다.

/*
ITEMS IN FAVORITES MENU <-- 이 문자열은 바꾸지 마십시오.
Desktop      ; %A_Desktop%
Favorites    ; %A_Desktop%\..\Favorites
My Documents ; %A_MyDocuments%

Program Files; %A_ProgramFiles%
*/

; END OF CONFIGURATION SECTION
; 이 시점 부터는 변경하지 마십시오.
; 단, 스크립트의 기본 기능을 바꾸고 싶다면 예외입니다.

#SingleInstance  ; 핫키가 동적으로 생성되므로 필수입니다.

Hotkey, %f_Hotkey%, f_DisplayMenu
StringLeft, f_HotkeyFirstChar, f_Hotkey, 1
if f_HotkeyFirstChar = ~  ; 특정 유형의 창에 대해서만 메뉴를 보여줍니다.
    f_AlwaysShowMenu = n
else
    f_AlwaysShowMenu = y

; 스크립트가 컴파일 되어 있는지 알아내는 데 사용됩니다:
SplitPath, A_ScriptName,,, f_FileExt
if f_FileExt = Exe  ; 외부 파일로부터 메뉴 항목들을 읽습니다.
    f_FavoritesFile = %A_ScriptDir%\Favorites.ini
else  ; 이 스크립트 파일로부터 직접 메뉴 항목들을 읽습니다.
    f_FavoritesFile = %A_ScriptFullPath%

;----환경 구성 파일을 읽습니다.
f_AtStartingPos = n
f_MenuItemCount = 0
Loop, Read, %f_FavoritesFile%
{
    if f_FileExt <> Exe
    {
        ; 메뉴 항목들은 이 스크립트로부터 직접 읽고 있기 때문에,
        ; 시작 줄에 도착할 때까지
        ; 모든 줄을 건너 뜁니다.
        if f_AtStartingPos = n
        {
            IfInString, A_LoopReadLine, ITEMS IN FAVORITES MENU
                f_AtStartingPos = y
            continue  ; 새 회돌이 반복을 시작합니다.
        }
        ; 그렇지 않으면, 주석 닫기 심볼이 리스트의 끝을 표식합니다.
        if A_LoopReadLine = */
            break  ; 회돌이를 끝냅니다
    }
    ; A_ThisMenuItemPos와의 호환을 위해
    ; 메뉴 가름 줄들도 세어야 합니다:
    f_MenuItemCount++
    if A_LoopReadLine =  ; 빈 줄은 가름 줄을 뜻합니다.
        Menu, Favorites, Add
    else
    {
        StringSplit, f_line, A_LoopReadLine, `;
        f_line1 = %f_line1%  ; 선두 후미의 스페이스를 제거합니다.
        f_line2 = %f_line2%  ; 선두 후미의 스페이스를 제거합니다.
        ; 필드 안에 변수 참조를 모두 결정합니다. 그리고
        ; 자주 가는 폴더의 경로를 담은 새 배열 원소를 생성합니다:
        Transform, f_path%f_MenuItemCount%, deref, %f_line2%
        Transform, f_line1, deref, %f_line1%
        Menu, Favorites, Add, %f_line1%, f_OpenFavorite
    }
}
return  ;----자동 실행 섹션의 끝.

;----선택된 폴더를 엽니다
f_OpenFavorite:
; 선택된 메뉴 항목에 상응하는 배열 원소를 가져 옵니다:
StringTrimLeft, f_path, f_path%A_ThisMenuItemPos%, 0
if f_path =
    return
if f_class = #32770    ; 대화상자입니다.
{
    if f_Edit1Pos <>   ; 그리고 Edit1 콘트롤이 있습니다.
    {
        ; 창을 활성화 합니다. 그러면 사용자가 대화상자 밖에서
        ; 가운데 버튼을 클릭하면, 잇다르는 클릭들도 작동합니다:
        WinActivate ahk_id %f_window_id%
        ; 이미 필드에 존재하더라도 파일이름을 모두 열람합니다.
        ; 그래야 새 폴더로 전환한 후에 다시 복구할 수 있습니다:
        ControlGetText, f_text, Edit1, ahk_id %f_window_id%
        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
        ControlSend, Edit1, {Enter}, ahk_id %f_window_id%
        Sleep, 100  ; 어떤 경우 어떤 대화상자에는 추가로 시간이 필요합니다.
        ControlSetText, Edit1, %f_text%, ahk_id %f_window_id%
        return
    }
    ; 그렇지 않으면 서브루틴의 아래로 가 표준 조치를 취합니다.
}
else if f_class in ExploreWClass,CabinetWClass  ; 탐색 창이므로, 폴더를 전환합니다.
{
    if f_Edit1Pos <>   ; 그리고 Edit1 콘트롤이 있습니다.
    {
        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
        ; Tekl의 보고에 의하면: "만약 폴더 L:\folder로 바꾸고 싶다면
        ; 주소바는 http://www.L:\folder.com를 보여준다. 이를 해결하기 위해,
        ; 나는 {Enter} 앞에 {right}를 추가했다":
        ControlSend, Edit1, {Right}{Enter}, ahk_id %f_window_id%
        return
    }
    ; 그렇지 않으면 서브루틴의 아래로 가서 표준 행위를 취합니다.
}
else if f_class = ConsoleWindowClass ; 콘솔 창이므로, 그 디렉토리로 CD 합니다
{
    WinActivate, ahk_id %f_window_id% ; 종조 mclick 때문에 비활성화 되는 경우가 있으므로,
    SetKeyDelay, 0  ; 이것은 이 쓰레드가 존재하는 동안에만 효과가 있습니다.
    IfInString, f_path, :  ; 드라이브 기호가 포함되어 있습니다
    {
        StringLeft, f_path_drive, f_path, 1
        Send %f_path_drive%:{enter}
    }
    Send, cd %f_path%{Enter}
    return
}
; 위에서 반환되지 않았다면, 다음 중 하나가 참입니다:
; 1) 지원하지 않는 창 유형이지만 f_AlwaysShowMenu가 y (yes)입니다.
; 2) 지원하는 유형이지만 Edit1 콘트롤이 없어서 맞춤 조치에 이용하지 못합니다.
;     그래서 대신 아래의 기본 행위를 합니다.
Run, Explorer %f_path%  ; 겹따옴표가 없으면 더 많은 시스템에 작동할 가능성이 높습니다.
return

;----메뉴를 보여줍니다
f_DisplayMenu:
; 다음 첫 몇 변수들은 여기에서 설정하고 f_OpenFavorite가 사용합니다:
WinGet, f_window_id, ID, A
WinGetClass, f_class, ahk_id %f_window_id%
if f_class in #32770,ExploreWClass,CabinetWClass  ; 대화상자 또는 탐색기.
    ControlGetPos, f_Edit1Pos,,,, Edit1, ahk_id %f_window_id%
if f_AlwaysShowMenu = n  ; 메뉴는 선택적으로만 보여주어야 합니다.
{
    if f_class in #32770,ExploreWClass,CabinetWClass  ; 대화상자 또는 탐색기.
    {
        if f_Edit1Pos =  ; 콘트롤이 존재하지 않습니다. 그래서 메뉴를 보여주지 않습니다
            return
    }
    else if f_class <> ConsoleWindowClass
        return ; 다른 유형의 창이기 때문에, 메뉴를 보여주지 않습니다.
}
; 그렇지 않으면, 메뉴를 이 유형의 창에 보여 주어야 합니다:
Menu, Favorites, show
return


AutoHotkey Script Showcase

오토핫키 스크립트 모범 예제

NiftyWindows -- by Enovatic-Solutions: 이 스크립트는 끌기, 크기 바꾸기, 최대화, 최소화 그리고 닫기등 기본적인 모든 창의 작동을 쉽게 제어할 수 있습니다. 가장 강력한 특징은 오른쪽 마우스 버튼으로 끌면 활성화 됩니다. 각 창을 가상의 3행 3열 아홉 개의 셀 격자에 나누어 보여줍니다. 가운데 셀이 가장 큽니다: 오른쪽 버튼으로 그 창의 모서리를 클릭해 끌어 이동할 수 있습니다. 다른 여덟 개의 셀은 같은 방식으로 창의 크기를 바꾸는 데 사용됩니다. NiftyWindows는 또한 자석 격자(snap-to-grid), "창 비율 유지", 창을 타이틀바까지 감아올리기, 투명도 제어, 기타 유용한 단축키들을 제공합니다.

화면 확대기 -- by Holomind: 이 화면 확대기는 운영 체제에 포함된 확대기에 비해 여러 장점이 있습니다: 갱신 간격 변경과 확대 수준 (축소 포함); 더 나은 출력을 제공하는 앤티엘리어싱; 그리고 오픈 소스입니다 (결론적으로, 여러 변형 중에서 고를 수 있으며, 여러분에게 맞게 스크립트를 재단할 수 있습니다).

LiveWindows: Watch Dialog-boxes in Thumbnail -- by Holomind: 이 스크립트로 내려받기, 파일 복사, 기타 대화상자의 진행 상황을 관제할 수 있습니다. 각 대화상자와 프로그레스 바에 작은 반복 표식을 보여줍니다 (대화상자는 자동으로 탐지됩니다. 다른 창 뒤에 있어도 탐지됩니다). 미리 보기 창은 언제나 상위에 있지만 화면 구역을 아주 조금만 차지합니다 (모서리를 끌어 크기를 바꿀 수도 있습니다). 어떤 창이든 관제할 수 있습니다. 선택 네모를 관심 구역 근처에 끌어 놓은 다음 (control-shift-drag), Win+W를 눌러 실시간으로 갱신해 미리보기 창에 그 구역을 보여줍니다.

Mouse Gestures -- by deguix: 이 스크립트는 마우스 우측 버튼이 눌려 있는 동안 어떻게 마우스를 이동하는지 지켜 봅니다. 알고 있는 모양이나 심볼을 "그리면", 프로그램을 기동하거나 여러분이 지정한 맞춤 행위를 수행합니다 (마치 핫키처럼). 제스처를 정의하는 법은 안에 포함된 README 파일을 참조하십시오.

편집기에 문맥 감지 도움말 설치하기 - by Rajat: 이 스크립트는선택된 오토핫키 명령어나 키워드에 대하여 Ctrl+2 (또른 여러분이 선택한 키)를 도움말 파일을 보여주도록 만듭니다. 아무것도 선택되어 있지 않으면, 명령어 이름이 현재 줄의 처음에서 추출됩니다.

쉽게 창 끌기 (XP/2k/NT 요구): 보통, 창은 타이틀 바를 클릭해야만 끌 수 있습니다. 이 스크립트는 창 안의 아무 곳이나 끌 수 있도록 확장되었습니다. 이 모드를 활성화하려면, 클릭하는 동안 CapsLock나 가운데 마우스 버튼을 클릭한 다음, 창을 새 위치로 끕니다.

쉽게 창 끌기 -- KDE 스타일 (XP/2k/NT 요구) -- by Jonny: 이 스크립트는 훨씬 더 쉽게 창을 이동하거나 크기를 바꿀 수 있습니다: 1) ALT 키를 누른 채로 창 안 아무곳이나 왼-클릭해 창을 새 위치로 끌 수 있습니다; 2) ALT 키를 누른 채로 창 안 아무곳이나 우-클릭해 끌면 크기를 쉽게 바꿀 수 있습니다; 3) ALT를 두번 누르되, 두 번째는 그냥 누른 채로, 왼클릭하면 창이 마우스 커서 아래로 최소화되고 우클릭하면 최대화되며, 가운데를 클릭하면 닫힙니다.

자주 가는 폴더에 쉽게 접근하기 -- by Savage: 어떤 유형의 창이 활성화되어 있는 동안 가운데 버튼을 클릭하면, 이 스크립트는 자주 가는 폴더 이름의 메뉴를 보여줍니다. 자주 가는 폴더를 선택할 때, 스크립트는 즉시 활성 창 안에서 그 폴더로 전환합니다. 다음 창 유형을 지원합니다: 1) 표준 파일-열기 또는 파일-저장 대화상자; 2) 탐색기 창; 3) 콘솔 (명령어 프롬프트) 창. 메뉴는 또 지원되지 않는 창 유형에 대하여 선택적으로 나타날 수도 있습니다. 그 경우 자주가는 폴더가 새 탐색 창으로 열립니다.

IntelliSense -- by Rajat (requires XP/2k/NT): 이 스크립트는 AutoHotkey 스크립트를 편집하는 동안 감시하다가 명령어 다음에 쉼표나 스페이스를 타자하는 것을 보면, 그 명령어의 매개변수 리스트를 보여주어 여러분을 안내합니다. 게다가, Ctrl+F1 (또는 선택에 따라 다른 핫키)를 선택하면 그 명령어의 도움말을 보여줍니다. 매개변수 리스트를 취소하려면, Escape 또는 Enter를 치면 됩니다.

조이스틱을 마우처럼 사용하기: 이 스크립트는 조이스틱을 버튼 세 개짜리 마우스로 변신시킵니다. 각 버튼은 마치 마우스 버튼처럼 끌 수 있습니다. 사실상 거의 CPU 시간을 사용하지 않습니다. 또한, 조이스틱을 가운데로부터 얼마나 멀리 미는가에 따라 커서를 더 빠르게 이동시킵니다. 스크립트의 상단에서 기호에 맞게 다양하게 설정할 수 있습니다.

조이스틱 테스트 스크립트: 이 스크립트는 조이스틱 버튼의 개수와 기타 속성을 알아내는 데 도움을 줍니다. 조이스틱이 눈금 조정이 필요한지 노출시켜 주기도 합니다; 즉, 각 축의 이동 범위는 0 부터 100 퍼센트 사이입니다. 눈금 조정이 필요하면, 운영 체제의 제어판 또는 조이스틱에 따라오는 소프트웨어를 이용하십시오.

화면-위 키보드 (XP/2k/NT 요구) -- by Jon: 이 스크립트는 화면 아래에 가상 키보드를 만듭니다. 누르는 키를 실시간으로 화면에 보여줍니다. 필자가 손 감각으로 타자하는 법을 익히기 위해 (키보드를 보지 않는 습관을 들이기 위해) 만들었습니다. 화면 위 키보드의 크기는 스크립트 상단에서 재단할 수 있습니다. 또한, 트레이 아이콘을 더블클릭 하면 키보드를 숨기거나 보여줄 수 있습니다.

창을 트레이 메뉴로 최소 화하기: 이 스크립트는 여러분 선택한 핫키를 창을 감추는 데 할당합니다. 창은 스크립트의 트레이 메뉴 아래에 엔트리가 됩니다. 숨은 창은 그러면 개별적으로 또는 모두 한꺼번에 다시 보여줄 수 있습니다. 메뉴에서 상응하는 메뉴를 선택하면 됩니다. 스크립트가 어떤 이유로 종료하면, 숨겨지 모든 창들이 자동으로 보여집니다.

MsgBox의 버튼 이름 바꾸기: 이 예제 스크립트는 타이머를 사용하여 MsgBox 대화상자에 있는 버튼의 이름을 바꿉니다. 버튼 이름은 바뀌지만, IfMsgBox 명령어은 여전히 그 버튼이 원래 이름으로 참조되기를 요구합니다.

Numpad 000 Key: 이 예제 스크립트는 어떤 키패드에 나타나는 특수 000 키를 등호 키로 만듭니다. Send, = 줄을 여러분의 선택에 따라 바꾸면 행위를 바꿀 수 있습니다.

키보드의 넘패드를 마우스처럼 사용하기 -- by deguix: 이 스크립트는 진짜 마우스를 사용하는 것 같이 키보드를 쉽게 사용할 수 있습니다 (어떤 작업에는 훨씬 더 쉽습니다). 마우스 버튼을 다섯 개까지 지원하고 마우스 휠 회전을 지원합니다. 또한 이동 속도를 조절할 수 있고 가속 기능과 "축 전도"도 지원합니다.

Seek -- by Phi: 시작 메뉴를 항해하는 것은 약간 난삽할 수 있습니다. 특히 시간이 지나면서 많은 프로그램을 설치했다면 정말 난삽합니다.. 'Seek'으로 대소문자를 구분하지 않는 키 단어/문구를 지정하면 시작 메뉴에서 그에 부합하는 프로그램과 디렉토리만 여과할 수 있습니다. 그러면 부합하는 몇 안되는 엔트리 중에서 쉽게 목표 프로그램을 열 수 있습니다. 이렇게 하면 시작 메뉴를 검색하고 순회하는 지겨운 일을 하지 않아도 됩니다.

툴팁 마우스 메뉴 (XP/2k/NT 요구) -- by Rajat: 이 스크립트는 가운데 버튼을 잠깐 누르는데 반응하여 팝업 메뉴를 보여줍니다. 메뉴 항목은 왼-클릭해 선택합니다. 바깥을 왼클릭하면 메뉴가 취소됩니다. 최근에 어느 유형의 창이 활성화 되어 있는가에 따라 메뉴의 내용이 바뀌도록 개선되었습니다 (Notepad 그리고 Word가 예제에서 사용됩니다).

Volume On-Screen-Display (OSD) -- by Rajat: 이 스크립트는 여러분의 핫키를 마스터 불륨과 웨이브 볼륨을 올리거나 내리는 데 할당합니다. 두 볼륨 모두 각각 다른 바 그래프로 보여줍니다.

Window Shading (창을 제목 바까지 말아 올리기) -- by Rajat: 이 스크립트는 핫키를 누려면 창을 그의 제목 바까지 줄이고 다시 그의 원래 크기로 돌아옵니다. 창의 개수에 상관없이 이런 식으로 줄일 수 있습니다 (스크립트가 각각을 따로따로 기억합니다). 스크립트가 어떤 이유로 종료하면, "말려 올라간" 모든 창이 원래의 높이로 복구됩니다.

WinLIRC 클라이언트: 이 스크립트는 리모트 콘트롤에 버튼을 누를 때마다 WinLIRC으로부터 고지를 받습니다. 이것을 이용해 Winamp, Windows Media Player, 등등을 자동화 할 수 있습니다. 쉽게 환경을 구성할 수 있습니다. 예를 들어, WinLIRC가 리모트 콘트롤에서 이름이 "VolUp"인 버튼을 인지하면, 이름이 VolUp인 라벨을 생성하고 그 아래에 명령어 SoundSet +5를 사용해 사운드카드의 볼륨을 5%만큼 키웁니다.

1 Hour Software -- by skrommel: 이것은 유용한 스크립트 모음입니다. 짧은 설명과 찰칵 그림과 함께 소개합니다.

토랄프(Toralf)의 스크립트 모음: 이 모음집은 다음과 같은 유용한 스크립트가 들어 있습니다:
1) AHK Window Info: 창, 콘트롤, 등등에 관한 정보를 노출시킵니다.
2) Electronic Program Guide: 여러분이 사는 지역의 TV 프로그램/편성표를 열람합니다. (여러 국가 지원).
3) Auto-Syntax-Tidy: 스크립트에서 명령어의 대소문자와 들여쓰기를 변경해 일관성 있는 스타일로 포맷합니다.

세언(Sean)의 스크립트 모음: 다음과 같은 유용한 스크립트가 포함되어 있습니다:
1) Network Download/Upload Meter: 네트워크 내려받기/올리기를 언제나 위 프로그레스 바에 보여줍니다.
2) StdoutToVar: 명령어나 어플리케이션의 출력을 스크립트의 변수로 방향전환합니다.
3) Capture a Screen Rectangle: 화면 일부를 잡아 그것을 파일로 저장하는 함수 (BMP/JPG/PNG/GIF/TIF). 또한 투명 창과 마우스 커서도 잡을 수 있습니다.
4) Color Zoomer/Picker: 커서 주위의 구역을 확대합니다. 픽셀 하나를 선택해 그의 색을 식별할 수 있습니다.

SKAN's Tips N Tricks: 종종 자주 요구되는 특징과 유용한 효과를 달성하기 위한 샘플 코드와 테크닉이 들어 있습니다.

스크립트 & 함수 포럼 (autohotkey.com): 이곳은 거의 1000개나 되는, 즉시 실행 가능한 스크립트와 함수 모음집입니다. 오토핫키 사용자들이 만들고 관리하는 이 보관소는 나날이 커지고 개선되고 있습니다. 또한 예전의 폐기된 스크립트도 많이 있습니다 (AutoHotkey v1.0).

스크립트 & 함수 포럼 (ahkscript.org): 스크립트로 가득한 또다른 포럼, 대부분 AutoHotkey v1.1 그리고 v2 용입니다.

-- 홈으로 이동 --


IntelliSense -- by Rajat (requires XP/2k/NT)

IntelliSense -- by Rajat (XP/2k/NT 이상)

이 스크립트는 AutoHotkey 스크립트를 편집하는 동안 감시하다가 명령어 다음에 쉼표나 스페이스를 타자하는 순간, 그 명령어의 매개변수 리스트를 보여줍니다 게다가 Ctrl+F1 (또는 여러분의 선택에 따라 다른 핫키)를 누르면 그 명령어의 도움말을 보여줍니다. 매개변수 리스트를 취소하려면 Escape 또는 Enter를 누르십시오.

이 스크립트를 내려받기 | 다른 샘플 스크립트 | 홈으로

; Requires v1.0.41+

; CONFIGURATION SECTION: 스크립트를 다움 변수로 재단합니다.

; 아래의 핫키를 누르면 현재 명령어의 도움말을 보여줍니다:
I_HelpHotkey = ^F1

; 아래의 문자열이 활성창의 제목에 존재해야
; 타자하는 동안 IntelliSense가 작동합니다.  비워 두면
; IntelliSense는 모든 창에 작동합니다. Pad로 만들면
; Metapad, Notepad, 그리고 Textpad 같은 편집기에서 작동합니다.  .ahk로 만들면
; 오직 .ahk 파일이 Notepad, Metapad, 등등에 열려 있을 경우에만 작동합니다.
I_Editor = pad

; 트레이에 다른 스크립트와 차별을 위해 이 스크립트에 대하여 다른 아이콘을 사용하고 싶으면
; 아래에 파일 이름을 제공하십시오. (비워 두면 아이콘이 없습니다).
; 예를 들어: E:\stuff\Pics\icons\GeoIcons\Information.ico
I_Icon =

; END OF CONFIGURATION SECTION (이 시점 이후로 변경하지 마십시오.
; 단, 스크립트의 기본 기능을 바꾸고 싶은 경우는 예외입니다).

SetKeyDelay, 0
#SingleInstance

if I_HelpHotkey <>
    Hotkey, %I_HelpHotkey%, I_HelpHotkey

; 트레이 아이콘을 바꿉니다 (위의 환경 구성 섹션에 지정되어 있다면):
if I_Icon <>
    IfExist, %I_Icon%
        Menu, Tray, Icon, %I_Icon%

; 오토핫키의 위치를 알아 냅니다:
RegRead, ahk_dir, HKEY_LOCAL_MACHINE, SOFTWARE\AutoHotkey, InstallDir
if ErrorLevel  ; 발견이 안되었으므로, 다른 위치에서 찾아 봅니다.
{
    if A_AhkPath
        SplitPath, A_AhkPath,, ahk_dir
    else IfExist ..\..\AutoHotkey.chm
        ahk_dir = ..\..
    else IfExist %A_ProgramFiles%\AutoHotkey\AutoHotkey.chm
        ahk_dir = %A_ProgramFiles%\AutoHotkey
    else
    {
        MsgBox Could not find the AutoHotkey folder.
        ExitApp
    }
}

ahk_help_file = %ahk_dir%\AutoHotkey.chm

; 명령어 구문을 읽습니다:
Loop, Read, %ahk_dir%\Extras\Editors\Syntax\Commands.txt
{
    I_FullCmd = %A_LoopReadLine%

    ; 지시어들은 쉼표가 아니라 스페이스를 첫 번째로 가집니다.
    ; 그래서 먼저 오는 것을 명령어 이름의 끝으로 간주합니다:
    StringGetPos, I_cPos, I_FullCmd, `,
    StringGetPos, I_sPos, I_FullCmd, %A_Space%
    if (I_cPos = -1 or (I_cPos > I_sPos and I_sPos <> -1))
        I_EndPos := I_sPos
    else
        I_EndPos := I_cPos

    if I_EndPos <> -1
        StringLeft, I_CurrCmd, I_FullCmd, %I_EndPos%
    else  ; 이 지시어/명령어는 매개변수가 없습니다.
        I_CurrCmd = %A_LoopReadLine%

    StringReplace, I_CurrCmd, I_CurrCmd, [,, All
    StringReplace, I_CurrCmd, I_CurrCmd, %A_Space%,, All
    StringReplace, I_FullCmd, I_FullCmd, ``n, `n, All
    StringReplace, I_FullCmd, I_FullCmd, ``t, `t, All

    ; 명령어 이름 배열과 완전한 cmd 구문을 구성합니다:
    I_Cmd%A_Index% = %I_CurrCmd%
    I_FullCmd%A_Index% = %I_FullCmd%
}

; Input 명령어를 사용해 사용자가 타자하는 명령어를 감시합니다:
Loop
{
    ; 편집기 창 점검:
    WinGetTitle, ActiveTitle, A
    IfNotInString, ActiveTitle, %I_Editor%
    {
        ToolTip
        Sleep, 500
        Continue
    }

    ; 엔드키를 만날때까지 모든 키를 얻습니다:
    Input, I_Word, V, {enter}{escape}{space}`,
    I_EndKey = %ErrorLevel%

    ; 이 경우 툴팁은 보이지 않습니다:
    if I_EndKey in EndKey:Enter,EndKey:Escape
    {
        ToolTip
        Continue
    }

    ; 다시 편집기 창을 점검합니다!
    WinGetActiveTitle, ActiveTitle
    IfNotInString, ActiveTitle, %I_Editor%
    {
        ToolTip
        Continue
    }

    ; 존재하는 들여쓰기 만큼 보상합니다:
    StringReplace, I_Word, I_Word, %A_Space%,, All
    StringReplace, I_Word, I_Word, %A_Tab%,, All
    if I_Word =
        Continue

    ; 주석 줄을 점검합니다:
    StringLeft, I_Check, I_Word, 1
    if (I_Check = ";" or I_Word = "If")  ; "If"는 툴팁을 보여주기에는 너무 거추장스럽습니다.
        Continue

    ; 단어를 명령어에 부합시킵니다:
    I_Index =
    Loop
    {
        ; 동적 변수를 한 번만 결정하면 수행성능이 개선됩니다.
        ; 게다가,  I_ThisCmd에 배경된 값은 또
        ; I_HelpHotkey 서브루틴이 사용합니다:
        I_ThisCmd := I_Cmd%A_Index%
        if I_ThisCmd =
            break
        if (I_Word = I_ThisCmd)
        {
            I_Index := A_Index
            I_HelpOn = %I_ThisCmd%
            break
        }
    }

    ; 부합이 없으면 사용자 입력 감시를 재개합니다:
    if I_Index =
        Continue

    ; 부합된 명령어를 보여주어 사용자를 안내합니다:
    I_ThisFullCmd := I_FullCmd%I_Index%
    ToolTip, %I_ThisFullCmd%, A_CaretX, A_CaretY + 20
}

I_HelpHotkey:
WinGetTitle, ActiveTitle, A
IfNotInString, ActiveTitle, %I_Editor%, Return

ToolTip  ; 지금 당장은 필요가 없기 때문에 구문 도움 툴팁을 끕니다.

SetTitleMatchMode, 1  ; 3의 경우, 이 설정은 이 쓰레드에만 효과가 있습니다.
IfWinNotExist, AutoHotkey Help
{
    IfNotExist, %ahk_help_file%
    {
        MsgBox, Could not find the help file: %ahk_help_file%.
        return
    }
    Run, %ahk_help_file%
    WinWait, AutoHotkey Help
}

if I_ThisCmd =  ; 대신에, 최근에 타자된 것을 사용합니다.
    I_ThisCmd := I_Word

; 위에서 "마지막 발견" 창이 설정되었고 그것을 아래에 사용합니다:
WinActivate
WinWaitActive
StringReplace, I_ThisCmd, I_ThisCmd, #, {#}  ; 있다면, 앞의 #를 교체합니다.
Send, !n{home}+{end}%I_HelpOn%{enter}
return


Using a Joystick as a Mouse

조이스틱을 마우스처럼 사용하기

이 스크립트는 조이스틱을 세 버튼 마우스로 변신시킵니다. 각 버튼을 마치 마우스 버튼 처럼 끌 수 있고 사실상 CPU 시간을 소비하지 않습니다. 또한, 조이스틱을 중앙으로부터 멀리 밀수록 커서를 더 빨리 이동시킵니다. 다양한 설정은 스크립트 상단에서 기호에 맞게 재단할 수 있습니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

; 마우스 커서를 더 빨리 이동시키려면 다음 값을 증가시키면 됩니다:
JoyMultiplier = 0.30

; 다음 값을 줄이면 조이스틱 중앙으로부터 좀 덜 밀어도
; 마우스를 이동시키기 시작할 수 있습니다. 그렇지만, 조이스틱 눈금 조정이 필요할 수 있습니다.
; -- 적절히 중앙에 정렬되었는지 확인해야 해야 -- 커서가 표류하는 것을 피할 수 있스니다.
; 완벽하게 빈틈 없이 중앙 정렬된 조이스틱은 값 1을 사용할 수 있습니다:
JoyThreshold = 3

; 다음을 true로 바꾸면 Y-축을 뒤집을 수 있습니다.
; 그러면 마우스는 조이스틱의 수직 반대 방향으로 이동합니다:
InvertYAxis := false

; 다음 값들을 바꾸면 조이스틱 버튼 번호를 왼쪽, 오른쪽, 그리고 가운데 마우스 버튼에 대하여
; 1, 2, 그리고 3 말고 다른 값을 사용할 수 있습니다. 가능한 값은 1부터 32까지입니다.
; 조이스틱 테스트 스크립트를 사용하면 조이스틱 번호를 더 쉽게 알아낼 수 있습니다.
ButtonLeft = 1
ButtonRight = 2
ButtonMiddle = 3

; 조이스틱에 POV 콘트롤이 있다면, 그것을 마우스 휠로 사용할 수 있습니다.
; 다음 값은 휠의 회전 사이의 밀리초의 개수입니다.
; 개수를 줄이면 휠이 더 빨리 회전합니다:
WheelDelay = 250

; 조이스틱이 여러 개이면, 이 값을 증가시켜
; 다른 조이스틱을 사용할 수 있습니다:
JoystickNumber = 1

; END OF CONFIG SECTION -- 이 시점 아래로 아무 것도 변경하지 마십시오.
; 단, 스크립트의 기본 기능을 변경하고 싶은 경우는 예외입니다.

#SingleInstance

JoystickPrefix = %JoystickNumber%Joy
Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft
Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight
Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle

; 마우스 이동을 시작시키는데 필요한 축의 이격을 계산합니다:
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

SetTimer, WatchJoystick, 10  ; 조이스틱의 이동을 관제합니다.

GetKeyState, JoyInfo, %JoystickNumber%JoyInfo
IfInString, JoyInfo, P  ; 조이스틱에 POV 콘트롤이 있습니다. 그래서 그것을 마우스 휠로 사용합니다.
    SetTimer, MouseWheel, %WheelDelay%

return  ; 자동 실행 섹션의 끝.

; 아래의 서브루틴은 KeyWait를 사용하지 않습니다.
; 왜냐하면 종종 버튼-업-대기 쓰레드 아래의 WatchJoystick 의사-쓰레드를 가로 채고,
; 그러면 조이스틱으로 마우스 끌기를 방해하는 효과가 있기 때문입니다.

ButtonLeft:
SetMouseDelay, -1  ;  더 부드럽게 이동하도록 만듭니다.
MouseClick, left,,, 1, 0, D  ; 왼쪽 마우스 버튼을 누르고 있습니다.
SetTimer, WaitForLeftButtonUp, 10
return

ButtonRight:
SetMouseDelay, -1  ; 더 부드럽게 이동하도록 만듭니다.
MouseClick, right,,, 1, 0, D  ; 오른쪽 마우스 버튼을 누르고 있습니다.
SetTimer, WaitForRightButtonUp, 10
return

ButtonMiddle:
SetMouseDelay, -1  ; 더 부드럽게 이동하도록 만듭니다.
MouseClick, middle,,, 1, 0, D  ; 오른쪽 마우스 버튼을 누르고 있습니다.
SetTimer, WaitForMiddleButtonUp, 10
return

WaitForLeftButtonUp:
if GetKeyState(JoystickPrefix . ButtonLeft)
    return  ; 버튼이 여전히 눌려 있습니다. 그래서 계속 대기합니다.
; 그렇지 않으면, 버튼이 떼어졌습니다.
SetTimer, WaitForLeftButtonUp, off
SetMouseDelay, -1  ; 더 부드럽게 이동하도록 만듭니다.
MouseClick, left,,, 1, 0, U  ; 마우스 버튼을 뗍니다.
return

WaitForRightButtonUp:
if GetKeyState(JoystickPrefix . ButtonRight)
    return  ; 버튼이 여전히 눌려 있습니다. 그래서 계속 기다립니다.
; 그렇지 않으면, 버튼이 떼어졌습니다.
SetTimer, WaitForRightButtonUp, off
MouseClick, right,,, 1, 0, U  ; 마우스 버튼을 뗍니다.
return

WaitForMiddleButtonUp:
if GetKeyState(JoystickPrefix . ButtonMiddle)
    return  ; 버튼이 여전히 눌려 있습니다. 그래서 계속 기다립니다.
; 그렇지 않으면, 버튼이 떼어졌습니다.
SetTimer, WaitForMiddleButtonUp, off
MouseClick, middle,,, 1, 0, U  ; 마우스 버튼을 뗍니다.
return

WatchJoystick:
MouseNeedsToBeMoved := false  ; 기본값을 설정합니다.
SetFormat, float, 03
GetKeyState, joyx, %JoystickNumber%JoyX
GetKeyState, joyy, %JoystickNumber%JoyY
if joyx > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdUpper
}
else if joyx < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdLower
}
else
    DeltaX = 0
if joyy > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdUpper
}
else if joyy < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdLower
}
else
    DeltaY = 0
if MouseNeedsToBeMoved
{
    SetMouseDelay, -1  ; 더 부드럽게 이동시킵니다.
    MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
}
return

MouseWheel:
GetKeyState, JoyPOV, %JoystickNumber%JoyPOV
if JoyPOV = -1  ; 각도 없음.
    return
if (JoyPOV > 31500 or JoyPOV < 4500)  ; 앞으로 이동
    Send {WheelUp}
else if JoyPOV between 13500 and 22500  ; 뒤로 이동
    Send {WheelDown}
return


Joystick Test Script

조이스틱 테스트 스크립트

이 스크립트로 조이스틱의 버튼 번호와 기타 속성을 알아낼 수 있습니다. 또 조이스틱이 눈금 조정이 필요한지 노출시켜 줍니다; 즉, 각 축의 이동 범위는 그래야 하는 것처럼 0부터 100 퍼센트 사이입니다. 눈금 조정이 필요하면, 운영 체제의 제어판이나 조이스틱에 따라오는 소프트웨어를 이용하십시오.

이 스크립트 내려 받기 | 다른 샘플 스크립트 | 홈으로

; July 6, 2005: 조이스틱 번호를 자동 탐지.
; May 8, 2005 : 수정: 조이스틱이 접속되어 있는지 탐지하는 수단으로
; JoyAxes를 더 이상 질의하지 않음. 어떤 조이스틱은 게임패드이고
; 축이 하나도 없기 때문입니다.

; 무조건 특정 조이스틱 번호를 사용하고 싶다면,
; 다음 값을 0에서 조이스틱 번호로 바꿉니다 (1-16).
; 값이 0이면 조이스틱 번호를 자동 탐지합니다:
JoystickNumber = 0

; END OF CONFIG SECTION. 이 시점 이후로 변경하지 마십시오
; 단, 스크립트의 기본 기능을 바꾸고 싶다면 예외입니다.

; 요청하면 조이스틱 번호를 자동 탐지합니다:
if JoystickNumber <= 0
{
    Loop 16  ; 각 조이스틱 번호를 질의해 어느 번호가 존재하는지 알아냅니다.
    {
        GetKeyState, JoyName, %A_Index%JoyName
        if JoyName <>
        {
            JoystickNumber = %A_Index%
            break
        }
    }
    if JoystickNumber <= 0
    {
        MsgBox 시스템에 조이스틱이 장착되어 있지 않은 것 같습니다.
        ExitApp
    }
}

#SingleInstance
SetFormat, float, 03  ; 축 위치 퍼센트에서 소수점을 생략합니다.
GetKeyState, joy_buttons, %JoystickNumber%JoyButtons
GetKeyState, joy_name, %JoystickNumber%JoyName
GetKeyState, joy_info, %JoystickNumber%JoyInfo
Loop
{
    buttons_down =
    Loop, %joy_buttons%
    {
        GetKeyState, joy%a_index%, %JoystickNumber%joy%a_index%
        if joy%a_index% = D
            buttons_down = %buttons_down%%a_space%%a_index%
    }
    GetKeyState, joyx, %JoystickNumber%JoyX
    axis_info = X%joyx%
    GetKeyState, joyy, %JoystickNumber%JoyY
    axis_info = %axis_info%%a_space%%a_space%Y%joyy%
    IfInString, joy_info, Z
    {
        GetKeyState, joyz, %JoystickNumber%JoyZ
        axis_info = %axis_info%%a_space%%a_space%Z%joyz%
    }
    IfInString, joy_info, R
    {
        GetKeyState, joyr, %JoystickNumber%JoyR
        axis_info = %axis_info%%a_space%%a_space%R%joyr%
    }
    IfInString, joy_info, U
    {
        GetKeyState, joyu, %JoystickNumber%JoyU
        axis_info = %axis_info%%a_space%%a_space%U%joyu%
    }
    IfInString, joy_info, V
    {
        GetKeyState, joyv, %JoystickNumber%JoyV
        axis_info = %axis_info%%a_space%%a_space%V%joyv%
    }
    IfInString, joy_info, P
    {
        GetKeyState, joyp, %JoystickNumber%JoyPOV
        axis_info = %axis_info%%a_space%%a_space%POV%joyp%
    }
    ToolTip, %joy_name% (#%JoystickNumber%):`n%axis_info%`nButtons Down: %buttons_down%`n`n(종료하려면 트레이 아이콘을 우클릭 하십시오)
    Sleep, 100
}
return


On-Screen Keyboard (requires XP/2k/NT) -- by Jon

화면 위 키보드 (XP/2k/NT 요구) -- by Jon

이 스크립트는 가짜 키보드를 화면 아래에 생성하고 누르는 키들을 실시간으로 보여줍니다. (키보드를 보지 않고) 손감각을 익히기 위해 만들었습니다. 화면 위 키보드의 크기는 스크립트 상단에서 재단할 수 있습니다. 또한, 트레이 아이콘을 더블 클릭하면 키보드를 보여주거나 감출 수 있습니다.

이 스크립트 내려 받기 | 다른 샘플 스크립트 | 홈으로

;---- 환경 구성 부분: 화면 위 키보드 크기와
; 기타 옵션을 여기에서 재단합니다.

; 다음 글꼴 크기를 바꾸면 전에 화면 위 키보드가
; 더 커지거나 더 작아입니다:
k_FontSize = 10
k_FontName = Verdana  ; 이 줄을 비우면 시스템의 기본 글꼴을 사용합니다.
k_FontStyle = Bold    ; 다른 예제: Italic Underline

; 트레이 메뉴 항목 이름:
k_MenuItemHide = Hide on-screen &keyboard
k_MenuItemShow = Show on-screen &keyboard

; 기본 모디터 말고 다른 모니터에 키보드를 보여주려면,
; 다음 변수에 2와 같이 숫자를 지정하십시오. 비워두면,
; 기본 모니터를 사용합니다:
k_Monitor =

;---- 환경 구성 부분 끝.  이 시점 부터는 변경하지 마십시오.
; 단, 스크립트이 기본 성격을 바꾸고 싶은 경우는 예외입니다.

;---- 트레이 아이콘 메뉴를 변경합니다:
Menu, Tray, Add, %k_MenuItemHide%, k_ShowHide
Menu, Tray, Add, &Exit, k_MenuExit
Menu, Tray, Default, %k_MenuItemHide%
Menu, Tray, NoStandard

;---- 선택된 글꼴 크기에 기반하여 객체 크기를 계산합니다.:
k_KeyWidth = %k_FontSize%
k_KeyWidth *= 3
k_KeyHeight = %k_FontSize%
k_KeyHeight *= 3
k_KeyMargin = %k_FontSize%
k_KeyMargin /= 6
k_SpacebarWidth = %k_FontSize%
k_SpacebarWidth *= 25
k_KeyWidthHalf = %k_KeyWidth%
k_KeyWidthHalf /= 2

k_KeySize = w%k_KeyWidth% h%k_KeyHeight%
k_Position = x+%k_KeyMargin% %k_KeySize%

;---- 화면 위 키보드를 위하여 GUI 창을 생성합니다:
Gui, Font, s%k_FontSize% %k_FontStyle%, %k_FontName%
Gui, -Caption +E0x200 +ToolWindow
TransColor = F1ECED
Gui, Color, %TransColor%  ; 이 색은 나중에 아래에서 투명색이 됩니다.

;---- 각 키에 버튼을 추가합니다. 첫 버튼을 절대 좌표에 배치합니다.
; 그러면 다른 모든 버튼이 그에 상대적으로 배치됩니다:
Gui, Add, Button, section %k_KeySize% xm+%k_KeyWidth%, 1
Gui, Add, Button, %k_Position%, 2
Gui, Add, Button, %k_Position%, 3
Gui, Add, Button, %k_Position%, 4
Gui, Add, Button, %k_Position%, 5
Gui, Add, Button, %k_Position%, 6
Gui, Add, Button, %k_Position%, 7
Gui, Add, Button, %k_Position%, 8
Gui, Add, Button, %k_Position%, 9
Gui, Add, Button, %k_Position%, 0
Gui, Add, Button, %k_Position%, -
Gui, Add, Button, %k_Position%, =
Gui, Add, Button, %k_Position%, Bk

Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Tab  ; 자동-너비.
Gui, Add, Button, %k_Position%, Q
Gui, Add, Button, %k_Position%, W
Gui, Add, Button, %k_Position%, E
Gui, Add, Button, %k_Position%, R
Gui, Add, Button, %k_Position%, T
Gui, Add, Button, %k_Position%, Y
Gui, Add, Button, %k_Position%, U
Gui, Add, Button, %k_Position%, I
Gui, Add, Button, %k_Position%, O
Gui, Add, Button, %k_Position%, P
Gui, Add, Button, %k_Position%, [
Gui, Add, Button, %k_Position%, ]
Gui, Add, Button, %k_Position%, \

Gui, Add, Button, xs+%k_KeyWidthHalf% y+%k_KeyMargin% %k_KeySize%, A
Gui, Add, Button, %k_Position%, S
Gui, Add, Button, %k_Position%, D
Gui, Add, Button, %k_Position%, F
Gui, Add, Button, %k_Position%, G
Gui, Add, Button, %k_Position%, H
Gui, Add, Button, %k_Position%, J
Gui, Add, Button, %k_Position%, K
Gui, Add, Button, %k_Position%, L
Gui, Add, Button, %k_Position%, `;
Gui, Add, Button, %k_Position%, '
Gui, Add, Button, x+%k_KeyMargin% h%k_KeyHeight%, Enter  ; 자동-너비.

; 아래의 첫 번째 버튼은 끝에 %A_Space%를 추가해 약간 더 넓힙니다.
; 그래서 그 다음 키와의 레이아웃이 더 정확하게 키보드를 반영합니다.:
Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Shift%A_Space%%A_Space%
Gui, Add, Button, %k_Position%, Z
Gui, Add, Button, %k_Position%, X
Gui, Add, Button, %k_Position%, C
Gui, Add, Button, %k_Position%, V
Gui, Add, Button, %k_Position%, B
Gui, Add, Button, %k_Position%, N
Gui, Add, Button, %k_Position%, M
Gui, Add, Button, %k_Position%, `,
Gui, Add, Button, %k_Position%, .
Gui, Add, Button, %k_Position%, /

Gui, Add, Button, xm y+%k_KeyMargin% h%k_KeyHeight%, Ctrl  ; Auto-width.
Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin%, Win      ; Auto-width.
Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin%, Alt      ; Auto-width.
Gui, Add, Button, h%k_KeyHeight% x+%k_KeyMargin% w%k_SpacebarWidth%, Space

;---- 창을 보여줍니다:
Gui, Show
k_IsVisible = y

WinGet, k_ID, ID, A   ; Get its window ID.
WinGetPos,,, k_WindowWidth, k_WindowHeight, A

;---- (태스크바의 위치를 고려하여)
; 키보드를 화면 아래에 배치합니다:
SysGet, k_WorkArea, MonitorWorkArea, %k_Monitor%

; 창의 X-위치를 계산합니다:
k_WindowX = %k_WorkAreaRight%
k_WindowX -= %k_WorkAreaLeft%  ; 이제 k_WindowX에 이 모니터의 너비가 담깁니다.
k_WindowX -= %k_WindowWidth%
k_WindowX /= 2  ; 수평으로 가운데 위치를 계산합니다.
; 다음은 창이 기본 모니터에 있지 않거나
; 태스크바가 화면 왼쪽 변에 정박되어 있는 경우를 처리합니다:
k_WindowX += %k_WorkAreaLeft%

; 창의 Y-위치를 계산합니다:
k_WindowY = %k_WorkAreaBottom%
k_WindowY -= %k_WindowHeight%

WinMove, A,, %k_WindowX%, %k_WindowY%
WinSet, AlwaysOnTop, On, ahk_id %k_ID%
WinSet, TransColor, %TransColor% 220, ahk_id %k_ID%

;---- 모든 키를 핫키로 설정합니다. 참조 www.asciitable.com
k_n = 1
k_ASCII = 45

Loop
{
    Transform, k_char, Chr, %k_ASCII%
    StringUpper, k_char, k_char
    if k_char not in <,>,^,~,,`,
        Hotkey, ~*%k_char%, k_KeyPress
        ; 위에서, 별표 접두 심볼 덕분에 사용자가 Control과 Shift 같은 수식 키를 누르고 있든 없든
        ; 키를 탐지할 수 있습니다.
    if k_ASCII = 93
        break
    k_ASCII++
}

return ; 자동 실행 섹션의 끝.

;---- 사용자가 키를 누르면, 화면 위에서 상응하는 버튼을 클릭합니다:

~*Backspace::
ControlClick, Bk, ahk_id %k_ID%, , LEFT, 1, D
KeyWait, Backspace
ControlClick, Bk, ahk_id %k_ID%, , LEFT, 1, U
return

;  "Shift" 대신에 LShift와 RShift를 사용합니다. 왜냐하면 핫키로 사용될 때,
; "Shift"는 기본적으로 키를 뗄 때 촉발되기 때문입니다 (예전 AHK 버전에서):
~*LShift::
~*RShift::
~*LCtrl::  ; Control 대신에 Ctrl을 사용해야 버튼 이름에 부합할 수 있습니다.
~*RCtrl::
~*LAlt::
~*RAlt::
~*LWin::
~*RWin::
StringTrimLeft, k_ThisHotkey, A_ThisHotkey, 3
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, D
KeyWait, %k_ThisHotkey%
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, U
return

~*,::
~*'::
~*Space::
~*Enter::
~*Tab::
k_KeyPress:
StringReplace, k_ThisHotkey, A_ThisHotkey, ~
StringReplace, k_ThisHotkey, k_ThisHotkey, *
SetTitleMatchMode, 3  ; T 키와 B 키를 Tab과 Backspace로 혼동하지 않도록 방지합니다.
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, D
KeyWait, %k_ThisHotkey%
ControlClick, %k_ThisHotkey%, ahk_id %k_ID%, , LEFT, 1, U
Return

k_ShowHide:
if k_IsVisible = y
{
    Gui, Cancel
    Menu, Tray, Rename, %k_MenuItemHide%, %k_MenuItemShow%
    k_IsVisible = n
}
else
{
    Gui, Show
    Menu, Tray, Rename, %k_MenuItemShow%, %k_MenuItemHide%
    k_IsVisible = y
}
return

GuiClose:
k_MenuExit:
ExitApp


Minimize Window to Tray Menu

창을 트레이 메뉴로 최소화하기

이 스크립트는 여러분이 선택한 핫키를 창을 감추는 데 할당합니다. 창은 스크립트의 트레이 메뉴 아래에 엔트리가 됩니다. 숨은 창들은 개별적으로 또는 한 꺼번에 메뉴에서 상응하는 항목을 선택해 보여줄 수 있습니다. 스크립트가 어떤 이유로 종료하면, 숨겨진 모든 창은 자동으로 숨김 해제됩니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

; 변경 이력:
; July 22, 2005 (egilmour가 제공한 변경):
; - 마지막 숨은 창을 보여줄 새 핫키 추가 (Win+U)
;
; November 3, 2004 (trogdor가 제공한 변경):
; - 프로그램 관리자가 숨지 못하도록 방지.
; - 활성 창이 없다면, minimize-to-tray 핫키가 무한정 기다리는 대신에
;   아무 효과가 없도록 변경.
;
; October 23, 2004:
; - 태스크바가 숨지 못하도록 방지.
; - 창 제목이 긴경우 발생 가능한 문제들이 해결됨.
; - 제목 없는 창도 아무 문제 없이 숨길 수 있음.
; - 스크립트가  AHK v1.0.22 이상에서 실행 중이면,
;   각 메뉴 항목의 최대 길이을 100에서 260으로 늘림.

; CONFIGURATION SECTION: 아래의 값을 입맛에 맞게 바꾸십시오.

; 다음은 숨기기를 허용할 창의 최대 개수입니다.
; (제한을 두면 수행성능이 향상됩니다):
mwt_MaxWindows = 50

; 활성 창을 감추는데 사용되는 핫키입니다:
mwt_Hotkey = #h  ; Win+H

; 마지막 숨김 창을 보여주는 데 사용되는 핫키입니다:
mwt_UnHotkey = #u  ; Win+U

; 트레이 메뉴에서 모든 표준 항목을 비우려면,
; 예를 들어 Help 그리고 Pause를 비우려면, N을 사용하십시오. 그렇지 않으면, Y를 사용하십시오:
mwt_StandardMenu = N

; 다음의 몇 가지 수행성능을 위한 설정은
; #HotkeyModifierTimeout 시간 안에 조치를 마치는 데 도움이 됩니다.
; 그리하여 주욱 늘어선 여러 창을 일렬로 감추기 위해
;  핫키의 수식자를 떼고 누를 필요가 없습니다.
; 다음과 같이 설정하면 #InstallKeybdHook 또는 기타 수단을 통하여
; 스크립트에 키보드 갈고리를 사용할 필요가 없습니다:
#HotkeyModifierTimeout 100
SetWinDelay 10
SetKeyDelay 0

#SingleInstance  ; 이 스크립트의 실체가 하나만 실행되도록 허용합니다.

; END OF CONFIGURATION SECTION (이 시점부터 변경하지 마십시오
; 단, 스크립트의 기본 기능을 변경하고 싶은 경우는 예외입니다).

Hotkey, %mwt_Hotkey%, mwt_Minimize
Hotkey, %mwt_UnHotkey%, mwt_UnMinimize

; 사용자가 어떤 수단으로 스크립트를 종료하면,
; 모든 창을 먼저 닫습니다:
OnExit, mwt_RestoreAllThenExit

if mwt_StandardMenu = Y
    Menu, Tray, Add
else
{
    Menu, Tray, NoStandard
    Menu, Tray, Add, E&xit and Unhide All, mwt_RestoreAllThenExit
}
Menu, Tray, Add, &Unhide All Hidden Windows, mwt_RestoreAll
Menu, Tray, Add  ; 위 항목을 더 특별하게 만들어 줄 또다른 가름 줄.

if a_AhkVersion =   ; 비어 있으므로, 버전이 1.0.22 미만입니다.
    mwt_MaxLength = 100
else
    mwt_MaxLength = 260  ; 이를 줄이면 메뉴의 너비를 제한할 수 있습니다.

return  ; 자동 실행 섹션의 끝.

mwt_Minimize:
if mwt_WindowCount >= %mwt_MaxWindows%
{
    MsgBox No more than %mwt_MaxWindows% may be hidden simultaneously.
    return
}

; "마지막으로 발견된 창"을 설정해 수행성능을 개선하고 일을 간단하게 만듭니다.
; 어떤 경우 활성 창이 없을 수 있으므로,
; 시간제한을 추가했습니다:
WinWait, A,, 2
if ErrorLevel <> 0  ; 시한 종료, 그래서 아무것도 하지 않습니다.
    return

; 그렇지 않으면, "마지막 발견 창"을 설정하고 이제 사용할 수 있습니다:
WinGet, mwt_ActiveID, ID
WinGetTitle, mwt_ActiveTitle
WinGetClass, mwt_ActiveClass
if mwt_ActiveClass in Shell_TrayWnd,Progman
{
    MsgBox The desktop and taskbar cannot be hidden.
    return
}
; 창을 감추어도 비활성화되는 것은 아니기 때문에,
; 이 창 아래의 창을 활성화 합니다. 다른 방법을 시도했지만, 결과적으로
; 태스크 바가 활성화되었습니다. 이런 식으로 (숨기 바로 직전의) 활성 창을
; 스택 뒤로 밀어 버리는 편이 가장 좋은 듯 보입니다:
Send, !{esc}
; Hide it only now that WinGetTitle/WinGetClass above have been run
; (기본적으로, 그런 명령어들은 숨은 창을 탐지할 수 없기 때문입니다):
WinHide

; 제목이 비어 있으면, 대신에 클래스를 사용하십시오. 이것은 두 가지 목적으로 기여합니다:
; 1) 더 의미 있는 이름이 메뉴 이름으로 사용됩니다.
; 2) 메뉴 항목을 생성할 수 있습니다
;     (그렇지 않으면, 빈 항목을 아래의 다양한 루틴에서 제대로 다룰 수 없습니다).
if mwt_ActiveTitle =
    mwt_ActiveTitle = ahk_class %mwt_ActiveClass%
; 제목이 길이가 짧은지 확인합니다.
; mwt_ActiveTitle도 역시 이 특정한 메뉴 항목을 유일하게 식별하는 데 기여합니다.
StringLeft, mwt_ActiveTitle, mwt_ActiveTitle, %mwt_MaxLength%

; 트레이 메뉴가 각 메뉴 이름이 유일하기를 요구하는 외에도
; 메뉴 이름이 유일해야만 나중에 창이 숨을 때
; 배열에서 안전하게 찾을 수 있습니다.
; 그래서 아직 그렇지 않다면 유일하게 만드십시오:
Loop, %mwt_MaxWindows%
{
    if mwt_WindowTitle%a_index% = %mwt_ActiveTitle%
    {
        ; 부합이 발견됨. 그래서 유일한 것이 아닙니다.
        ; 먼저 0x를 십육진 수에서 제거해 메뉴 공간을 보존합니다:
        StringTrimLeft, mwt_ActiveIDShort, mwt_ActiveID, 2
        StringLen, mwt_ActiveIDShortLength, mwt_ActiveIDShort
        StringLen, mwt_ActiveTitleLength, mwt_ActiveTitle
        mwt_ActiveTitleLength += %mwt_ActiveIDShortLength%
        mwt_ActiveTitleLength += 1 ; +1 the 1 space between title & ID.
        if mwt_ActiveTitleLength > %mwt_MaxLength%
        {
            ; 메뉴 이름이 길이에 제한이 있기 때문에,
            ; 제목을 다듬어 그의 이름 뒤에
            ; 창의 Short ID를 위한 충분한 공간을 확보합니다:
            TrimCount = %mwt_ActiveTitleLength%
            TrimCount -= %mwt_MaxLength%
            StringTrimRight, mwt_ActiveTitle, mwt_ActiveTitle, %TrimCount%
        }
        ; 유일한 제목을 빌드합니다:
        mwt_ActiveTitle = %mwt_ActiveTitle% %mwt_ActiveIDShort%
        break
    }
}

; 먼저, 이 ID가 리스트에 이미 존재하지 않는지 확인합니다.
; 이런 일은 특정 창이 외부적으로 보이게 되면 (또는 그의 어플리케이션이 숨김을 해제하면
; 일어날 수 있습니다. 그리고 이제 다시 숨기 일보 직전입니다:
mwt_AlreadyExists = n
Loop, %mwt_MaxWindows%
{
    if mwt_WindowID%a_index% = %mwt_ActiveID%
    {
        mwt_AlreadyExists = y
        break
    }
}

; 항목을 트레이와 메뉴에 추가합니다:
if mwt_AlreadyExists = n
{
    Menu, Tray, add, %mwt_ActiveTitle%, RestoreFromTrayMenu
    mwt_WindowCount += 1
    Loop, %mwt_MaxWindows%  ; Search for a free slot.
    {
        ; 올바르게 설계되었다면 언제나 빈 공간을 찾을 수 있을 것입니다.
        if mwt_WindowID%a_index% =  ; 빈 슬롯이 발견되었습니다.
        {
            mwt_WindowID%a_index% = %mwt_ActiveID%
            mwt_WindowTitle%a_index% = %mwt_ActiveTitle%
            break
        }
    }
}
return

RestoreFromTrayMenu:
Menu, Tray, delete, %A_ThisMenuItem%
; 메뉴 항목 이름으로 저장된 유일한 제목에 기반하여 창을 찾습니다:
Loop, %mwt_MaxWindows%
{
    if mwt_WindowTitle%a_index% = %A_ThisMenuItem%  ; 부합 발견.
    {
        StringTrimRight, IDToRestore, mwt_WindowID%a_index%, 0
        WinShow, ahk_id %IDToRestore%
        WinActivate ahk_id %IDToRestore%  ; 종종 필요.
        mwt_WindowID%a_index% =  ; 비워서 슬롯을 풀어줍니다.
        mwt_WindowTitle%a_index% =
        mwt_WindowCount -= 1
        break
    }
}
return

;; 다음은 마지막 최소화 창을 스택에서 꺼내 보여줍니다.
mwt_UnMinimize:
;; 더 이상 보여줄 것이 없는지 확인합니다.
if mwt_WindowCount > 0
{
    ;; 마지막 최소 창의 id를 얻어 그것을 보여줍니다
    StringTrimRight, IDToRestore, mwt_WindowID%mwt_WindowCount%, 0
    WinShow, ahk_id %IDToRestore%
    WinActivate ahk_id %IDToRestore%

    ;; 마지막 최소 창의 메뉴 이름을 얻어 그것을 제거합니다
    StringTrimRight, MenuToRemove, mwt_WindowTitle%mwt_WindowCount%, 0
    Menu, Tray, delete, %MenuToRemove%

    ;; 우리의 '배열'을 정리하고 창 개수를 줄입니다
    mwt_WindowID%mwt_WindowCount% =
    mwt_WindowTitle%mwt_WindowCount% =
    mwt_WindowCount -= 1
}
return

mwt_RestoreAllThenExit:
Gosub, mwt_RestoreAll
ExitApp  ; 진짜로 종료합니다.

mwt_RestoreAll:
Loop, %mwt_MaxWindows%
{
    if mwt_WindowID%a_index% <>
    {
        StringTrimRight, IDToRestore, mwt_WindowID%a_index%, 0
        WinShow, ahk_id %IDToRestore%
        WinActivate ahk_id %IDToRestore%  ; 종종 필요함.
        ; 이런 식으로 하거나 vs. 모두 지웁니다(DeleteAll)
        ; 가름 줄과 첫 항목은 그대로 둡니다:
        StringTrimRight, MenuToRemove, mwt_WindowTitle%a_index%, 0
        Menu, Tray, delete, %MenuToRemove%
        mwt_WindowID%a_index% =  ; 비워서 슬롯을 풀어 줍니다.
        mwt_WindowTitle%a_index% =
        mwt_WindowCount -= 1
    }
    if mwt_WindowCount = 0
        break
}
return


Mouse Gestures -- by deguix

마우스 제스쳐 -- by deguix

이 스크립트는 오른쪽 버튼이 눌려 있는 동안 마우스를 어떻게 이동하는지 감시합니다. 만약 "그리기"를 보고 알고 있는 모양이나 심볼을 발견하면, 프로그램을 기동하거나 (마치 핫키처럼) 선택에 따라 다른 조치를 수행합니다. 제스쳐를 정의하는 법은 동봉된 README 파일을 참조하십시오.


Changing MsgBox's Button Names

MsgBox의 버튼 이름 바꾸기

다음은 타이머를 사용하여 MsgBox 대화상자의 버튼 이름을 바꾸는 예제입니다. 버튼 이름은 바뀌더라도, IfMsgBox 명령어는 여전히 버튼이 그의 원래 이름으로 참조되기를 요구합니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

#SingleInstance
SetTimer, ChangeButtonNames, 50
MsgBox, 4, Add or Delete, Choose a button:
IfMsgBox, YES
    MsgBox, You chose Add.
else
    MsgBox, You chose Delete.
return

ChangeButtonNames:
IfWinNotExist, Add or Delete
    return  ; 계속 대기.
SetTimer, ChangeButtonNames, off
WinActivate
ControlSetText, Button1, &Add
ControlSetText, Button2, &Delete
return


Numpad 000 Key

이 예제 스크립트는 어떤 키보드에 나타나는 특수한 000 키를 등호 키로 변신시킵니다. 행위를 바꾸려면 Send, = 줄을 여러분의 기호대로 변경하십시오.

이 스크립트 내려 받기 | 다른 샘플 스크립트 | 홈으로

#MaxThreadsPerHotkey 5  ; 이 핫키에 대하여 여러 쓰레드를 허용합니다.
$Numpad0::
#MaxThreadsPerHotkey 1
; 위에서: $를 사용해 갈고리 사용을 강제합니다. 이렇게 하면 무한 회돌이를 방지합니다.
; 서브루틴 자체가 Numpad0를 전송하기 때문인데, 이 때문에
; 자기 자신을 호출하는 무한 재귀에 빠질 수 있습니다.
SetBatchLines, 100 ; 이 경우 약간 더 빨리 실행하도록 만듭니다.
DelayBetweenKeys = 30 ; 작동하지 않을 경우 이 값을 조절합니다.
if A_PriorHotkey = %A_ThisHotkey%
{
    if A_TimeSincePriorHotkey < %DelayBetweenKeys%
    {
        if Numpad0Count =
            Numpad0Count = 2 ; 즉, 앞에 것에다 이것을 더한 것입니다.
        else if Numpad0Count = 0
            Numpad0Count = 2
        else
        {
            ; 여기에 있으므로, Numpad0Count가 이전 호출에서
            ; 반드시 2로 설정되어 있어야 합니다.
            ; 즉, 이 번에 키가 세 번째 눌린 것이라는 뜻입니다
            ; 그러므로, 핫키 연속열이 촉발되어야 합니다:
            Numpad0Count = 0
            Send, = ; ******* 이것이 000 키에 대한 조치입니다
        }
        ; 위의 모든 경우에, 더 이상 조치 없이 돌아갑니다:
        CalledReentrantly = y
        return
    }
}
; 그렇지 않으면, 이 Numpad0 이벤트는 일련의 연속에서 첫 번째이거나
; 아니면 어쩌다가 첫 번째 이벤트 다음에 너무 오래 걸린 것입니다.
; (예, 사용자가 Numpad0 키를 계속 눌러서 자동 반복을 하는 경우가 그럴텐데,
; 이것을 허용하고 싶은 것입니다).  그러므로, 짧은 지연 시간 후에
; -- 그 사이에 또다른 Numpad0 핫키 이벤트가 재진입하여
;  이 서브루틴을 호출할 수도 있지만 --
; 재진입 호출이 일어나지만 않는다면 그 키를 계속 보냅니다:
Numpad0Count = 0
CalledReentrantly = n
; 이렇게 자는 동안, 이 서브루틴은 재진입 호출될 수 있습니다
; (즉, 동시 "쓰레드"로서 현재 호출 상태에 있는 쓰레드와
; 병행적으로 실행됩니다):
Sleep, %DelayBetweenKeys%
if CalledReentrantly = y ; 또다른 "쓰레드"가 값을 변경했습니다.
{
    ; 재진입 호출되었으므로, 이 키 이벤트는 연속열에서
    ; 첫 번째 이벤트였습니다. 그래서 억눌러야 합니다 (시스템으로부터 숨겨야 합니다):
    CalledReentrantly = n
    return
}
; 그렇지 않으면, 연속열에 포함되지 않습니다. 그래서 그 키를 보통처럼 전송합니다.
; 다른 말로, *진짜* Numpad0 키가 눌렸습니다. 그래서 정상처럼 효과가 있기를 원합니다.:
Send, {Numpad0}
return


Using Keyboard Numpad as a Mouse -- by deguix

키보드의 넘패드를 마우스처럼 사용하는 법 -- by deguix

이 스크립트는 키보드를 마우스처럼 사용할 수 있도록 해 줍니다. 거의 실제 마우스를 사용하는 것과 비슷하게 쉽습니다 (어떤 작업에는 훨씬 더 쉬울 수 있습니다). 최대 다섯 개의 마우스 버튼을 지원하며 마우스 휠을 회전할 수 있습니다. 또한 이동 속도, 가속 기능, 그리고 "축 뒤집기"를 재단할 수 있습니다.

이 스크립틀 내려 받기 | 다른 샘플 스크립트 | 홈으로

/*
o------------------------------------------------------------o
|키보드의 넘패드를 마우스로 사용하기                         |
(------------------------------------------------------------)
| By deguix           / 오토핫키 1.0.22+ 용 스크립트 파일    |
|                    ----------------------------------------|
|                                                            |
|    이 스크립트는 오토핫키의 사용법을 보여주는 예제입니다.  |
| 키보드의 넘패드 키를 리맵해서 마우스로서 변신시킵니다.     |
| 가속 기능이 들어 있어서 키를 오랫 누르고 있으면 마우스     |
| 이동을 가속할 수 있습니다다. 회전 기능도 갖추고 있어서     |
| 넘패드 마우스를 "돌릴 수 있습니다"                         |
| 즉, NumPadDown와 NumPadUp를 누르면 휠처럼 돌릴 수 있습니다.|
| 아래에 사용된 키 리스트를 참조하십시오:                    |
|                                                            |
|------------------------------------------------------------|
| 키                    | 설명                               |
|------------------------------------------------------------|
| ScrollLock (toggle on)| 넘패드 마우스 모드를 활성화        |
|-----------------------|------------------------------------|
| NumPad0               | 왼버튼 클릭.                       |
| NumPad5               | 가운데 버튼 클릭.                  |
| NumPadDot             | 우버튼 클릭.                       |
| NumPadDiv/NumPadMult  | X1/X2 마우스 버튼 클릭. (Win 2k+)  |
| NumPadSub/NumPadAdd   | 마우스 휠을 위 아래로 이동.        |
|                       |                                    |
|-----------------------|------------------------------------|
| NumLock (toggled off) | 마우스 이동 모드를 활성화.         |
|-----------------------|------------------------------------|
| NumPadEnd/Down/PgDn/  | 마우스 이동.                       |
| /Left/Right/Home/Up/  |                                    |
| /PgUp                 |                                    |
|                       |                                    |
|-----------------------|------------------------------------|
| NumLock (toggled on)  | 마우스 속도 조절 모드 활성화.      |
|-----------------------|------------------------------------|
| NumPad7/NumPad1       | 버튼을 누를 때마다                 |
|                       | 가속이 증가/감소.                  |
| NumPad8/NumPad2       | 버튼을 누를 때마다                 |
|                       | 최초 속도가 증가/감소.             |
| NumPad9/NumPad3       | 버튼을 누를 때마다                 |
|                       | 최대 속도가 증가/감소.             |
| ^NumPad7/^NumPad1     | 버튼을 누를 때마다 *               |
|                       | 휠 가속이 증가/감소.               |
| ^NumPad8/^NumPad2     | 버튼을 누를 때마다 *               |
|                       | 휠 초기 속도 증가/감소.            |
| ^NumPad9/^NumPad3     | 버튼을 누를 때마다 *               |
|                       | 휠 최대 속도 증가/감소.            |
| NumPad4/NumPad6       | 오른쪽으로 회전 각도를 증가/감소   |
|                       | 즉, 180° = 반대로 뒤집어짐        |
|------------------------------------------------------------|
| * = 이 옵션은 제어판에서 조절한 마우스 휠의 속도의         |
| 영향을 받습니다. 마우스에 휠이 없다면                      |
| 기본값은 버튼 눌림당 3 +/- 줄입니다.                       |
o------------------------------------------------------------o
*/

;환경 구성 시작

#SingleInstance force
#MaxHotkeysPerInterval 500

; 키보드 갈고리를 사용하여 넘패드 핫키를 구현하면
; à와 같은 ANSI 문자의 생성을 간섭하지 않습니다.
; 이 때문에 오토 핫키는 ALT를 누르고 일련의
; 넘패드 키눌림을 전송함으로써 그런 문자들을 생성합니다.
; 갈고리 핫키는 똑똑해서 그런 키눌림은 무시합니다.
#UseHook

MouseSpeed = 1
MouseAccelerationSpeed = 1
MouseMaxSpeed = 5

; 마우스 휠의 속도는 제어판에서 설정합니다.
; 보통의 마우스 행위에 영향을 미치기 때문에, 아래의 세 가지 설정의
; 실제 속도는 정상 마우스 휠 속도의 두 배가 됩니다.
MouseWheelSpeed = 1
MouseWheelAccelerationSpeed = 1
MouseWheelMaxSpeed = 5

MouseRotationAngle = 0

;환경 구성 끝

; 다음은 꼭 필요합니다. 그렇지 않으면 키눌림은
; 정상적인 조치를 전송하지 못하기 때문입니다.
; NumPadDiv와 같은 경우 가끔 "/"을 화면에 전송합니다
#InstallKeybdHook

Temp = 0
Temp2 = 0

MouseRotationAnglePart = %MouseRotationAngle%
; 45º로 나눕니다; 왜냐하면 MouseMove는 정수만 지원하기 때문입니다,
; 그리고 마우스 회전을 45º보다 작은 숫자로 변경하면;
; 이상한 행위를 야기할 수 있습니다.
;
; 예를 들어: 22.5º로 지정하면 NumPadUp를 누를때:
;  먼저 변을 향하여 속도가 1에 도달할 때까지
;  위로 이동합니다.
MouseRotationAnglePart /= 45

MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%

MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseSpeed%

SetKeyDelay, -1
SetMouseDelay, -1

Hotkey, *NumPad0, ButtonLeftClick
Hotkey, *NumpadIns, ButtonLeftClickIns
Hotkey, *NumPad5, ButtonMiddleClick
Hotkey, *NumpadClear, ButtonMiddleClickClear
Hotkey, *NumPadDot, ButtonRightClick
Hotkey, *NumPadDel, ButtonRightClickDel
Hotkey, *NumPadDiv, ButtonX1Click
Hotkey, *NumPadMult, ButtonX2Click

Hotkey, *NumpadSub, ButtonWheelUp
Hotkey, *NumpadAdd, ButtonWheelDown

Hotkey, *NumPadUp, ButtonUp
Hotkey, *NumPadDown, ButtonDown
Hotkey, *NumPadLeft, ButtonLeft
Hotkey, *NumPadRight, ButtonRight
Hotkey, *NumPadHome, ButtonUpLeft
Hotkey, *NumPadEnd, ButtonUpRight
Hotkey, *NumPadPgUp, ButtonDownLeft
Hotkey, *NumPadPgDn, ButtonDownRight

Hotkey, Numpad8, ButtonSpeedUp
Hotkey, Numpad2, ButtonSpeedDown
Hotkey, Numpad7, ButtonAccelerationSpeedUp
Hotkey, Numpad1, ButtonAccelerationSpeedDown
Hotkey, Numpad9, ButtonMaxSpeedUp
Hotkey, Numpad3, ButtonMaxSpeedDown

Hotkey, Numpad6, ButtonRotationAngleUp
Hotkey, Numpad4, ButtonRotationAngleDown

Hotkey, !Numpad8, ButtonWheelSpeedUp
Hotkey, !Numpad2, ButtonWheelSpeedDown
Hotkey, !Numpad7, ButtonWheelAccelerationSpeedUp
Hotkey, !Numpad1, ButtonWheelAccelerationSpeedDown
Hotkey, !Numpad9, ButtonWheelMaxSpeedUp
Hotkey, !Numpad3, ButtonWheelMaxSpeedDown

Gosub, ~ScrollLock  ; 현재 스크롤락의 상태에 기반하여 초기화합니다.
return

; 키 활성화 지원

~ScrollLock::
; 키를 떼기를 기다립니다. 그렇지 않으면 갈고리 상태가
; 키를 누르고 있는 동안 리셋되어 버려서, 업-이벤트가 억눌러집니다,
; 이어서 스크롤락 상태/불빛의 토클을 막아 버립니다:
KeyWait, ScrollLock
GetKeyState, ScrollLockState, ScrollLock, T
If ScrollLockState = D
{
    Hotkey, *NumPad0, on
    Hotkey, *NumpadIns, on
    Hotkey, *NumPad5, on
    Hotkey, *NumPadDot, on
    Hotkey, *NumPadDel, on
    Hotkey, *NumPadDiv, on
    Hotkey, *NumPadMult, on

    Hotkey, *NumpadSub, on
    Hotkey, *NumpadAdd, on

    Hotkey, *NumPadUp, on
    Hotkey, *NumPadDown, on
    Hotkey, *NumPadLeft, on
    Hotkey, *NumPadRight, on
    Hotkey, *NumPadHome, on
    Hotkey, *NumPadEnd, on
    Hotkey, *NumPadPgUp, on
    Hotkey, *NumPadPgDn, on

    Hotkey, Numpad8, on
    Hotkey, Numpad2, on
    Hotkey, Numpad7, on
    Hotkey, Numpad1, on
    Hotkey, Numpad9, on
    Hotkey, Numpad3, on

    Hotkey, Numpad6, on
    Hotkey, Numpad4, on

    Hotkey, !Numpad8, on
    Hotkey, !Numpad2, on
    Hotkey, !Numpad7, on
    Hotkey, !Numpad1, on
    Hotkey, !Numpad9, on
    Hotkey, !Numpad3, on
}
else
{
    Hotkey, *NumPad0, off
    Hotkey, *NumpadIns, off
    Hotkey, *NumPad5, off
    Hotkey, *NumPadDot, off
    Hotkey, *NumPadDel, off
    Hotkey, *NumPadDiv, off
    Hotkey, *NumPadMult, off

    Hotkey, *NumpadSub, off
    Hotkey, *NumpadAdd, off

    Hotkey, *NumPadUp, off
    Hotkey, *NumPadDown, off
    Hotkey, *NumPadLeft, off
    Hotkey, *NumPadRight, off
    Hotkey, *NumPadHome, off
    Hotkey, *NumPadEnd, off
    Hotkey, *NumPadPgUp, off
    Hotkey, *NumPadPgDn, off

    Hotkey, Numpad8, off
    Hotkey, Numpad2, off
    Hotkey, Numpad7, off
    Hotkey, Numpad1, off
    Hotkey, Numpad9, off
    Hotkey, Numpad3, off

    Hotkey, Numpad6, off
    Hotkey, Numpad4, off

    Hotkey, !Numpad8, off
    Hotkey, !Numpad2, off
    Hotkey, !Numpad7, off
    Hotkey, !Numpad1, off
    Hotkey, !Numpad9, off
    Hotkey, !Numpad3, off
}
return

; 마우스 클릭 지원

ButtonLeftClick:
GetKeyState, already_down_state, LButton
If already_down_state = D
    return
Button2 = NumPad0
ButtonClick = Left
Goto ButtonClickStart
ButtonLeftClickIns:
GetKeyState, already_down_state, LButton
If already_down_state = D
    return
Button2 = NumPadIns
ButtonClick = Left
Goto ButtonClickStart

ButtonMiddleClick:
GetKeyState, already_down_state, MButton
If already_down_state = D
    return
Button2 = NumPad5
ButtonClick = Middle
Goto ButtonClickStart
ButtonMiddleClickClear:
GetKeyState, already_down_state, MButton
If already_down_state = D
    return
Button2 = NumPadClear
ButtonClick = Middle
Goto ButtonClickStart

ButtonRightClick:
GetKeyState, already_down_state, RButton
If already_down_state = D
    return
Button2 = NumPadDot
ButtonClick = Right
Goto ButtonClickStart
ButtonRightClickDel:
GetKeyState, already_down_state, RButton
If already_down_state = D
    return
Button2 = NumPadDel
ButtonClick = Right
Goto ButtonClickStart

ButtonX1Click:
GetKeyState, already_down_state, XButton1
If already_down_state = D
    return
Button2 = NumPadDiv
ButtonClick = X1
Goto ButtonClickStart

ButtonX2Click:
GetKeyState, already_down_state, XButton2
If already_down_state = D
    return
Button2 = NumPadMult
ButtonClick = X2
Goto ButtonClickStart

ButtonClickStart:
MouseClick, %ButtonClick%,,, 1, 0, D
SetTimer, ButtonClickEnd, 10
return

ButtonClickEnd:
GetKeyState, kclickstate, %Button2%, P
if kclickstate = D
    return

SetTimer, ButtonClickEnd, off
MouseClick, %ButtonClick%,,, 1, 0, U
return

; 마우스 이동 지원

ButtonSpeedUp:
MouseSpeed++
ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonSpeedDown:
If MouseSpeed > 1
    MouseSpeed--
If MouseSpeed = 1
    ToolTip, Mouse speed: %MouseSpeed% pixel
else
    ToolTip, Mouse speed: %MouseSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonAccelerationSpeedUp:
MouseAccelerationSpeed++
ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonAccelerationSpeedDown:
If MouseAccelerationSpeed > 1
    MouseAccelerationSpeed--
If MouseAccelerationSpeed = 1
    ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixel
else
    ToolTip, Mouse acceleration speed: %MouseAccelerationSpeed% pixels
SetTimer, RemoveToolTip, 1000
return

ButtonMaxSpeedUp:
MouseMaxSpeed++
ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels
SetTimer, RemoveToolTip, 1000
return
ButtonMaxSpeedDown:
If MouseMaxSpeed > 1
    MouseMaxSpeed--
If MouseMaxSpeed = 1
    ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixel
else
    ToolTip, Mouse maximum speed: %MouseMaxSpeed% pixels
SetTimer, RemoveToolTip, 1000
return

ButtonRotationAngleUp:
MouseRotationAnglePart++
If MouseRotationAnglePart >= 8
    MouseRotationAnglePart = 0
MouseRotationAngle = %MouseRotationAnglePart%
MouseRotationAngle *= 45
ToolTip, Mouse rotation angle: %MouseRotationAngle%°
SetTimer, RemoveToolTip, 1000
return
ButtonRotationAngleDown:
MouseRotationAnglePart--
If MouseRotationAnglePart < 0
    MouseRotationAnglePart = 7
MouseRotationAngle = %MouseRotationAnglePart%
MouseRotationAngle *= 45
ToolTip, Mouse rotation angle: %MouseRotationAngle%°
SetTimer, RemoveToolTip, 1000
return

ButtonUp:
ButtonDown:
ButtonLeft:
ButtonRight:
ButtonUpLeft:
ButtonUpRight:
ButtonDownLeft:
ButtonDownRight:
If Button <> 0
{
    IfNotInString, A_ThisHotkey, %Button%
    {
        MouseCurrentAccelerationSpeed = 0
        MouseCurrentSpeed = %MouseSpeed%
    }
}
StringReplace, Button, A_ThisHotkey, *

ButtonAccelerationStart:
If MouseAccelerationSpeed >= 1
{
    If MouseMaxSpeed > %MouseCurrentSpeed%
    {
        Temp = 0.001
        Temp *= %MouseAccelerationSpeed%
        MouseCurrentAccelerationSpeed += %Temp%
        MouseCurrentSpeed += %MouseCurrentAccelerationSpeed%
    }
}

;MouseRotationAngle을 버튼 방향의 속도로 변환
{
    MouseCurrentSpeedToDirection = %MouseRotationAngle%
    MouseCurrentSpeedToDirection /= 90.0
    Temp = %MouseCurrentSpeedToDirection%

    if Temp >= 0
    {
        if Temp < 1
        {
            MouseCurrentSpeedToDirection = 1
            MouseCurrentSpeedToDirection -= %Temp%
            Goto EndMouseCurrentSpeedToDirectionCalculation
        }
    }
    if Temp >= 1
    {
        if Temp < 2
        {
            MouseCurrentSpeedToDirection = 0
            Temp -= 1
            MouseCurrentSpeedToDirection -= %Temp%
            Goto EndMouseCurrentSpeedToDirectionCalculation
        }
    }
    if Temp >= 2
    {
        if Temp < 3
        {
            MouseCurrentSpeedToDirection = -1
            Temp -= 2
            MouseCurrentSpeedToDirection += %Temp%
            Goto EndMouseCurrentSpeedToDirectionCalculation
        }
    }
    if Temp >= 3
    {
        if Temp < 4
        {
            MouseCurrentSpeedToDirection = 0
            Temp -= 3
            MouseCurrentSpeedToDirection += %Temp%
            Goto EndMouseCurrentSpeedToDirectionCalculation
        }
    }
}
EndMouseCurrentSpeedToDirectionCalculation:

;MouseRotationAngle를 90도의 속도로 오른쪽으로 변환
{
    MouseCurrentSpeedToSide = %MouseRotationAngle%
    MouseCurrentSpeedToSide /= 90.0
    Temp = %MouseCurrentSpeedToSide%
    Transform, Temp, mod, %Temp%, 4

    if Temp >= 0
    {
        if Temp < 1
        {
            MouseCurrentSpeedToSide = 0
            MouseCurrentSpeedToSide += %Temp%
            Goto EndMouseCurrentSpeedToSideCalculation
        }
    }
    if Temp >= 1
    {
        if Temp < 2
        {
            MouseCurrentSpeedToSide = 1
            Temp -= 1
            MouseCurrentSpeedToSide -= %Temp%
            Goto EndMouseCurrentSpeedToSideCalculation
        }
    }
    if Temp >= 2
    {
        if Temp < 3
        {
            MouseCurrentSpeedToSide = 0
            Temp -= 2
            MouseCurrentSpeedToSide -= %Temp%
            Goto EndMouseCurrentSpeedToSideCalculation
        }
    }
    if Temp >= 3
    {
        if Temp < 4
        {
            MouseCurrentSpeedToSide = -1
            Temp -= 3
            MouseCurrentSpeedToSide += %Temp%
            Goto EndMouseCurrentSpeedToSideCalculation
        }
    }
}
EndMouseCurrentSpeedToSideCalculation:

MouseCurrentSpeedToDirection *= %MouseCurrentSpeed%
MouseCurrentSpeedToSide *= %MouseCurrentSpeed%

Temp = %MouseRotationAnglePart%
Transform, Temp, Mod, %Temp%, 2

If Button = NumPadUp
{
    if Temp = 1
    {
        MouseCurrentSpeedToSide *= 2
        MouseCurrentSpeedToDirection *= 2
    }

    MouseCurrentSpeedToDirection *= -1
    MouseMove, %MouseCurrentSpeedToSide%, %MouseCurrentSpeedToDirection%, 0, R
}
else if Button = NumPadDown
{
    if Temp = 1
    {
        MouseCurrentSpeedToSide *= 2
        MouseCurrentSpeedToDirection *= 2
    }

    MouseCurrentSpeedToSide *= -1
    MouseMove, %MouseCurrentSpeedToSide%, %MouseCurrentSpeedToDirection%, 0, R
}
else if Button = NumPadLeft
{
    if Temp = 1
    {
        MouseCurrentSpeedToSide *= 2
        MouseCurrentSpeedToDirection *= 2
    }

    MouseCurrentSpeedToSide *= -1
    MouseCurrentSpeedToDirection *= -1

    MouseMove, %MouseCurrentSpeedToDirection%, %MouseCurrentSpeedToSide%, 0, R
}
else if Button = NumPadRight
{
    if Temp = 1
    {
        MouseCurrentSpeedToSide *= 2
        MouseCurrentSpeedToDirection *= 2
    }

    MouseMove, %MouseCurrentSpeedToDirection%, %MouseCurrentSpeedToSide%, 0, R
}
else if Button = NumPadHome
{
    Temp = %MouseCurrentSpeedToDirection%
    Temp -= %MouseCurrentSpeedToSide%
    Temp *= -1
    Temp2 = %MouseCurrentSpeedToDirection%
    Temp2 += %MouseCurrentSpeedToSide%
    Temp2 *= -1
    MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadPgUp
{
    Temp = %MouseCurrentSpeedToDirection%
    Temp += %MouseCurrentSpeedToSide%
    Temp2 = %MouseCurrentSpeedToDirection%
    Temp2 -= %MouseCurrentSpeedToSide%
    Temp2 *= -1
    MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadEnd
{
    Temp = %MouseCurrentSpeedToDirection%
    Temp += %MouseCurrentSpeedToSide%
    Temp *= -1
    Temp2 = %MouseCurrentSpeedToDirection%
    Temp2 -= %MouseCurrentSpeedToSide%
    MouseMove, %Temp%, %Temp2%, 0, R
}
else if Button = NumPadPgDn
{
    Temp = %MouseCurrentSpeedToDirection%
    Temp -= %MouseCurrentSpeedToSide%
    Temp2 *= -1
    Temp2 = %MouseCurrentSpeedToDirection%
    Temp2 += %MouseCurrentSpeedToSide%
    MouseMove, %Temp%, %Temp2%, 0, R
}

SetTimer, ButtonAccelerationEnd, 10
return

ButtonAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
    Goto ButtonAccelerationStart

SetTimer, ButtonAccelerationEnd, off
MouseCurrentAccelerationSpeed = 0
MouseCurrentSpeed = %MouseSpeed%
Button = 0
return

; 마우스 휠 이동 지원

ButtonWheelSpeedUp:
MouseWheelSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
    MouseWheelSpeedMultiplier = 1
MouseWheelSpeedReal = %MouseWheelSpeed%
MouseWheelSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
    MouseWheelSpeedMultiplier = 1
If MouseWheelSpeedReal > %MouseWheelSpeedMultiplier%
{
    MouseWheelSpeed--
    MouseWheelSpeedReal = %MouseWheelSpeed%
    MouseWheelSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelSpeedReal = 1
    ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% line
else
    ToolTip, Mouse wheel speed: %MouseWheelSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return

ButtonWheelAccelerationSpeedUp:
MouseWheelAccelerationSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
    MouseWheelSpeedMultiplier = 1
MouseWheelAccelerationSpeedReal = %MouseWheelAccelerationSpeed%
MouseWheelAccelerationSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelAccelerationSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
    MouseWheelSpeedMultiplier = 1
If MouseWheelAccelerationSpeed > 1
{
    MouseWheelAccelerationSpeed--
    MouseWheelAccelerationSpeedReal = %MouseWheelAccelerationSpeed%
    MouseWheelAccelerationSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelAccelerationSpeedReal = 1
    ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% line
else
    ToolTip, Mouse wheel acceleration speed: %MouseWheelAccelerationSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return

ButtonWheelMaxSpeedUp:
MouseWheelMaxSpeed++
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
    MouseWheelSpeedMultiplier = 1
MouseWheelMaxSpeedReal = %MouseWheelMaxSpeed%
MouseWheelMaxSpeedReal *= %MouseWheelSpeedMultiplier%
ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return
ButtonWheelMaxSpeedDown:
RegRead, MouseWheelSpeedMultiplier, HKCU, Control Panel\Desktop, WheelScrollLines
If MouseWheelSpeedMultiplier <= 0
    MouseWheelSpeedMultiplier = 1
If MouseWheelMaxSpeed > 1
{
    MouseWheelMaxSpeed--
    MouseWheelMaxSpeedReal = %MouseWheelMaxSpeed%
    MouseWheelMaxSpeedReal *= %MouseWheelSpeedMultiplier%
}
If MouseWheelMaxSpeedReal = 1
    ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% line
else
    ToolTip, Mouse wheel maximum speed: %MouseWheelMaxSpeedReal% lines
SetTimer, RemoveToolTip, 1000
return

ButtonWheelUp:
ButtonWheelDown:

If Button <> 0
{
    If Button <> %A_ThisHotkey%
    {
        MouseWheelCurrentAccelerationSpeed = 0
        MouseWheelCurrentSpeed = %MouseWheelSpeed%
    }
}
StringReplace, Button, A_ThisHotkey, *

ButtonWheelAccelerationStart:
If MouseWheelAccelerationSpeed >= 1
{
    If MouseWheelMaxSpeed > %MouseWheelCurrentSpeed%
    {
        Temp = 0.001
        Temp *= %MouseWheelAccelerationSpeed%
        MouseWheelCurrentAccelerationSpeed += %Temp%
        MouseWheelCurrentSpeed += %MouseWheelCurrentAccelerationSpeed%
    }
}

If Button = NumPadSub
    MouseClick, wheelup,,, %MouseWheelCurrentSpeed%, 0, D
else if Button = NumPadAdd
    MouseClick, wheeldown,,, %MouseWheelCurrentSpeed%, 0, D

SetTimer, ButtonWheelAccelerationEnd, 100
return

ButtonWheelAccelerationEnd:
GetKeyState, kstate, %Button%, P
if kstate = D
    Goto ButtonWheelAccelerationStart

MouseWheelCurrentAccelerationSpeed = 0
MouseWheelCurrentSpeed = %MouseWheelSpeed%
Button = 0
return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return


Seek -- by Phi

시작 메뉴를 항해하는 것은 난삽할 수 있습니다. 특히 시간이 지나면서 많은 프로그램을 설치했다면 더욱 난삽합니다. 'Seek'으로 대소문자를 구분하지 않고 키 단어/문구를 지정하면 시작 메뉴로부터 오직 부합하는 프로그램과 디렉토리만 여과합니다. 그래서 쉽게 목표 프로그램을 몇 개 안되는 부합 엔트리 중 하나에서 열 수 있습니다. 이렇게 하면 시작 메뉴를 검색하고 순회하는 지겨운 작업을 하지 않아도 됩니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

;*****************************************************************
;
;  Program : Seek
;  Coder   : Phi
;  Updated : Mon Jan 31 10:08:37 2005
;
;  여러분, 무엇을 찾고 계십니까?
;
;*****************************************************************
;
;  필자는 재미있게 이 코딩을 즐겼습니다. 모쪼록 여러분도
;  재미있게 사용하시기를 바랍니다. 주저하지 마시고 이메일을
;  주십시오. 논평이든 피드백이든 환영합니다: phi1618 (*a.t*) gmail
;  :D0T: com.
;
;  옵션:
;    -cache 가능하면 캐쉬된 디렉토리 리스트를 사용한다
;           (아무 옵션도 지정하지 않으면 이것이 기본값이다)
;    -scan  디렉토리를 스캔해
              최근의 디렉토리 목록을 열람한다
;    -scex  스캔 & 종료 (잠재적으로 시간을 소모하는
              디렉토리 스캔 작업을 배경 작업으로 설정할 경우
;              유용하다)
;    -help  이 도움말을 보여준다
;
;*****************************************************************
;
; HOW TO 'SEEK':
;
; 1. 'Seek'은 오토핫키 스크립트입니다.
;    Seek.ahk (원본 스크립트) 또는 Seek.exe (컴파일된 실행 파일)
;    로 실행할 수 있습니다.
;
;    Seek.exe를 얻으려면, Seek.zip을 내려받으면 됩니다
;    (안에 소스 코드와 컴파일된 이진 파일이 모두 들어 있습니다)
;    http://home.ripway.com/2004-10/188589/
;    그렇지 않으면, 스스로 Seek.ahk를 컴파일해도 됩니다
;    오토핫키의 Ahk2Exe.exe 컴파일러를 사용하거나, 아니면
;    필자에게 이메일로 사본을 요청해도 됩니다. 파일 크기는 대략
;    200 킬로바이트 정도록 작습니다. 다음 이메일로 연락 주십시오: phi1618 (*a.t*)
;    gmail :D0T: com.
;
;    Seek.ahk를 사용하려면, 먼저, 여러분의 컴퓨터에
;    AutoHotkey v1.0.25 이상을 설치해야 합니다.
;    (http://www.autohotkey.com에서 내려 받으십시오). 다음 명령어를 실행합니다:
;
;    X:\myTools\AutoHotkey\AutoHotkey.exe Y:\myAHK\Seek.ahk
;
;    잊지 말고 X:\myTools 그리고 Y:\myAHK를
;    여러분의 컴퓨터에 맞는 적절한 디렉토리 이름으로 교체하십시오.
;
; 2. 실행 파일 Seek.exe는 어디든 마음래도 두셔도 됩니다.
;    설치가 필요 없습니다. 레지스트리에 전혀 쓰지도 않으며
;    인터넷에도 전혀 접근하지 않습니다
;    설치를 제거하려면,
;    그냥 Seek.exe를 삭제하면 끝입니다.
;
;    'Seek'이 생성하는 두 개의 2 파일만
;    TMP 디렉토리에 배치됩니다:
;
;      a. _Seek.key  (마지막 질의 문자열을 위한 캐쉬 파일)
;      b. _Seek.list (디렉토리 리스트를 위한 캐쉬 파일)
;
;    여러분이 순수 주의자라면, 시스템에서 'Seek'을 제거하기로
;    결정한 순간 손수 지워 버리면 됩니다.
;
; 3. 'Seek'을 실행하는 가장 편리한 방법은 단축키/핫키를
;    이용하는 것입니다. 여러분의 컴퓨터에
;    아직 핫키 관리 프로그램을 사용하고 있지 않다면, 필자는
;    AutoHotkey를 강력 추천합니다. 지금 당장은
;    핫키 관리 프로그램을 설치하고 싶지 않다면
;    윈도우즈의 단축키를 이용할 수 있습니다.  'Seek'를 기동할
;    단축 키 (예, ALT-F1)를 묶으면 됩니다. 이것은 중요합니다.
;    언제든지 어디서든 'Seek'를
;    실행할 수 있기 때문입니다..
;
; 4. 처음 'Seek'를 실행할 때, 시작 메뉴를 스캔합니다
;    그리고 디렉토리 리스트를
;    캐쉬 파일에 저장합니다.
;
;    다음 디렉토리가 스캔 대상에 포함됩니다:
;    - %A_StartMenu%
;    - %A_StartMenuCommon%
;
;    기본값으로, 연이은 실행은 캐쉬 파일로부터 읽습니다
;    그래서 적재 시간을 절약합니다.
;    옵션에 관한 더 자세한 정보는 'Seek.exe -help'를 실행하십시오.
;    시작 메뉴에 별로 프로그램이 없다면
;    캐쉬 사용을 포기하고 언제나 디렉토리 스캔을
;    사용하라고 'Seek'에게 알릴 수 있습니다 (옵션 -scan).
;    그런 식으로 언제나 최신 목록을 얻을 수 있습니다.
;
; 5. 'Seek'을 실행할 때, 창이 나타나서
;    여러분이 키 단어/문구를 입력하기를 기다립니다.
;    질의 문자열을 입력한 후, 부합하는 레코드 목록을
;    보여줍니다. 다음으로, 엔트리를 강조하고
;    <Enter>를 누르거나 'Open' 버튼을 클릭할 필요가 있습니다.
;    그래야 선택된 프로그램을 실행하거나
;     택된 디렉토리를 열 수 있습니다.
;
;*****************************************************************
;
; 기술적 고지 사항:
;
; - 'Seek'는 크리스 멀릿(Chris Mallett)의 AutoHotkey v1.0.25
;   이상을 요구합니다 (http://www.autohotkey.com).
;   크리스에게 위대한 작업을 해 주신 것에 대하여 감사드립니다:)
;
; - 다음 환경 변수는 항상 유효합니다:
;   a. TMP
;
;*****************************************************************
;
; 알려진 문제:
;
; - 없음
;
;*****************************************************************
;
; 구현 제안:
;
; - 기본으로 첫 번째 부합 레코드를 강조.
;   사용자가 그냥 <Enter>만 치면 실행되도록.
;   (Suggested by Yih Yeong)
;
; - 검색 결과 목록을 더블 클릭하면
;   프로그램을 실행하도록 개선.
;   (Suggested by Yih Yeong & Jack)
;
; - 자동 실-시간 점진적 검색.
;   (Suggested by Rajat)
;
; - 사용자가 스페이스로 구분하여,
;    여러 질의 문자열을 입력알 때 퍼지(Fuzzy) 검색.
;   (Suggested by Rajat)
;
;*****************************************************************
;
; 특징 제안 (구현 미정):
;
; - 기동 이력 기록. 최근에 사용된 프로그램을
;   검색 결과의 상단에 배치.
;   (Suggested by Yih Yeong)
;
; - 리스트 박스 대신, 일련의 어플리케이션 아이콘을
;   보여줌. 그러면 그 아이콘 위에 커서를 올리면
;   프로그램 정보가 들어 있는 툴팁이
;   나타난다 (경로, 등등).
;   (Suggested by Yih Yeong)
;
; - 텍스트 중간에 부합하는 대신에,
;   질의 문자열로 시작하는
;   프로그램/디렉토리에만 부합.
;   (Suggested by Stefan)
;
; - 즐겨 찾기 관리 추가. 단 번에
;   프로그램 그룹을 기동.
;   (Suggested by Atomhrt)
;
; - Seek를 윈도우즈 태스크바/툴바에 통합.
;   언제나 가능하고 Seek를 기동하기 위해
;   핫키를 묶을 필요가 없기 때문에.
;   (Suggested by Deniz Akay)
;
; - 만능문자/정규 표현식으로 검색.
;   (Suggested by Steve)
;
;*****************************************************************
;
; 변경 이력:
;
; * v1.1.0
; - 최초 배포.
;
; * v1.1.1
; - 창-최대화 옵션 제거.
;   잘 작동하지 않은 프로그램이 있기 때문에.
; - 'Open' 기능을 촉발시키기 위해 더블 클릭 탐지 추가.
;
; * v2.0.0
; - 'Seek' 팝업 창을 출력 화면에 통합
;   덕분에 사용자가 질의 문자열을 재입력할 수 있음
;   뭔가를 검색하기 위해 종료했다가 다시 Seek을 실행할 필요가 없음.
; - 'Scan Start-Menu' 버튼 추가.
; - 실시간 점진 검색 추가. 타자하는 동안
;   부합하는 레코드를 자동으로 여과한다,
;   <Enter>를 누르기를 기다리지 않는다.
; - 검색 문자열을 추적할 내부 스위치 추가 (TrackKeyPhrase).
; - 툴팁을 이용하여 파일이름을 보여줄
;   내부 스위치 추가 (ToolTipFilename)
;
; * v2.0.1
; - 수평 스크롤바를 리스트박스에 추가. 이제 아주 긴
;   레코드라도 중간에서 끊어지지 않는다.
;
; * v2.0.2
; - 사용자가 자신의 맞춤 디렉토리 목록을 스캔 대상에 포함할 수 있도록 허용.
;   사용자는 그냥 텍스트 파일 'Seek.dir'을 Seek.exe 또는  Seek.ahk가 있는
;   디렉토리에 만들어, 추가될 디렉토리의 전체 경로를
;   한 줄에 하나씩 지정하기만 하면 된다.
;   경로는 홑따옴표 또는 겹따옴표로 둘러 싸지 마십시오.
;
; * v2.0.3
; - 이름으로 정렬 /on 옵션을 DIR-명령어에 추가.
; - 사용자가 여러 질의 문자열을 스페이스로 분할해 입력할 때,
;   퍼지 검색. 예, "med pla". 문자열이 모두
;   ("med" & "pla") 발견되면 부합한다.
;   이것은 "Media Player", "Macromedia Flash Player",
;   "Play Medieval King", "medpla", "plamed"에 부합한다.
; - 탭-이동 절차를 교정. 모든 버튼을 시작으로부터 오른쪽으로 추가하고,
;   실제로 사용할 수 있을 때까지
;   불능으로 만들어서.
; - 툴팁=피드백을 교체하기 위해 상태 바를 추가.
; - 폐기된 내부 스위치를 제거 (ToolTipFilename).
; - "dir" 명령어의 사용을 오토핫키의
;   "Loop" 명령어로 교체해 디렉토리 내용을 스캔.
;   "dir"은 확장 문자 세트를 처리할 수 없으므로
;   비-영어 (예, 독일어) 디렉토리와 파일이름은 잘못 얻게 됨
;   (이 변경을 테스트해 주신 볼프강 부가티(Wolfgang Bujatti)와
;   시에스 플리지(Sietse Fliege)에게 감사)
; - 내부 스위치 추가 (ScanMode) 파일이나 디렉토리가
;   스캔 대상에 포함되었는지 확인.
; - 하드코드된 시작 메뉴 경로를 내장 변수
;    A_StartMenu, A_StartMenuCommon으로 교체.
;   이로서, Seek은 이제 시작 메뉴에서
;   다른 이름짓기 관례를 가진 다른 로케일과도 작동.
;   (이 새 변수를 사용하기 전에 또다른 방법을 테스트해 주신
;   볼프강 부가티(Wolfgang Bujatti)와
;   시에스 플리지(Sietse Fliege)에게 감사)
; - 마지막-실행 프로그램 레코드를 미리 선택
;   신속하게-<ENTER>를 두 번 누르면 그것을 실행.
;
;*****************************************************************

;**************************
;<--- BEGIN OF PROGRAM --->
;**************************

;==== 여기는 맞춤 설정 구역================================

; 디렉토리를 열 때 사용할 프로그램을 지정합니다.
; 프로그램을 발견할 수 없거나 지정하지 않으면
; (즉, 변수가 할당되지 않았거나 무효한 값이 할당되어 있으면),
; 기본 익스플로러가 사용됩니다.
dirExplorer = E:\utl\xplorer2_lite\xplorer2.exe

; 스캔 대상에 포함될  사용자의 추가 맞춤 디렉토리 목록
; 전체 경로는 홑따옴표 또는 겹따옴표로 둘러싸면 안됩니다
; 이 파일이 없으면
; 기본 디렉토리만 스캔합니다.
SeekMyDir = %A_ScriptDir%\Seek.dir

; 캐쉬 디렉토리/프로그램 목록을 저장할
; 파일이름과 디렉토리 위치를 지정합니다
; 원하지 않으면 이를 바꿀 필요가 없습니다.
dirListing = %A_Temp%\_Seek.list

; 마지막 검색의 캐쉬된 키 단어/문구를 저장할
; 파일이름과 디렉토리 위치를 지정합니다
;  원하지 않으면 이를 바꿀 필요가 없습니다.
keyPhrase = %A_Temp%\_Seek.key

; 검색 문자열 추적 (ON/OFF)
; ON이면, 다음에 Seek을 실행할 때
; 마지막-사용된 질의 문자열을기본으로 재사용합니다.
; OFF이면, 마지막 사용된 질의 문자열을 추적하지 않습니다
; 그리고 다음번 Seek를 실행할 때
; 질의 문자열이 없습니다.
TrackKeyPhrase = ON

; 스캔 대상에 포함될 것들을 지정합니다.
; 0: 디렉토리 배제 (파일만 포함).
; 1: 모든 파일과 디렉토리 포함.
; 2: 오직 디렉토리만 포함 (파일 제외).
ScanMode = 1

;...........................................................

; INIT
;#NoTrayIcon
StringCaseSense, Off
version = Seek v2.0.3

; DISPLAY HELP INSTRUCTIONS
If 1 in --help,-help,/h,-h,/?,-?
{
    MsgBox,, %version%, 시작 메뉴를 항해하는 것은 난삽할 수 있습니다. 특히 시간이 지나면서 많은 프로그램을 설치했다면 더욱 난삽합니다. 'Seek'으로 대소문자를 구분하지 않고 키 단어/문구를 지정하면 시작 메뉴로부터 오직 부합하는 프로그램과 디렉토리만 여과합니다. 그래서 쉽게 목표 프로그램을 몇 개 안되는 부합 엔트리 중 하나에서 열 수 있습니다. 이렇게 하면 시작 메뉴를 검색하고 순회하는 지겨운 작업을 하지 않아도 됩니다.`n`n;  필자는 재미있게 이 코딩을 즐겼습니다. 모쪼록 여러분도 재미있게 사용하시기를 바랍니다. 주저하지 마시고 이메일을 주십시오. 논평이든 피드백이든 환영합니다: phi1618 (*a.t*) gmail :D0T: com.`n`nOptions:`n  -cache`t가능하면 캐쉬된 디렉토리 리스트를 사용한다 (아무 옵션도 지정하지 않으면 이것이 기본값이다)`n  -scan`t디렉토리를 스캔해 최근의 디렉토리 목록을 열람한다`n  -scex`tScan & 스캔 & 종료 (잠재적으로 시간을 소모하는 디렉토리 스캔 작업을 배경 작업으로 설정할 경우 유용하다)`n  -help`t이 도움말을 보여준다
    Goto QuitNoSave
}

; 필수 환경 변수가 존재하는지 그리고 유효한지 점검합니다
; *TMP*
IfNotExist, %A_Temp% ; 경로가 존재하지 않습니다
{
    MsgBox 이 필수 환경 변수는 정의되지 않았거나 유효하지 않습니다:`n`n    TMP = %A_Temp%`n`n먼저 수정한 후에 Seek을 실행하십시오.
    Goto QuitNoSave
}

; SCAN-AND-EXIT이 아니면
IfNotEqual 1, -scex
{
    ; 마지막으로 사용된 키-문구를 캐쉬 파일로부터 열람해
    ; 기본 질의 문자열로 사용합니다
    If TrackKeyPhrase = ON
    {
        FileReadLine, PrevKeyPhrase, %keyPhrase%, 1
        FileReadLine, PrevOpenTarget, %keyPhrase%, 2
    }
    NewKeyPhrase = %PrevKeyPhrase%
    NewOpenTarget = %PrevOpenTarget%

    ; 사용자가 질의 문자열을 입력할 텍스트 박스를 추가합니다.
    Gui, 1:Add, Edit, vFilename W600, %NewKeyPhrase%

    ; ADD MY FAV TAGLINE
    Gui, 1:Add, Text, X625 Y10, 무엇을 찾고 계십니까, 여러분?

    ; 사용자에게 피드백을 제공하기 위해 상태 바를 추가합니다
    Gui, 1:Add, Text, vStatusBar X10 Y31 R1 W764

    ; 검색 결과를 보여줄 선택 리스트박스를 추가합니다
    Gui, 1:Add, ListBox, vOpenTarget gTargetSelection X10 Y53 R28 W764 HScroll Disabled, %List%

    ; 다음 버튼을 추가하지만, 지금은 불능으로 만들어 둡니다
    Gui, 1:Add, Button, gButtonOPEN vButtonOPEN Default X10 Y446 Disabled, Open
    Gui, 1:Add, Button, gButtonOPENDIR vButtonOPENDIR X59 Y446 Disabled, Open Directory
    Gui, 1:Add, Button, gButtonSCANSTARTMENU vButtonSCANSTARTMENU X340 Y446 Disabled, Scan Start-Menu

    ; 종료 버튼 추가
    Gui, 1:Add, Button, gButtonEXIT X743 Y446, Exit

    ; 질의 창을 팝업
    Gui, 1:Show, Center, %version%
}

; 마지막 디렉토리 목록을 다시 스캔
If 1 in -scan,-scex
    rescan = Y
; 디렉토리 캐쉬 파일이 이미 존재하는지 점검합니다. 없다면, 다시 스캔합니다.
Else IfNotExist, %dirListing%
    rescan = Y

If rescan = Y ; 다시 스캔합니다
{
    ; 사용자가 SCAN-AND-EXIT 옵션을 지정하지 않는 한, 상태를 보여줍니다.
    IfNotEqual 1, -scex
        GuiControl,, StatusBar, 디렉토리 목록 스캔 중...

    ; 시작 메뉴를 스캔해 디렉토리/프로그램 목록을 캐쉬 파일에 저장합니다
    Gosub ScanStartMenu

    ; 사용자가 SCAN-AND-EXIT 옵션을 지정했다면 종료합니다
    IfEqual 1, -scex, Goto, QuitNoSave
}

GuiControl,, StatusBar, 마지막 질의 결과를 열람 중...

; 마지막으로 사용된 키 문구에 대하여 부합하는 목록을 열람합니다
Gosub SilentFindMatches

; 상태 텍스트를 제거합니다
GuiControl,, StatusBar,

; 디렉토리 목록이 이제 적재되었습니다. 다른 버튼을 활성화합니다.
; 이 버튼들은 앞에서 불능화 시켜 두었습니다. 왜냐하면 이 스크립트에서
; 이 부분에 도착하기 전까지 작동하면 안되기 때문입니다.
GuiControl, 1:Enable, ButtonOPEN
GuiControl, 1:Enable, ButtonOPENDIR
GuiControl, 1:Enable, ButtonSCANSTARTMENU

; 점진 검색을 켭니다
SetTimer, tIncrementalSearch, 500

; 구이를 갱신합니다
Gosub EnterQuery

Return

;***********************************************************
;                                                          *
;                 END OF MAIN PROGRAM                      *
;                                                          *
;***********************************************************

;=== BEGIN ButtonSCANSTARTMENU EVENT =======================

ButtonSCANSTARTMENU:

Gui, 1:Submit, NoHide
GuiControl,, StatusBar, 디렉토리 목록 스캔 중...

; 스캔 중인 동안 리스트박스를 불능으로 만듭니다
GuiControl, 1:Disable, OpenTarget
GuiControl, 1:Disable, ButtonEXIT
GuiControl, 1:Disable, ButtonOPEN
GuiControl, 1:Disable, ButtonOPENDIR
GuiControl, 1:Disable, ButtonSCANSTARTMENU

; 스캔합니다
Gosub ScanStartMenu

; 사용자에게 스캔이 완료되었다고 알립니다
If Filename =
{
    ; 질의 문자열이 비어 있다면...
    GuiControl, 1:Enable, ButtonEXIT
    GuiControl, 1:Enable, ButtonOPEN
    GuiControl, 1:Enable, ButtonSCANSTARTMENU
    GuiControl,, StatusBar, Scan completed.
    Gosub EnterQuery
}
Else
{
    ; 질의 문자열이 존재하면...
    ; 새 목록을 검색 문자열에 대하여 여과합니다.
    NewKeyPhrase =
    Gosub FindMatches
}
Return

;... END ButtonSCANSTARTMENU EVENT .........................

;=== BEGIN ScanStartMenu SUBROUTINE ========================
; 시작 메뉴를 스캔하고 캐시 파일에
; 디렉토리/프로그램 목록을 저장합니다
ScanStartMenu:

; 열람할 디렉토리 경로를 정의합니다.
; 경로를 홑따옴표 또는 겹따옴표로 둘러싸면 안됩니다.
;
; 영어 버전의 창에 대하여
scanPath = %A_StartMenu%|%A_StartMenuCommon%

; 사용자가 정의한 추가 경로를 스캔 대상에 포함합니다
IfExist, %SeekMyDir%
{
    Loop, read, %SeekMyDir%
    {
        IfNotExist, %A_LoopReadLine%
            MsgBox, 8192, %version%, 맞춤 디렉토리 리스트를 처리중
            ...`n`n"%A_LoopReadLine%"는 존재하지 않으며
            스캔 대상에서 제외됩니다.`n업데이트 하십시오 [ %SeekMyDir% ].
        Else
            scanPath = %scanPath%|%A_LoopReadLine%
    }
}

; 새 버전을 만들기 전에 기존의 파일을 삭제합니다
FileDelete, %dirListing%

; 디렉토리 목록을 스캔합니다 (구분자 = |)
; 각 디렉토리마다 재귀해 들어가 그 내용을 열람합니다.
; 숨은 파일은 제외됩니다.
Loop, parse, scanPath, |
{
    Loop, %A_LoopField%\*, %ScanMode%, 1
    {
        FileGetAttrib, fileAttrib, %A_LoopFileFullPath%
        IfNotInString, fileAttrib, H ; 숨은 파일을 제외합니다
            FileAppend, %A_LoopFileFullPath%`n, %dirListing%
    }
}

Return

;... END ScanStartMenu SUBROUTINE ..........................

;=== BEGIN FindMatches SUBROUTINE ==========================
; 부합하는 모든 레코르를 검색해 리스트박스에 보여줍니다
FindMatches:

Gui, 1:Submit, NoHide
CurFilename = %Filename%
GuiControl,, StatusBar,

; 빈 질의 문자열인지 점검합니다
If CurFilename =
{
    MsgBox, 8192, %version%, 검색할 키 단어/문구를 입력하십시오.
    Goto EnterQuery
}

; tIncrementalSearch는 인터럽트된 상태입니다. 종료시켜 버립니다.
If NewKeyPhrase <> %CurFilename%
{
    ; 사용자에게 참고 기다리라고 알립니다
    GuiControl,, StatusBar, 찾는 중...
    ResumeFindMatches = TRUE
    Return
}

If List = |
{
    ; 부합하는 레코드가 하나도 발견되지 않았습니다
    ; 사용자에게 질의 문자열을 변경하고 다시 시도하도록 요구합니다.
    MsgBox, 8192, %version%, 질의 문자열 "%CurFilename%"는 부합하는 레코드가 없습니다. 다시 시도하십시오.
    GuiControl, 1:Disable, ButtonOPENDIR
    GuiControl, 1:Enable, ButtonSCANSTARTMENU
    Goto EnterQuery
}
Else
{
    ; 다른 레코드가 선택되어 있지 않으면 첫 번째 레코드를 선택합니다
    Gui, 1:Submit, NoHide
    GuiControl, 1:Enable, OpenTarget
    GuiControl, 1:Enable, ButtonOPEN
    GuiControl, 1:Enable, ButtonOPENDIR
    GuiControl, 1:Enable, ButtonSCANSTARTMENU
    GuiControl, Focus, OpenTarget
    If OpenTarget =
        GuiControl, 1:Choose, OpenTarget, |1
}

; REFRESH GUI
Gui, 1:Show, Center, %version%

Return

;... END FindMatches SUBROUTINE ............................

;=== BEGIN SilentFindMatches SUBROUTINE ====================

SilentFindMatches:

Gui, 1:Submit, NoHide
sfmFilename = %Filename%

; 사용자의 질의 문자열에 기반하여 부합하는 레코드를 여과합니다
List = |
If sfmFilename <>
{
    Loop, read, %dirListing%
    {
        Gui, 1:Submit, NoHide
        tFilename = %Filename%
        If sfmFilename <> %tFilename%
        {
            ; 사용자가 검색 문자열을 변경했습니다.
            ; 예전 문자열을 사용하여 검색을 계속할 이유가 없습니다. 그래서 종료합니다.
            Return
        }
        Else
        {
            ; APPEND MATCHING RECORDS INTO THE LIST
            SplitPath, A_LoopReadLine, name, dir, ext, name_no_ext, drive
            MatchFound = Y
            Loop, parse, sfmFilename, %A_Space%
            {
                IfNotInString, name, %A_LoopField%
                {
                    MatchFound = N
                    Break
                }
            }
            IfEqual, MatchFound, Y
            {
                ; 레코드를 리스트에 추가합니다
                List = %List%%A_LoopReadLine%|

                ; 다음이 마지막-실행 프로그램에 부합하면 미리 선택합니다
                If (A_LoopReadLine = PrevOpenTarget && sfmFilename = PrevKeyPhrase)
                    List = %List%|
            }
        }
    }
}

; 검색 결과로 리스트를 갱신합니다
GuiControl, 1:, OpenTarget, %List%

If List = |
{
    ; 부합하는 레코드를 발견하지 못햇습니다
    ; 리스트박스를 불능으로 만듭니다
    GuiControl, 1:Disable, OpenTarget
    GuiControl, 1:Disable, ButtonOPENDIR
}
Else
{
    ; 부합하는 레코드를 발견했습니다
    ; 리스트박스를 활성화 합니다
    GuiControl, 1:Enable, OpenTarget
    GuiControl, 1:Enable, ButtonOPENDIR
}

; 구이를 갱신합니다
Gui, 1:Show, Center, %version%

Return

;... END SilentFindMatches SUBROUTINE ......................

;=== BEGIN EnterQuery SUBROUTINE ===========================
; 구이를 갱신하고 사용자가 검색 문자열을 입력하도록 허용합니다
EnterQuery:
GuiControl, Focus, Filename
GuiControl, 1:Enable, ButtonOPEN
Gui, 1:Show, Center, %version%
Return
;... END EnterQuery SUBROUTINE .............................

;=== BEGIN TargetSelection EVENT ===========================

TargetSelection:
Gui, 1:Submit, NoHide

; 프로그램을 기동하기 위하여 더블 클릭을 탐지합니다
If A_GuiControlEvent = DoubleClick
{
    Gosub ButtonOPEN
}
Else
{
    ; 미래에 사용할 - 임시 구조물
    If A_GuiControlEvent = Normal
    {
        ; 지금 당장은 아무 것도 하지 않습니다
    }
}

Return

;... END TargetSelection EVENT .............................

;=== BEGIN ButtonOPEN EVENT ================================

; 사용자가 'OPEN' 버튼을 클릭하거나 <ENTER>를 눌렀습니다.
ButtonOPEN:
Gui, 1:Submit, NoHide

; 키보드 초점이 있는 곳을 알아냅니다. 초점이 텍스트 필드에
; 있다면, 질의 문자열을 실행해 부합하는 것을 찾습니다.
; 분명히 리스트 박스 안에 있을 것입니다.
GuiControlGet, focusControl, 1:Focus
If focusControl = Edit1
{
    GuiControl, Focus, OpenTarget
    GuiControl, 1:Disable, OpenTarget
    GuiControl, 1:Disable, ButtonOPENDIR
    GuiControl, 1:Disable, ButtonSCANSTARTMENU
    Goto FindMatches
}

; 리스트박스에 아무 레코드도 선택되어 있지 않습니다
If OpenTarget =
{
    MsgBox, 8192, %version%, 선택을 먼저 한 후에 <Enter>를 누르십시오.`n종료하려면 <Esc>를 누르십시오.
    Goto EnterQuery
}

; 선택된 레코드가 존재하지 않습니다 (파일이나 디렉토리를 발견하지 못함)
IfNotExist, %OpenTarget%
{
    MsgBox, 8192, %version%, %OpenTarget%이 존재하지 않습니다. 이것은 그 디렉토리 캐쉬가 유효기간이 지났다는 뜻입니다. 아래의 'Scan Start-Menu' 버튼을 클릭하면 이제 여러분의 최신 디렉토리 목록으로 디렉토리 캐쉬를 업데이트할 수 있습니다.
    Goto EnterQuery
}

; 선택된 레코드가 파일인지 아니면 디렉토리인지 점검합니다
FileGetAttrib, fileAttrib, %OpenTarget%
IfInString, fileAttrib, D ; IS DIRECTORY
{
    Gosub sOpenDir
}
Else If fileAttrib <> ; IS FILE
{
    Run, %OpenTarget%
}
Else
{
    MsgBox %OpenTarget%는 디렉토리도 아니고 파일도 아닙니다. 이런 일은 일어날 수 없습니다. 더 이상 검색을 진행하지 못합니다. 종료 중...
}

Goto Quit

;... END ButtonOPEN EVENT ..................................

;=== BEGIN ButtonOPENDIR EVENT =============================

; 사용자가 'OPEN DIRECTORY' 버튼을 클릭했습니다
ButtonOPENDIR:
Gui, 1:Submit, NoHide

; 사용자가 레코드를 이미 선택했는지 점검합니다
If OpenTarget =
{
    MsgBox, 8192, %version%, 먼저 선택하십시오.
    Goto EnterQuery
}

; 디렉토리를 열기 위해 서브루틴을 실행합니다
Gosub sOpenDir

Goto Quit

;... END ButtonOPENDIR EVENT ...............................

;=== BEGIN sOpenDir SUBROUTINE =============================

sOpenDir:

; 사용자가 디렉토리-레코드 대신에 파일-레코드를 선택했다면,
; 그 디렉토리 경로를 추출합니다. (필자는 FileGetAttrib 대신에
; DriveGet을 사용합니다. OpenTarget은 유효하지 않지만
; OpenTarget의 디렉토리 경로는 유요한 경우에 대처할 수 있기 때문입니다.
DriveGet, status, status, %OpenTarget%
If status <> Ready ; 디렉토리가 아님
{
    SplitPath, OpenTarget, name, dir, ext, name_no_ext, drive
    OpenTarget = %dir%
}

; 디렉토리가 존재하는지 점검합니다
IfNotExist, %OpenTarget%
{
    MsgBox, 8192, %version%, %OpenTarget%이 존재하지 않습니다. 이것은 디렉토리 캐쉬가 유효 기간이 지났다는 뜻입니다. 'Scan Start-Menu' 버튼을 아래에서 클릭하면 이제 최신 디렉토리 리스트로 디렉토리 캐쉬를 업데이트할 수 있습니다.
    Goto EnterQuery
}

; 디렉토리를 엽니다
IfExist, %dirExplorer%
{
    Run, "%dirExplorer%" "%OpenTarget%", , Max ; OPEN WITH CUSTOMISED FILE EXPLORER
}
Else
{
    Run, %OpenTarget%, , Max ; 기본 창 파일 탐색기를 엽니다
}
Return

;... END sOpenDir SUBROUTINE ...............................

;=== BEGIN tIncrementalSearch EVENT ========================
; 자동으로 실시간 점진 검색을 수행하여
; 부합하는 레코드를 찾습니다.
; 사용자가 <ENTER>를 누르기를 기다리지 않습니다.
tIncrementalSearch:

Loop
; 사용자가 질의 문자열 바꾸기를 멈출 때까지 검색을 반복합니다.
{
    Gui, 1:Submit, NoHide
    CurFilename = %Filename%
    If NewKeyPhrase <> %CurFilename%
    {
        OpenTarget =
        Gosub SilentFindMatches
        NewKeyPhrase = %CurFilename%
        Sleep, 100 ; CPU 독점 금지!
    }
    Else
    {
        ; 질의 문자열이 더 이상 변하지 않습니다
        Break
    }
}

; 사용자가 <ENTER>를 눌러서 부합하는 레코드를 찾습니다.
; RUN FindMatches NOW.
If ResumeFindMatches = TRUE
{
    ResumeFindMatches = FALSE
    Gosub FindMatches
}

; 계속 변화를 관제합니다
SetTimer, tIncrementalSearch, 500

Return

;... END tIncrementalSearch EVENT ..........................

;=== BEGIN Quit SUBROUTINE =================================

Quit:
ButtonEXIT:
GuiClose:
GuiEscape:

Gui, 1:Submit, NoHide

; 만약 변경되었다면 그 키 단어/문구를 다음 실행을 대비해 저장합니다.
If TrackKeyPhrase = ON
{
    If (PrevKeyPhrase <> Filename || PrevOpenTarget <> OpenTarget)
    {
        FileDelete, %keyPhrase%
        FileAppend, %Filename%`n, %keyPhrase%
        FileAppend, %OpenTarget%`n, %keyPhrase%
    }
}

QuitNoSave:
ExitApp ; 이상 끝. 즐거운 하루 되시기를!

;... END Quit SUBROUTINE ...................................

;************************
;<--- END OF PROGRAM --->
;************************

; /* vim: set noexpandtab shiftwidth=4: */


ToolTip Mouse Menu (requires XP/2k/NT) -- by Rajat

툴팁 마우스 메뉴 (XP/2k/NT 요구) -- by Rajat

이 스크립트는 가운데 버튼을 잠깐 누르는데 응답하여 팝업 메뉴를 보여줍니다. 왼클릭하여 메뉴 항목을 선택합니다. 바깥에서 좌클릭하면 메뉴를 취소합니다. 최근에 어느 유형의 창이 활성화되어 있는가에 따라 메뉴의 내용이 변하도록 개선되었습니다. (여기에서는 Notepad와 Word를 예제로 사용합니다).

이 스크립트 내려 받기 | 다른 샘플 스크립트 | 홈으로

; 메뉴에 대하여 여기에서 제목을 설정할 수 있습니다:
MenuTitle = -=-=-=-=-=-=-=-

; 다음은 얼마나 오래 버튼을 눌러야 메뉴를 보여줄지 결정합니다:
UMDelay = 20

SetFormat, float, 0.0
SetBatchLines, 10ms
SetTitleMatchMode, 2
#SingleInstance

;___________________________________________
;_____메뉴 정의______________________

; 여기에서 메뉴 항목을 만들고 수정합니다.
; keys/values/section 이름에 스페이스를 사용하면 안 됩니다.

; 순서는 신경쓰지 않아도 됩니다. 메뉴는 정렬됩니다.

MenuItems = Notepad/Calculator/Section 3/Section 4/Section 5

;___________________________________________
;______동적인 메뉴 항목 정의_______________

; 구문:
;     Dyn# = 메뉴 항목|창 제목

Dyn1 = MS Word|- Microsoft Word
Dyn2 = Notepad II|- Notepad

;___________________________________________

Exit

;___________________________________________
;_____메뉴 섹션_________________________

; 여기에 메뉴 섹션을 생성하고 편집합니다.

Notepad:
Run, Notepad.exe
Return

Calculator:
Run, Calc
Return

Section3:
MsgBox, You selected 3
Return

Section4:
MsgBox, You selected 4
Return

Section5:
MsgBox, You selected 5
Return

MSWord:
msgbox, this is a dynamic entry (word)
Return

NotepadII:
msgbox, this is a dynamic entry (notepad)
Return

;___________________________________________
;_____핫키 섹션________________________

~MButton::
HowLong = 0
Loop
{
    HowLong ++
    Sleep, 10
    GetKeyState, MButton, MButton, P
    IfEqual, MButton, U, Break
}
IfLess, HowLong, %UMDelay%, Return

; 동적 메뉴를 준비합니다
DynMenu =
Loop
{
    IfEqual, Dyn%a_index%,, Break

    StringGetPos, ppos, dyn%a_index%, |
    StringLeft, item, dyn%a_index%, %ppos%
    ppos += 2
    StringMid, win, dyn%a_index%, %ppos%, 1000

    IfWinActive, %win%,
        DynMenu = %DynMenu%/%item%
}

; 정렬된 메인 메뉴와 동적 메뉴를 결합합니다
Sort, MenuItems, D/
TempMenu = %MenuItems%%DynMenu%

; 이전 엔트리들을 지웁니다
Loop
{
    IfEqual, MenuItem%a_index%,, Break
    MenuItem%a_index% =
}

; 새 엔트리들을 생성합니다
Loop, Parse, TempMenu, /
{
    MenuItem%a_index% = %a_loopfield%
}

; 메뉴를 생성합니다
Menu = %MenuTitle%
Loop
{
    IfEqual, MenuItem%a_index%,, Break
    numItems ++
    StringTrimLeft, MenuText, MenuItem%a_index%, 0
    Menu = %Menu%`n%MenuText%
}

MouseGetPos, mX, mY
HotKey, ~LButton, MenuClick
HotKey, ~LButton, On
ToolTip, %Menu%, %mX%, %mY%
WinActivate, %MenuTitle%
Return

MenuClick:
HotKey, ~LButton, Off
IfWinNotActive, %MenuTitle%
{
    ToolTip
    Return
}

MouseGetPos, mX, mY
ToolTip
mY -= 3        ; 첫 줄이 시작하면 뒤에 스페이스
mY /= 13    ; 각 줄마다 스페이스
IfLess, mY, 1, Return
IfGreater, mY, %numItems%, Return
StringTrimLeft, TargetSection, MenuItem%mY%, 0
StringReplace, TargetSection, TargetSection, %a_space%,, A
Gosub, %TargetSection%
Return


Volume On-Screen-Display (OSD) -- by Rajat

화면 위 디스플레이에서 볼륨 조절하는 법 (OSD) -- by Rajat

이 스크립트는 여러분이 선택한 핫키를 마스터 또는 웨이브 볼륨을 높이거나 내리는 데 할당합니다. 두 볼륨 모두 다른 색의 바 그래프로 보여줍니다.

이 스크립트 내려 받기 | 다른 샘플 스크립트 | 홈으로

;_________________________________________________
;_______사용자 설정_____________________________

; 재단은 이 구역과 핫키 구역에서만 허용합니다!!

; 매번 볼륨을 올리거나 내릴 백분률:
vol_Step = 4

; 얼마나 오래 볼륨 레벨 바 그래프를 보여줄 것인가:
vol_DisplayTime = 2000

; 마스터 볼륨 바 컬러
; (더 정밀한 쉐이드를 사용하려면 도움말 참조):
vol_CBM = Red

; 웨이브 볼륨 바 컬러
vol_CBW = Blue

; 배경 색
vol_CW = Silver

; 바의 화면 좌표.  -1을 사용하면 해당 차원의 가운데에 정렬:
vol_PosX = -1
vol_PosY = -1
vol_Width = 150  ; 바의 너비
vol_Thick = 12   ; 바의 두께

; 키보드에 볼륨에 대한 멀티미디어 버튼이 있다면
; 아래의 핫키에 그 버튼들을 사용하도록 바꿀 수 있습니다. 아래와 같이 지정하십시오.
; Volume_Up, ^Volume_Up, Volume_Down, 그리고 ^Volume_Down:
HotKey, #Up, vol_MasterUp      ; Win+UpArrow
HotKey, #Down, vol_MasterDown
HotKey, +#Up, vol_WaveUp       ; Shift+Win+UpArrow
HotKey, +#Down, vol_WaveDown

;___________________________________________
;_____자동 실행 섹션__________________

; 여기는 아무 것도 바꾸지 마십시오 (단, 무엇을 하고 있는지 잘 아는 경우는 예외입니다).

vol_BarOptionsMaster = 1:B ZH%vol_Thick% ZX0 ZY0 W%vol_Width% CB%vol_CBM% CW%vol_CW%
vol_BarOptionsWave   = 2:B ZH%vol_Thick% ZX0 ZY0 W%vol_Width% CB%vol_CBW% CW%vol_CW%

; X 위치가 지정되어 있다면, 그것을 옵셥에 추가합니다.
; 그렇지 않으면, 생략해 바를 수평으로 가운데에 배치할 수 있습니다:
if vol_PosX >= 0
{
    vol_BarOptionsMaster = %vol_BarOptionsMaster% X%vol_PosX%
    vol_BarOptionsWave   = %vol_BarOptionsWave% X%vol_PosX%
}

; Y 위치가 지정되어 있다면, 그것을 옵션에 추가합니다.
; 그렇지 않으면, 생략해 나중에 계산할 수 있습니다:
if vol_PosY >= 0
{
    vol_BarOptionsMaster = %vol_BarOptionsMaster% Y%vol_PosY%
    vol_PosY_wave = %vol_PosY%
    vol_PosY_wave += %vol_Thick%
    vol_BarOptionsWave = %vol_BarOptionsWave% Y%vol_PosY_wave%
}

#SingleInstance
SetBatchLines, 10ms
Return

;___________________________________________

vol_WaveUp:
SoundSet, +%vol_Step%, Wave
Gosub, vol_ShowBars
return

vol_WaveDown:
SoundSet, -%vol_Step%, Wave
Gosub, vol_ShowBars
return

vol_MasterUp:
SoundSet, +%vol_Step%
Gosub, vol_ShowBars
return

vol_MasterDown:
SoundSet, -%vol_Step%
Gosub, vol_ShowBars
return

vol_ShowBars:
; "번쩍임" 효과를 방지하려면, 아직 존재하지 않은 경우,
; 바 창만 생성하십시오:
IfWinNotExist, vol_Wave
    Progress, %vol_BarOptionsWave%, , , vol_Wave
IfWinNotExist, vol_Master
{
    ; 스크립트가 실행 중인 동안에 화면 해상도가 바뀌는 경우,
    ; 여기에서 위치를 계산합니다:
    if vol_PosY < 0
    {
        ; 웨이브 바를 마스터 바 바로 위에 생성합니다:
        WinGetPos, , vol_Wave_Posy, , , vol_Wave
        vol_Wave_Posy -= %vol_Thick%
        Progress, %vol_BarOptionsMaster% Y%vol_Wave_Posy%, , , vol_Master
    }
    else
        Progress, %vol_BarOptionsMaster%, , , vol_Master
}
; 사용자 또는 외부 프로그램이 볼륨을 바꾸었을 경우, 볼륨을 둘 다 얻습니다:
SoundGet, vol_Master, Master
SoundGet, vol_Wave, Wave
Progress, 1:%vol_Master%
Progress, 2:%vol_Wave%
SetTimer, vol_BarOff, %vol_DisplayTime%
return

vol_BarOff:
SetTimer, vol_BarOff, off
Progress, 1:Off
Progress, 2:Off
return


Window Shading (roll up a window to its title bar) -- by Rajat

Window Shading (창을 제목 바까지 말아 올리기) -- by Rajat

이 스크립트는 창을 제목 바까지 말아 올리고 핫키를 누르면 다시 원래 크기로 돌아옵니다. 창의 개수에 상관없이 이런 식으로 줄일 수 있습니다 (스크립트가 각각 기억합니다). 스크립트가 어떤 이유로 종료하면 "말려 올라간" 모든 창이 자동으로 원래 높이로 복구됩니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

; 말린 창의 높이를 여기에서 설정합니다.
; 아마도 이 숫자가 얼마나 낮은가에 상관 없이 운영체제는
; 제목바가 숨는 것을 허용하지 않을 것입니다:
ws_MinHeight = 25

; 이 줄은 어떤 이유로 스크립트가 종료하면
; 말려 올라간 창을 복구합니다:
OnExit, ExitSub
return  ; 자동 실행 섹션의 끝

#z::  ; 이 줄을 바꿔 다른 핫키를 골라도 됩니다.
; 이 시점 이후로, 어떤 변경도 허용하지 않습니다
; 단, 스크립트의 기본 기능을 변경하고 싶은 경우는 예외입니다.
; 다음 줄을 주석 해제하면 이 서브루틴을 핫키가 아니라
; 맞춤 메뉴 항목으로 변환할 수 있습니다.
; 지연 시간 덕분에 메뉴 때문에 꺼졌던
; 활성 창은 다시 켜집니다:
;Sleep, 200
WinGet, ws_ID, ID, A
Loop, Parse, ws_IDList, |
{
    IfEqual, A_LoopField, %ws_ID%
    {
        ; 부합이 발견되었으므로, 이 창은 복구됩니다 (다시 펴짐):
        StringTrimRight, ws_Height, ws_Window%ws_ID%, 0
        WinMove, ahk_id %ws_ID%,,,,, %ws_Height%
        StringReplace, ws_IDList, ws_IDList, |%ws_ID%
        return
    }
}
WinGetPos,,,, ws_Height, A
ws_Window%ws_ID% = %ws_Height%
WinMove, ahk_id %ws_ID%,,,,, %ws_MinHeight%
ws_IDList = %ws_IDList%|%ws_ID%
return

ExitSub:
Loop, Parse, ws_IDList, |
{
    if A_LoopField =  ; 리스트의 첫 필드는 보통 비어 있습니다.
        continue      ; 그래서 건너 뜁니다.
    StringTrimRight, ws_Height, ws_Window%A_LoopField%, 0
    WinMove, ahk_id %A_LoopField%,,,,, %ws_Height%
}
ExitApp  ; OnExit 서브루틴에 대하여 반드시 이렇게 해야만 스크립트를 실제로 종료할 수 있습니다.


WinLIRC Client

WinLIRC 클라이언트

이 스크립트는 리모트 콘트롤에 버튼을 누를 때마다 WinLIRC 로부터 고지를 받습니다. Winamp, Windows Media Player, 등등을 자동화 하는 데 사용할 수 있습니다. 쉽게 환경을 구성할 수 있습니다. 예를 들어 WinLIRC가 리모트 콘트롤에서 이름이 "VolUp"인 버튼을 인지하면, 이름이 VolUp인 라벨을 생성하고 그 아래에 명령어 SoundSet +5를 사용하여 사운드카드의 볼륨을 5%만큼 높입니다.

이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로

; 다음은 이 스크립트를 사용하는 방법입니다:
; 1) 리모트 콘트롤과 버튼을 인식하도록 WinLIRC를 구성합니다.
;    WinLIRC는 다음에 있습니다: http://winlirc.sourceforge.net
; 2) 아래의 CONFIG 섹션에서 WinLIRC 경로, 주소, 그리고 포트 번호를 편집합니다.
; 3) 이 스크립트를 기동시킵니다. 필요하면 WinLIRC 서버가 자동으로 기동됩니다.
; 4) 리모트 콘트롤에서 버튼을 눌러 봅니다. 버튼을 누를 때마다
;    작은 창이 나타나 그 버튼의 이름을 보여줍니다.
; 5) 버튼을 구성해 Winamp, Media Player, 등등과 같은 창에
;     키눌림과 마우스 클릭을 전송합니다. 아래 예제를 참조하십시오.

; 이 스크립트는 AutoHotkey 1.0.38.04 이상을 요구합니다.
; 변경 이력
; March 2, 2007:
; - ReceiveData()에 "Critical"를 통하여 신뢰성 개선.
; October 5, 2005:
; - 시스템이 셧다운/로그오프할 때 Winsock 경고 대화상자 "10054"가 나타나는 것을 제거.
; - 반복 속도를 감소시키기 위해 옵션 "DelayBetweenButtonRepeats"를 추가.

; -------------------------------------------------------------
; CONFIGURATION SECTION: 여기에 원하는 대로 설정합니다.
; -------------------------------------------------------------
; 어떤 리모콘은 버튼을 누르고 있는 동안 신호를 빠르게 반복해 보냅니다.
; 이 때문에 리모트 콘트롤이 오직 하나의 신호만 전송하도록 만들기가 어렵습니다
; 다음 설정은  지정된 시간이 경과할 때까지 반복된 신호를 무시함으로써
; 이 문제를 해결합니다. 200이면 보통 좋은 설정입니다.
; 0으로 설정하면 이 특징을 불능으로 만듭니다.
DelayBetweenButtonRepeats = 200

; 경로를 WinLIRC에 지정합니다. 예를 들어 C:\WinLIRC\winlirc.exe
WinLIRC_Path = %A_ProgramFiles%\WinLIRC\winlirc.exe

; WinLIRC의 주소와 포트를 지정합니다. 보통 127.0.0.1 (localhost)과 8765입니다.
WinLIRC_Address = 127.0.0.1
WinLIRC_Port = 8765

; 다음 두 줄은 변경하지 마십시오. 건너뛰고 아래에서 계속하십시오.
Gosub WinLIRC_Init
return

; --------------------------------------------
; ASSIGN ACTIONS TO THE BUTTONS ON YOUR REMOTE
; --------------------------------------------
; 아래에서 리모트 콘트롤 버튼을 구성하십시오. 버튼에 WinLIRC의 이름을 사용합니다.
; 이름은 WinLIRC 환경구성 파일(.cf)에서 보실 수 있습니다.
;  -- 아니면 리모트 콘트롤에 버튼을 마우것나 누르면
; 스크립트가 작은 창에 그 버튼의 이름을 잠시 보여줍니다.
;
; 아래는 몇 가지 예제입니다.
;  자유롭게 여러분의 기호에 맞게 개조하거나 지원도 됩니다.

VolUp:
SoundSet +5  ; 마스터 볼륨을 5%만큼 늘립니다. Vista에서는 이 줄을 다음으로 교체하십시오: Send {Volume_Up}
return

VolDown:
SoundSet -5  ; 마스터 볼륨을 5%만큼 줄입니다. Vista에서는 이 줄을 다음으로 교체하십시오: Send {Volume_Down}
return

ChUp:
WinGetClass, ActiveClass, A
if ActiveClass in Winamp v1.x,Winamp PE  ; Winamp가 활성화 되어 있습니다.
    Send {right}  ; 오른쪽-화살표 키눌림을 전송합니다.
else  ; 다른 유형의 창이 활성화 되어 있습니다.
    Send {WheelUp}  ; 마우스 휠을 한 눈금 위로 돌립니다.
return

ChDown:
WinGetClass, ActiveClass, A
if ActiveClass in Winamp v1.x,Winamp PE  ; Winamp가 활성화 되어 있습니다.
    Send {left}  ; 왼쪽-화살표 키눌림을 전송합니다.
else  ; 다른 유형의 창이 활성화 되어 있습니다.
    Send {WheelDown}  ; 마우스 휠을 한 눈금 아래로 돌립니다.
return

Menu:
IfWinExist, Untitled - Notepad
{
    WinActivate
}
else
{
    Run, Notepad
    WinWait, Untitled - Notepad
    WinActivate
}
Send Here are some keystrokes sent to Notepad.{Enter}
return

; 위의 예제에서 어떻게 일반적인 과업을 달성하는지 감을 잡을 수 있습니다.
; 오토핫키의 기본 지식을 습득하려면 빨지 시작하기 자습서를 찾아 보시기 바랍니다:
; http://www.autohotkey.com/docs/Tutorial.htm

; ----------------------------
; END OF CONFIGURATION SECTION
; ----------------------------
; 이 시점 이후로 변경하지 마십시오.
; 단, 스크립트의 핵심 기능을 바꾸고 싶다면 예외입니다.

WinLIRC_Init:
OnExit, ExitSub  ; 접속 청소 목적을 위해.

; 아직 실행되지 않았다면 WinLIRC를 기동합니다:
Process, Exist, winlirc.exe
if not ErrorLevel  ; WinLIRC에 대한 PID가 발견되지 않았습니다.
{
    IfNotExist, %WinLIRC_Path%
    {
        MsgBox 파일 "%WinLIRC_Path%"가 존재하지 않습니다. 이 스크립트를 편집해 그 위치를 지정하십시오.
        ExitApp
    }
    Run %WinLIRC_Path%
    Sleep 200  ; WinLIRC에 초기화 할 시간을 줍니다 (아마도 거의 필요하지 않을 겁니다. 신경쓰지 마십시오).
}

; WinLIRC에 접속합니다 (또는 그를 대신하면 어떤 종류의 서버이든 접속합니다):
socket := ConnectToAddress(WinLIRC_Address, WinLIRC_Port)
if socket = -1  ; 접속 실패 (이미 이유는 보여주었습니다).
    ExitApp

; 이 스크립트의 메인 창을 찾습니다:
Process, Exist  ; 이렇게 하면 ErrorLevel에 이 스크립트의 PID가 설정됩니다 (이런식으로 하면 컴파일된 스크립트를 지원할 수 있습니다).
DetectHiddenWindows On
ScriptMainWindowId := WinExist("ahk_class AutoHotkey ahk_pid " . ErrorLevel)
DetectHiddenWindows Off

; OS가 스크립트에게 들어오는 데이터가 수신되기를 기다리고 있다고 고지할 때,
; 다음은 그 데이터를 읽기 위하여 함수를 기동시킵니다:
NotificationMsg = 0x5555  ; 임의의 메시지 번호, 그러나 0x1000 보다는 커야 합니다.
OnMessage(NotificationMsg, "ReceiveData")

; 접속을 설정해 이 스크립트에게 새로 데이터가 도착할 때마다 메시지를 통하여 고지합니다.
; 이렇게 하면 접속을 폴할 필요가 없으므로, 자원 낭비가 감소합니다.
FD_READ = 1     ; 데이터를 읽을 수 있을 때 수신됩니다.
FD_CLOSE = 32   ; 접속이 닫힐 때 수신됩니다.
if DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket, "UInt", ScriptMainWindowId, "UInt", NotificationMsg, "Int", FD_READ|FD_CLOSE)
{
    MsgBox % "WSAAsyncSelect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError")
    ExitApp
}
return

ConnectToAddress(IPAddress, Port)
; 대부분의 유형의 TCP 서버에 접속할 수 있습니다. WinLIRC 만으로 제한되지 않습니다.
; 실패하면 -1 (INVALID_SOCKET)을 돌려주고 성공하면 소켓 ID를 돌려줍니다.
{
    VarSetCapacity(wsaData, 400)
    result := DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData) ; Winsock 2.0 (0x0002)을 요구합니다
    ; WSAStartup()이 이스크립트가 첫 번째로 호출한 Winsock 함수일 가능성이 높으므로,
    ; ErrorLevel을 점검해 OS에 Winsock 2.0이 있는지 알아 봅니다:
    if ErrorLevel
    {
        MsgBox WSAStartup() could not be called due to error %ErrorLevel%. Winsock 2.0 or higher is required.
        return -1
    }
    if result  ; 0이 아니라면, 실패했다는 뜻입니다 (대부분의 Winsock 함수는 성공하면 0을 돌려줍니다).
    {
        MsgBox % "WSAStartup() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError")
        return -1
    }

    AF_INET = 2
    SOCK_STREAM = 1
    IPPROTO_TCP = 6
    socket := DllCall("Ws2_32\socket", "Int", AF_INET, "Int", SOCK_STREAM, "Int", IPPROTO_TCP)
    if socket = -1
    {
        MsgBox % "socket() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError")
        return -1
    }

    ; 접속을 준비합니다:
    SizeOfSocketAddress = 16
    VarSetCapacity(SocketAddress, SizeOfSocketAddress)
    InsertInteger(2, SocketAddress, 0, AF_INET)   ; sin_family
    InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2)   ; sin_port
    InsertInteger(DllCall("Ws2_32\inet_addr", "AStr", IPAddress), SocketAddress, 4, 4)   ; sin_addr.s_addr

    ; 접속을 시도합니다:
    if DllCall("Ws2_32\connect", "UInt", socket, "UInt", &SocketAddress, "Int", SizeOfSocketAddress)
    {
        MsgBox % "connect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") . ". Is WinLIRC running?"
        return -1
    }
    return socket  ; -1 말고 유효한 소켓 ID를 돌려주어 성공을 알립니다.
}

ReceiveData(wParam, lParam)
; OnMessage()를 수단으로, 이 함수는 새 데이터가 접속에 도착할 때마다
; 자동으로 호출되도록 설정되어 있습니다. 데이터를 WinLIRC로부터 읽어서
; 그 내용에 따라 적절하게 조치를 취합니다.
{
    Critical  ; 이미 쓰레드가 실행되어 있기 때문에 또다른 같은 메시지가 폐기되지 않도록 막습니다.
    socket := wParam
    ReceivedDataSize = 4096  ; 이전 데이터를 처리하는데 지연 시간이 있어서 많은 데이터가 버퍼에 찰 경우를 대비해 크게 잡습니다.

    VarSetCapacity(ReceivedData, ReceivedDataSize, 0)  ; recv()에 사용하기 위해 0을 마지막 매개변수에 지정해 문자열을 종료합니다.
    ReceivedDataLength := DllCall("Ws2_32\recv", "UInt", socket, "Str", ReceivedData, "Int", ReceivedDataSize, "Int", 0)
    if ReceivedDataLength = 0  ; 접속이 우아하게 닫혔습니다. 아마도 WinLIRC를 끝냈기 때문일 것입니다.
        ExitApp  ; OnExit 루틴이 우리를 대신하여 WSACleanup()을 호출해 줍니다.
    if ReceivedDataLength = -1
    {
        WinsockError := DllCall("Ws2_32\WSAGetLastError")
        if WinsockError = 10035  ; WSAEWOULDBLOCK, "더 이상 읽을 데이터가 없다"는 뜻입니다.
            return 1
        if WinsockError <> 10054 ; WSAECONNRESET, WinLIRC가 시스템 셧다운/로그오프를 통하여 닫힐 때 일어납니다.
            ; 예측 하지 못한 에러이므로 보고합니다.  또 무한 회돌이를 피하기 위해 종료합니다.
            MsgBox % "recv() indicated Winsock error " . WinsockError
        ExitApp  ; OnExit 루틴이 우리를 대신에 WSACleanup()를 호출합니다.
    }
    ; 그렇지 않으면, 수신된 데이터를 처리합니다. 테스트에 의하면 한 번에 한 줄 이상을 얻을 수 있습니다
    ; (명시적으로-전송된 IR 신호에 대해서도 마찬가지입니다), 다음 메쏘드가 적절하게 처리합니다.
    ; WinLIRC로부터 얻은 데이터는 다음 예제와 비슷합니다 (자세한 것은 WinLIRC 문서를 참조하십시오):
    ; 0000000000eab154 00 NameOfButton NameOfRemote
    Loop, parse, ReceivedData, `n, `r
    {
        if A_LoopField in ,BEGIN,SIGHUP,END  ; 빈 줄과 WinLIRC의 시작 메시지를 무시합니다.
            continue
        ButtonName =  ; 아래에서 3 개 보다 적게 필드가 발견될 경우를 대비해 비워서 초기화합니다.
        Loop, parse, A_LoopField, %A_Space%  ; 버튼 이름을 추출합니다. 세 번째 필드입니다.
            if A_Index = 3
                ButtonName := A_LoopField
        global DelayBetweenButtonRepeats  ; 전역 변수를 선언해 이 함수에 적용합니다.
        static PrevButtonName, PrevButtonTime, RepeatCount  ; 이 변수들은 호출 사이에 값을 기억합니다.
        if (ButtonName != PrevButtonName || A_TickCount - PrevButtonTime > DelayBetweenButtonRepeats)
        {
            if IsLabel(ButtonName)  ; 이 버튼에 연관된 서브루틴이 있습니다.
                Gosub %ButtonName%  ; 그 서브루틴을 기동시킵니다.
            else ; 연관된 서브루틴이 없으므로, 간략하게 어느 버튼이 눌렸는지 보여줍니다.
            {
                if (ButtonName == PrevButtonName)
                    RepeatCount += 1
                else
                    RepeatCount = 1
                SplashTextOn, 150, 20, Button from WinLIRC, %ButtonName% (%RepeatCount%)
                SetTimer, SplashOff, 3000  ; 이렇게 하면 창이 보이는 동안에 더 많은 신호를 처리할 수 있습니다.
            }
            PrevButtonName := ButtonName
            PrevButtonTime := A_TickCount
        }
    }
    return 1  ; 프로그램에게 더 이상 이 메시지를 처리할 필요가 없다고 알립니다.
}

SplashOff:
SplashTextOff
SetTimer, SplashOff, Off
return

InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
; 호출자는 pDest의 가용 능력이 충분한지 확인해야 합니다. 기존의 내용을 pDest에 보존하기 위해,
; pOffset에서 시작해서 오직 pSize 개수의 바이트만 변경됩니다.
{
    Loop %pSize%  ; 각 바이트를 구조체 안으로 날 이진 데이터로 복사합니다.
        DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
}

ExitSub:  ; 이 서브루틴은 스크립트가 어떤 이유로 종료될 때 자동으로 호출됩니다.
; MSDN에 의하면: "WSACleanup이 호출될 때 열린 소켓은 모두 리셋되고
; 마치 closesocket 이 호출될 것처럼 자동으로 할당이 해제됩니다."
DllCall("Ws2_32\WSACleanup")
ExitApp