Function Reference

GUIRegisterMsg

Register a user defined function for a known Windows Message ID (WM_MSG).

GUIRegisterMsg ( msgID, "function" )

 

Parameters

msgID A Windows Message ID (see Appendix: Windows Message Codes).
function The name of the user function to call when the message appears or an empty string "" to unregister a message.

 

Return Value

Success: 1
Failure: 0

 

Remarks

!!! To make the user function workable you have to define it with maximum 4 function parameters otherwise the function won't be called !!!
i.e:
Func MyUserFunction($hWndGUI, $MsgID, $WParam, $LParam)
...
EndFunc

Or

Func MyUserFunction($hWndGUI, $MsgID)
...
EndFunc

When the user function is called then these 4 parameters have the following values:
Position Parameter Meaning
1 hWnd The Window handle of the GUI in which the message appears.
2 Msg The Windows message ID.
3 wParam The first message parameter as hex value.
4 lParam The second message parameter as hex value.

Up to 256 user functions can be registered for message ID's.

By default after finishing the user function the AutoIt internal message handler will be proceed.
That won't be if yourself Return a value (See WM_COMMAND in example) or if you use the keyword 'Return' without any value.
By using 'Return' without any return value the AutoIt internal message handler (if there is one for this message) will NOT be proceed!

!!! If you want AutoIt to run it's internal handler for a message, return the variable $GUI_RUNDEFMSG (in GUIConstants.au3) from the function (see also examples) !!!
I.e. if you want to return ealier than at the userfunction end and also proceed the AutoIt internal message handler.

Warning: blocking of running user functions which executes window messages with commands such like "Msgbox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!

 

Related

GUICtrlGethandle

 

Example


; *******************************************************
; Example - Create an ownerdrawn/colored button
; *******************************************************

#include <GUIConstants.au3>

Global Const $WM_DRAWITEM           = 0x002B
Global Const $WM_COMMAND            = 0x0111

Global Const $GWL_STYLE             = -16

Global Const $BS_OWNERDRAW          = 0x0000000B
Global Const $BS_NOTIFY             = 0x00004000

Global Const $COLOR_BTNTEXT         = 18
Global Const $COLOR_BTNFACE         = 15
Global Const $COLOR_BTNSHADOW       = 16
Global Const $COLOR_HIGHLIGHTTEXT   = 14
Global Const $COLOR_GRAYTEXT        = 17

Global Const $DT_CENTER             = 0x00000001
Global Const $DT_RIGHT              = 0x00000002
Global Const $DT_VCENTER            = 0x00000004
Global Const $DT_BOTTOM             = 0x00000008
Global Const $DT_WORDBREAK          = 0x00000010
Global Const $DT_SINGLELINE         = 0x00000020
Global Const $DT_EXPANDTABS         = 0x00000040
Global Const $DT_TABSTOP            = 0x00000080
Global Const $DT_NOCLIP             = 0x00000100
Global Const $DT_EXTERNALLEADING    = 0x00000200
Global Const $DT_CALCRECT           = 0x00000400
Global Const $DT_NOPREFIX           = 0x00000800
Global Const $DT_INTERNAL           = 0x00001000

Global Const $ODS_SELECTED          = 0x0001
Global Const $ODS_GRAYED            = 0x0002
Global Const $ODS_DISABLED          = 0x0004
Global Const $ODS_CHECKED           = 0x0008
Global Const $ODS_FOCUS             = 0x0010
Global Const $ODS_HOTLIGHT          = 0x0040
Global Const $ODS_INACTIVE          = 0x0080
Global Const $ODS_NOACCEL           = 0x0100
Global Const $ODS_NOFOCUSRECT       = 0x0200

Global Const $ODT_BUTTON            = 4

Global Const $DFC_BUTTON            = 4
Global Const $DFCS_BUTTONPUSH       = 0x0010


$hGUI       = GUICreate("My Ownerdrawn Created Button", 300, 200)

$nButton    = GUICtrlCreateButton("", 90, 50, 120, 30)
GUICtrlSetStyle($nButton, BitOr($WS_TABSTOP, $BS_NOTIFY, $BS_OWNERDRAW)) ; Set the ownerdrawn flag

$nButton2   = GUICtrlCreateButton("Normal Button", 90, 110, 120, 30)

GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
; WM_DRAWITEM has to registered before showing GUI otherwise the initial drawing isn't done
GUIRegisterMsg($WM_DRAWITEM, "MY_WM_DRAWITEM")

GUISetState()

While 1
    $GUIMsg = GUIGetMsg()
   
    Switch $GUIMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
           
        Case $nButton
            ; Normally should not run through cause of our MY_WM_COMMAND function
            Msgbox(0, "Info", "Button pressed")
           
        Case $nButton2
            ; Normally should not run through cause of our MY_WM_COMMAND function
            Msgbox(0, "Info", "Button2 pressed")
    EndSwitch
WEnd

Exit


; React on a button click
Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode    = BitShift($wParam, 16)
    $nID            = BitAnd($wParam, 0x0000FFFF)
    $hCtrl          = $lParam
   
    If $nID <> 2 And $nNotifyCode = 0 Then ; Check for IDCANCEL - 2
        ; Ownerdrawn buttons don't send something by pressing ENTER
        ; So IDOK - 1 comes up, now check for the control that has the current focus
        If $nID = 1 Then
            $hFocus = DllCall("user32.dll", "hwnd", "GetFocus")
            $nCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hFocus[0])
            PostButtonClick($hFocus[0], $nCtrlID[0])
        Else
            Msgbox(0, "MY_WM_COMMAND", "GUIHWnd" & @TAB & ":" & $hwnd & @LF & _
                                        "MsgID" & @TAB & ":" & $Msg & @LF & _
                                        "wParam" & @TAB & ":" & $wParam & @LF & _
                                        "lParam" & @TAB & ":" & $lParam & @LF & @LF & _
                                        "WM_COMMAND - Infos:" & @LF & _
                                        "-----------------------------" & @LF & _
                                        "Code" & @TAB & ":" & $nNotifyCode & @LF & _
                                        "CtrlID" & @TAB & ":" & $nID & @LF & _
                                        "CtrlHWnd" & @TAB & ":" & $hCtrl)
        EndIf
        Return 0 ; Only workout clicking on the button
    EndIf
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
EndFunc


; RePost a WM_COMMAND message to a ctrl in a gui window
Func PostButtonClick($hWnd, $nCtrlID)
    DllCall("user32.dll", "int", "PostMessage", _
                                    "hwnd", $hGUI, _
                                    "int", $WM_COMMAND, _
                                    "int", BitAnd($nCtrlID, 0x0000FFFF), _
                                    "hwnd", GUICtrlGetHandle($nCtrlid))
EndFunc


; Draw the button
Func MY_WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
    Local $stDrawItem = DllStructCreate("uint;uint;uint;uint;uint;uint;uint;int[4];dword", $lParam)
   
    $nCtlType = DllStructGetData($stDrawItem, 1)
    If $nCtlType = $ODT_BUTTON Then
        $nCtrlID    = DllStructGetData($stDrawItem, 2)
        $nItemState = DllStructGetData($stDrawItem, 5)
        $hCtrl      = DllStructGetData($stDrawItem, 6)
        $hDC        = DllStructGetData($stDrawItem, 7)
        $nLeft      = DllStructGetData($stDrawItem, 8, 1)
        $nTop       = DllStructGetData($stDrawItem, 8, 2)
        $nRight     = DllStructGetData($stDrawItem, 8, 3)
        $nBottom    = DllStructGetData($stDrawItem, 8, 4)
        $sText      = "Ownerdrawn Button"
        $nTextColor = 0x5555DD
        $nBackColor = 0xFFEEDD
        DrawButton($hWnd, $hCtrl, $hDC, $nLeft, $nTop, $nRight, $nBottom, $nItemState, $sText, $nTextColor, $nBackColor)
        $stDrawItem = 0
        Return 1
    EndIf

    $stDrawItem = 0
    Return $GUI_RUNDEFMSG ; Proceed the default Autoit3 internal message commands
EndFunc


; The main drawing procedure
Func DrawButton($hWnd, $hCtrl, $hDC, $nLeft, $nTop, $nRight, $nBottom, $nItemState, $sText, $nTextColor, $nBackColor)
    ;Local $bDefault    = FALSE
    Local $bChecked = BitAnd($nItemState, $ODS_CHECKED)
    Local $bFocused = BitAnd($nItemState, $ODS_FOCUS)
    Local $bGrayed  = BitAnd($nItemState, BitOr($ODS_GRAYED, $ODS_DISABLED))
    Local $bSelected= BitAnd($nItemState, $ODS_SELECTED)

    $stRect = DllStructCreate("int;int;int;int")
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    If $bGrayed Then
        $nClrTxt    = SetTextColor($hDC, GetSysColor($COLOR_HIGHLIGHTTEXT))
    ElseIf $nTextColor = -1 Then
        $nClrTxt    = SetTextColor($hDC, GetSysColor($COLOR_BTNTEXT))
    Else
        $nClrTxt    = SetTextColor($hDC, $nTextColor)
    EndIf
   
    If $nBackColor = -1 Then
        $hBrush     = GetSysColorBrush($COLOR_BTNFACE)
        $nClrSel    = GetSysColor($COLOR_BTNFACE)
    Else
        $hBrush     = CreateSolidBrush($nBackColor)
        $nClrSel    = $nBackColor;
    EndIf

    $nClrBk         = SetBkColor($hDC, $nClrSel)
    $hOldBrush      = SelectObject($hDC, $hBrush)

    $nTmpLeft   = $nLeft
    $nTmpTop    = $nTop
    $nTmpRight  = $nRight
    $nTmpBottom = $nBottom
   
    If $bSelected Then
        InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -1, -1)
        $hBrushSel = CreateSolidBrush(GetSysColor($COLOR_BTNSHADOW))
        FrameRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $hBrushSel)
        DeleteObject($hBrushSel)
    Else
        If $bFocused And Not $bSelected Then InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -1, -1)
        DrawFrameControl($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $DFC_BUTTON, $DFCS_BUTTONPUSH)
    EndIf
   
    $nTmpLeft   = $nLeft
    $nTmpTop    = $nTop
    $nTmpRight  = $nRight
    $nTmpBottom = $nBottom
   
    If $bSelected Then
        InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -2, -2)
    Else
        If $bFocused And Not $bSelected Then
            InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -3, -3)
            $nTmpLeft -= 1
            $nTmpTop -= 1
        Else
            InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -2, -2)
            $nTmpLeft -= 1
            $nTmpTop -= 1
        EndIf
    EndIf
   
    FillRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $hBrush)
   
    If $bSelected Or $bGrayed Then
        $nTmpLeft = $nTmpLeft + 2
        $nTmpTop = $nTmpTop +2
    EndIf
   
    $uFlags = BitOr($DT_NOCLIP, $DT_CENTER, $DT_VCENTER)

    If Not BitAnd(GetWindowLong($hCtrl, $GWL_STYLE), $BS_MULTILINE) Then $uFlags = BitOr($uFlags, $DT_SINGLELINE)
   
    DrawText($hDC, $sText, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $uFlags)

    If $bGrayed Then
        $nTmpLeft   = $nLeft
        $nTmpTop    = $nTop
        $nTmpRight  = $nRight
        $nTmpBottom = $nBottom
       
        $nTmpLeft -= 1
       
        $nClrTxt    = SetTextColor($hDC, GetSysColor($COLOR_GRAYTEXT))
        DrawText($hDC, $sText, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, BitOr($DT_NOCLIP, $DT_CENTER, $DT_VCENTER, $DT_SINGLELINE))
    EndIf

    $nTmpLeft   = $nLeft
    $nTmpTop    = $nTop
    $nTmpRight  = $nRight
    $nTmpBottom = $nBottom
       
    If $bFocused Then
        $hBrush = CreateSolidBrush(0)
        FrameRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, $hBrush)
       
        $nTmpLeft   = $nLeft
        $nTmpTop    = $nTop
        $nTmpRight  = $nRight
        $nTmpBottom = $nBottom
       
        InflateRect($nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom, -4, -4)
        DrawFocusRect($hDC, $nTmpLeft, $nTmpTop, $nTmpRight, $nTmpBottom)
    EndIf

    SelectObject($hDC, $hOldBrush)
    DeleteObject($hBrush)
    SetTextColor($hDC, $nClrTxt)
    SetBkColor($hDC, $nClrBk)
         
    Return 1
EndFunc


; Some graphic / windows functions
Func CreateSolidBrush($nColor)
    Local $hBrush = DllCall("gdi32.dll", "hwnd", "CreateSolidBrush", "int", $nColor)
    Return $hBrush[0]
EndFunc


Func GetSysColor($nIndex)
    Local $nColor = DllCall("user32.dll", "int", "GetSysColor", "int", $nIndex)
    Return $nColor[0]
EndFunc


Func GetSysColorBrush($nIndex)
    Local $hBrush = DllCall("user32.dll", "hwnd", "GetSysColorBrush", "int", $nIndex)
    Return $hBrush[0]
EndFunc


Func DrawFrameControl($hDC, $nLeft, $nTop, $nRight, $nBottom, $nType, $nState)
    Local   $stRect = DllStructCreate("int;int;int;int")
   
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    DllCall("user32.dll", "int", "DrawFrameControl", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "int", $nType, "int", $nState)

    $stRect = 0
EndFunc


Func DrawFocusRect($hDC, $nLeft, $nTop, $nRight, $nBottom)
    Local   $stRect = DllStructCreate("int;int;int;int")
   
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    DllCall("user32.dll", "int", "DrawFocusRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect))
   
    $stRect = 0
EndFunc


Func DrawText($hDC, $sText, $nLeft, $nTop, $nRight, $nBottom, $nFormat)
    Local $nLen = StringLen($sText)
   
    Local $stRect = DllStructCreate("int;int;int;int")
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    Local $stText = DllStructCreate("char[260]")
    DllStructSetData($stText, 1, $sText)
   
    DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "ptr", DllStructGetPtr($stText), "int", $nLen, "ptr", DllStructGetPtr($stRect), "int", $nFormat)
   
    $stRect = 0
    $stText = 0
EndFunc


Func FillRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
    Local   $stRect = DllStructCreate("int;int;int;int")
   
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    DllCall("user32.dll", "int", "FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
   
    $stRect = 0
EndFunc


Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
    Local   $stRect = DllStructCreate("int;int;int;int")
   
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
   
    $stRect = 0
EndFunc


Func InflateRect(ByRef $nLeft, ByRef $nTop, ByRef $nRight, ByRef $nBottom, $nX, $nY)
    Local   $stRect = DllStructCreate("int;int;int;int")
   
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)
   
    DllCall("user32.dll", "int", "InflateRect", "ptr", DllStructGetPtr($stRect), "int", $nX, "int", $nY)
   
    $nLeft      = DllStructGetData($stRect, 1)
    $nTop       = DllStructGetData($stRect, 2)
    $nRight     = DllStructGetData($stRect, 3)
    $nBottom    = DllStructGetData($stRect, 4)
   
    $stRect = 0
EndFunc


Func SetBkColor($hDC, $nColor)
    Local $nOldColor = DllCall("gdi32.dll", "int", "SetBkColor", "hwnd", $hDC, "int", $nColor)
    Return $nOldColor[0]
EndFunc


Func SetTextColor($hDC, $nColor)
    Local $nOldColor = DllCall("gdi32.dll", "int", "SetTextColor", "hwnd", $hDC, "int", $nColor)
    Return $nOldColor[0]
EndFunc


Func SelectObject($hDC, $hObj)
    Local $hOldObj = DllCall("gdi32.dll", "hwnd", "SelectObject", "hwnd", $hDC, "hwnd", $hObj)
    Return $hOldObj[0]
EndFunc


Func DeleteObject($hObj)
    Local $nResult = DllCall("gdi32.dll", "hwnd", "DeleteObject", "hwnd", $hObj)
EndFunc


Func GetWindowLong($hWnd, $nIndex)
    Local $nVal = DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $hWnd, "int", $nIndex)
    Return $nVal[0]
EndFunc