Autor Beitrag
DiamondDog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Mo 06.10.08 13:07 
Hallo Leute,
ich hab da folgenden Code gefunden:
ausblenden volle Höhe Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
uses
  tlhelp32, ShellAPI;

function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;

function GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hProcess: THandle;
  wf: DWORD;
begin
  bClose := False;
  Button1.Enabled := False;
  while bClose = False do
  begin
    hProcess := GetProcessHandleFromID(GetProcessID('notepad.exe'));
    if hProcess = 0 then
      Label1.Caption := 'Notepad läuft nicht'
    else
      Label1.Caption := 'Notepad läuft';
    Application.HandleMessage;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  bClose := True;
end;
gebe ich jetzt anstelle von notepad.exe den laufenden GameMon.des an,
wird diese Prozess mir aber nicht angezeigt.
Weiß jemand wieso und wie ich es beheben kann?

Danke schon mal fürs Helfen.

Mfg Dog


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 06.10.2008 um 17:43
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 06.10.08 13:23 
Taucht er denn im Taskmanager auf?
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Mo 06.10.08 13:25 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Taucht er denn im Taskmanager auf?

Ja im Taskmanager steht er drin.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 06.10.08 13:35 
Was mich irritiert: Wozu GetProcessHandleFromID? Du hast doch schon die ID gefunden, und dann muss er ja laufen, wozu also den dann noch öffnen?
Um welchen Prozess geht es denn?

Und dann ist da noch ein ziemlich heftiger Fehler im Code:
user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
Das ist falsch, der Vergleich mit true darf da nicht stehen, sonst brauchst du dich nicht wundern, wenn es nicht immer funktioniert. Richtig ist:
ausblenden Delphi-Quelltext
1:
2:
3:
    if Process32First(hProcSnap, pe32) then
    begin
      while Process32Next(hProcSnap, pe32) do
Erklärungen:
www.michael-puff.de/...Wahrheitswerte.shtml
und eine etwas längere Diskussion mit genaueren Erläuterungen darüber:
www.delphi-forum.de/...kt+mit+if_83487.html
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Mo 06.10.08 13:48 
Auch das entfernen von = True hat mich nicht weiter gebracht.
Er kann es immer noch nicht finden.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 06.10.08 13:59 
Probier mal Suche im MSDN ENUMPROCESSES.
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Mo 06.10.08 14:04 
Hab was gefunden womit es geht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
  hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnap <> INVALID_HANDLE_VALUE) then
  begin
    ProcEntry.dwSize := SizeOf(ProcessEntry32);
    if (Process32First(hSnap, ProcEntry)) then
    begin
      s := ProcEntry.szExeFile;
      while Process32Next(hSnap, ProcEntry) do
      begin
        s := ProcEntry.szExeFile;
        if ExtractFileName(s) = 'GameMon.des' then ShowMessage('GameMon.des gefunden');
      end;
    end;
  end;
  CloseHandle(hSnap);
end;
jetzt müst ich nur noch wissen wie ich mir angezeigen lassen kann, wenn der Prozes nicht gefunden wurde.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 06.10.08 14:13 
Das ist ja das selbe wie der Code vorhin, nur eben ohne das von mir ja angesprochene GetProcessHandleFromID...
Versuch deinen alten Code doch einfach mal ohne...

Wobei mir mal so auffällt: Wird der von Process32First gefundene Prozess bei den beiden Codes eigentlich benutzt? Ich würde sagen nein...
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Mo 06.10.08 22:04 
Ich erklär mal kurz was ich vor habe:
Also ich mache eine Liste von bestimmten Prozessen und diese soll mit den laufen den verglichen werden.
Das dürfte ja eigendlich nicht so schwer sein das erste geht auch mit *.exe aber leidermit der GameMon.des die übersieht er leider immer.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 06.10.08 22:23 
Probier mal dieses Programm aus, wenn es funktioniert, hatte ich in meinem vorletzten Beitrag Recht, wenn nicht wüsste ich auch grad nicht warum es nicht geht.
Einloggen, um Attachments anzusehen!
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Mo 06.10.08 22:38 
Ja damit funktioniert es.
Wollte es eh nicht mehr über die ProzessID machen sondern abfragen was alles läuft und dann alles mit den Programmen die ich in meiner Liste habe vergleichen.
Sorry in so etwas schwirigen sachen bin ich noch Anfänger, deswegen versteh ich nit immer alles gleich auf Anhieb.
Was genau hast bei deinem Prog den jetzt alles geändert?

Moderiert von user profile iconNarses: überflüssige Leerzeilen/Umbrüche entfernt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 06.10.08 22:42 
user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:
Was genau hast bei deinem Prog den jetzt alles geändert?
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was mich irritiert: Wozu GetProcessHandleFromID? Du hast doch schon die ID gefunden, und dann muss er ja laufen, wozu also den dann noch öffnen?
;-)
Durch die Verwendung auch des ersten Eintrags wird der Systemprozess und dessen Daten (Auslastung) auch gefunden.
ausblenden volle Höhe Delphi-Quelltext
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:
31:
32:
33:
34:
35:
function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) then
    begin
      repeat
        if (Exename = pe32.szExeFile)
          or (not frmMain.chkExact.Checked and (Pos(LowerCase(Exename), LowerCase(pe32.szExeFile)) > 0)) then
        begin
          result := pe32.th32ProcessID;
          frmMain.memResult.Lines.Clear;
          frmMain.memResult.Lines.Add('Prozess: ' + pe32.szExeFile);
          CloseHandle(hProcSnap);
          Exit;
        end;
      until not Process32Next(hProcSnap, pe32);
    end;
    CloseHandle(hProcSnap);
  end;
end;

procedure TfrmMain.btnSearchClick(Sender: TObject);
begin
  if GetProcessID(edtProcessName.Text) = 0 then
    ShowMessage('Der Prozess läuft nicht!')
  else
    ShowMessage('Der Prozess läuft!');
end;
DiamondDog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: Di 07.10.08 19:26 
Super @ jaenicke so funktioniert es so wie es soll.
1000 Dank.