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