Hi<p>Ich hab 3 Fragen zum WindowsXP-Taskmanager...<p>1) Einige Prozesse sind als "SYSTEM" deklariert - ist es möglich, selbstprogrammierte Prozesse als "SYSTEM" deklarieren zu lassen?<p>2) Gibt es noch eine andere Möglichkeit als 2, um herauszufinden, ob ein bestimmtes Programm läuft?<p><br>cu, Heinzi
Announcement
Collapse
No announcement yet.
Taskmanager-Prozesse
Collapse
X
-
hi Sebastian,<p>
statt der geschichte mit dem anzeigen der prozesse per Toolhelp32Snapshot,<br>
kann man ein programm auch ueber die api-funktion FindWindow() finden.<br>
dafuer musst du den fenstertitel und/oder den fensterklassennamen wissen.<br>
laeuft das entsprechende programm, wird ein fensterhandle zurueckgegeben,<br>
ansonsten NULL (c/c++), Nil oder eine 0 (bei delphi weiss ich nicht genau).<br>
solltest du ein laufendes programm suchen, dessen fenstertitel nicht fix ist,<br>
bleibt dir nix anderes uebrig als den fensterklassennamen zu ermitteln.<br>
delphi liefert hierfuer ein extra-tool mit (jedenfalls fuer delphi6 professional),<br>
welches WinSight32 heisst.<br>
persoenlich find ich aber die Toolhelp32Snapshot-geschichte schoener/professioneller. <p>
gruss ro
-
hi Sebastian,<p>
da mir langweilig war, hab ich dir ein kleines beispielprogramm geschrieben.<br>
die suche ist non case sensitive.<br>
(delphi6 unter win2k)<br>
<pre>
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SeekWindow(szTitle, szClass: string);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
/////////////////////////////////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption := 'FindWindow Sample';
Label1.Caption := 'Fenster Titel:';
Label2.Caption := 'Fenster Klasse:';
Edit1.Text := 'FindWindow Sample';//ZoneAlarm Pro
Edit1.MaxLength := 200;
Edit2.Text := '';//TForm1 ZAFrameWnd IEFrame
Edit2.MaxLength := 50;
Button1.Caption := 'Suche';
end;
/////////////////////////////////////////////////////////////
procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.SetFocus;
end;
/////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
szTitle, szClass: string;
begin
szTitle := Edit1.Text;
szClass := Edit2.Text;
if (szTitle = '') and (szClass = '') then
begin
MessageDlg('Gib ein Fenstertitel oder eine Fensterklasse ein!', mtWarning, [mbOk], 0);
Edit1.SetFocus;
end
else
SeekWindow(szTitle, szClass);
end;
/////////////////////////////////////////////////////////////
procedure TForm1.SeekWindow(szTitle, szClass: string);
var
hHandle: HWND;
pcTitle: array[0..200] of Char;
pcClass: array[0..50] of Char;
szMsg: string;
i: Integer;
begin
i := 0;
//nach titel suchen
if (szTitle <> '') and (szClass = '') then
begin
StrPCopy(pcTitle, szTitle);
hHandle := FindWindow(nil, pcTitle);
if hHandle = 0 then
szMsg := 'Fenstertitel: '+#9+#9+ szTitle +#13+
'Status: '+#9+#9+#9+'nicht gefunden'
else
begin
i := GetClassName(hHandle, pcClass, sizeof(pcClass));
if i>0 then
Edit2.Text := pcClass;
szMsg := 'Fenstertitel: '+#9+#9+ szTitle +#13+
'Fensterklasse: '+#9+#9+ pcClass +#13+
'Fenster-Handle: '+#9+ '0x' + IntToHex(hHandle,8) +#13+
'Status: '+#9+#9+#9+'gestartet';
end;
end
//nach klasse suchen
else if (szTitle = '') and (szClass <> '') then
begin
StrPCopy(pcClass, szClass);
hHandle := FindWindow(pcClass, nil);
if hHandle = 0 then
szMsg := 'Fensterklasse: '+#9+#9+ szClass +#13+
'Status: '+#9+#9+#9+'nicht gefunden'
else
begin
i := GetWindowText(hHandle, pcTitle, sizeof(pcTitle));
if i>0 then
Edit1.Text := pcTitle;
szMsg := 'Fenstertitel: '+#9+#9+ pcTitle +#13+
'Fensterklasse: '+#9+#9+ pcClass +#13+
'Fenster-Handle: '+#9+ '0x' + IntToHex(hHandle,8) +#13+
'Status: '+#9+#9+#9+'gestartet';
end;
end
//nach beiden suchen
else if (szTitle <> '') and (szClass <> '') then
begin
StrPCopy(pcTitle, szTitle);
StrPCopy(pcClass, szClass);
hHandle := FindWindow(pcClass, pcTitle);
if hHandle = 0 then
szMsg:= 'Fenstertitel: '+#9+#9+ szTitle +#13+
'Fensterklasse: '+#9+#9+ pcClass +#13+
'Status: '+#9+#9+#9+'nicht gefunden'
else
szMsg := 'Fenstertitel: '+#9+#9+ szTitle +#13+
'Fensterklasse: '+#9+#9+ pcClass +#13+
'Fenster-Handle: '+#9+ '0x' + IntToHex(hHandle,8) +#13+
'Status: '+#9+#9+#9+'gestartet';
end;
MessageDlg(szMsg, mtInformation, [mbOk], 0);
end;
end.
</pre>
<br>
gruss roy
Comment
-
Hi<p>Vielen Dank für die Lösung - es funktioniert! Jetzt habe ich zu der Lösung aber noch eine Frage...kann ich mit dem Window-Handle noch irgendwas anfangen? Kann ich damit irgendwelche Meldungen an das andere Programm schicken?<p>Und 1. ist immer noch aktuell - wie kann ich eine eigene Anwendung als SYSTEM-Prozess deklarieren?<p>cu, Heinz
Comment
-
hi Sebastian,<p>
mit dem window-handle kann man noch eine menge anfangen.<br>
man koennte die child-windows ermitteln (buttons, edits, usw).<br>
und man kann auch messages an sie verschicken.<br>
das ist noch laengst nicht alles, mehr will ich aber dazu nicht sagen.<br>
dafuer sind gute winapi-kenntnisse und kenntnisse des message-handling's in winanwendungen noetig.<br>
aber um herauszufinden, ob ein bestimmtes programm laeuft, sollte das erstmal reichen.<p>
und zu erster frage, habe ich in der msdn die funktionen OpenSCManager(), CreateService() und StartService() gefunden.<br>
die anwendung wird beim create in die registry eingetragen<br>(HKEY_LOCAL_MACHINE\System\CurrentC ontrolSet\Services).<br>
schau dir am besten mal die bereitgestellten service-funktionen an:<br>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/service_functions.asp<br>
anscheinend hat man hier die moeglichkeit den account anzugeben.<br>
ob es eine einfachere loesung gibt, weiss ich nicht, ist fuer mich auch neuland.<p>
gruss ro
Comment
-
hi Sebastian,<p>
mit dem window-handle kann man noch eine menge anfangen.<br>
man koennte die child-windows ermitteln (buttons, edits, usw).<br>
und man kann auch messages an sie verschicken.<br>
das ist noch laengst nicht alles, mehr will ich aber dazu nicht sagen.<br>
dafuer sind gute winapi-kenntnisse und kenntnisse des message-handling's in winanwendungen noetig.<br>
aber um herauszufinden, ob ein bestimmtes programm laeuft, sollte das erstmal reichen.<p>
gruss ro
Comment
-
Hallo Sebastian,
"deklarieren" wirst Du Deinen Prozess nicht als System können. Dieses Prozesse werden vom System ausgeführt. Das sind in der Regel Dienste, die gestartet wurden.
Wenn ich mich nicht irre, gibt keine Möglichkeit, seinen eigenen Prozess vorm "Abschiessen" durch den Taskmanager zu schützen, es sei denn er läuft als Dienst.
Gruß
Michae
Comment
Comment