Page 1 sur 1

[..] Hotkeys et Msgbox

Posté : lun. 21 oct. 2013 08:28
par EvilRyu
Salut à tous!

Voilà je rencontre un problème tout con.

J'utilise des MsgBox tout le long d'un script, afin de donner des instructions pas à pas. Je ne veux pas utiliser de splashscreen ou tooltip.

Seulement, j'ai des HotKeySet() qui appellent des fonctions, et malheuresement, pendant des MsgBox, les Hotkeys ne marchent pas. :?

J'ai lu sur un forum US qu'il fallait utiliser HotKeyAssign() à la place de HotKeySet(). J'ai essayé mais j'avoue ne pas bien comprendre comment l'utiliser, car pour l'instant, le résultat est le même.

Voici mon bout de script:

Code : Tout sélectionner

#include "HotKey_20b.au3"

Func Quit()
Exit 0
EndFunc

Global Const $VK_ESCAPE = 0x1B

_HotKey_Assign($VK_ESCAPE, 'Quit')

MsgBox(0,"","Test")

 
Une idée pour faire marcher le HotKeyAssign? Voici un lien vers le UDF

Merci :)

Re: [..] Hotkeys et Msgbox

Posté : lun. 21 oct. 2013 10:46
par mikell
Une msgbox est bloquante et tant qu'elle est ouverte les hotkeys ne marchent pas, qu'elles aient été posées avec HotkeySet ou HotKeyAssign
La seule solution est d'ouvrir la msgbox dans un autre process comme expliqué ici
http://www.autoitscript.com/forum/topic ... functions/

Re: [..] Hotkeys et Msgbox

Posté : lun. 21 oct. 2013 10:58
par EvilRyu
Af merdouille.... Ok merci

Re: [..] Hotkeys et Msgbox

Posté : lun. 21 oct. 2013 11:22
par ZDS
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 ^^

Re: [..] Hotkeys et Msgbox

Posté : lun. 21 oct. 2013 11:35
par mikell
Sérieux le plus simple est de loin la soluce n°2 de ZDS, remplacer la msgbox par une custom qui est une gui bloquante
► Afficher le texte
Edit
Et ce coup-ci Über-Garfield grillé par ZDS :mrgreen:

Re: [..] Hotkeys et Msgbox

Posté : lun. 21 oct. 2013 15:00
par EvilRyu
Merci pour vos réponses, c'est très sympa!

Je vais pouvoir assaisonner tout ça à ma sauce maintenant :)