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

  1. #1
    Membre éprouvé
    ShellExecute et Windows 10 64Bits y a t'il un problème ?
    Bonjour à toutes et à tous,

    Pour ne pas chaque fois redémarrer complètement le Pc à cause de ne plus avoir accès au réglage du volume qui se trouve dans la TrayIcon, je kill Explorer et Windows le relance car il en a besoin pour le système.

    Avec un fichier .bat il n'y a aucun problème :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    taskkill /im explorer.exe /f
    start explorer.exe
    exit


    Le même code avec ShellExecute cela fonctionne à moitié car Explorer ne se relance pas et donc écran noir:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    ShellExecute(Handle,'open', 'CMD', '/c taskkill.exe /f /im explorer.exe && start explorer.exe', nil, SW_SHOWNORMAL);


    Ce n'est pas le lancer en mode Administrateur car j'ai tout essayé même lancé mon fichier .bat avec ShellExecute alors que le lancer seul cela fonctionne.

    Peut être que quelqu'un à une astuce pour l'utilisation de ShellExecute et cette commande sinon en dehors de Delphi il existe plusieurs méthodes.

    En vous remerciant,

    @+,

    cincap

  2. #2
    Membre éprouvé
    Bonjour,

    j'ai pas de Win10 pour tester mais tu peux tenter ceci:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ShellExecute(Handle, Nil, 'CMD' , '/c "start /wait taskkill.exe /f /im explorer.exe&&explorer.exe"', Nil , SW_SHOWNORMAL);//SW_HIDE

    ça fait longtemps que je n'utilise plus cette méthode. Je passe par un TDosCommand qui offre bien plus souplesse (AMHA)
    mais avec un peu de chance ...

    Cordialement,

    @+

  3. #3
    Membre éprouvé
    @ Cirec, comment vas tu avec tes précieux conseils ?

    Merci de ton intervention, j'ai testé et j'ai aussi un écran noir après le Kill.

    C'est fou en double cliquant sur le fichier batch même sans être Administrateur cela fonctionne correctement et pourtant c'est le même code.

    Je dois avoir ta source (ID=34484) permettant de faire les commandes Dos avec attribut ou pas, je testerai aussi si je remet la main dessus.

    D'après mes recherches, une fois que le processus "explorer" est bien arrêté c'est Windows 10 qui le relance.

    Je continue aussi de tester des fonctions de Kill.

    @+,

    cincap

  4. #4
    Membre éprouvé
    ... chaudement

    et en faisant un ShellExecute avec le fichier *.bat que je renommerai au passage en *.cmd ?

    pour savoir si c'est un problème de droits tu peux tester en lançant ton appli en mode Admin!

    Cordialement,
    @+

  5. #5
    Membre éprouvé
    @ Cirec, merci pour ta suggestion.

    J'ai testé en mode Administrateur, j'ai testé le fichier .bat avec ShellExecute c'est pareil.

    J'ai aussi testé avec l'extension .cmd, c'est pareil par contre en les testant direct soit fichier .bat et .cmd cela fonctionne.

    J'ai aussi testé avec la "function KillProcess" et la cela fonctionne correctement et proprement peut importe en Administrateur ou pas.

    J'ai donc le choix mais tu me connais j'aimerai comprendre pourquoi pas avec ShellExecute ou alors il faut passer par syswow64 ?

    Sinon la touche ctrl + majuscule et click droit sur la barre de tâche on retrouve l'arrêt de explorer en bas dans le menu.

    @+,

    cincap

  6. #6
    Membre éprouvé
    dernière suggestion

    et je ne sais pas si ça va aider ^^
    comme tu ne sembles pas avoir "TDosCommand"
    je tenterai de créer un autre fichier cmd qui fait appel au bat qui fait le job
    et je lancerai celui-ci ... pour voir si ça fait une différence ou pas

    Cordialement,

    @+

  7. #7
    Membre éprouvé
    Bonjour à toutes et à tous,

    Encore un grand merci @ Cirec.

    Voici ma solution d'attente qui fonctionne correctement et proprement afin de killer puis relancer Explorer sur Windows 10 64bits version 1903.

    1) Avec uniquement un fichier .bat :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    taskkill /im explorer.exe /f
    start explorer.exe
    exit


    Ne fonctionne pas avec ShellExecute dans Delphi 6 !

    Fonctionne aussi avec Windows PowerShell Administrateur ou pas.


    2) Avec une fonction de KillProcess :

    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
     
    //Tue et relance
     
    function KillProcess(const ProcessName : string) : boolean; 
    var ProcessEntry32 : TProcessEntry32; 
        HSnapShot : THandle; 
        HProcess : THandle; 
    begin 
      Result := False; 
     
      HSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
      if HSnapShot = 0 then exit; 
     
      ProcessEntry32.dwSize := sizeof(ProcessEntry32); 
      if Process32First(HSnapShot, ProcessEntry32) then 
      repeat 
        if CompareText(ProcessEntry32.szExeFile, ProcessName) = 0 then 
        begin 
          HProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry32.th32ProcessID); 
          if HProcess <> 0 then 
          begin 
            Result := TerminateProcess(HProcess, 0); 
            CloseHandle(HProcess); 
          end; 
          Break; 
        end; 
      until not Process32Next(HSnapShot, ProcessEntry32); 
     
      CloseHandle(HSnapshot); 
    end;


    Usage :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    KillProcess('explorer.exe');


    Avec ce code, la relance se fait toujours par Windows.

    Peut être qu'un membre trouvera la solution pour utiliser un ShellExecute avec soit le fichier .bat ou avec sa commande.

    @+,

    cincap

  8. #8
    Membre éprouvé
    @ tous, je ferme ce topic car la solution avec ShellExecute (code direct ou fichier .bat) est correcte il fallait juste utiliser la redirection.

    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
     
    procedure TFProcessus.Button8Click(Sender: TObject);
    Var
      Wow64FsEnableRedirection: LongBool;
     
    begin
      try
       Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
     
    //Avec fichier .bat
     
       //ShellExecute(0, nil, PChar(chappli + 'Restart_Windows_Exploreur.bat'), nil, nil, 0);
     
    //ou code direct
     
     ShellExecute(HInstance,'open', 'cmd.exe', '/c taskkill.exe /f /im explorer.exe&&start explorer.exe', nil, SW_SHOWNORMAL);
     
       Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
     
    end;


    @+,

    cincap