![]() |
Send to tray
moin, moin zusammen,
ich hab mir die Routine von Luckie zum Thema Tray: ![]() 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:-) |
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:
benutzt du aber
Application.ShowMainForm := False;
Delphi-Quellcode:
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. :)
self.Hide;
3. Indem du die Zeilen
Delphi-Quellcode:
suchst und auskommentierst.
Owner := GetWindow(Handle, GW_OWNER);
ShowWindow(Owner, SW_HIDE); 4. Über einen Parameter am besten. Trag es im Autostart etwa so ein
Code:
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
MeinProgramm /autorun
Delphi-Quellcode:
if(paramstr(1) = '/autorun') then begin
Application.ShowMainForm := False; { usw. } |
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:
der aufruf ob in tray oder nicht:
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;
Code:
irgendwie nimmt er mir den parameter net und zeigt die form immer:-(
oncreate:
... if(paramstr(1) = '/autorun') then Application.ShowMainForm := False; danke patrik |
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:
Dann sollte es gehen.
RunName := '"' + RunName + '" /autorun';
Dann hätte ich die Frage, ob diese Anweisung
Delphi-Quellcode:
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
RootKey := HKEY_LOCAL_MACHINE;
Delphi-Quellcode:
ausweichen. Das erfüllt auch seinen Zweck.
RootKey := HKEY_CURRENT_USER;
Hm, eins noch. Ich kann mich irren, aber das hier
Delphi-Quellcode:
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.
if(paramstr(1) = '/autorun') then
Application.ShowMainForm := False; 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:
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. :)
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; Gruß. |
Re: Send to tray
Zitat:
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] |
Re: Send to tray
Zitat:
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; |
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 01:16 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