GUI-Schließ-Button enablen/disablen

  • Hallo,

    wenn jemand nach einer Möglichkeit sucht, den Schließ-Button (x) eines Fensters zu deaktiveren/aktivieren, hier ist sie:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $frmMain = GUICreate("Test", 222, 60, -1, -1)
    $btnEnable = GUICtrlCreateButton("Enable", 20, 16, 75, 25)
    $btnDisable = GUICtrlCreateButton("Disable", 124, 16, 75, 25)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnEnable
    _GUIDisableCloseButton($frmMain, False)
    Case $btnDisable
    _GUIDisableCloseButton($frmMain, True)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; #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 (http://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

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Das Disablen/Enablen von ALT+F4 ist suboptimal gelöst, da Zusatzcode im Skript eingefügt werden muss. Hat da jemand eine Idee?
    Edit: Von Großvater überarbeitet und verbessert. ALT-F4 wird nun lässig abgefangen. Siehe Listing und Anhang.

    Gruß, tiotua

  • Das Disablen/Enablen von ALT+F4 ist suboptimal gelöst, da Zusatzcode im Skript eingefügt werden muss. Hat da jemand eine Idee?


    Ja: ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $frmMain = GUICreate("Test", 222, 60, -1, -1)
    $btnEnable = GUICtrlCreateButton("Enable", 20, 16, 75, 25)
    $btnDisable = GUICtrlCreateButton("Disable", 124, 16, 75, 25)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnEnable
    _GUIDisableCloseButton($frmMain, False)
    Case $btnDisable
    _GUIDisableCloseButton($frmMain, True)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; #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
    ;
    ; ===============================================================================================================================
    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

    [/autoit]
  • Du hast da einen kleinen Variablenfehler.
    Global $canExit muss unter die Includes und nicht in die Funktion.
    Es ist aber ein ziemlich cooles Skript.

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • @Großvater: Genial, funzt :rock: danke! Ich habe das von dir verbesserte Listing auch ins erste Posting gesetzt und den Download entsprechend geändert. Unter "Author" ist selbstverständlich ein Hinweis auf deine Mitarbeit drin.

    Du hast da einen kleinen Variablenfehler.
    Global $canExit muss unter die Includes und nicht in die Funktion.

    Stimmt, das macht man so normalerweise nicht. Hat sich dank Großvater erledigt.

    Es ist aber ein ziemlich cooles Skript.

    Danke :) .

    Gruß, tiotua