Entwickler-Ecke

Windows API - Prozess beenden


Jan K. - Mo 26.05.03 22:02
Titel: Prozess beenden
Ich möchte einen bestimmten Prozess beenden, den ich mit

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:
var  TListe     : TList;

function EnumWindowsProc(WND: HWND; LParam: LPARAM): BOOL; stdcall;
var PLW: ^HWND;
begin
  Result := True;
  If IsWindow(WND) and ((IsWindowVisible(WND) {or IsIconic(WND)}and
    ((GetWindowLong(WND, GWL_HWNDPARENT) = 0or
     (GetWindowLong(WND, GWL_HWNDPARENT) = GetDesktopWindow)) and
     (GetWindowLOng(WND, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0)) Then begin 
       If Assigned(TListe) Then begin
         new(PLW);
         PLW^ := WND; 
         TListe.Add(PLW); 
       end
  end
end


procedure TForm1.FormCreate(Sender: TObject);
begin
  TListe          := TList.Create;
  EnumWindows(@EnumWindowsProc,0);
end;

ermittelt habe.

bei meinem programm möchte ich das Net Send Fenster schlißen, falls eins geöffnet ist, sodass alle ankommenden Nachrichten geschlossen werden.

hab im Forum schon was von CloseHandle oder TerminateProcess gelesen, kann da aber irgendwie nichts mit anfangen... :roll:


AndyB - Mo 26.05.03 22:14


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function TerminateProcessByWindow(wnd: HWND): Boolean;
var
  idProcess: Cardinal;
  hProcess: THandle;
begin
  Result := False;
  GetWindowThreadProcessId(wnd, idProcess);
  hProcess := OpenProcess(PROCESS_TERMINATE, False, idProcess);
  if hProcess <> 0 then
  begin
    TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
    Result := True;
  end;
end;


Du gibst hoffentlich die Elemente der Liste mit Dispose wieder frei.


Jan K. - Di 27.05.03 15:02

Danke, bis jetzt hab ich nichts mit dispose wieder freigegeben, was passiert denn, wenn man das nich macht??? :roll:


Delete - Di 27.05.03 16:00

So lange deine Anwendung läuft, müllst du dir den Speicher deiner Anwendung voll und wenn du Pech hast, ist irgendwann Ende.

Grundsätzlich gilt: Jeden Speicher, den man selber von Hand angefordert hat, muß man auch wieder freigeben. :mahn:


AndyB - Di 27.05.03 16:37

Du musst far kein New(PLW) aufrufen. Ein einfacher Typecase von HWND nach Pointer tut es auch.


Delphi-Quelltext
1:
2:
3:
if Assigned(TListe) then begin
  TListe.Add(Pointer(WND));
end;

Das hat auch den Vorteil, dass du kein Dispose benötigst.


Jan K. - Mo 02.06.03 14:49

ok, ich komm da jetzt nicht so mit zurecht, könnt ich mir einfach sagen, wie ich es anstelle, eine Net Send Nachricht zu schließen, nachdem ich sie empfangen habe, ohne den Nachrichtendienst zu deaktivieren


ShadowThief - Mo 02.06.03 16:55

kannst auch einfach den nachrichtendienst deaktivieren.

shadow.


BungeeBug - Mo 02.06.03 17:16

Hi,
eigendlich ganz einfach :)


Delphi-Quelltext
1:
SendMessage(FindWindow(nil,'Nachrichtendienst '),WM_Close,0,0);                    


Das was du da oben gebaut hast find ich umständlich :) ... zumindest hierfür :)

MfG BungeeBug