Meilleur auteur de réponses
interrompre l'arrêt de windows.

Question
-
Salut,
J'ai créer un petit programme qui est démarrer avec windows et qui doit normalement interrompre l'arrêt de windows et si il y a une clé usb ou un disque dur externe branché attendre le temps que je les éjectes.
mais mon code ne fonctionne pas et windows 7 arrête tout les processus et s'éteint ...
Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Integer Private Const WM_QUERYENDSESSION As Integer = &H11 Private arretwin As Boolean = False Protected Overrides Sub WndProc(ByRef sw As System.Windows.Forms.Message) If sw.Msg = WM_QUERYENDSESSION Then arretwin = True AbortSystemShutdown(0) detection_disk.Start() msgbox("test") Else MyBase.WndProc(sw) End If End Sub
mon programme détecte l'arrêt de windows car il affiche mon msgbox "test" mais windows s'éteint après
et pour comblé le tout je ne sais pas si j'appel bien l'API et si l'API est correcte et fonctionne sous windows 7 ..
Merci de votre aide.
Réponses
-
Bonjour,
Essaye avec ceci :
'constants needed, form level Private Const WM_QUERYENDSESSION As System.Int32 = &H11 Private Const WM_CANCELMODE As System.Int32 = &H1F 'the sub to intercept the windows messages Protected Overrides Sub WndProc(ByRef ex As Message) If ex.Msg = WM_QUERYENDSESSION Then 'cancel the message Dim MyMsg As New Message MyMsg.Msg = WM_CANCELMODE MyBase.WndProc(MyMsg) Else 'send the message as normal MyBase.WndProc(ex) End If End Sub
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Non, chez moi je n'ai aucune de ces deux clés.
D'après l'article que j'ai indiqué, cela veut dire que Windows va "tuer" les applications au bout de 2 secondes. Cela explique sans doute à la fois que l'arrêt ne puisse pas être empêché ainsi que sans doute le problème avec les clés USB.
Supprime ces clés de registre et vois ce que cela donne. A l'arrêt Windows va alors fermer les clés USB et attendra la fin de cette fermeture (ou peut-être 12 à 20 secondes je crois par défaut ce qui devrait être suffisant) au lieu de tout interrompre au bout de 2 secondes.
Du coup faire un programme qui empêche l'arrêt de Windows deviendra sans doute inutile (et ne marchait pas car Windows était configuré pour le "tuer" au bout de 2 secondes).
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".- Marqué comme réponse Benny03 dimanche 16 janvier 2011 21:10
Toutes les réponses
-
Bonjour,
Essaye avec ceci :
'constants needed, form level Private Const WM_QUERYENDSESSION As System.Int32 = &H11 Private Const WM_CANCELMODE As System.Int32 = &H1F 'the sub to intercept the windows messages Protected Overrides Sub WndProc(ByRef ex As Message) If ex.Msg = WM_QUERYENDSESSION Then 'cancel the message Dim MyMsg As New Message MyMsg.Msg = WM_CANCELMODE MyBase.WndProc(MyMsg) Else 'send the message as normal MyBase.WndProc(ex) End If End Sub
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Salut Thomas et merci de ta réponses car elle fonctionne mais sous windows xp
désolé si je suis si difficile mais pour ne pas arrangé les choses j'ai windows 7 et il s'éteint sans problème en 2 secondes ... :'-(
voila, maintenant ce n'est peut-être pas possible avec windows 7.
Merci de votre aide.
-
-
Salut,
Merci pour votre réponses je vais commencé par chercher pas la ... ;-)
et je vous dis quoi.
Edit : Après 15 minnute de recherche et 1h45 de test j'ai découvert que soit je n'utilise pas bien la fonction ShutdownBlockReasonCreate soit il manque quelle que chose a mon code ...
pour que ShutdownBlockReasonCreate fonctionne il faut retourner FALSE au message WM_QUERYENDSESSION si non Windows ne vous demandera jamais pourquoi interrompre l'arrêt j'ai donc appelé la fonction après "MyBase.WndProc(MyMsg)"
et ca donne cela
'constants needed, form level Declare Function ShutdownBlockReasonCreate Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal reason As String) As Boolean Private Const WM_QUERYENDSESSION As System.Int32 = &H11 Private Const WM_CANCELMODE As System.Int32 = &H1F 'the sub to intercept the windows messages Protected Overrides Sub WndProc(ByRef ex As Message) If ex.Msg = WM_QUERYENDSESSION Then 'cancel the message Dim MyMsg As New Message MyMsg.Msg = WM_CANCELMODE MyBase.WndProc(MyMsg) ShutdownBlockReasonCreate(Me.Handle, "Mon message") Else 'send the message as normal MyBase.WndProc(ex) End If End Sub
et quand je clique sur arrêter Windows mon programme est fermé en premier ....
sans message "Les programmes suivants sont toujour en cours d'execution : Form1 : Mon message"
Merci de votre aide
-
-
-
Bonjour,
Si la solution de monsieur Microsoft ne fonctionne pas je crains qu'il n'existe pas, pour l'instant, de solution.
http://msdn.microsoft.com/fr-fr/library/microsoft.win32.systemevents.sessionending.aspx (voir le code plus haut)
Cordialement, Troxsa- Proposé comme réponse TroxsaEditor mardi 11 janvier 2011 21:44
-
Salut Troxsa, j'ai bien les 2 messages et j'ai le temps de répondre aux messages mais après avoir répondu Oui au message suivant
"Do you want to save your work before logging off?"
windows affiche un fond bleu transparent (normale) avec la "liste des programmes encore en cours d'exécution" mais la liste est vide et windows s'éteint .
je ne sais pas si c'est mon windows 7 qui fait cela ou TOUTE les version de windows 7 qui ont ce "problème".
Tanpis si il n'y a pas de solution encore connue pour windows 7, j'utiliserais un autre programme que le mien ...
Encore Merci de votre aide ;-)
P.S: je ne sais pas si c'est normale ou si c'est la traduction qui fait ça mais il manque
MyBase.WndProc(m) après le end if
la il est compris dans le commentaire :
' If this is WM_QUERYENDSESSION, the closing event should be raised in the base WndProc. MyBase.WndProc(m)
ça ne fonctionne pas tres bien comme commentaire ^^
-
Bonjour Benny,
J'ai trouvé un article sur comment bloquer l'arrêt de Windows Vista.
Je n'ai pas pu tester moi-même mais manifestement si cela marche sous Vista, il ne semble pas très sûr que cela marche sous Seven ...
Donc bon, a tester, sans trop de conviction tout de même ...
Je laisse quand même l'article : http://community.bartdesmet.net/blogs/bart/archive/2006/10/25/Windows-Vista-_2D00_-ShutdownBlockReasonCreate-in-C_2300_.aspx
Il y a une démo avec du code, donc tu peux déjà la faire tourner, si jamais elle fonctionne sous Windows 7, cela sera une bonne base pour travailler, sinon ben je crois que c'est foutu pour l'instant.
Cordialement,
Thomas
PS : le code est en C#, mais il existe un excellent traducteur de C# vers VB.Net sur DeveloperFusion : http://www.developerfusion.com/tools/convert/csharp-to-vb/
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr- Proposé comme réponse Alex Petrescu mardi 11 janvier 2011 13:49
-
Bonjour,
J’ai trouvé le même thread que Thomas et je l’ai teste pour une application C#. Il fonctionne parfaitement. J’ai créé un FAQ en Français à partir de ce code et je l’ai poste dans le forum C# :
Comment faire une application C# pour interrompre l’arrêt de Windows
Le truc est qu’on doit appeler la fonction ShutdownBlockReasonCreate avant l’arrêt de Windows et pas dans la méthode WndProc, pour avoir déjà le « block » en place.
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Salut,
je crois qu'il n'y a pas de solution a mon problème car j'ai traduis le code en vb et cela ne fonctionne pas sur mon ordinateur, mon programme est même fermé en premier ...
j'ai donc créer un nouveau projet avec un textbox et 2 bouttons
je clique sur le bouton bloking j'ai un message
Shutdown blocking succeeded
je clique sur Arrêter, le "programme" se ferme et windows s'éteint
voici le code que j'ai utiliser :
Public Class Form1 Private Declare Function ShutdownBlockReasonDestroy Lib "user32.dll" (ByVal hWnd As IntPtr) As Boolean Private Declare Function ShutdownBlockReasonCreate Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal reason As String) As Boolean Private Const WM_QUERYENDSESSION As System.Int32 = &H11 Private Const WM_CANCELMODE As System.Int32 = &H1F 'the sub to intercept the windows messages Protected Overrides Sub WndProc(ByRef ex As Message) If ex.Msg = WM_QUERYENDSESSION Then 'cancel the message Dim MyMsg As New Message MyMsg.Msg = WM_CANCELMODE MyBase.WndProc(MyMsg) Else 'send the message as normal MyBase.WndProc(ex) End If End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing e.Cancel = True End Sub Private Sub Bloking_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bloking.Click If (ShutdownBlockReasonCreate(Me.Handle, TextBox1.Text)) Then MessageBox.Show("Shutdown blocking succeeded") Else MessageBox.Show("Shutdown blocking failed") End If MessageBox.Show("Shutdown blocking succeeded") End Sub Private Sub Unbloking_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Unbloking.Click If (ShutdownBlockReasonDestroy(Me.Handle)) Then MessageBox.Show("Shutdown unblocking succeeded") Else MessageBox.Show("Shutdown unblocking failed") End If End Sub End Class
voila, a mon avis il n'y a pas de solution a mon problème , c'est pas grave ...
Merci ;-)
-
Bonjour,
J’ai testé votre code VB et il fonctionne aussi que la version C# sur mon PC. Est-ce que vous êtes administrateur sur votre PC ?
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Bonjour,
Personnellement j'ai pas essayé comme là fait Alex, mais je pense que si ça fonctionne sur sa machine il n'y a pas de raison que cela ne fonctionne pas sur d'autre !
Sur les machines sur les quelles vous faites des testes sont elles à jour ?A bientot
Cordialement, Troxsa -
Salut Alex,
oui je suis administrateur de mon ordinateur et mon ordi est à jour mais j'ai plus eu de mise à jour depuis quelque mois ... c'est peut-être normale ...
j'ai windows 7 familiale premium mais a mon avis cela ne change rien ...
je ne sais pas pour quelle raison rien ne fonctionne pour interrompre l'arrêt de windows ...
-
Bonjour,
Le code VB semble différent des solutions C# proposées. Par exemple le message WM_ENDSESSION n'est pas bloqué et le blocage est fait en envoyant un autre message alors que le message est purement et simplement ignoré dans le code C#.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered". -
Salut Patrice, la chose qui pause problème c'est que mon système d'exploitation est windows 7
car la code de Thomas fonctionne super bien mais sous windows XP
Maintenant le message pour bloquer l'arrêt de windows 7 et XP n'est peut-être pas le même, je ne sais pas ...
a mon avis c'est peut-être mon windows 7 qui a des problèmes ... je ne sais pas non plus c'est bizzard ... .
-
Et que donne tout simplement :
Public Class Form1 Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If e.CloseReason = CloseReason.WindowsShutDown Then MsgBox("Non !") e.Cancel = True End If End Sub End Class
Chez moi le message "Non !" s'affiche et après clique sur le bouton j'ai bien la liste des applis avec pour celle ci le message par défaut style "Cette application empêche Windows de s'arrêter." Je suis également sur une "Familale Premium".
C'est bien un arrêt et pas une mise en veille ? Eventuellement lancer aussi directement le fichier EXE si le test est actuellement fait directement depuis VS.
Sinon je ne vois effectivement pas et c'est probablement un réglage spécifique à cette machine...
En relisant le fil, je remarque également grâce à la mention d'une question oui/non avec un message "Do you want to save your work before logging off ?" que le code montré n'est pas celui réellement exécuté. Il est préférable de toujours tester une application qui ne fait que cela et qui est très exactement le code que tu nous montres. Si le code n'est pas identique il y a toujours la possibilité d'une différence qui change ce comportement et que nous ne pourrons jamais comprendre faute de voir un code absolument identique à celui que tu exécutes.
Si le but est de faire qq chose automatiquement à la fermeture de l'appli je le mettrais dans le formclosing sans interrompre l'arrêt de Windows (à priori Windows attends que l'application se ferme avant de continuer). Bloquer l'arrêt est intéressant si une opération longue est en cours et ne doit pas être interrompue. Ici on dirait plutôt que l'on veut avoir le temps de faire avant l'arrêt qq chose qui ne prendra pas beaucoup de temps ce qui n'est pas un blocage de l'arrêt de Windows mais juste une gestion de l'évènement "fermeture de l'application".
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered". -
Salut Patrice,
Ton code tout simple ne fonctionne pas chez moi ... j'ai le message "Non !" quand je clique sur (démarrer => Arrêter) mais dés que j'ai cliquer sur OK la form qui est vide se ferme,
après j'ai bien un "message" (Cette application empêche Windows de s'arrêter) mais il n'y avait rien dans la liste ... et elle est apparue 2 secondes.
le but de mon programme est d'interrompre l'arrêt de windows puis d'analyser si il y a une clé usb, si il ne trouve rien il arrête windows et le seul problème que j'ai avec XP c'est que si il ne détecte rien il arrêt windows même quand je clique sur redémarrer ... c'est normale vu le code que j'utilise ...
mais mon ordi a windows 7 et j'ai déjà perdu des donnés j'ai donc voulu créer une petite application mais elle n'a jamais fonctionné , voila pourquoi je suis ici ;-)
mon application démarre avec windows et va dans les icone a côté de l'heure (NotifyIcon).
Private Const WM_QUERYENDSESSION As System.Int32 = &H11 Private Const WM_CANCELMODE As System.Int32 = &H1F 'the sub to intercept the windows messages Protected Overrides Sub WndProc(ByRef ex As Message) If ex.Msg = WM_QUERYENDSESSION Then 'cancel the message Dim MyMsg As New Message MyMsg.Msg = WM_CANCELMODE MyBase.WndProc(MyMsg) detection_disk.Start() 'timer qui analyse les disques amovibles toute les 1000 ms(1sec)avec plusieurs If et un Else qui a pour commande d'arrêter windows Else 'send the message as normal MyBase.WndProc(ex) End If End Sub
c'est le code le plus important le reste c'est des fonctions qui sont appelé dans le timer "detection_disk" pour détecter les different type de disque .
Merci pour vos réponses.
-
J'ai l'impression que c'est plutôt un problème avec ton PC. Donc tu dis que ton windows affiche bien un message "Cette application empêche Windows de s'arrêter" mais que Windows s'arrête tout de même ce qui ne semble pas très cohérent.
De plus, je serais étonné que Windows n'arrête pas correctement les clés USB.
N'y aurait il pas par exemple une clé HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTasks à 1 ? Je vois par exemple sur http://www.pctipsbox.com/windows-xp-shutdown-too-slow-fix-it-to-shutdown-instantly/ qu'il est possible de contrôler l'extinction (XP mais je pense que cela reste probablement vrai pour les successeurs) en l'imposant et en la rendant plus rapide (ce qui pourrait ressembler à ce qui se passe actuellement sur ton PC).
Pour l'instant j'irais plutôt sur un forum Windows. J'ai l'impression que l'on essaie de résoudre par programmation qq chose qui est plutôt un problème de config...
Si c'est bien le cas, cette solution ne pourrait de toute façon pas fonctionner, Windows étant configuré pour justement passer outre...
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".- Modifié Patrice ScribeMVP, Moderator samedi 15 janvier 2011 21:31 Ajout dernière phrase.
-
Salut et merci de ton aide,
Désolé de répondre si tard mais hier je t'ai répondu mais ça n'apparaît plus aujourd'hui ??
Mes clé sont a mon avis normale ...
HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTasks est bien à 1
et
HKEY_CURRENT_USER\Control Panel\Desktop\WaitToKillAppTimeout est à 2000
donc mon windows a 2 problèmes :
1) impossible d'interrompre l'arrêt de windows
2)Windows n'arrête pas correctement mes clés USB
Merci beaucoup pour votre aide. ;-)
-
Non, chez moi je n'ai aucune de ces deux clés.
D'après l'article que j'ai indiqué, cela veut dire que Windows va "tuer" les applications au bout de 2 secondes. Cela explique sans doute à la fois que l'arrêt ne puisse pas être empêché ainsi que sans doute le problème avec les clés USB.
Supprime ces clés de registre et vois ce que cela donne. A l'arrêt Windows va alors fermer les clés USB et attendra la fin de cette fermeture (ou peut-être 12 à 20 secondes je crois par défaut ce qui devrait être suffisant) au lieu de tout interrompre au bout de 2 secondes.
Du coup faire un programme qui empêche l'arrêt de Windows deviendra sans doute inutile (et ne marchait pas car Windows était configuré pour le "tuer" au bout de 2 secondes).
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".- Marqué comme réponse Benny03 dimanche 16 janvier 2011 21:10
-
Salut Patrice, problème résolut !! c'est super Merci beaucoup ;-)
j'ai supprimer les 2 clés cliquer sur arrêter et mon ordi c'est arrêter .... mais je me suis dit que les modifications n'était pas d'application
recommencé après avoir redémarre le pc et maintenant j'ai mon programme (avec le textbox et les 2 boutons) dans une liste avec des caractère Chinois comme description ?
avec côté "Ce programme empêche windows de s'arrêter" ... c'est super !
le problème maintenant c'est que le code "ShutdownBlockReasonCreate(Me.Handle, TextBox1.Text)" fonctionne mais comme description (textbox1) j'ai des caractère chinois ...
Merci.
-
A priori mettre un attribut <MarshalAs(UnmanagedType.LPWStr)> devant le paramètre concerné.
Egalement, comme je disais, à mon avis écrire ce programme devient probablement inutile. Je soupçonne que le problème rencontré avec les clés USB était causé par ce même réglage, les opérations de fermeture n'ayant pas le temps de se terminer correctement à cause de ce réglage.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".- Modifié Patrice ScribeMVP, Moderator lundi 17 janvier 2011 11:57 Mise en forme HTML incorrecte
-
-
-
Je seconde TroXsA. Pas de souci, cela pourra éventuellement être utile à qq d'autre et de mon côté j'ignorais que l'on pouvait configurer la façon dont Windows s'arrête ou comment mettre un message explicite (d'une façon générale, j'ai appris pas mal de choses en répondant)...
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered". -