Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm vor Taskmanager verstecken (https://www.delphipraxis.net/49912-programm-vor-taskmanager-verstecken.html)

DevilsCamp 18. Jul 2005 08:07


Programm vor Taskmanager verstecken
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich habe folgenden Code im INet auf diversen Seiten gefunden:

Delphi-Quellcode:
function RegisterServiceProcess(dwProcessID, dwType: dword): integer; stdcall;
external 'Kernel32.dll';

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterServiceProcess(0, 1);
end;
angeblich soll dieser Code das Programm vor dem Taskmanager verstecken.
Doch bei mir macht er nur folgendes:
- Das Programm startet im Einzelschritt
- Es stürzt ab, bevor die OnCreate-Methode des MainForms aufgerufen werden kann.
- Ich bekomme die Fehlermeldung, die im Anhang zu sehen ist


Wenn ich nun die Zeile mit "RegisterServiceProcess" auskommentiere, dann läuft das Programm wieder normal.

Hat einer von euch 'ne Ahnung, was falsch sein könnte?

(Quell-Code im Anhang)

marabu 18. Jul 2005 09:58

Re: Programm vor Taskmanager verstecken
 
Hallo Marc,

üblicherweise übergibst du GetCurrentProcessID() als ersten Parameter.

Grüße vom marabu

DevilsCamp 18. Jul 2005 10:01

Re: Programm vor Taskmanager verstecken
 
:(

Hat leider auch nicht den gewünschten Effekt.
Ich habe immer noch den selben Fehler...

Olli 18. Jul 2005 10:02

Re: Programm vor Taskmanager verstecken
 
a.) Man versteckt keine Prozesse vor dem TaskManager, sondern entzieht dem Benutzer den Zugriff
b.) Funktioniert deine C&P-Frickellösung nur auf Windows 9x/Me

Um es vorneweg klarzustellen. Ja, RegisterServiceProcess() ist eine Frickellösung. Da hilft auch kein rumdiskutieren. Während ich bei Win9x/Me ohne Rechteverwaltung durchaus noch eine Daseinsberechtigung sehen könnte (mit viel gutem Willen), ist sie ab NT4 (eigentlich NT allgemein) nicht mehr gegeben. Daher existiert diese Funktion dort nicht. Und das ist auch gut so. Willst du verhindern, daß dein Prozess beendet wird, so tu dies über ACLs usw.!

Sagst du uns noch welches OS du hast, Marc?!

marabu 18. Jul 2005 10:11

Re: Programm vor Taskmanager verstecken
 
Gerade wollte ich Marc bitten vor dem Aufruf der Funktion WIN95 zu starten. Ich hatt in meiner code library geschaut und die Abhängigkiet erst soeben in der online hilfe entdeckt. Peinlich...

marabu

Olli 18. Jul 2005 10:16

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von marabu
Gerade wollte ich Marc bitten vor dem Aufruf der Funktion WIN95 zu starten. Ich hatt in meiner code library geschaut und die Abhängigkiet erst soeben in der online hilfe entdeckt.

Teamwork geht doch auch ;)

Mich wundert eigentlich nur, daß die o.g. Fehlermeldung kommt, weil dies für mich bedeutet, daß es kein fehlender Import sein kann. Da würde der PE-Loader vorher aufmucken. Also entweder gibt es einen schlechten Stub in dem OS, welches er benutzt, oder er benutzt Win9x/Me. Wobei dann der Fehler (lt. Adresse) gefühlsmäßig in einer DLL liegen dürfte.

Hatte schon viele Probleme mit dieser Mist-Funktion. Die sollte man nur dynamisch importieren ... alle Programmierer, die das mißachten, gehören in die VisualBasic-Hölle :mrgreen: ... wurde uns diese Funktion vielleicht sogar vom Teufel der VB-Hölle persönlich gesandt? :mrgreen:

Das ist übrigens der Grund, warum diese Funktion noch immer nicht offiziell dokumentiert ist.

DevilsCamp 18. Jul 2005 10:27

Re: Programm vor Taskmanager verstecken
 
1. Ich nutze Win2000 Pro, das Programm soll aber auch unter WinXP laufen (Home und Pro)
2. Delphi 7 Pro.

3.
Das Programm soll eine Uhr sein, die ständig im Vordergrund liegt, damit man nicht immer die Taskleiste öffnen muss.
Sie kann jederzeit per PopUp Menü beendet werden.
Ich möchte sie nur verstecken, damit sie nicht per ALT-TAB auswählbar ist und so Platz spart...
Rechtevergabe wäre hier also wie mit Kanonen auf Spatzen schießen.

Olli 18. Jul 2005 10:57

Re: Programm vor Taskmanager verstecken
 
Delphi-Quellcode:
type
  TFNRegisterServiceProcess = function(dwProcessID, dwType: dword): Integer; stdcall;

function RegisterServiceProcess(dwProcessID, dwType: DWORD): Integer;
var
  hLib:THandle;
  _RegisterServiceProcess: TFNRegisterServiceProcess;
begin
  // Ist sowieso immer geladen
  _RegisterServiceProcess := nil;
  hLib := GetModuleHandle('Kernel32.dll');
  if(hLib <> 0)then
    @_RegisterServiceProcess := GetProcAddress(hLib, 'RegisterServiceProcess');

  if(Assigned(@_RegisterServiceProcess))then
    result := _RegisterServiceProcess(dwProcessID, dwType)
  else
  begin
    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
    result := 0; // Fehler signalisieren
  end;
end;
Mit W2K verwendet man diese Funktion einfach nicht. Einen Prozess unter NT verstecken zu wollen ist
a.) entweder dumm, oder
b.) mit einer bösen Absicht (Rootkit, Virus) verbunden.

Such's dir aus ;) ... das Thema RSP ist so alt wie sonst nix. Mußt du diese Funktion dennoch verwenden, so wrappe sie wie ich es dir oben schnell hingetippt habe.
Beispiele mit LoadLibrary() kannste hier komplett vergessen, weil manche Menschen denken sie könnten einen Win32-Prozess ohne kernel32.dll starten :mrgreen:

Siehe auch: http://support.microsoft.com/default...b;en-us;125714

:wall: ... für dein Ziel brauchst du eine ganz andere Lösung. Poste ich nach dem Mittagessen wenn keiner schneller war. Den Code zum Verstecken haste ja nun.

runger 18. Jul 2005 11:09

Re: Programm vor Taskmanager verstecken
 
Hallo Olli,
klingt ganz schön überheblich, was du da von dir gibst.

Zitat:

Einen Prozess unter NT verstecken zu wollen ist
a.) entweder dumm, oder
b.) mit einer bösen Absicht (Rootkit, Virus) verbunden.
Zitat:

... für dein Ziel brauchst du eine ganz andere Lösung. Poste ich nach dem Mittagessen wenn keiner schneller war. Den Code zum Verstecken haste ja nun.
Warum, wenn du Jemanden für a.) dumm oder b.) böswillig hälst, willst du dann selbst eine Lösung präsentieren?
Zu welcher Kategorie gehörst du denn zu a.) oder b.)?

Rainer ( dieser Beitrag ist nicht ganz ernst gemeint )

Olli 18. Jul 2005 11:41

Re: Programm vor Taskmanager verstecken
 
Hi Rainer,

locker bleiben.
Zitat:

Zitat von runger
klingt ganz schön überheblich, was du da von dir gibst.

Kann sein. Wahrheit tut manchmal weh. Da ich aus Wissen heraus und nicht aus übersteigertem Selbstbewußtsein heraus schreibe, leiste ich mir sowas. Wenn ich nicht wüßte wovon ich rede, würde ich nicht so klare Worte wählen.
Nur weil es dumm ist etwas zu tun, ist derjenige der es tut nicht gleich dumm. Oder?

Zitat:

Zitat von runger
Zitat:

... für dein Ziel brauchst du eine ganz andere Lösung. Poste ich nach dem Mittagessen wenn keiner schneller war. Den Code zum Verstecken haste ja nun.
Warum, wenn du Jemanden für a.) dumm oder b.) böswillig hälst, willst du dann selbst eine Lösung präsentieren?

Ich habe dir mal die wichtigste Stelle meines Satzes markiert. Er will nämlich offenbar nicht den Prozess, sondern vielmehr das Anwendungsfenster verstecken. Das gehört eigentlich zu einer guten Fragestellung - Ziel angeben, statt aktuellen Schritt erfragen, aber kann ja jedem mal passieren ;)

Zitat:

Zitat von runger
Zu welcher Kategorie gehörst du denn zu a.) oder b.)?

Das obliegt dem jeweiligen Betrachter :zwinker:
Übrigens: siehe deine Signatur ;) -> Ja.

DevilsCamp 18. Jul 2005 11:46

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von Olli
Er will nämlich offenbar nicht den Prozess, sondern vielmehr das Anwendungsfenster verstecken.

RICHTIG, der Kandidat hat 100 Punkte. Das meinte ich sogar.


Da wir nun geklärt haben, dass ich die Überschrift etwas unglücklich gewählt habe ;), hat einer von euch nun eine Lösung?

@Olli:
Dein Code funktioniert bei mir nicht.

Delphi-Quellcode:
@_RegisterServiceProcess := GetProcAddress(hLib, 'RegisterServiceProcess');
Liefert mir immer ein:
@_RegisterServiceProcess = nil


:(

Olli 18. Jul 2005 11:51

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von DevilsCamp
Zitat:

Zitat von Olli
Er will nämlich offenbar nicht den Prozess, sondern vielmehr das Anwendungsfenster verstecken.

RICHTIG, der Kandidat hat 100 Punkte. Das meinte ich sogar.


Da wir nun geklärt haben, dass ich die Überschrift etwas unglücklich gewählt habe ;), hat einer von euch nun eine Lösung?

Bitte etwas Geduld. Habe nur 2 Hände, 1 Tastatur und 1 Monitor ... da hilft auch kein multitaskingfähiges Gehirn, wenn der I/O nicht stimmt. ;)

Zitat:

Zitat von DevilsCamp
Dein Code funktioniert bei mir nicht.

Delphi-Quellcode:
@_RegisterServiceProcess := GetProcAddress(hLib, 'RegisterServiceProcess');
Liefert mir immer ein:
@_RegisterServiceProcess = nil

Doch tut er. Sehr gut sogar. Der Code muß nil zurückliefern - du arbeitest nämlich auf Windows 2000 wo diese Funktion garnicht aus Kernel32.dll exportiert wird. Rufe einfach meine Wrapperfunktion auf und du kannst dir sicher sein, daß dein Code portabel zwischen Windows 9x/Me und NT4/2K/XP ist.

Die Lösung des anderen Problems kommt, wie gesagt, gleich.

s14 18. Jul 2005 11:52

Re: Programm vor Taskmanager verstecken
 
Hallo Olli,

probier mal:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow( Application.Handle, SW_HIDE );
  SetWindowLong( Application.Handle, GWL_EXSTYLE,
                 GetWindowLong(Application.Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  ShowWindow( Application.Handle, SW_SHOW );
end;

Olli 18. Jul 2005 12:00

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von s14
probier mal:

*grrr* ... Frechheit :mrgreen: ... sowas auch :mrgreen: . Da will man es gerade posten und dann sowas. :mrgreen:
Püh, ich stell mich jetzt in die Ecke und schmolle :mrgreen:

@Marc: Sowas in der Art meinte ich.

arbu man 18. Jul 2005 12:11

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von Olli
Er will nämlich offenbar nicht den Prozess, sondern vielmehr das Anwendungsfenster verstecken.

Wenn es das ist was du willst dann plaziere diesen Code in der fromshow

Delphi-Quellcode:
ShowWindow(GetWindow(Handle,GW_OWNER),SW_HIDE);
Und dein Fenster taucht in der taskleiste nicht mehr auf.

runger 18. Jul 2005 12:15

Re: Programm vor Taskmanager verstecken
 
Hi Olli,

den letzten Satz hast du aber gelesen?

Rainer ( ich liebe es wenn sich jemand so aufregt )

DevilsCamp 18. Jul 2005 12:29

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von arbu man
Zitat:

Zitat von Olli
Er will nämlich offenbar nicht den Prozess, sondern vielmehr das Anwendungsfenster verstecken.

Wenn es das ist was du willst dann plaziere diesen Code in der fromshow

Delphi-Quellcode:
ShowWindow(GetWindow(Handle,GW_OWNER),SW_HIDE);
Und dein Fenster taucht in der taskleiste nicht mehr auf.

Das weiß ich selber.

Aber ich möchte das Fenster auch noch aus der Alt-TAB-Liste entfernen.
Man soll es zwar per Maus anklicken und beenden können (FormStyle steht auf fsStayOnTop) aber nicht per Alt-TAB auswählen können...

Olli 18. Jul 2005 12:57

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von arbu man
Delphi-Quellcode:
ShowWindow(GetWindow(Handle,GW_OWNER),SW_HIDE);
Und dein Fenster taucht in der taskleiste nicht mehr auf.

Dann ist das Form aber auch wech ;) ... er will nur keinen Eintrag in der Taskleiste und beim Task umschalten. Das geht wie oben von s14 beschrieben.

DevilsCamp 18. Jul 2005 13:00

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von Olli
er will nur keinen Eintrag in der Taskleiste und beim Task umschalten. Das geht wie oben von s14 beschrieben.

Bei mir funktioniert das irgendwie nicht...

Olli 18. Jul 2005 13:04

Re: Programm vor Taskmanager verstecken
 
Hi Rainer,

Zitat:

Zitat von runger
den letzten Satz hast du aber gelesen?

Rainer ( ich liebe es wenn sich jemand so aufregt )

Na logo. Und da ich eine angeregte Diskussion liebe, habe ich dennoch meine Gründe dargelegt ...
Ich lese jeden Monat Titanic und Eulenspiegel ... bin also "Kummer" gewohnt *g* :mrgreen:

@Marc: Ich schaue mal eben nochmal über deinen Code. Habe selber W2K, sollte also reproduzierbar sein ;)

Gruß,

s14 18. Jul 2005 13:07

Re: Programm vor Taskmanager verstecken
 
@DevilsCamp: Was steht im OnCreate Ereigis des Formulars?
Zeig mal...

DevilsCamp 18. Jul 2005 13:19

Re: Programm vor Taskmanager verstecken
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  mdown := false;

  ShowWindow( Application.Handle, SW_HIDE );
  SetWindowLong( Application.Handle, GWL_EXSTYLE,
                 GetWindowLong(Application.Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  ShowWindow( Application.Handle, SW_SHOW );
end;
In der Taskleiste ist es verschwunden, aber wie schon gesagt weiterhin per ALT-TAB auswählbar...

Robert Marquardt 18. Jul 2005 13:19

Re: Programm vor Taskmanager verstecken
 
s14, das gehort nicht ins FormCreate. Zu diesem Zeitpunkt muss nicht notwendigerweise ein Fenster vorhanden sein und es ist durchaus moeglich das das Fenster spaeter gegen ein neues ausgewechselt wird.

DevilsCamp 18. Jul 2005 13:31

Re: Programm vor Taskmanager verstecken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli
@Marc: Ich schaue mal eben nochmal über deinen Code. Habe selber W2K, sollte also reproduzierbar sein ;)

Gruß,

Anbei die neue Version

Olli 18. Jul 2005 13:35

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von Robert Marquardt
s14, das gehort nicht ins FormCreate. Zu diesem Zeitpunkt muss nicht notwendigerweise ein Fenster vorhanden sein und es ist durchaus moeglich das das Fenster spaeter gegen ein neues ausgewechselt wird.

Moin Robert, doch es ist vorhanden, denn er nimmt Application.Handle :zwinker:

DevilsCamp 18. Jul 2005 13:39

Re: Programm vor Taskmanager verstecken
 
Ich habe den Fehler.

Das Icon, das bei Alt-Tab angezeigt wird, gehört zum MainForm.
Ich muss also auch das MainForm (in diesem Fall Form1) verstecken:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  mdown := false;

  Timer1.Enabled := True;

end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;

  ShowWindow( Application.Handle, SW_HIDE );
  SetWindowLong( Application.Handle, GWL_EXSTYLE,
                 GetWindowLong(Application.Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  ShowWindow( Application.Handle, SW_SHOW );

  ShowWindow( Handle, SW_HIDE );
  SetWindowLong( Handle, GWL_EXSTYLE,
                 GetWindowLong(Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  ShowWindow( Handle, SW_SHOW );
end;
So funktioniert es...

Robert_G 18. Jul 2005 13:42

Re: Programm vor Taskmanager verstecken
 
Ist der Timer den wirklich nötig?
Würde es nicht reichen den Constructor zu überschreiben? FormCreate wird ja irgendwo dazwischen aufgerufen....

DevilsCamp 18. Jul 2005 13:51

Re: Programm vor Taskmanager verstecken
 
Ich habe aber erst ein Handle auf das Fenster, NACHDEM es erstellt wurde. Und nicht schon vorher...

Olli 18. Jul 2005 13:53

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von DevilsCamp
Ich habe aber erst ein Handle auf das Fenster, NACHDEM es erstellt wurde. Und nicht schon vorher...

DevilsCamp, verwechsele nicht VCL-Objekte und Windows-Objekte. Außerdem kannst du beim Überladen ja inherited angeben und dann dein eigenes Zeug danach machen. Dann existiert definitiv ein Handle ;)

Robert_G 18. Jul 2005 13:59

Re: Programm vor Taskmanager verstecken
 
Zitat:

Zitat von DevilsCamp
Ich habe aber erst ein Handle auf das Fenster, NACHDEM es erstellt wurde. Und nicht schon vorher...

richtig. ;)

Delphi-Quellcode:
constructor TSomeForm.Create(AOwner: TComponent);
begin
   inherited;
   // OnCreate würde noch *im* Constrcutor
   // des Vorgängers (TCustomForm) aufgerufen werden
   // somit wird alles nach inherited auch nach OnCreate
   // und somit nach allem Fenstergedönst aufgerufen
   
   ShowWindow(Application.Handle, SW_HIDE);

   SetWindowLong(Application.Handle,
                 GWL_EXSTYLE,
                 GetWindowLong(Application.Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

   ShowWindow(Application.Handle, SW_SHOW);

   ShowWindow(Handle, SW_HIDE);
   SetWindowLong(Handle,
                 GWL_EXSTYLE,
                 GetWindowLong(Handle, GWL_EXSTYLE) or
                 WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

   ShowWindow(Handle, SW_SHOW);
end;
Nachtrag: @Ollie: Jenau! :)

DevilsCamp 18. Jul 2005 14:01

Re: Programm vor Taskmanager verstecken
 
mist.

Zu spät :D



So, damit wäre die Frage wohl geklärt :)

Zacherl 18. Sep 2005 19:23

Re: Programm vor Taskmanager verstecken
 
Oder man schreibt den Code ins OnShow Ereignis. :wink:

Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz