Avatar billede hr__hallandsen Nybegynder
03. december 2006 - 14:56 Der er 8 kommentarer og
1 løsning

Vente på program, som kører i forvejen

Hej

Jeg har et program, som detekterer om Media Player kører. Det virker også fint nok, men her kommer problemet:

Hvis Media Player (nej, dette er ikke et forsøg for at reklamere for M$, men mit program skal arbejde sammen med Media Player) kører skal mit program vente på at det afsluttes og så gå videre.

Jeg har uden held prøvet med

WaitForSingleObject(FindWindow(nil, 'Windows Media Player'), INFINITE);

Er der nogen, som har en bedre ide?

Mange hilsner

Hallandsen
Desperat programmør
Avatar billede hrc Mester
04. december 2006 - 13:26 #1
Kan du ikke kalde MediaPlayeren selv og lade den vente på at programmet afsluttes? Eller har jeg misforstået dit spørgsmål?
Avatar billede hrc Mester
04. december 2006 - 13:27 #2
Omformuleret: Kan du ikke kalde MediaPlayeren i dit program og lade det vente på at den afslutter? Der må være et API til det %¤!"&#¤& program. Det vil man nok kunne støve op på MSDN.
Avatar billede psycosoft-funware Nybegynder
04. december 2006 - 16:09 #3
i noget kode jeg bruger til at exec and wait på et program bruger jeg <> WAIT_OBJECT_0
i stedet for infinite, det virker ganske ude mærket :)

dette er godt nok kode beregnet til selv at starte et program, men tænkte at det kunne være brugbart efter som det benytter WaitForSingleObject  :)

uses
  ShellApi;

procedure ShellExecute_AndWait(FileName: string; Params: string);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    ExInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute_AndWait('FileName', 'Parameter');
end;
Avatar billede hr__hallandsen Nybegynder
04. december 2006 - 16:48 #4
psycosoft-funware >> jeg kan desværre ikke få det til at virke
Avatar billede hr__hallandsen Nybegynder
04. december 2006 - 16:52 #5
det eneste, jeg kan finde på, er det her, men jeg bryder mig ikke videre om den måde at programmere på

while true do
begin
  if FindWindow(nil, 'Windows Media Player') = 0 then
    Exit
  else
    Sleep(1000);
end;
Avatar billede hr__hallandsen Nybegynder
04. december 2006 - 17:10 #6
Ps: waitforsingleobject() returnerer wait_failed, så måske er det slet ikke findwindow, som skal anvendes eller også kan det måske kun lade sig gøre, hvis man selv har startet programmet?
Avatar billede psycosoft-funware Nybegynder
04. december 2006 - 17:44 #7
alternativet kunne være at du laver det fx sådan her:

function CeckWmpRunning: Boolean;
begin
  if FindWindow(nil, 'Windows Media Player') = 0 then
    Result := True
  else
    Result := False;
end;


Timer1.OnTimer:

begin
case CheckWmpRunning of
True: begin
  //Do SOmething
      end;
False: begin
    //Do Somthing Else
      end;
end;
end;

:)
Avatar billede hr__hallandsen Nybegynder
05. december 2006 - 19:22 #8
Med al respekt, men er det ikke lidt det samme?

Det jeg gerne ville var at undgå at kontrollere hele tiden, men i stedet gå videre lige så snart programmet afsluttes
Avatar billede hr__hallandsen Nybegynder
01. marts 2007 - 09:37 #9
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester