• Hi,
    ich möchte euch mal meine neuste Funktion vorstellen. Es ist ein MsgBox Clon mit einem extra Feature: Mann hat die Möglichkeit eimem Coutdown festzulegen. D.h. der OK Button ist für eine definierbare Zeit einfach deaktiviert. Also ein guter Schutz gegen DAU's die aus Angst alle sich aufmachenden Fenster einfach zumachen ohne sich den Text durchzulesen.

    Viel Spaß damit. :D

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    _WaitMsgBox("Waiter Box by Sprenger120","Das ist nur ein kleiner Text meiner Waiter Box. Ein sicherer Schutz gegen DAU's die einfach jedes Fenster zumachen das irgentwo aufpoppt, ohne den Text zu zu lesen.")

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

    Func _WaitMsgBox($sTitle,$sText, $iSeks2Wait = 5, $hParent = 0,$MaxLenght = 50)
    ;By Sprenger120
    Local $iCount = 0, $iLineLenght = $MaxLenght
    If StringLen($sText) < 9 Then
    While StringLen($sText) < 9
    $sText &= " "
    WEnd
    EndIf

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

    $iCount += Int(StringLen($sText / $MaxLenght))
    If Mod($iCount, $MaxLenght) Then $iCount += 1

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

    If $iLineLenght > StringLen($sText) Then $iLineLenght = StringLen($sText)

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

    $iWidth = $iLineLenght * 7
    $iHeight = 10 + ($iCount * 20)

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

    $hWaiterGUI = GUICreate($sTitle, 10 + $iWidth, 40 + $iHeight, -1, -1, BitOR($WS_BORDER,$WS_CAPTION), $WS_EX_TOPMOST, $hParent)

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

    GUICtrlCreateLabel($sText, 5, 5, $iWidth, $iHeight, 0)
    $cButton = GUICtrlCreateButton("OK", $iWidth - 60, $iHeight + 10, 65, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW, $hWaiterGUI)

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

    $hTimer = TimerInit()
    Do
    Sleep(100)
    GUICtrlSetData($cButton, $iSeks2Wait - Int(TimerDiff($hTimer) / 1000))
    Until TimerDiff($hTimer) > $iSeks2Wait * 1000
    GUICtrlSetState($cButton, $GUI_ENABLE)
    GUICtrlSetData($cButton, "OK")
    While GUIGetMsg() <> $cButton
    WEnd
    EndFunc ;==>_WaitMsgBox

    [/autoit]
    • Offizieller Beitrag

    Schönes Beispiel! :thumbup:
    Es geht aber auch mit der Standard-MsgBox und der Timer-UDF:

    Spoiler anzeigen
    [autoit]


    #include <Timers.au3>

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

    $sMsg = "Das ist nur ein kleiner Text meiner Waiter Box. Ein sicherer Schutz gegen DAU's die einfach jedes Fenster zumachen das irgendwo aufpoppt, ohne den Text zu lesen."
    $hGui = GUICreate('')
    $sTitle = 'Test'
    $iCountTime = 5000 ; mSek
    $iTimer = TimerInit()
    $fCheck = False
    _Timer_SetTimer($hGui, 100, '_Wait')
    MsgBox(0, $sTitle, $sMsg)
    _Timer_KillAllTimers($hGui)

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

    Func _Wait($hWnd, $Msg, $iIDTimer, $dwTime)
    If TimerDiff($iTimer) < $iCountTime Then
    ControlSetText($sTitle, '', '[CLASS:Button; INSTANCE:1]', Int($iCountTime / 1000) - Int(TimerDiff($iTimer) / 1000))
    If Not $fCheck Then
    $fCheck = True
    ControlDisable($sTitle, '', '[CLASS:Button; INSTANCE:1]')
    EndIf
    Else
    ControlSetText($sTitle, '', '[CLASS:Button; INSTANCE:1]', 'Ok')
    If $fCheck Then
    $fCheck = False
    ControlEnable($sTitle, '', '[CLASS:Button; INSTANCE:1]')
    EndIf
    EndIf
    EndFunc

    [/autoit]
  • Ich finde Oscars Lösung aber "dreckig" - und zwar insofern, als das ich nicht direkt, sondern indirekt die Controls manipuliere und der Titel ja ähnlich mit anderen sein kann.

    Vermutlich sehe ich das aber falsch...

    Gruß,
    Matthias

    Edit: Nicht böse gemeint!

    • Offizieller Beitrag

    Ich wollte nur zeigen, dass sowas auch mit der Standard-MsgBox geht. :)

    Aber bleiben wir beim Thema: Sprenger, Du hast vergessen die GUI am Ende zu löschen. Und man sollte den EventMode auf den MessageLoop-Modus schalten, weil es ja sein kann, dass einer Deine Funktion im OnEventMode benutzen möchte und dann wäre die gleichzeitige Benutzung von GUIGetMsg nicht erlaubt. Ich hab's Dir mal eingefügt:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    _WaitMsgBox("Waiter Box by Sprenger120", "Das ist nur ein kleiner Text meiner Waiter Box. Ein sicherer Schutz gegen DAU's die einfach jedes Fenster zumachen das irgentwo aufpoppt, ohne den Text zu zu lesen.")

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

    Func _WaitMsgBox($sTitle, $sText, $iSeks2Wait = 5, $hParent = 0, $MaxLenght = 50)
    ;By Sprenger120
    Local $iCount = 0, $iLineLenght = $MaxLenght, $iOldEventMode
    $iOldEventMode = Opt('GUIOnEventMode', 0) ; umschalten auf den MessageLoop-Modus (vorherigen Modus in $iOldEventMode)
    If StringLen($sText) < 9 Then
    While StringLen($sText) < 9
    $sText &= " "
    WEnd
    EndIf

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

    $iCount += Int(StringLen($sText / $MaxLenght))
    If Mod($iCount, $MaxLenght) Then $iCount += 1

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

    If $iLineLenght > StringLen($sText) Then $iLineLenght = StringLen($sText)

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

    $iWidth = $iLineLenght * 7
    $iHeight = 10 + ($iCount * 20)

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

    $hWaiterGUI = GUICreate($sTitle, 10 + $iWidth, 40 + $iHeight, -1, -1, BitOR($WS_BORDER, $WS_CAPTION), $WS_EX_TOPMOST, $hParent)

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

    GUICtrlCreateLabel($sText, 5, 5, $iWidth, $iHeight, 0)
    $cButton = GUICtrlCreateButton("OK", $iWidth - 60, $iHeight + 10, 65, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW, $hWaiterGUI)

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

    $hTimer = TimerInit()
    Do
    Sleep(100)
    GUICtrlSetData($cButton, $iSeks2Wait - Int(TimerDiff($hTimer) / 1000))
    Until TimerDiff($hTimer) > $iSeks2Wait * 1000
    GUICtrlSetState($cButton, $GUI_ENABLE)
    GUICtrlSetData($cButton, "OK")
    While GUIGetMsg() <> $cButton
    WEnd
    GUIDelete($hWaiterGUI) ; hast Du noch vergessen
    Opt('GUIOnEventMode', $iOldEventMode) ; vorherigen Modus wiederherstellen
    EndFunc ;==>_WaitMsgBox

    [/autoit]
  • Ich frage trotzdem noch einmal nach, weil es mich interessiert. Kann man deine Funktion, Oscar, so umschreiben, dass ich mit 100%-iger Sicherheit das/den Handle der MsgBox bekomme?

    Gruß,
    Matthias

  • Blume: Danke, aber das ist mir bewusst gewesen. Ich möchte eine 100%-ige Sicherheit. Das kann ich mit Win... nicht.

  • So. Jetzt habe ich eine 100%ig sichere Methode gebastelt. ^^

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <Timers.au3>

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

    $sTitle = "MsgBox Test"
    $iCountTime = 5000
    $fCheck = False

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

    $hWnd_Parent = GUICreate("")

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

    $iTimer = TimerInit()
    _Timer_SetTimer($hWnd_Parent, 100, '_Wait')
    MsgBox(64, $sTitle, "AutoIt Rulez!", Default, $hWnd_Parent)
    _Timer_KillAllTimers($hWnd_Parent)

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

    Func _Wait($hWnd, $Msg, $iIDTimer, $dwTime)
    If Not IsDeclared("hMsgBoxHandleTmp") Then Global $hMsgBoxHandleTmp = _MsgBox_GetHandle($sTitle, $hWnd_Parent)
    If TimerDiff($iTimer) < $iCountTime Then
    ControlSetText($hMsgBoxHandleTmp, '', '[CLASS:Button; INSTANCE:1]', Int($iCountTime / 1000) - Int(TimerDiff($iTimer) / 1000))
    If Not $fCheck Then
    $fCheck = True
    ControlDisable($hMsgBoxHandleTmp, '', '[CLASS:Button; INSTANCE:1]')
    EndIf
    Else
    ControlSetText($hMsgBoxHandleTmp, '', '[CLASS:Button; INSTANCE:1]', 'Ok')
    If $fCheck Then
    $fCheck = False
    ControlEnable($hMsgBoxHandleTmp, '', '[CLASS:Button; INSTANCE:1]')
    EndIf
    EndIf
    EndFunc

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

    Func _MsgBox_GetHandle($sTitle, $hWnd_Parent)
    $aWinList = WinList("[CLASS:#32770;TITLE:" & $sTitle & "]")
    For $i = 1 To $aWinList[0][0]
    If _WinAPI_GetParent($aWinList[$i][1]) = $hWnd_Parent Then Return $aWinList[$i][1]
    Next
    Return 0
    EndFunc

    [/autoit]
  • Wow, danke dir herzlich name22!

    Das ist aber umständlich ;)

    ... ich glaube ich verzichte :P

    Spaß beiseite, das ist sicher auch für andere Dinge praktisch (idealer Kandidat für eine MsgBox-Udf, zusammen mit der Waiter-Box)!

  • Ich bin dennoch immer noch der Meinung, dass das in eine UDF gehört, damit es jeder leicht benutzen kann ;)

    Gruß,
    Matthias