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 :

Cacher le bouton "Demarrer" de windows et en particulier de seven


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 402
    Points : 300
    Points
    300
    Par défaut Cacher le bouton "Demarrer" de windows et en particulier de seven
    Bonjour,
    Je n'arrive pas à cacher le bouton Demarrer de windows. Les différentes solutions proposées en Pascal ne fonctionnent pas pour ce bouton.
    J'ai une application en C# qui fonctionne et qui utilise : GetVistaStartMenuWnd

    Est ce que cette function existe en Delphi ou sinon comment la recréer ?

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Voilà une conversion rapide de ta fonction.

    Sur Window Seven, ça fonctionne, je n'ai pas testé ailleurs.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    interface
     
     
    procedure showTaskBar;
    procedure HideTaskBar;
     
     
    implementation
     
     
    uses Math, System.Generics.Collections, TlHelp32,Windows;
     
     
    var
      vistaStartMenuWnd: Integer;
     
     
    const
      SW_SHOW = 5;
      SW_HIDE = 0;
      VistaStartMenuCaption = 'Start';
     
     
    function MyEnumThreadWindowsProc(Wnd: hwnd; Data: lParam): Boolean;
    var
      buffer: array [0 .. 255] of char;
    begin
      if (GetWindowText(Wnd, buffer, Length(buffer)) > 0) then
      begin
        if (buffer = VistaStartMenuCaption) then
        begin
          vistaStartMenuWnd := wnd;
          result := false;
          exit;
        end;
      end;
      result := TRUE;
    end;
     
     
     
     
    function ListProcessThreads(dwOwnerPID: DWORD;pList:Tlist<Integer>): Boolean;
    var
      hThreadSnap: THANDLE;
      te32: TThreadEntry32;
      NextProc: Boolean;
    begin
      pList.Clear;
      // Take a snapshot of all running threads
      hThreadSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
      if (hThreadSnap = INVALID_HANDLE_VALUE) then begin
        result := false;
        exit;
      end;
     
     
      // Fill in the size of the structure before using it.
      te32.dwSize := sizeof(THREADENTRY32);
     
     
      // Retrieve information about the first thread,
      // and exit if unsuccessful
      NextProc := Thread32First(hThreadSnap, te32); // get the first Thread
      while NextProc do
      begin
     
     
        if te32.th32OwnerProcessID = dwOwnerPID then // Check the owner Pid against the PID requested
        begin
          pList.Add(te32.th32ThreadID);
        end;
     
     
        NextProc := Thread32Next(hThreadSnap, te32); // get the Next Thread
      end;
      // Don't forget to clean up the snapshot object.
      CloseHandle(hThreadSnap);
      result := TRUE;
    end;
     
     
     
     
    function GetVistaStartMenuWnd(var taskBarWnd: Integer): IntPtr;
    var
      procId: Cardinal;
      lList: TList<Integer>;
      i: Integer;
    begin
      // get process that owns the taskbar window
      GetWindowThreadProcessId(taskBarWnd, procId);
      lList := TList<Integer>.Create;
      ListProcessThreads(procId, lList);
      for i := 0 to lList.Count - 1 do begin
        EnumThreadWindows(lList[i], @MyEnumThreadWindowsProc, 0);
      end;
      result := vistaStartMenuWnd;
    end;
     
     
    procedure SetVisibility(show: Boolean);
    var
      startWnd, taskBarWnd: Integer;
    begin
      // get taskbar window
      taskBarWnd := FindWindow('Shell_TrayWnd', nil);
     
     
      // try it the WinXP way first...
      startWnd := FindWindowEx(taskBarWnd, 0, 'Button', 'Start');
     
     
      if (startWnd = 0) then
      begin
        // try an alternate way, as mentioned on CodeProject by Earl Waylon Flinn
        startWnd := FindWindowEx(0, 0, Pointer($C017), 'Start');
      end;
     
     
      if (startWnd = 0) then
      begin
        // ok, let's try the Vista easy way...
        startWnd := FindWindow('Button', nil);
     
     
        if (startWnd = 0) then
        begin
          // no chance, we need to to it the hard way...
          startWnd := GetVistaStartMenuWnd(taskBarWnd);
        end;
      end;
     
     
      ShowWindow(taskBarWnd, IfThen(show, SW_SHOW, SW_HIDE));
      ShowWindow(startWnd, IfThen(show, SW_SHOW, SW_HIDE));
    end;
     
     
    procedure HideTaskBar;
    begin
      SetVisibility(false);
    end;
     
     
     
     
    procedure showTaskBar;
    begin
      SetVisibility(TRUE);
    end;
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    une version localisée en Français sur un Seven 64 Bi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      StartBtn: HWND;
    begin
      StartBtn := FindWindow('Button', 'Démarrer');
      if StartBtn > 0 then
        ShowWindow(StartBtn, SW_HIDE); // Ne fais rien !!!!
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      StartBtn: HWND;
    begin
      StartBtn := FindWindow('Button', 'Démarrer');
      if StartBtn > 0 then
        CloseWindow(StartBtn); // Etrange, on voit un léger scintillement du bouton, il n'est pas caché mais le clic ne fonctionne plus dessus !!!
    end;
    Cela cache tout la barre de taches, c'est bien dommage, je n'arrive pas à cacher juste le bouton
    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
    var
      TrayWnd, StartBtn, StartBtn2: HWND;
    begin
      StartBtn := FindWindow('Button', 'Démarrer');
      if StartBtn > 0 then
      begin
        TrayWnd := FindWindow('Shell_TrayWnd', nil);
        StartBtn2 := FindWindowEx(TrayWnd, 0, 'Button', 'Démarrer'); // ne trouve rien, j'ai eu le temps de tester le hard way...
     
        ShowWindow(TrayWnd, SW_HIDE);
        if StartBtn2 > 0 then
          ShowWindow(StartBtn2, SW_HIDE)
        else
          ShowWindow(StartBtn, SW_HIDE);
      end;
    end;
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      StartBtn: HWND;
    begin
      StartBtn := FindWindow('Button', 'Démarrer');
      if StartBtn > 0 then
        ShowWindow(StartBtn, SW_HIDE); // Ne fais rien !!!!
    end;
    Si, ça fonctionne, le bouton est bien caché mais le gag est que l'image du bouton est aussi dessinée sur la barre des tâches
    Il faudrait encore déplacer la barre de boutons, mais l'effet est temporaire jusqu'à ce qu'une application démarre ou quitte ce qui entraîne une réorganisation de la barre des tâches. Il faudrait encore intercepter WM_MOVE/WM_SIZE (hook)
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    var
      OldRect :TRect;
     
    procedure TForm1.bHideClick(Sender: TObject);
    var
      StartBtn: hWnd;
      TaskBar : hWnd;
      TrayWnd : hWnd;
    begin
      StartBtn := FindWindow('Button', 'Démarrer');
     
      if StartBtn <> 0 then
      begin
        ShowWindow(StartBtn, SW_HIDE);
     
        TrayWnd := FindWindow('Shell_TrayWnd', nil);
     
        if TrayWnd <> 0 then
        begin
          TaskBar := FindWindowEx(TrayWnd, 0, 'ReBarWindow32', nil);
     
          if TaskBar <> 0 then
          begin
            GetWindowRect(TaskBar, OldRect);
            MoveWindow(TaskBar, 0, 0, OldRect.Width +OldRect.Left, OldRect.Height, TRUE);
          end;
        end;
      end;
    end;
     
    procedure TForm1.bShowClick(Sender: TObject);
    var
      StartBtn: hWnd;
      TaskBar : hWnd;
      TrayWnd : hWnd;
    begin
      StartBtn := FindWindow('Button', 'Démarrer');
     
      if StartBtn <> 0 then
      begin
        ShowWindow(StartBtn, SW_SHOW);
     
        TrayWnd := FindWindow('Shell_TrayWnd', nil);
     
        if TrayWnd <> 0 then
        begin
          TaskBar := FindWindowEx(TrayWnd, 0, 'ReBarWindow32', nil);
     
          if TaskBar <> 0 then
            MoveWindow(TaskBar, OldRect.Left, 0, OldRect.Width, OldRect.Height, TRUE);
        end;
      end;
    end;

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Si, ça fonctionne, le bouton est bien caché mais le gag est que l'image du bouton est aussi dessinée sur la barre des tâches
    J'ai remarqué cela après car en faisant ce code, on se retrouve avec une image qui flotte dans le vide !
    C'est le bidouille pour gérer l'effet de luminosité ?
    Nom : start in space.jpg
Affichages : 454
Taille : 2,7 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      TrayWnd: HWND;
    begin
        TrayWnd := FindWindow('Shell_TrayWnd', nil);
        ShowWindow(TrayWnd, SW_HIDE);
    end;
    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

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 402
    Points : 300
    Points
    300
    Par défaut
    Bonsoir et merci à tous pour votre aide.
    Je viens d'essayer les différentes solutions et la seule qui fonctionne c'est celle de Linkin.
    Je me suis contenté de l'essayer telle quelle sans regarder trop comment c'est fait, mais cela ressemble très fortement à la solution en C# que j'avais vue.
    J'ai testé et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindWindow('Button', 'Démarrer');
    ne trouve jamais rien !! j'ai aussi essayé avec 'Start' même résultat.

    Seule la méthode GetVistaStartMenuWnd semble donner un résultat correct avec Seven. Avec 8.1 j'efface bien la barre des tâches, mais le bouton que rajoute "StartMenu8" reste mais là c'est autre chose et il suffit de rester avec 8.1 sans "StartMenu" et le problème est résolu.

    Encore merci.
    Bernard

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Cela y ressemble car c'est la solution C# traduite en delphi
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Ça ressemble peut-être mais ça ne peut pas marcher (après essai, ça ne marche d'ailleurs pas) simplement parce que la convention d'appel de la procédure MyEnumThreadWindowsProc devrait être stdcall
    C'est un des FindWindow(Ex) précédents qui renvoie quelque chose, sans doute FindWindow('Button', nil).

    Shai avait averti que son exemple était pour un OS en français, en quelle langue est le tient ?

    Citation Envoyé par ShaiLeTroll Voir le message
    C'est le bidouille pour gérer l'effet de luminosité ?
    Je pense que c'est juste un "leurre" le temps que le bureau soit chargé au démarrage (chez moi, les deux images sont de tailles légèrement différentes )

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 402
    Points : 300
    Points
    300
    Par défaut
    Exact Andnotor, sous seven (je viens de faire un test sur une autre machine), c'est bien FindWindow('Button', nil) qui répond.

    Mon OS est bien en français et en 64 bits.

    Sous 8 on passe bien dans la procédure MyEnumThreadWindowsProc et comme il n'y a pas de menu démarrer cela ne fait rien ?
    Comment devrait être devrait être faite la déclaration pour que cela puisse éventuellement fonctionner (futur windows 10)? en d'autre termes où mettre le stdcall ? il me semble qu'il faut le mettre dans la partie implémentation des unités, là comme il est dans la même unité où le met-on ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par Bernard B Voir le message
    Mon OS est bien en français et en 64 bits.
    Alors, c'est d'autant plus étonnant.

    Citation Envoyé par Bernard B Voir le message
    où mettre le stdcall ?
    function MyEnumThreadWindowsProc(Wnd: hwnd; Data: lParam): Boolean; stdcall;

    Sous 8-10, il n'y a plus besoin de s'occuper de ce bouton, il fait maintenant partie de la barre des tâches. Cacher la barre est suffisant.

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

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