Post by just me » 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.
Moin,
das ist interessant. Wenn ich dieses Skript hier in PSPad starte (aktuelles Win 10 und AHK Unicode, beide 64-Bit)
[code]#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[/code]wandert das Guifenster nach dem automatischen Schließen der MsgBox in den Hintergrund und bleibt dort dauerhaft inaktiv. Ob mit oder ohne [c]IfMsgBox, Timeout[/c] spielt keine Rolle.
Wenn ich stattdessen die zumindest seit Win XP namentlich exportierte aber bis heute nicht dokumentierte Windows Funktion [c]MessageBoxTimeout[/c] aufrufe, klappt alles wie es soll.
[code]#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[/code]
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.