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 Send to tray (https://www.delphipraxis.net/6627-send-tray.html)

__patrik 17. Jul 2003 08:47


Send to tray
 
moin, moin zusammen,

ich hab mir die Routine von Luckie zum Thema Tray:
TNA-DEMO
heruntergeladen und jetzt hab ich ein paar Fragen dazu:
wie muss ich die Routine modifizieren damit ...
1. ... das Progg nicht beim verkleinern in den Tray geht sondern normal unten in die Taskleiste?
2. ... beim schließen sich nicht schließt sondern in den Tray geht?
3. ... wenn das Progg im Vordergrund ist zusätzlich ein Symbol in der Taskleiste erscheint?
4. gibt es eine Möglichkeit das ein Progg erkennt ob es über den Autostart(soll dann nur in den Tray) oder vom User (dann soll es normal im Vordergrund gezeigt werden) gestartet wurde?

danke im voraus

patrik

@luckie: deine progg-beispiele sind super!!! aber wäre es vielleicht möglich das du ein, zwei zeilen inlinedoku zu packst. dann hätten so ahnungslose wie ich die möglichkeit die dinge ein wenig besser nachvollziehen zu können und ich würde nicht dauernt irgendwelche black-boxen verwenden in die ich vorne was reinstecke, hinten was richtiges rauskommt und ich keine ahnung hab warum:-)

MathiasSimmack 17. Jul 2003 09:42

Re: Send to tray
 
1. Die Bearbeitung von WM_SYSCOMMAND (procedure WMSysCommand) weglassen.

2. Ich persönlich finde dieses Verhalten zwar unschön, aber du rufst den TNA-Code, den du im "OnCreate" findest einfach im "OnClose"-Ereignis der Form auf. Statt
Delphi-Quellcode:
Application.ShowMainForm := False;
benutzt du aber
Delphi-Quellcode:
self.Hide;
und setzt die Variable "Action" (aus dem OnClose-Prozedurkopf) auf caNone. Ich empfehle eine zusätzliche Variable (bool-Typ, bspw.), damit das Programm auch beendet werden kann. Das erwartet man ja eigentlich auch. Wie gesagt: ist nur meine Meinung, aber ich finde das Ändern von einem erwarteten Verhalten (Schließen in dem Fall) weniger schön. Es kommt aber auf´s Programm an. Bei einer Firewall akzeptiere ich das noch. :)

3. Indem du die Zeilen
Delphi-Quellcode:
Owner := GetWindow(Handle, GW_OWNER);
ShowWindow(Owner, SW_HIDE);
suchst und auskommentierst.

4. Über einen Parameter am besten. Trag es im Autostart etwa so ein
Code:
MeinProgramm /autorun
Diesen Parameter wertest du beim Start aus. Ist er vorhanden, startest du das Programm evtl. gleich minimiert ... oder was auch immer. Ist er nicht vorhanden, dann startet es normal. Dazu müsstest du den TNA-Code in "OnCreate" auch dort lassen und seine Ausführung eben nur vom ermittelten Parameter abhängig machen
Delphi-Quellcode:
if(paramstr(1) = '/autorun') then begin
  Application.ShowMainForm := False;

  { usw. }

__patrik 17. Jul 2003 11:42

Re: Send to tray
 
hallo mathias,

erstmal vielen dank für die ausführliche Antwort, funzt alles so wie ichs gern hätt und das mit der abfrage ob "Schließen" oder "Tray" war so geplant:-)

ich hab nur noch ein kleines Prob mit dem Autostart. den parameter ignoriert er ganz grosszügig:-(
der eintrag in die reg:
Code:
procedure doapptorun(RunName, AppName: string);
...
  RunName := RunName + '/autorun';
  Reg := TRegistry.Create;
  with Reg do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
    WriteString(RunName, AppName);
    CloseKey;
    Free;
der aufruf ob in tray oder nicht:
Code:
oncreate:
...
  if(paramstr(1) = '/autorun') then
    Application.ShowMainForm := False;
irgendwie nimmt er mir den parameter net und zeigt die form immer:-(

danke
patrik

MathiasSimmack 17. Jul 2003 14:01

Re: Send to tray
 
Lass mal ein Leerzeichen zwischen Dateinamen und Parameter. Und du solltest "RunName" in doppelte Anführungszeichen setzen; für den Fall, dass es sich um einen langen Dateinamen handelt, bzw. dass der Ordner (in dem das Programm steckt) Leerzeichen usw. enthält:
Delphi-Quellcode:
RunName := '"' + RunName + '" /autorun';
Dann sollte es gehen.

Dann hätte ich die Frage, ob diese Anweisung
Delphi-Quellcode:
RootKey := HKEY_LOCAL_MACHINE;
Absicht ist. Bitte nicht falsch verstehen, das ist nicht böse gemeint. Nachdem man mir aber neulich sprachliche Ausraster vorwarf, frage ich lieber nach. Falls du mit einem NT-Betriebssystem arbeitest (NT, 2000, XP) kann es bei HKLM Probleme geben, wenn der Anwender (der dein Programm nutzt) keine ausreichenden Rechte (Admin) hat. Wenn du aber sagst, dass das okay ist, weil dein Programm zwingend mit Admin-Rechten gestartet werden muss bzw. unbedingt auf HKLM zugreifen muss, dann habe ich nichts gesagt. Ansonsten solltest du besser auf
Delphi-Quellcode:
RootKey := HKEY_CURRENT_USER;
ausweichen. Das erfüllt auch seinen Zweck.

Hm, eins noch. Ich kann mich irren, aber das hier
Delphi-Quellcode:
if(paramstr(1) = '/autorun') then
  Application.ShowMainForm := False;
könnte evtl. noch zum Problem werden. Deine Bedingung war ja, dass das Programm in der TNA verschwindet, wenn es mit dem Parameter gestartet wird. Wird es dagegen normal angeklickt, dann soll es sichtbar bleiben.

Ich hab´s in meinem Posting nur angedeutet, weil ich den ganzen Code aus Luckies Demo nicht schreiben wollte. Aber nur für den Fall, dass du das missverstanden hast - ich dachte das so:
Delphi-Quellcode:
if(paramstr(1) = '/autorun') then begin
  Application.ShowMainForm := False;
  IconData.cbSize := SizeOf(IconData);
  IconData.Wnd := Handle;
  IconData.uID := 100;
  IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  IconData.uCallBackMessage := WM_USER + 20;
  IconData.hIcon := Application.Icon.Handle;
  IconData.szTip := 'SysInfo';
  Shell_NotifyIcon(NIM_ADD, @IconData);
end;
Bei deinem Code oben passiert folgendes: Wird das Programm über den Autostart aktiv, scheint alles zu funktionieren. Klickt man es jedoch an, ist es zwar sichtbar, aber es wird auch das TNA-Icon angelegt. Ich weiß nicht, ob du das willst. :)

Gruß.

Luckie 17. Jul 2003 14:49

Re: Send to tray
 
Zitat:

Zitat von __patrik
@luckie: deine progg-beispiele sind super!!! aber wäre es vielleicht möglich das du ein, zwei zeilen inlinedoku zu packst.

Ursprünglich waren das nur Beispile/Demos, die ich mal für ein Forum gemacht habe. Und als ich jetzt mal den Ordner aufgeräumt / entmistet habe, sind mir so ein paar Sachen aufgefallen, die ich nicht auf der Festpaltte vergammeln lassen wollte. Also habe ich sie nur mal kurz etwas überarbeitet (den Code etwas ansehnlciher gemacht) und dann einfach ohne großartige Kommentare online gestellt. Ich wollte da jetzt nicht noch großartig was zu schreiben. Es sind eben nur einfache, aber lauffähige Code schnippsel. Es sollten nie Tutorials oder etwas ähnliches werden. Da gibt es genugt andere Seiten im Netz.

Wer damit zurecht kommt, ok gut, wer nicht, na ja Pech. Aber der kann ja dann mit Google suchen und sich informieren oder in einem Form seiner Wahl posten. Aber zu mindest hat er schon mal was in der Hand.

[modmodus on]Neue Frage, neuer Thread bitte.[modmudos off]

toms 17. Jul 2003 19:40

Re: Send to tray
 
Zitat:

1. ... das Progg nicht beim verkleinern in den Tray geht sondern normal unten in die Taskleiste?
Nit dieser Funktion kannst du deine App animiert ins Tray minimieren.

Delphi-Quellcode:
uses
  ShellApi;

procedure MinimizeToTray(AForm: TForm; bMinimizing, bOverrideUserSettings: Boolean);
var
  RectFrom, RectTo: TRect;
  GotRectTo: Boolean;
  abd: TAppBarData;
  HTaskbar, HTrayWnd: HWND;
  ResetRegistry: Boolean;
  ai: TAnimationInfo;

  procedure SetAnimation(Animation: Boolean);
  begin
    FillChar(ai, SizeOf(ai), 0);
    ai.cbSize := SizeOf(ai);
    if Animation then
      ai.iMinAnimate := 1
    else
      ai.iMinAnimate := 0;
    SystemParametersInfo(SPI_SETANIMATION, 0, @ai, SPIF_SENDCHANGE);
  end;

begin
  // Check if user wants window animation
  ResetRegistry := False;
  if bOverrideUserSettings then
  begin
    FillChar(ai, SizeOf(ai), 0);
    ai.cbSize := SizeOf(ai);
    SystemParametersInfo(SPI_GETANIMATION, 0, @ai, SPIF_SENDCHANGE);
    if ai.iMinAnimate = 0 then
    begin
      // Temporarily enable window animation
      ResetRegistry := True;
      SetAnimation(True);
    end;
  end;

  RectFrom := AForm.BoundsRect;
  GotRectTo := False;

  // Get the traybar's bounding rectangle
  HTaskbar := FindWindow('Shell_TrayWnd', nil);
  if HTaskbar <> 0 then
  begin
    HTrayWnd := FindWindowEx(HTaskbar, 0, 'TrayNotifyWnd', nil);
    if HTrayWnd <> 0 then
      if GetWindowRect(HTrayWnd, RectTo) then
        GotRectTo := True;
  end;

  // If that fails, invent a rectangle in the corner where the traybar is
  if not GotRectTo then
  begin
    FillChar(abd, SizeOf(abd), 0);
    abd.cbSize := SizeOf(abd);
    if SHAppBarMessage(ABM_GETTASKBARPOS, abd) = 0 then Exit;
    with Screen, abd.rc do
      if (Top > 0) or (Left > 0) then
        RectTo := Rect(Width-32, Height-32, Width, Height)
      else if (Bottom < Height) then
        RectTo := Rect(Width-32, 0, Width, 32)
      else if (Right < Width) then
        RectTo := Rect(0, Height-32, 32, Height);
  end;

  if bMinimizing then
    DrawAnimatedRects(AForm.Handle, IDANI_CAPTION, RectFrom, RectTo)
  else
    DrawAnimatedRects(AForm.Handle, IDANI_CAPTION, RectTo, RectFrom);

  if ResetRegistry then
    SetAnimation(False);              // Disable window animation
end;

// Beispielaufruf:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Hide;
  FloatingRectangles(Form1, True, True);
end;

__patrik 18. Jul 2003 09:54

Re: Send to tray
 
@mathias:

danke, jetzt funzt alles, mein kardinalfehler war, dass ich den '/autorun'-Parameter zum runName gepackt hab und net zum appName (und wieder was gelernt). :bounce1:
Und zum ROOTKEY: nein, war keine Absicht, danke für den Tipp :D

dankeschön,

patrik


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.

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