AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Send to tray

Ein Thema von __patrik · begonnen am 17. Jul 2003 · letzter Beitrag vom 18. Jul 2003
Antwort Antwort
__patrik

Registriert seit: 8. Mai 2003
Ort: hamburg
32 Beiträge
 
Delphi 7 Professional
 
#1

Send to tray

  Alt 17. Jul 2003, 09:47
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
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: Send to tray

  Alt 17. Jul 2003, 10:42
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
Application.ShowMainForm := False; benutzt du aber
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. }
  Mit Zitat antworten Zitat
__patrik

Registriert seit: 8. Mai 2003
Ort: hamburg
32 Beiträge
 
Delphi 7 Professional
 
#3

Re: Send to tray

  Alt 17. Jul 2003, 12:42
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
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: Send to tray

  Alt 17. Jul 2003, 15:01
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:
RunName := '"' + RunName + '" /autorun'; Dann sollte es gehen.

Dann hätte ich die Frage, ob diese Anweisung
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 aufRootKey := 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ß.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Send to tray

  Alt 17. Jul 2003, 15:49
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]
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#6

Re: Send to tray

  Alt 17. Jul 2003, 20:40
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;
Thomas
  Mit Zitat antworten Zitat
__patrik

Registriert seit: 8. Mai 2003
Ort: hamburg
32 Beiträge
 
Delphi 7 Professional
 
#7

Re: Send to tray

  Alt 18. Jul 2003, 10:54
@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).
Und zum ROOTKEY: nein, war keine Absicht, danke für den Tipp

dankeschön,

patrik
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 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