Bonjour,
A mon humble avis, tu ne pourras pas plus utiliser HotKeyAssign que HotKeySet pendant l'affichage de tes MsgBox car ce n'est pas les HotKey qui foutent la m.... mais le fonctionnement des MsgBox qui bloquent l'exécution du reste du programme (perso, je n'utilise les MsgBoxes que pour du débuggage, jamais pour d'autres utilisations). Par contre, ce que tu peux faire, c'est remplacer partout dans ton code tes MsgBox() par _MsgBox(), et coder toi même une nouvelle fonction d'affichage des boites de dialogues.
Un exemple qui ne change rien pour toi :
Code : Tout sélectionner
Func _MsgBox($flag, $title, $text, $timeout=0, $hwnd=Default)
Local $result = MsgBox($flag, $title, $text, $timeout, $hwnd)
Return SetError(@error, @extended, $result)
EndFunc
Un autre exemple un peu "bâtard" :
Code : Tout sélectionner
Func _MsgBox($flag, $title, $text, $timeout=0, $hwnd=Default)
Local $GUI = GUICreate($title, 400, 300, Default, Default, Default, Default, $hwnd)
Local $LABEL = GUICtrlCreateLabel($text, 10, 10, 400-2*10, 300-2*10-10-25)
Local $BUTTON = GUICtrlCreateButton("OK", 100, 300-10-25, 400-2*100, 25)
GUISetState(@SW_SHOW, $GUI)
Local $timer = TimerInit()
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE Or $msg = $BUTTON Or ($timeout>0 And TimerDiff($timer)>$timeout*1000)
GUIDelete($GUI)
Local $result = 0, $error = 0
If $msg = $BUTTON Then $result = 1
If ($timeout>0 And TimerDiff($timer)>$timeout*1000) Then $error = 1
Return SetError($error, 0, $result)
EndFunc
A toi de l'agrémenter comme tu le souhaites.
Il reste une autre solution, c'est d'utiliser un processus annexe pour afficher les boites de dialogues, car les msbox freeze le process qui les appellent pas les autres. Mais c'est à éviter comme la peste comme les Eval et les Assign, pour deux raisons principales :
- 1°: La sécurité dans ce cas est un vrai gruyère, au même titre que les injections de code dans les pages web. Normalement, vu que la commande utilisée n'interprète qu'une seule ligne de code, il y a très très très peu de risque (voir aucun vu que l'affichage n'est pas dans le process père, mais dans le fils, mais bon... Essaye de taper " '&@AutoItExe&' ", dans la première boîte de dialogue, et tu verras de quoi je parle)
- 2° : Les multiples process c'est quand même un peu chaud à gérer surtout avec des ressources communes et des accès concurrents : cf sémaphores
Bref, voici un exemple :
Code : Tout sélectionner
Global $stop = False
HotKeySet("{F4}", "stop")
Func stop()
If $stop Then Exit
$stop = True
EndFunc
Local $input = InputBox("[PARENT] Tapez un texte", "Entrez une valeur à afficher dans la MsgBox", "jlhsfdhjlfsdg")
Local $result = _MsgBox(0, "Titre", $input, 10)
MsgBox(0,"[PARENT]","$resultat:"&$result)
Func _MsgBox($flag, $title, $text, $timeout=0, $hwnd=Default)
Local $pid = Run(@AutoItExe & ' /AutoIt3ExecuteLine "MsgBox('&$flag&', ''[FILS:'&$timeout&'] '&$title&''', '''&$input&''', '&$timeout&')"')
Do
TrayTip("[PARENT] HotKey en attente", "Appuyez sur F4 pour arreter", 1)
Local $exist = ProcessExists($pid)
Until $stop Or $exist = False
If $stop Then
ProcessClose($pid)
Return 0
EndIf
Return 1
EndFunc
Bonne chance, et à bientôt !
Edit: Arf, grillé par Über-Garfield ^^