AutoHotKey(오토핫키) 설명서 RegisterCallback()
RegisterCallback()
DllCall()그리고 호출한 함수등에서 스크립트내의 함수를 호출하기 위한 래퍼 함수를 생성해, 주소를 돌려준다
RegisterCallback("FunctionName" [, Options = "", ParamCount = FormalCount, EventInfo = Address])
Parameters
인수명 | 설명 |
---|---|
FunctionName |
스크립트내의 함수명을 문자열치로서 지정한다. |
Options |
이하의 옵션을 반각 스페이스 단락으로 지정한다.
|
ParamCount |
함수가 받는 인수의 수를 지정한다. 생략시는,FunctionName의 함수에 정의되고 있는 필수의 인수와 같은 수가 된다. FunctionName(으)로 지정되어 있는 인수의 수보다 많거나, 필수의 인수의 수보다 적거나 해서는 안 된다. |
EventInfo |
작성된 콜백 함수로부터 스크립트의 함수가 불릴 때A_EventInfo변수에 격납되는 값을 지정한다. 생략시는, 콜백 함수의 주소가 된다. A_EventInfo변수는,Options에Fast하지만 지정되어 있어도, 기존 스렛드의 변수를 덧쓰기하지 않는다. |
돌아가 값
성공했을 경우, 작성한 함수의 주소를 돌려준다.
FunctionName그리고 지정한 함수가 존재하지 않거나, 인수의 수나 형식에 문제가 있었을 경우 등은, 하늘의 문자열이 돌려주어진다.
Remarks
콜백 함수는,DllCall()그리고 호출하는 함수의 인수에 함수의 주소를 건네주지 않으면 안 되는 경우 등에 사용한다.
DLL의 함수로부터 콜백 함수가 불려 가면,FunctionName그리고 지정한 함수가AutoHotkey에 의해서 실행된다.
FunctionName그리고 지정하는 함수에는, 최대31개까지의 인수를 정의할 수 있다.
생략 가능 인수를 사용하면,ParamCount(이)가 다른 콜백 함수로부터 같은 함수를 호출할 수 있도록(듯이) 할 수 있다.
ByRef인수는 사용할 수 없다.
인수는, 어떠한 형태여도,4아르바이트 부호 없음 정수(0~4294967295)에 변환된다.
본래의 형태가 부호 정수인 경우는, 「(param>0x7FFFFFFF)?-(~param+1):param」(와)과 같은 식에서 복원할 수 있다.
본래의 형태가 문자열치인 경우는, 아래와 같은 코드로 내용을 꺼낼 수 있다.
VarSetCapacity(MyString, DllCall("lstrlen", UInt, MyParameter)) DllCall("lstrcpy", Str, MyString, UInt, MyParameter)
FunctionName그리고 지정한 함수는,return그리고-2147483648~4294967295의 정수를 돌려줄 수 있다.
부의 값은,4아르바이트 부호 없음 정수로서 다루어져 그 이외는4아르바이트 부호 없음 정수로서 다루어진다.
유효한 수치를 돌려주지 않았던 경우, 콜백 함수의 반치는0(이)가 된다.
함수의 최초로Critical커멘드를 실행하는 것으로, 함수 실행중에 다른 스렛드가 끼어드는 것을 억제할 수 있다
콜백 함수를 하나 생성할 때 마다,32아르바이트 정도의 메모리를 소비한다.
불특정 다수의 콜백 함수를 생성하는 경우는, 불필요하게 된 시점에서 「DllCall("GlobalFree", UInt, MyCallBackFunc)」(와)과 같이 해 해방하는 것.
Related
DllCall(), OnMessage(), OnExit, OnClipboardChange, Sort's callback, Critical, Post/SendMessage, Functions Threads
; Example: The following is a working script that displays a summary of all top-level windows. ; For performance and memory conservation, call RegisterCallback() only once for a given callback: if not EnumAddress ; Fast-mode is okay because it will be called only from this thread: EnumAddress := RegisterCallback("EnumWindowsProc", "Fast") DetectHiddenWindows On ; Due to fast-mode, this setting will go into effect for the callback too. ; Pass control to EnumWindows(), which calls the callback repeatedly: DllCall("EnumWindows", UInt, EnumAddress, UInt, 0) MsgBox %Output% ; Display the information accumulated by the callback. 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 ; Tell EnumWindows() to continue until all windows have been enumerated. }
; Example: The following is a working script that demonstrates how to subclass a GUI window by ; redirecting its WindowProc to a new WindowProc in the script. In this case, the background ; color of a text control is changed to a custom color. TextBackgroundColor := 0xFFBBBB ; A custom color in BGR format. TextBackgroundBrush := DllCall("CreateSolidBrush", UInt, TextBackgroundColor) Gui, Add, Text, HwndMyTextHwnd, Here is some text that is given`na custom background color. Gui +LastFound GuiHwnd := WinExist() WindowProcNew := RegisterCallback("WindowProc", "" ; "" to avoid fast-mode for subclassing. , 4, MyTextHwnd) ; Must specify exact ParamCount when EventInfo parameter is present. WindowProcOld := DllCall("SetWindowLong", UInt, GuiHwnd, Int, -4 ; -4 is GWL_WNDPROC , Int, WindowProcNew, UInt) ; Return value must be set to UInt 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", UInt, wParam, UInt, TextBackgroundColor) return TextBackgroundBrush ; Return the HBRUSH to notify the OS that we altered the HDC. } ; Otherwise (since above didn't return), pass all unhandled events to the original WindowProc. return DllCall("CallWindowProcA", UInt, WindowProcOld, UInt, hwnd, UInt, uMsg, UInt, wParam, UInt, lParam) } GuiClose: ExitApp
'AutoHotKey > Commands' 카테고리의 다른 글
AutoHotKey(오토핫키) 설명서 RegWrite (0) | 2014.08.14 |
---|---|
AutoHotKey(오토핫키) 설명서 RegRead (0) | 2014.08.14 |
AutoHotKey(오토핫키) 설명서 RegExReplace() (0) | 2014.08.14 |
AutoHotKey(오토핫키) 설명서 RegExMatch() (0) | 2014.08.14 |
AutoHotKey(오토핫키) 설명서 RegDelete (0) | 2014.08.14 |