Avatar billede Slettet bruger
04. november 2003 - 14:56 Der er 8 kommentarer og
1 løsning

check om program kører

hvordan kan man tjekke om et givent program kører, uden at kende stien?

kan man gemme indtastning i en edit i en inifil?
Avatar billede stoney Nybegynder
04. november 2003 - 15:17 #1
Du kan fange det på classname eller caption på formen.

Stoney
Avatar billede Slettet bruger
04. november 2003 - 15:17 #2
Hvis du kender exe filens navn kan du bruge denne kode:

Uses TlHelp32;

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.Button1Click(Sender: TObject);
begin
if WindowFromAppname32('project1.exe') <> 0 then
ShowMessage('Programmet kører');
end;
Avatar billede Slettet bruger
04. november 2003 - 18:21 #3
og hvis det ikke kører

if WindowFromAppname32('project1.exe') <> 0 ?? hvad skal så ændres
skal den så  ændres til
<0
Avatar billede Slettet bruger
04. november 2003 - 18:23 #4
Nej, du skal bruge = :
if WindowFromAppname32('project1.exe') = 0 then
Avatar billede Slettet bruger
04. november 2003 - 18:43 #5
if WindowFromAppname32('project1.exe') = 0 then
ShowMessage('Programmet er lukket');

hvordan kan man styre ('project1.exe') hvad der skal stå via et Tedit.

sådan at det er en variabel i en Tedit som ændrer "project1.exe" til project2.exe.
hvis du forstår hvad jeg mener...
Avatar billede Slettet bruger
04. november 2003 - 18:54 #6
Tror det er det her du mener:

if WindowFromAppname32(Edit1.Text) = 0 then
ShowMessage('Programmet er lukket');
Avatar billede Slettet bruger
04. november 2003 - 19:22 #7
næ ikke helt for så er project1.exe en konstant, og man kan kun lukke project1.exe

hvis teksten  i en Tedit er project2.exe ændres "project2.exe" i
WindowFromAppname32(project2.exe)da man ikke altid ved hvad brugeren indtaster i editfeltet, kunne project1.exe ikke være en variabel, så hvis man skrev i editfeltet project1.exe eller project2.exe så lukkes programmerne alt efter hvad der står i editfeltet. Håber du forstår hvad jeg mener.
Avatar billede Slettet bruger
04. november 2003 - 19:33 #8
Er ik helt sikker på hvad du mener, men hvis du skal lukke programmerne kan du bruge denne kode:

uses
  Tlhelp32;

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.Button1Click(Sender: TObject);
begin
  KillTask(Edit1.Text);
end;

Hvis du f.eks. skriver Project1.exe i Edit1 lukker den project1.exe.
Avatar billede Slettet bruger
04. november 2003 - 19:54 #9
yepper det var hvad jeg mente...gud hvor indlysende når man ser det.gg

takker
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