Page 1 sur 1
[..] Création point de restauration : blocage GUI
Posté : sam. 05 avr. 2014 22:06
par franco
Bonjour.
Désolé pour ce titre à rallonge, mais ceci
explique en gros mon souci.
Pour un projet en cours, on inclue la possibilité de la
création d'un point de restauration.
La création en elle-même
fonctionne.
J'ai mis une
barre de progression.
Mais au moment où la création du point débute,
la GUI (interface graphique) est figé :
- Aucune interaction possible.
- La barre de progression (normalement fonctionnelle) ne défile pas.
- A la fin de la création, j'ai de nouveau le contrôle de ma GUI.
J'ai mis que le script
lié à ce phénomène.
Voici le code :
► Afficher le textecode n°1
Code : Tout sélectionner
#include
#include
#include
#RequireAdmin
Global $Form1 = GUICreate("Form1", 540, 70, 100, 100)
$Add_SRP1 = GUICtrlCreateButton("Créer un point de restauration", 10, 10, 250, 30)
$BT_TEST = GUICtrlCreateButton("Bouton de test", 280, 10, 250, 30)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Add_SRP1
GUISetState(@SW_MINIMIZE,$Form1)
While 1
$description = InputBox("Création d'un point de resrauration système", "Veuillez indiquez un nom cohérent pour le nouveau point de restauration" & @CRLF & @CRLF & "Si vous n'indiquez pas de nom, le point de restauration créé portera ce nom :" & @CRLF & "''Point de Restauration - Ch-Knife''", "", "", 400, 420)
If @error Then ExitLoop
If $description = "" Then $description = "Point de Restauration - Ch-Knife"
Global $Progress_SRP = GUICtrlCreateProgress(00, 50, 540, 20, $PBS_MARQUEE)
GUICtrlSendMsg($Progress_SRP, 0x0400 + 10, 1, Number(30)) ; on envoie la ProgressBar
GUISetState(@SW_SHOW, $Progress_SRP)
_CreateSystemRestorePoint($description)
GUICtrlDelete($Progress_SRP)
MsgBox(0, "", "Done !")
GUISetState(@SW_SHOWDEFAULT,$Form1)
ExitLoop
WEnd
Case $BT_TEST
MsgBox(0, "", GUICtrlRead($BT_TEST))
EndSwitch
WEnd
Func _CreateSystemRestorePoint($description, $disable = True)
$obj = ObjGet("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
$obj.Enable("")
$obj.CreateRestorePoint($description, 12, 100)
If $disable Then
$obj.Disable("")
EndIf
EndFunc ;==>_CreateSystemRestorePoint
Vu que la GUI se bloque, j'ai pondu un second code,
pour "contourner" le problème.
=>
Le même que le premier, mais avec des petites modifications.
- Plus de barre de progression
- Réduction de la GUI dans la barre des tâches
- Un traytip (pour remplacer la barre de progression)
- Une fois la création du point effectué, on réaffiche la GUI
Voici le code
► Afficher le textecode n°2
Code : Tout sélectionner
#include
#include
#include
#RequireAdmin
Global $Form1 = GUICreate("Form1", 540, 70, 100, 100)
$Add_SRP1 = GUICtrlCreateButton("Créer un point de restauration", 10, 10, 250, 30)
$BT_TEST = GUICtrlCreateButton("Bouton de test", 280, 10, 250, 30)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Add_SRP1
GUISetState(@SW_MINIMIZE, $Form1)
While 1
$description = InputBox("Création d'un point de resrauration système", "Veuillez indiquez un nom cohérent pour le nouveau point de restauration" & @CRLF & @CRLF & "Si vous n'indiquez pas de nom, le point de restauration créé portera ce nom :" & @CRLF & "''Point de Restauration - Ch-Knife''", "", "", 400, 420)
If @error Then ExitLoop
If $description = "" Then $description = "Point de Restauration - Ch-Knife"
TrayTip("Création du point de restauration", "Veuillez patienter pendant la création du point de restauration suivant : " & $description, 0)
_CreateSystemRestorePoint($description)
TrayTip("", "", 0)
MsgBox(0, "", "Done !")
GUISetState(@SW_SHOWDEFAULT, $Form1)
ExitLoop
WEnd
Case $BT_TEST
MsgBox(0, "", GUICtrlRead($BT_TEST))
EndSwitch
WEnd
Func _CreateSystemRestorePoint($description, $disable = True)
$obj = ObjGet("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
$obj.Enable("")
$obj.CreateRestorePoint($description, 12, 100)
If $disable Then
$obj.Disable("")
EndIf
EndFunc ;==>_CreateSystemRestorePoint
Donc, ma question : est-ce possible que la GUI ne soit pas bloquée, et donc avoir une barre de progression qui fonctionne ?
Merci à tous !

@+
Re: [..] Création point de restauration : blocage GUI
Posté : dim. 06 avr. 2014 11:28
par PandiPanda
Bonjour, voici un exemple
Vous devez appuyer sur le bouton, et attendre que ca atteint 200 pour pouvoir quitté.
► Afficher le textecode qui représente votre problème
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 109, 61, 192, 114)
Global $Button1 = GUICtrlCreateButton("OK", 8, 8, 97, 41)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Local $i = 0
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
While $i < 200
$i = $i+1
GUICtrlSetData($Button1,$i)
Sleep(50)
WEnd
GUICtrlSetData($Button1,"OK")
$i = 0
EndSwitch
WEnd
► Afficher le texteVoici une résolution possible
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 109, 61, 192, 114)
Global $Button1 = GUICtrlCreateButton("OK", 8, 8, 97, 41)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Local $i = 0
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
While $i < 200
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
$i = $i+1
GUICtrlSetData($Button1,$i)
Sleep(50)
WEnd
GUICtrlSetData($Button1,"OK")
$i = 0
EndSwitch
WEnd
Re: [..] Création point de restauration : blocage GUI
Posté : lun. 07 avr. 2014 14:36
par franco
Salut
Merci PandiPanda
J'ai donc, sur mon code, utilisé le deuxième bouton pour tester.
Et en effet, il passe à 1 et se bloque.
Je pense que la fonction suivante empêche toute interaction avec la gui.
Néanmoins, l’exemple que tu m'as donnée m'apprend des choses que je ne connaissais pas
La fonction :
Code : Tout sélectionner
Func _CreateSystemRestorePoint($description, $disable = True)
$obj = ObjGet("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
$obj.Enable("")
$obj.CreateRestorePoint($description, 12, 100)
If $disable Then
$obj.Disable("")
EndIf
EndFunc ;==>_CreateSystemRestorePoint
Je vais voir si je ne trouve pas une alternative.
@+
Re: [..] Création point de restauration : blocage GUI
Posté : lun. 07 avr. 2014 16:20
par jguinch
franco a écrit :Je pense que la fonction suivante empêche toute interaction avec la gui
Oui, c'est comme une fonction MsgBox ou Sleep : c'est bloquant...
Tu peux contourner ça en faisant sous-traiter la partie "point de restauration" par un autre script

Re: [..] Création point de restauration : blocage GUI
Posté : sam. 12 avr. 2014 19:31
par franco
Salut.
Désolé de l'attente, mais entre garder ma nièce, peindre les murs crépi de la véranda, vadrouiller partout... je n'ai pas eu le temps d'y revenenir.
Tu peux contourner ça en faisant sous-traiter la partie "point de restauration" par un autre script
Si je comprends bien, je contourne en faisant un autre script,
lié au script initial, que je
compile et que je l'associe en faisant un
fileinstall ?
Je pense que j'ai suivre mon idée :
réduire la GUI dans la barre des tâches
pendant la fonction avec apparition d'un
traytip (ou autre).
Je me demande si, quand on
réduit le programme (gui) dans la barre des tâches, on peut
empêcher l'utilisateur de l'afficher lui-même,
pendant que la fonction se termine.
Est-ce possible ?
Promis juré (pas craché, c'est dégueux

), je vous embêterai plus ensuite pour ce sujet
@+
Re: [..] Création point de restauration : blocage GUI
Posté : sam. 12 avr. 2014 21:56
par Tlem
Un
SplashTextOn avec comme message :
Code : Tout sélectionner
Point de restauration en cours de création ...
Veuillez patienter quelques instants.
me semblerait tout indiqué.

Re: [..] Création point de restauration : blocage GUI
Posté : sam. 12 avr. 2014 22:55
par jguinch
C'est vrai qu'un splashtext conviendrait.
Tu peux aussi tout simplement désactiver la GUI et mettre un label "Veuillez patienter...", et une fois le point de restauration créé, suppression du label et réactivation de la GUI.