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

Lazarus Pascal Discussion :

Un écran de confidentialité numérique sous Windows, un tutoriel de Christophe Piquer


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Chrispi
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Juin 2020
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2020
    Messages : 279
    Par défaut Un écran de confidentialité numérique sous Windows, un tutoriel de Christophe Piquer
    Ce tutoriel montre l’élaboration d’une application fonctionnant sous Windows qui permet à l'utilisateur d'un PC de masquer son écran temporairement en mettant en œuvre en quelque sorte un écran de confidentialité numérique.
    Ce masquage numérique convient uniquement pour les absences de très courte durée de l'utilisateur face à son écran tout en demeurant non loin de celui-ci.
    La solution proposée n’est pas le top mais elle peut plutôt être considérée comme palliative le temps de l'acquisition d'une application qui permet à l'utilisateur de se reconnecter par la simple apposition d'une carte à puce sur un lecteur associé au PC.

    https://chrispi.developpez.com/tutor...alite-windows/

    Et vous ?
    Que pensez-vous de ce tutoriel ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 989
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 989
    Par défaut
    Peut-être un oubli, il n'y a pas la source complète. Sans elle certaines remarques peuvent être hors contexte

    On ne voit pas où est appelé CheckPrivacyWindow mais d'après le prototype TNotifyEvent on peut supposer que ce soit sur un timer. A la place il serait possible de s'enregistrer comme récepteur d'événements systèmes par SetWinEventHook. Celui qui t'intéresserait est EVENT_SYSTEM_FOREGROUND.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Hook := SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, 0, @WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT or WINEVENT_SKIPOWNPROCESS)];
     
    procedure WinEventProc(hWinEventHook: THandle; Event: dword; Wnd: hWnd; idObject, idChild, idEventThread, dwmsEventTime: dword); stdcall;
    begin
      if (idObject = OBJID_WINDOW) and (Event = EVENT_SYSTEM_FOREGROUND) then
        SetWindowPos(MyFormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE);
    end;
    Le hook clavier est-il bien nécessaire ? Comme déclaré actuellement il affecte le système complet, est-ce le but ? Si ça ne concerne que ta fenêtre il faudrait plutôt définir dwThreadId que hMod.
    A noter que si la fenêtre était inactivable elle ne recevrait aucune touche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TfMain.CreateParams(var params: TCreateparams);
    begin
      inherited;
      params.exstyle := params.exstyle or WS_EX_NOACTIVATE;
    end;
    Sur le principe, les complications sont dues au fait que tu restes sur un bureau ayant lancé le shell en toile de fond. Tu aurais pu t'inspirer du lock screen en créant ton propre bureau, ton app (invisible) ne faisant finalement plus que traiter le raccourci de réouverture.

    La même application se suffirait sur les deux bureaux, elle aurait juste un comportement différent en fonction d'un paramètre passé à CreateProcess.

    Un exemple (Delphi) d'une app console créant un nouveau bureau et lançant notepad.exe. Le bureau utilisateur est restaurer lorsque notepad se ferme.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      Winapi.Windows;
     
    const
      LockDesktopName = 'LockDesktop';
     
    var
      UserDesktop: HDESK;
      LockDesktop: HDESK;
      SI: TStartupInfo;
      PI: TProcessInformation;
     
    begin
      UserDesktop := GetThreadDesktop(0);
      LockDesktop := CreateDesktop(LockDesktopName, nil, nil, 0, GENERIC_ALL, nil);
     
      try
        ZeroMemory(@SI, SizeOf(TStartupInfo));
        SI.cb := SizeOf(TStartupInfo);
        SI.lpDesktop := LockDesktopName;
     
        if CreateProcess('C:\Windows\notepad.exe', nil, nil, nil, FALSE, 0, nil, nil, SI, PI) then
        try
          SwitchDesktop(LockDesktop);
          WaitForSingleObject(PI.hProcess, INFINITE);
          SwitchDesktop(UserDesktop);
        finally 
          CloseHandle(PI.hProcess);
          CloseHandle(PI.hThread);
        end;
     
      finally
        CloseDesktop(LockDesktop);
      end;
    end.

  3. #3
    Rédacteur
    Avatar de Chrispi
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Juin 2020
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2020
    Messages : 279
    Par défaut
    Bonjour Andnotor,

    Peut-être un oubli, il n'y a pas la source complète.
    Oui Bien vu.

    On ne voit pas où est appelé CheckPrivacyWindow mais d'après le prototype TNotifyEvent on peut supposer que ce soit sur un timer.
    Oui c'est ça.

    J'ai apporté les corrections dans le tuto.

    Pour le reste je vais y regarder.

    Merci pour tes remarques.

    Cordialement,

    Chrispi

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 713
    Par défaut
    Bonjour,

    Si je trouve que c'est intéressant en terme d'exemple de programmation, je ne vois cependant pas l'avantage comparé à un programme qui activerait l'écran de veille, voire passerait en veille profonde.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 989
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 989
    Par défaut
    Citation Envoyé par Chrispi Voir le message
    J'ai apporté les corrections dans le tuto.
    mmmh! ça doit pas être juste, tu as maintenant deux événements pour le même timer : TtIdleTimer et CheckIdleAndLogoff.

    Je dois dire que j'aime moyen sa gestion.
    • Il ne devrait être activé que lorsque F_Priv est visible.
    • Son intervalle fixé à 10 minutes puisque c'est la durée souhaitée (GetIdleTime n'est pas vraiment utile).
    • Il est désactivé au verrouillage de la station, où est-il redémarré au déverrouillage ? Il manque la gestion de WM_WTSSESSION_CHANGE (WTS_SESSION_UNLOCK) après un appel à WTSRegisterSessionNotification.
      F_Priv devrait également être masquée au verrouillage sinon l'utilisateur va se retrouver avec un écran noir à la réouverture.

  6. #6
    Rédacteur
    Avatar de Chrispi
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Juin 2020
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2020
    Messages : 279
    Par défaut
    Bonjour,

    Andnotor : J'ai de nouveau apporté des modifications.

    Il ne devrait être activé que lorsque F_Priv est visible.
    C'est le cas.

    F_Priv devrait également être masquée au verrouillage sinon l'utilisateur va se retrouver avec un écran noir à la réouverture.
    L'utilisateur ne retrouve pas l'écran noir au déverrouillage de sa session. Si nécessaire, il peut réactiver l'écran de confidentialité (l'écran noir) par exemple en double-cliquant sur l'icône de l'application. Les 10 min d'inactivité avant verrouillage de la session de l'utilisateur seront à nouveau comptées.

    Guesset : Utiliser l'écran de veille c'est peut-être un peu plus compliqué d'une part.

    https://support.microsoft.com/fr-fr/...d-8c972e8e6eff

    Et d'autre part, est-ce que ça correspond bien au besoin ?

    Cordialement,

    Chrispi

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/05/2019, 19h10
  2. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 13h15
  3. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 18h45

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