Avatar billede jisch Mester
04. august 2003 - 23:37 Der er 8 kommentarer og
1 løsning

Kørende program?

Hej,
Er der nogen der ved hvordan man kan finde uf af om et andet program er kørende samtidigt med mit mit eget Delphi-program?
Avatar billede Slettet bruger
04. august 2003 - 23:44 #1
Prøv at putte det her ind i en timer:

if findwindow(nil, 'Vinduet navn') <> 0 then
begin

end;
Avatar billede jisch Mester
05. august 2003 - 02:56 #2
>hejhej: Tak for dit svar. Jeg går ud fra at "vinduets navn" er Caption. Kan man ikke på en eller anden måde søge på applikationens navn f.eks. "finans.exe"?
Avatar billede Slettet bruger
05. august 2003 - 07:24 #3
Tilføj TlHelp32 til uses.

Type
  TEnumData = Record
    hW: HWND;
    pID: DWORD;
  End;

Function EnumProc( hw: HWND; Var data: TEnumData ): Bool; stdcall;
  Var
    pID: DWORD;
  Begin
    Result := True;
    If (GetWindowLong(hw, GWL_HWNDPARENT) = 0) and
      (IsWindowVisible( hw ) or IsIconic(hw))
    Then Begin
      GetWindowThreadProcessID( hw, @pID );
      If pID = data.pID Then Begin
        data.hW := hW;
        Result := False;
      End; { If }
    End; { If }
  End; { EnumProc }

Function WindowFromProcessID( pID: DWORD ): HWND;
  Var
    data: TEnumData;
  Begin
    data.pID := pID;
    data.hW := 0;
    EnumWindows( @EnumProc, longint(@data) );
    Result := data.hW;
  End; { WindowFromProcessID }

Function WindowFromAppname32( appname: String ): HWND;
  { Take only the application filename, not full path!
    Need to pass the extension as well. }
  Var
    snapshot: THandle;
    processEntry : TProcessEntry32;
  Begin
    Result := 0;
    snapshot := CreateToolhelp32Snapshot(
                  TH32CS_SNAPPROCESS,
                  0 );
    If snapshot <> 0 Then
    try
      processEntry.dwSize := Sizeof( processEntry );
      If Process32First( snapshot, processEntry ) Then
      Repeat
        If AnsiCompareText(
            appname,
            ExtractFilename( StrPas(processEntry.szExeFile))
            ) = 0
        Then Begin
          Result:= WindowFromProcessID( processEntry.th32ProcessID);
          Break;
        End; { If }
      Until not Process32Next( snapshot, processEntry );
    finally
      CloseHandle( snapshot );
    End; { try }
  End; { WindowFromAppname32 }

procedure TForm1.Timer1Timer(Sender: TObject);
begin
If WindowFromAppname32('Project1.exe') <> 0 then
ShowMessage('Project1 kører');
end;
Avatar billede bananjoe Nybegynder
05. august 2003 - 13:56 #4
er det så muligt at lukke det vindue der er blevet fundet
Avatar billede Slettet bruger
05. august 2003 - 14:15 #5
Ja, tror det her virker.. erstat din timer procedure med denne:

procedure TForm1.Timer1Timer(Sender: TObject);
var
Programmet:HWND;
begin
Programmet := WindowFromAppname32('Project1.exe');
If Programmet <> 0 then
SendMessage(Programmet,WM_CLOSE,0,0);
end;
Avatar billede Slettet bruger
05. august 2003 - 14:17 #6
Ellers virker det her ihvertfald, hvis du bare vil lukke programmet:

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
KillTask('Project1.exe')
end;
Avatar billede bananjoe Nybegynder
05. august 2003 - 22:45 #7
hvad er Function WindowFromProcessID( pID: DWORD ): HWND; til så
Avatar billede Slettet bruger
05. august 2003 - 23:05 #8
Den skal du ikke bruge, ellers kan du bruge den hvis du har processid'et.
Avatar billede Slettet bruger
06. august 2003 - 21:08 #9
Takker for point :D
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