관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

RegisterCallback() DllCall()그리고 호출한 함수등에서 스크립트내의 함수를 호출하기 위한 래퍼 함수를 생성해, 주소를 돌려준다 본문

AUTOHOTKEY/레퍼런스

RegisterCallback() DllCall()그리고 호출한 함수등에서 스크립트내의 함수를 호출하기 위한 래퍼 함수를 생성해, 주소를 돌려준다

님투 2007. 11. 5. 16:38
반응형

RegisterCallback()

DllCall()그리고 호출한 함수등에서 스크립트내의 함수를 호출하기 위한 래퍼 함수를 생성해, 주소를 돌려준다

RegisterCallback("FunctionName" [, Options = "", ParamCount = FormalCount, EventInfo = Address])

Parameters


인수명 설명
FunctionName 스크립트내의 함수명을 문자열치로서 지정한다.
Options 이하의 옵션을 반각 스페이스 단락으로 지정한다.
Fast
FunctionName그리고 지정한 함수를 실행할 때, 새로운 스렛드를 개시하지 않는 것에보다 , 처리 속도를 향상시킨다.
이 경우, 콜백 함수가 불려 가고 있었을 때에 실행되고 있던 스렛드의ErrorLevel(이)나A_LastError,LastFoundWindow등이 덧쓰기되어 버린다.
콜백 함수가 언제 불릴까 부정인 경우 등은, 지정해선 안 된다.
CDecl
호출 규약이 「CDecl」방식의 함수를 생성하고 싶은 경우로 지정한다.
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
반응형
Comments