Hallo,
wenn jemand nach einer Möglichkeit sucht, den Schließ-Button (x) eines Fensters zu deaktiveren/aktivieren, hier ist sie:
Spoiler anzeigen
#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)
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 (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
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