Créer un fichier lors de la fermeture de windows

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Créer un fichier lors de la fermeture de windows

Message par falsam »

Ce code permet de créer un fichier quand windows est en cours de fermeture. Ce code est il suffisamment secure ?

Code : Tout sélectionner

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  Protected result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_ENDSESSION, #WM_CLOSE
      CreateFile(0, "test.txt")
      WriteString(0, "Fermeture")
      CloseFile(0)      
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 400, 400, "#WM_ENDSESSION", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        End 
      EndSelect 
  ForEver 
EndIf 
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
digital
Messages : 25
Inscription : mar. 02/févr./2016 0:34

Re: Créer un fichier lors de la fermeture de windows

Message par digital »

Bon et bien merci falsam pour le code mais comme on à discuter cela pause soucis quand on à déja une boucle principal qui prend un certain temps à effectuer le calcul.
Et comme je ne trouve aucun moyen de lancer ce code dans un Thread tout en le gardant opérationnel.


Du coup je me suis tourné sur l'API GetSystemMetric qui propose entre autre de détecter si l'ordinateur est en train de s'éteindre.
Voila un petit code très rudimentaire.

Code : Tout sélectionner

OpenFile(0,"C:\shutdown.txt")
Repeat

  IsSleepingOff = GetSystemMetrics_(#SM_SHUTTINGDOWN)
  If IsSleepingOff = 0 
    Else 
      Debug IsSleepingOff
      WriteStringN("PC éteint")
EndIf 

  
ForEver
L'avantage c'est que je peut l'utiliser dans une procédure et faire un appel via CreateThread() sans que PureBasic ne bronche.
Je testerai d'avantage mais ça marche plutôt bien pour l'instant.
digital
Messages : 25
Inscription : mar. 02/févr./2016 0:34

Re: Créer un fichier lors de la fermeture de windows

Message par digital »

Le copier coller à fail effectivement:
Il ne pouvais fonctionner vu que dans WriteStringN j'avait oublié de spécifier quel fichier texte ou écrire :)

Voila le code que j'utilise dans mon application.

Code : Tout sélectionner

Procedure CheckShutdown(*Value)
OpenFile(0,"C:\shutdown.txt")
Repeat
Delay(1)
  IsSleepingOff = GetSystemMetrics_(#SM_SHUTTINGDOWN)
  If IsSleepingOff = 0 
    Else 
      Debug IsSleepingOff
      WriteStringN(0,"PC éteint")
EndIf 
ForEver  
EndProcedure 


CreateThread(@CheckShutdown(),1)

While 1 = 1
  Debug "Et voila ça fonctionne "
  Delay(100)
Wend

J'ai utiliser un Thread mais ont est pas obliger évidemment.
-> Pas besoin d'avoir une application de type fenêtre
-> Pas de soucis à utiliser avec un Thread

Inconvénient par rapport à la méthode de falsam:
-> Consomme un peu plus en CPU/RAM (d'ou le Delay(1) que j'ai placer sinon c'est infâme)
-> Là on attend pas un évent on check juste en permanence

Voila après si vous avez un code de disponible plus propre mais qui fonctionne en console je suis tout ouïe.
A voir comme ça sa fait le taff, je revienderai si y'a des souçis ou une petite maj :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Créer un fichier lors de la fermeture de windows

Message par Ar-S »

@digital
Tu pourrais peut-être utiliser un timer plutôt que cette boucle avec delay et un thread.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Créer un fichier lors de la fermeture de windows

Message par Mesa »

Il est peut-être plus prudent de laisser faire Windows, en le laissant découvrir le moment où il se ferme ou se deloggue et de le laisser exécuter un script ou un bat avec la stratégie de groupe de Windows. C'est plus simple qu'il n'y parait.
Je pense que le script ou le batch peut lancer un exe fait par PB.
Ça marche avec xp pro et +, à voir si xp famille peut le faire ou non.


Voir ici:
https://technet.microsoft.com/en-us/lib ... 53404.aspx

http://superuser.com/questions/345298/r ... -on-logoff

http://www.nextofwindows.com/how-to-run ... indows-7-8

M.
digital
Messages : 25
Inscription : mar. 02/févr./2016 0:34

Re: Créer un fichier lors de la fermeture de windows

Message par digital »

@Spock

Effectivement ça serai plus propre de rajouter le CloseFile(0)
imagine que l'ordi s’éteigne avant la fin de ton prg , ton fichier ne sera pas ecrit !
Si on émet cette hypothèse sachant que c'est la dernière chose que le programme fait, bah si il à pas eu le temps d'écrire cette ligne il à pas eu le temps de CloseFile

Vu que le but justement est d'enregistrer avant que l'ordinateur ne s'éteigne, si windows ignore notre code. (par exemple si l'utilisateur éteint son PC via son bouton Power, CloseFile ou pas ça ne change rien)

Pour ça que je n'ai pas trouver utile dans ce cas très précis, mais effectivement ça ne mange pas de pain.


@Mesa
C'est ce que fait le code de Falsam ou le mien, en aucun cas Windows est totalement bloquer, dans mon code il détecte justement le moment ou il se ferme, dans celui de Falsam de même, et dispose d'un laps de temps (~5 Sec) pour effectuer une action.
Pour une sauvegarde rapide ou l'exécution d'un code rapide c'est parfait.

Mais ton idée est assez intéressante, dans le cas ou le traitement serai important, l'utilisation via un batch script pourrait permettre de stopper le pc de s'éteindre, d'effectuer son traitement et executer à nouveau l'extinction de l'ordinateur de manière à ce que ce soit transparent.
Après ceci dit le délai offert est amplement suffisant pour mon cas d'utilisation.
Répondre