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

API, COM et SDKs Delphi Discussion :

Ecran de démarrage et icones


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut Ecran de démarrage et icones
    Bonjour,

    Je développe un petit utilitaire proche de l'écran de démarrage de windows.
    Il est simple de lancer une applic avec une forme semi transparente du même genre.

    Quand on lance l'écran de démarrage, windows permet de voir en transparence le fond d'écran du bureau,
    mais les icônes de raccourci sont masquées et les applis passent en minimisées.

    Je sais faire en sorte de minimiser les applis et les restituer à leur état après fermeture de mon utilitaire,
    mais comment faire pour les icônes des raccourcis, comment les recenser et les faire disparaître ?

    Merci pour votre aide

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    En passant par une énumération des composants enfants en partant du desktop jusqu'à trouver la liste.

    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
    procedure ShowDesktopIconList(aShow :boolean);
    const
      Flags :array[boolean] of integer = (SW_HIDE, SW_SHOWNORMAL);
    var
      Worker :hWnd;
      Wnd    :hWnd;
    begin
      Worker := 0;
     
      while TRUE do
      begin
        Worker := FindWindowEx(0, Worker, 'WorkerW', nil);
        if Worker = 0 then Exit;
     
        Wnd := FindWindowEx(Worker, 0, 'SHELLDLL_DefView', nil);
        if Wnd = 0 then Continue;
     
        Wnd := FindWindowEx(Wnd, 0, 'SysListView32', nil);
        if Wnd <> 0 then
        begin
          ShowWindow(Wnd, Flags[aShow]);
          Exit;
        end;
      end;
    end;

  3. #3
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Merci AndNoTor,

    Je viens de trouver une autre manière qui ressemble beaucoup à la tienne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure ShortCutIsVisible(value: boolean);var
       Hdn: Thandle;
    begin
         hdn:= FindWindowEx(0,0, 'Progman',nil);
         if value then
            ShowWindow(hdn, 5)
         else
             ShowWindow(hdn, 0);
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Tu développes encore sous Win7 alors, Progman n'existe plus depuis Win10...

    Et pour information, l'écran d'autentification est un autre bureau (Winlogon) et non le bureau utilisateur sans icône (Default).

  5. #5
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu développes encore sous Win7 alors, Progman n'existe plus depuis Win10...

    Et pour information, l'écran d'autentification est un autre bureau (Winlogon) et non le bureau utilisateur sans icône (Default).
    M....de

    Mon EDI est sous VM Win7, mais je développe pour Win10, sauf que je n'ai pas encore testé...pas cool ta révélation.

    Edit: En tout cas, sous Win7, ça marchait bien. fin edit

    Bon, pas grave, je ne développe plus que pour moi, puisque je suis à la retraite depuis 2017

    Je vais regarder ça avant d'aller plus loin, peut être que GetDesktopWindow me renverra le bon Handle pour faire ce que je veux.
    Dans ton code, je suppose que WorkerW désigne le bureau de travail en cours ?

    Merci en tout cas,

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Citation Envoyé par castorcharly Voir le message
    peut être que GetDesktopWindow me renverra le bon Handle pour faire ce que je veux.
    Non si tu veux masquer que des éléments du bureau.

    Citation Envoyé par castorcharly Voir le message
    Dans ton code, je suppose que WorkerW désigne le bureau de travail en cours ?
    Non, ce sont des objets appartenant au bureau. 0 en premier paramètre de FindWindowEx est équivalent à GetDesktopWindow : recherche des enfants directs du bureau.

    Tu peux cependant conditionner tout cela :
    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
    procedure ShowDesktopIconList(aShow :boolean);
    const
      Classes :array[boolean] of string = ('Progman', 'WorkerW');
      Flags   :array[boolean] of integer = (SW_HIDE, SW_SHOWNORMAL);
    var
      Wnd :hWnd;
    begin
      Wnd := 0;
     
      while TRUE do
      begin
        Wnd := FindWindowEx(0, Wnd, PChar(Classes[TOSVersion.Check(10)]), nil);
        if Wnd = 0 then Exit;
     
        if FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil) <> 0 then
        begin
          ShowWindow(Wnd, Flags[aShow]);
          Exit;
        end;
      end;
    end;
    Par contre je constate que sous Win8 le papier peint appartient à Progman et disparaît, contrairement à 7 ou 11 (j'ai plus 10). Je chercherais plus profondément jusqu'à trouver SysListView32.

    Sinon pourquoi ne pas simplement ouvrir une fenêtre plein écran, StayOnTop qui reprend le papier peint en fond ?

  7. #7
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Merci pour toutes ces précisions, y a beaucoup de choses qui ont changées en qq.s années.

  8. #8
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    J'ai une bizarrerie sur mon PC,
    autant ça fonctionne bien sur Seven, (avec progman en dur ou ton dernier code avec progman et WorkerW,
    mais sous Win10, pas moyen.

    J'ai donc regardé ce que testait ton code et j'ai fait un bête TOSVersion.toString
    pour voir ce que ma machine sous Win10 renvoyait
    et là surprise, toString me renvoi: Windows 8 (Version 6.2, Built 9200, Edition 64 bits) !

    J'ai passé en dur WorkerW nada, aucune réaction, j'ai tenté avec Progman, pareil.

    Pourtant ma machine est bien en Windows 10 Pro - 64 bits - version 22H2 ?
    Je ne sais quoi penser, bug de mon RAD, qui date un peu, je suis sous XE7 Archi, ou de ma version de Windows, même à jour (à priori pas de défaut de Maj).

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 988
    Par défaut
    L'exe est lancé via un Raccourci ?
    Il n'y a pas eu au premier lancement une demande de compatibilité ?
    Et du coup c'est la version compatibilité qui serait retourné par TOSVersion.toString ?

    TOSVersion.toString retourne par exemple 'Windows 10 (Version 10.0, Build 0, 64-bit Edition)'

    Le code fonctionne sur mon Win10 pour info
    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

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par castorcharly Voir le message
    je suis sous XE7 Archi,
    TOSVersion.toString me renvoi: Windows 8 (Version 6.2, Built 9200, Edition 64 bits) !
    je crois que c'est "normal", windows 10 (2015-07-29) n'était pas encore sorti à l'époque de XE7 (2014-10-2)

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 988
    Par défaut
    Effectivement, en XE7 c'était encore 6.3, 6.2 ... Check(10) ça ne pas fonctionner car 10 ce n'est pas le numéro version interne qui doit être toujours à 6.3

    Si l'on regarde le code de D10, pour savoir si c'est un Windows 10, cela regarde la version du fichier 'kernel32.dll' car GetVersionEx plafonne à 6

    toString est généré par Delphi à partir des valeurs calculées, si GetVersionEx plafonne à 6.2, il affiche Win8

    GetVersionEx
    Les applications sans manifest pour Windows 8.1 ou Windows 10 retournent la valeur de version du système d’exploitation Windows 8 (6.2).
    Sinon GetVersionEx retourne toujours la version ciblé par le manifeste
    ... du coup, le numéro est totalement bidon

    Je me souviens d'ailleurs cette découverte : Récupération de la version de l'OS (problème et bug), il faudrait importer manuellement IsWindows10OrGreater une macro qui encapsule VerifyVersionInfoW en fait, si la fonctionne n'existe pas dans 'kernel32.dll' c'est que c'est un windows plus ancien que XP.



    En tout cas, en dehors de problème de version, sur Win10, cacher WorkerW avec comme efant SHELLDLL_DefView n'a fonctionné qu'une seule fois !
    Curieusement les appels suivants n'ont pas eu d'effet
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Il faut ajouter manuellement un manifeste déclarant Win10.

    Une autre possibilité, passer par RtlGetVersion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function RtlGetVersion(var aVersionInfo :TOSVersionInfo) :HResult; stdcall; external 'ntdll.dll' name 'RtlGetVersion';

  13. #13
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Merci à tous pour votre participation.
    Qu'il y est un problème via un bug sur Delphi ou sur Windows, masque l'essentiel de mon soucis.

    Mon objectif étant de masquer les icones sur le bureau et de réduire ou masquer les fenêtre des applis.
    Avec ce problème de version, j'ai contourné le bug (ou une erreur de ma part), en passant en dur les appels.
    Il est facile de forcer la recherche du handle de la fenêtre du bureau en passant WorkerW ou Progman dans le code,
    plutôt que de laisser le programme identifier la version de Windows.

    Le résultat est sous Seven, en utilisant progman en dur ça fonctionne très bien
    Sous ma version de Win10, WorkerW, n'a aucun effet et si je passe Progman, même résultat.

    Voici mon petit bout de code pour test:

    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
     
     
    function SetShortCutVisible(aShow :boolean; Target: integer): boolean;
    const
      Classes :array[0..1] of string = ('Progman', 'WorkerW');
      Flags   :array[boolean] of integer = (SW_HIDE, SW_SHOWNORMAL);
    var
       Wnd :hWnd;
    begin
         result:= false;
         Wnd:= 0;
         Wnd:= FindWindowEx(0, Wnd, PChar(Classes[Target]), nil);
         if Wnd = 0 then Exit;
         if FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil) <> 0 then begin
            ShowWindow(Wnd, Flags[aShow]);
            result:= true;
            Exit;
         end;
    end;

  14. #14
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Après une bonne nuit, j'ai repris le collier et le code ci-dessous fonctionne sous mon Win10

    Je l'avais zappé

    Il me suffira de faire la détection de la version d'OS via la lecture des infos de Kernel32.



    Citation Envoyé par Andnotor Voir le message
    En passant par une énumération des composants enfants en partant du desktop jusqu'à trouver la liste.

    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
    procedure ShowDesktopIconList(aShow :boolean);
    const
      Flags :array[boolean] of integer = (SW_HIDE, SW_SHOWNORMAL);
    var
      Worker :hWnd;
      Wnd    :hWnd;
    begin
      Worker := 0;
     
      while TRUE do
      begin
        Worker := FindWindowEx(0, Worker, 'WorkerW', nil);
        if Worker = 0 then Exit;
     
        Wnd := FindWindowEx(Worker, 0, 'SHELLDLL_DefView', nil);
        if Wnd = 0 then Continue;
     
        Wnd := FindWindowEx(Wnd, 0, 'SysListView32', nil);
        if Wnd <> 0 then
        begin
          ShowWindow(Wnd, Flags[aShow]);
          Exit;
        end;
      end;
    end;

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

Discussions similaires

  1. ecran rouge avant apparition des icones windows
    Par Dnetman dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 03/02/2015, 11h30
  2. [SageX3V5] Cacher un libellé d'icône sur un écran
    Par Cereal123 dans le forum SAGE
    Réponses: 2
    Dernier message: 27/08/2014, 11h18
  3. Réponses: 6
    Dernier message: 28/03/2010, 23h59
  4. icône qui suit le curseur à l'écran
    Par laurentSc dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 15/12/2009, 08h51
  5. [VB]écran de veille qui reste en icone réduite
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 25/04/2006, 23h51

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