Bonjour à tous :

Je code une application qui a besoin de piloter PowerDVD.

En utilisant la FAQ et les programmes sources,
j'ai pu obtenir l'excellent WindowsSpy qui m'a donner une source de renseignements sur les classes, noms,...

Et grâce au conseils de la FAQ, j'ai réalisé ceci :

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
 
procedure TfrmCmdPowerDVD.FormCreate(Sender: TObject);
var Result:integer;
    StartInfo   : TStartupInfo;
    ProcessInfo : TProcessInformation;
 
begin
  // Recherche de POWERDVD.EXE
  PowerDVDHandle:=FindWindow('Class of CyberLink Universal Player','POWERDVD');
  if (PowerDVDHandle=0) then
     begin
      lblHandle.Caption:='Not detected';
      // On le lance
      CreateProcess(Nil, '"C:\Program Files\CyberLink\PowerDVD\PowerDVD.exe"'
                    , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo);
      //Result:=ShellExecute(0,'OPEN','C:\Program Files\CyberLink\PowerDVD\PowerDVD.exe',Nil,Nil,SW_SHOW); OK
      //Sleep(3000);
      if Result<31 then
         begin
         end
      else
         begin
           PowerDVDHandle:=FindWindow('Class of CyberLink Universal Player','POWERDVD');
           lblHandle.Caption:='Lancer ='+IntToStr(PowerDVDHandle);
        end;
     end
  else
    lblHandle.Caption:='Detected='+IntToStr(PowerDVDHandle);
 
end;
Si je le lance avec POWERDVD exécuté, pas de problème, j'obtient le HANDLE.

Si il n'est pas lancé, avec createprocess, j'obtient :


L'application n'a pas réussi à s'initialiser correctement (0xc0000142). Cliquer sur OK pour arrêter l'application.
Par contre si j'utilise le shellexecute, il se lance mais le handle vaut 0 SAUF si j'active le SLEEP qui lui donne le temps de se charger.

Quelles sont mes erreurs ?

Peut-on se passer du SLEEP ?

Merci.