#include <GUIConstantsEx.au3>

$frmMain = GUICreate("Test", 222, 60, -1, -1)
$btnEnable = GUICtrlCreateButton("Enable", 20, 16, 75, 25)
$btnDisable = GUICtrlCreateButton("Disable", 124, 16, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $btnEnable
            _GUIDisableCloseButton($frmMain, False)
        Case $btnDisable
            _GUIDisableCloseButton($frmMain, True)
    EndSwitch
WEnd

; #FUNCTION# ====================================================================================================================
;
; Name...........: _GUIDisableCloseButton
; Description ...: Disables/enables the GUI close button and also ALT-F4 (see remarks)
; Syntax.........: _GUIDisableCloseButton($hGUI, $iMsg)
; Parameters ....: $hGUI - Handle of the target GUI
;                  $iMsg - True = disable, False = enable
;                  $wParam - for message handling
;                  $lParam - for message handling
; Return values .: $iMsg (True/False)
; Remarks .......: The function registers itself as message handler for WM_SYSCOMMAND
; Example .......: Yes
; Author ........: tiotua, enhanced by Großvater (www.autoit.de)
;
; ===============================================================================================================================
Func _GUIDisableCloseButton($hGUI, $iMsg, $wParam = 0, $lParam = 0)
    Local Static $CurrentStates = ""
    Local Static $MsgRegistered = False
    Local Const $WM_SYSCOMMAND = 0x0112
    Local Const $MF_GRAYED = 0x1
    Local Const $MF_DISABLED = 0x2
    Local Const $SC_CLOSE = 0xF060
    Local $IsDisabled = StringRegExp($CurrentStates, "(?m)^" & $hGUI)
    ; WM_SYSCOMMAND message handler ============================================
    If $iMsg == $WM_SYSCOMMAND Then
        If $wParam = $SC_CLOSE Then
            If $IsDisabled Then Return 0
        EndIf
        Return $GUI_RUNDEFMSG
    EndIf
    ; Set/Unset handler ========================================================
    If Not IsHWnd($hGUI) Then Return SetError(1, 0, -1)
    Local $aResult
    If $iMsg Then
        If Not $IsDisabled Then
            $aResult = DllCall("User32.dll", "HWND", "GetSystemMenu", "HWND", $hGUI, "Int", 0)
            DllCall("User32.dll", "Int", "EnableMenuItem", "HWND", $aResult[0], "UInt", $SC_CLOSE, "UInt", BitOR($MF_GRAYED, $MF_DISABLED))
            $CurrentStates &= $hGUI & @TAB & $aResult[0] & @LF
        EndIf
    Else
        If $IsDisabled Then
            $aResult = StringRegExp($CurrentStates, "(?m)^" & $hGUI & "\t(.*)$", 1)
            DllCall("User32.dll", "Int", "EnableMenuItem", "HWND", $aResult[0], "UInt", $SC_CLOSE, "UInt", 0)
            DllCall("User32.dll", "None", "GetSystemMenu", "HWND", $hGUI, "Int", 1)
            $CurrentStates = StringRegExpReplace($CurrentStates, "(\A|\n)" & $hGUI & "\t" & $aResult[0] & "(\n|\z)", "")
        EndIf
    EndIf
    If $CurrentStates Then
        If Not $MsgRegistered Then
            $MsgRegistered = GUIRegisterMsg($WM_SYSCOMMAND, "_GUIDisableCloseButton")
            ; ConsoleWrite("WM_SYSCOMMAND registered!" & @CRLF)
        EndIf
    Else
        If $MsgRegistered Then
            GUIRegisterMsg($WM_SYSCOMMAND, "")
            $MsgRegistered = False
            ; ConsoleWrite("WM_SYSCOMMAND unregistered!" & @CRLF)
        EndIf
    EndIf
    Return $iMsg
EndFunc   ;==>_GUIDisableCloseButton