MsgBox mit Timeout - Fehler oder nicht?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

MsgBox mit Timeout - Fehler oder nicht?

19 Jun 2018, 08:08

Hallöle zusammen,

ich bin schon öfter mal über folgendes gestolpert...

Code: Select all

            MsgBox, 8228, Datenimport, % "Wollen Sie vorher die Tabelle löschen?`n`nKicken Sie auf 'Ja', um die Tabelle zu löschen.`nKlicken Sie auf 'Nein', um den Vorgang abzubrechen.", 30
            IfMsgBox, Yes
            {
                ; Lösche die Tabelle, etc. pp.
                ; Das klappt immer
            }
            
            ; #####  Dies hier sind die beiden entscheidenden Zeilen  #####
            IfMsgBox, Timeout    ; Wenn 30 Sek lang nichts gemacht wird, zurück.
                Return
            
            Return   ;  Wenn Nein geklickt wird, auch zurück. Klappt auch immer
Wenn ich ein Gui öffne und dann z.B. eine solche MsgBox anzeige (Task modal), wird ja das Gui gesperrt, was auch so gewollt ist.
Macht der Benutzer aber keine Eingabe, bzw. wählt er nicht innerhalb von 30 Sek. "Ja" oder "Nein" aus, bleibt das Gui gesperrt und das Script scheint "zu stehen"?!
Erst die beiden markierten Zeilen "IfMsgBox, Timeout..." bewirken, dass alles richtig läuft und nach dem Timeout dann "Return" ausgeführt wird.

Meine Meinung war bislang immer (was ja auch falsch sein kann), dass das 2. Return ohne Bedingung vorneweg ausreichend sein sollte, um "Nein" UND den Timeout quasi gemeinsam abzufangen (spart etwas Code - grins)

Oder mache ich einen Denkfehler?


Grüße,

Gucky.
User avatar
Ragnar
Posts: 613
Joined: 30 Sep 2013, 15:25

Re: MsgBox mit Timeout - Fehler oder nicht?

19 Jun 2018, 11:56

Ob das ein Bug in AutoHotkey oder eine Eigenart von Windows ist, kann ich nicht sagen, aber bei einer selbsterstellten GUI ist Gui +OwnDialogs in der Regel die bessere Vorgehensweise. Zum Beispiel:

Code: Select all

Gui, Add, Button,, Test
Gui, Show, w200
return

ButtonTest:
Gui, +OwnDialogs
MsgBox,,,, 5
return
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: MsgBox mit Timeout - Fehler oder nicht?

20 Jun 2018, 02:37

Das "+OwnDialogs" habe ich in dem GUI eh schon fest drin, es wird bereits beim Erstellen des GUI aufgerufen und nicht erst, wenn ich eine Aktion auslöse.
Ich meine, das ist kein "suerduperschlimmer" Fehler, man muss ja nur "MsgBox, Timeout" setzen und gut.
Mich interessierte nur, ob das an AHK selber, an (wie Du es auch sagst) Windows oder an etwas anderem liegt?

Grüße,

Gucky.
User avatar
Ragnar
Posts: 613
Joined: 30 Sep 2013, 15:25

Re: MsgBox mit Timeout - Fehler oder nicht?

20 Jun 2018, 03:01

Gucky_87 wrote:Das "+OwnDialogs" habe ich in dem GUI eh schon fest drin, es wird bereits beim Erstellen des GUI aufgerufen und nicht erst, wenn ich eine Aktion auslöse.
Das funktioniert so nicht. Gui +OwnDialogs muss im aktuellen Thread angegeben werden, wo das Dialogfenster aufgerufen wird. Du kannst das auch einfach testen, indem du bei meinem Beispiel Gui +OwnDialogs auf die ersten Zeilen verschiebst. Oder schau dir das letzte Beispiel auf der GUI-Seite im Beispielabschnitt ganz unten an.
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: MsgBox mit Timeout - Fehler oder nicht?

20 Jun 2018, 04:35

Moin,

das ist interessant. Wenn ich dieses Skript hier in PSPad starte (aktuelles Win 10 und AHK Unicode, beide 64-Bit)

Code: Select all

#NoEnv
Gui, Margin, 100, 50
Gui, Add, Button, w100 gBoxTest, MsgBox
Gui, Show, , MsgBox Test
Return

GuiClose:
ExitApp

BoxTest:
MsgBox, 8228, Datenimport, % "Wollen Sie vorher die Tabelle löschen?`n`nKicken Sie auf 'Ja', um die Tabelle zu löschen.`nKlicken Sie auf 'Nein', um den Vorgang abzubrechen.", 3
IfMsgBox, Yes
{
   ; Lösche die Tabelle, etc. pp.
   ; Das klappt immer
   Return
}
; #####  Dies hier sind die beiden entscheidenden Zeilen  #####
IfMsgBox, Timeout    ; Wenn 30 Sek lang nichts gemacht wird, zurück.
   Return
Return   ;  Wenn Nein geklickt wird, auch zurück. Klappt auch immer
wandert das Guifenster nach dem automatischen Schließen der MsgBox in den Hintergrund und bleibt dort dauerhaft inaktiv. Ob mit oder ohne IfMsgBox, Timeout spielt keine Rolle.

Wenn ich stattdessen die zumindest seit Win XP namentlich exportierte aber bis heute nicht dokumentierte Windows Funktion MessageBoxTimeout aufrufe, klappt alles wie es soll.

Code: Select all

#NoEnv
Gui, Margin, 100, 50
Gui, Add, Button, w100 gBoxTest, MsgBox
Gui, Show, , MsgBox Test
Return

GuiClose:
ExitApp

BoxTest:
; MessageBoxTimeout -> edn.embarcadero.com/article/32736
; function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar;
;                            uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;
Msg := "Wollen Sie vorher die Tabelle löschen?`n"
     . "`n"
     . "Kicken Sie auf 'Ja', um die Tabelle zu löschen.`n"
     . "Klicken Sie auf 'Nein', um den Vorgang abzubrechen."
Result := DllCall("User32.dll\MessageBoxTimeout", "Ptr", 0, "Str", Msg, "Str", "Datenimport", "UInt", 8228, "UShort", 0, "UInt", 3000, "Int")
ToolTip, %Result% - %ErrorLevel% - %A_LastError%
Return
AHK verwendet einen internen Timer, um die MsgBox nach Zeitablauf zu beenden. Ich habe deshalb die Vermutung, dass es sich um einen AHK Bug bzw. um ein durch AHK ausgelöstes Fehlverhalten des Systems handelt.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 26 guests