IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

[D6][Windows 11 64 bits] Détecter la fin de session


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut [D6][Windows 11 64 bits] Détecter la fin de session
    Bonjour à toutes et à tous,

    Dans le temps il était facile d'ajouter un son à l'ouverture et à la fermeture de Windows.

    Pour l'ouverture j'ai mis le son dans le dossier Démarrage, c'est ok.

    Pour la fermeture, avec Win 11 on suggère de modifier 3 clés de registre pour ce faire mais niet.

    J'avais pensé à récupérer la fin de session mais apparemment cela ne fonctionne pas ou alors je devrai laisser l'application en arrière plan.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     private
        { Déclarations privées }
      procedure EndSession(var Msg: TMessage); message WM_QUERYENDSESSION;
    .....
     
    procedure TForm1.EndSession(var Msg: TMessage);
    begin
     w1.Play; //W1 contient le fichier .wav
     inherited;
    end;
    Si quelqu'un avait une solution merci d'avance.

    @+,

    cincap

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    En cherchant, il existe une piste en C# :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    using System.Windows;
     
    namespace SDKSample
    {
        public partial class App : Application
        {
            void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
            {
                // Ask the user if they want to allow the session to end
                string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
                MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);
     
                // End session, if specified
                if (result == MessageBoxResult.No)
                {
                    e.Cancel = true;
                }
            }
        }
    }

    Mais modifier le C# en Delphi pas assez expérimenté si quelqu'un pouvait tester le code.

    Je continue mes recherches et mes essais.

    @+,

    cincap

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Le code C# est intraduisible et ce qu'il contient n'a aucun intéret, c'est juste un message qui s'affiche

    App_SessionEnding c'est un évènement standard, tout le mécanisme de capture est masqué.
    Or, toi tu veux justement ce qui est masqué par le .NET

    WM_QUERYENDSESSION c'est avant la fin de session, je crois que c'est ce qui permet d'afficher le panneau où les applications informent qu'elles doivent d'abord finir une tache, comme la sauvegarde d'un fichier
    Tu dois retourner True ou False plutôt que inherited
    Tu ne dois pas lancer le Play à ce moment si c'est pour lancer un son d'arrêt, il faut impérativement un retour immédiat et lancer de façon asynchrone la tache de fin (à l'extrème ShutdownBlockReasonCreate/ShutdownBlockReasonDestroy

    WM_ENDSESSION, c'est lorsque la session s'arrête
    Là tu as droit à un délai pour garantir que ton programme a fini sa tache importante



    Par contre, je l'aurais mis dans un OnMessage du TApplicationEvents et non dans une TForm, je ne crois pas que toutes les fenêtres soient notifiées mais plutôt la "fenêtre" masquée TApplication.
    En fait ça doit dépendre de MainFormOnTaskbar mais tu n'utiliserais pas un vieux D6 ?
    Aujourd'hui, il devient difficile de répondre pour D6 lorsque l'on utilise D10 au quotidien.

    Pour D6, je redéfinirais la WndProc pour choper le message, il est peut-être en dehors de la plage que le TApplication dispatch à la MainForm.
    HookMainWindow existe en D6 ?


    Citation Envoyé par cincap Voir le message
    ... je devrai laisser l'application en arrière plan.
    Euh évidemment, tu n'as un message qui si ton programme est en cours d'execution pour l'informer qu'il faut que se ferme proprement
    Là, j'ai l'impression que tu veux juste déclencher ce son à l'arrêt sans lien avec un arrêt propre de ton programme

    Genre le son système que l'on modifiait sous Win98 via la BDR ... c'est tellement Old School ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, merci pour toutes ces infos.

    Apparemment Windows 11 n'a pas prévu de mettre un son au démarrage ni à la fermeture malgré la modification des clés DWord "WindowsLogon et Windowslogoff" pour afficher dans la liste des sons "Modifier les sons système".

    Même en copiant les sons dans le répertoire "C:\Windows\Media".

    Je ne vais pas fermer le topic on ne sait jamais.

    @ +,

    cincap

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Pour information il est facile de faire apparaitre la boite de dialog pour fermer Windows 11 avec d'autres choix.

    En ajoutant dans le uses comobj;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      shell: Variant;
    begin
      shell := CreateOleObject('Shell.Application');
      shell.ShutdownWindows;
    end;
    @+,

    cincap

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    Après bien des tests voici la solution pour celui qui veut un son a la fermeture du PC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    private
        { Déclarations privées }
     
    procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
     
    ----
     
    procedure TForm1.WMEndSession(var Msg: TWMEndSession);
    begin
     if Msg.EndSession = True then begin
     
    w1.Play; //Important avant le message !
     
    ShowMessage(
          'Windows is shutting down ' + #10#13 + 'at ' + FormatDateTime('c', Now)
        );
     
      inherited;
    end;
    end;
    Ce code peut peut-être amélioré ?

    Je ferme le topic.

    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détecter la fin de chargement de Windows
    Par megaben dans le forum VB.NET
    Réponses: 5
    Dernier message: 28/09/2009, 04h32
  2. [D6] Détecter la fin du démarrage de la session Windows
    Par Lung dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 04/02/2009, 23h48
  3. [Réseau] détecter la fin de lecture dans un flux entrant
    Par al85 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 30/03/2005, 21h06
  4. [TMediaPlayer] Détecter la fin de lecture
    Par ysr1 dans le forum C++Builder
    Réponses: 1
    Dernier message: 30/09/2004, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo