Avatar billede safl Nybegynder
13. august 2003 - 08:56 Der er 12 kommentarer og
1 løsning

Tjekke om et program kører

Hello!

Hvordan tjekker man om et program kører? Et program hvor man har navnet på exe-filen.

mvh safl
Avatar billede per_s_n Nybegynder
13. august 2003 - 09:21 #1
Det kommer helt an på hvilket styresystem du har. hvis du har 2000 eller xp  kan du prøv at trykke på [ctrl] + [alt] + [del]
og se hvad der står i joblisten. Her kan du også stoppe et program hvis det kager.
Du kan bruge Regcleaner til at fjerne et givent program helt fra din computer..
Håber det er svar nok.
Per
Avatar billede safl Nybegynder
13. august 2003 - 09:29 #2
Siden jeg har stillet spørgsmålet under "Programmering:Delphi" og IKKE "Styresystemer:Windows" tror du så ikke jeg kunne tænke mig at vide hvordan det gøres med kode?
Avatar billede per_s_n Nybegynder
13. august 2003 - 09:33 #3
lol...
Sorry det havde jeg ikke lige set... er der så ikke nogle point.. ;)
Avatar billede Slettet bruger
13. august 2003 - 09:34 #4
Avatar billede snowball Novice
13. august 2003 - 09:36 #5
Avatar billede Slettet bruger
13. august 2003 - 09:38 #6
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 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 safl Nybegynder
13. august 2003 - 12:10 #7
hej hej>
Den melder fejl når jeg compiler ved:
Type
  TEnumData = Record
    hW: HWND;
    pID: DWORD;
  End;
Avatar billede safl Nybegynder
13. august 2003 - 12:13 #8
Jeg ved ikke helt hvor jeg skal smide det ind når der også står:
Når den normalt ser sådan ud:

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Avatar billede safl Nybegynder
13. august 2003 - 12:18 #9
snowball > koden fra linket du skrev virker og det er jo cool :) Det der er skod er bare at der er så forfærdelig meget kode! Kan jeg ikke smide dem ind i et eller andet form for "library" eller en .pas fil for sig selv? Hvordan gør jeg det?
Avatar billede snowball Novice
13. august 2003 - 12:20 #10
safl: Jo, det burde du godt kunne. Prøver lige at lave et eksempel.

Snowball
Avatar billede safl Nybegynder
13. august 2003 - 12:24 #11
ok cool nok :)
Avatar billede snowball Novice
13. august 2003 - 12:29 #12
Gem nedenstående som process.pas og tilføj den til dit eksisterende projekt. Under Uses i den unit du vil kalde den fra tilføjer du så Process og kalder den på følgende måde:  if Process.EXE_Running('Notepad.exe', False) then ...

unit process;

interface

uses
  Windows, SysUtils, Classes, Psapi, tlhelp32;

  procedure CreateWin9xProcessList(List: TstringList);
  procedure CreateWinNTProcessList(List: TstringList);
  procedure GetProcessList(var List: TstringList);
  function EXE_Running(FileName: string; bFullpath: Boolean): Boolean;

implementation

procedure CreateWin9xProcessList(List: TstringList);
var
  hSnapShot: THandle;
  ProcInfo: TProcessEntry32;
begin
  if List = nil then Exit;
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      List.Add(ProcInfo.szExeFile);
      while (Process32Next(hSnapShot, ProcInfo)) do
        List.Add(ProcInfo.szExeFile);
    end;
    CloseHandle(hSnapShot);
  end;
end;

procedure CreateWinNTProcessList(List: TstringList);
var
  PIDArray: array [0..1023] of DWORD;
  cb: DWORD;
  I: Integer;
  ProcCount: Integer;
  hMod: HMODULE;
  hProcess: THandle;
  ModuleName: array [0..300] of Char;
begin
  if List = nil then Exit;
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
      PROCESS_VM_READ,
      False,
      PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess);
    end;
  end;
end;

procedure GetProcessList(var List: TstringList);
var
  ovi: TOSVersionInfo;
begin
  if List = nil then Exit;
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(ovi);
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
    VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(List);
  end
end;

function EXE_Running(FileName: string; bFullpath: Boolean): Boolean;
var
  i: Integer;
  MyProcList: TstringList;
begin
  MyProcList := TStringList.Create;
  try
    GetProcessList(MyProcList);
    Result := False;
    if MyProcList = nil then Exit;
    for i := 0 to MyProcList.Count - 1 do
    begin
      if not bFullpath then
      begin
        if CompareText(ExtractFileName(MyProcList.Strings[i]), FileName) = 0 then
          Result := True
      end
      else if CompareText(MyProcList.strings[i], FileName) = 0 then Result := True;
      if Result then Break;
    end;
  finally
    MyProcList.Free;
  end;
end;

end.

Snowball
Avatar billede safl Nybegynder
13. august 2003 - 12:39 #13
Ok perfekt!
Point til dig :)
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