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 nur als Tray sichtbar (https://www.delphipraxis.net/27852-programm-nur-als-tray-sichtbar.html)

RuX 16. Aug 2004 16:06


Programm nur als Tray sichtbar
 
TNA_FragenCount++;
Mal zur Abwechslung eine Tray Frage.
Ich will das mein Programm nur als TrayIcon sichtbar ist, und nicht auch noch in der Taskbar. Hab vorhin ca 30min hier im Forum gesucht aber nur eine Antwort gefunden die bei mir nicht zu funktionieren scheint (Delphi3):
Delphi-Quellcode:
ShowWindow(self.Handle, SW_HIDE);
Hat bei mir irgendwie keine Wirkung, obwohl irgendwo geschrieben wurde dass es so funktionieren sollte. Hat jemand eine Idee?

P.S.: Ich habs ohne Komponente gemacht und will auch wegen allgemeiner Resourcen Einsparung keine verwenden :)

Muetze1 16. Aug 2004 16:18

Re: Programm nur als Tray sichtbar
 
Moin!

Bevor ich mich auf die Suche begebe was bei dir Self ist, folgender Vorschlag: Probier dies mal aus und sage mir, ob dieses Projekt dies ordentlich macht. Wenn ja, dann kannst du den Fehler leicht durch vergleichen herausfinden. Wenn nicht, dann müssen wir uns mal um die Details kümmern warum in D3 die VCL das nicht mag.

MfG
Muetze1

RuX 17. Aug 2004 08:20

Re: Programm nur als Tray sichtbar
 
achso ja, self ist bei mir ein formular, ich verwende also das formular handle.
dein beispiel programm scheint auch leider kein delphi3 projekt zu sein, kommt ein stream fehler beim öffnen. source kann ich aber anschaun und wenn ich das richtig sehe wird da ja nur das hinzufügen und entfernen des TNA Icons selber behandelt. mir gings ja aber um das unsichtbarmachen des "normalen" balkens, also der balken der links _neben den tray icons ist. halt der programm balken der bei ganz normalen programmen in der taskbar erscheint. den will ich verstecken das nur noch das trayicon, sprich tna sprich das kleine ding bei der uhr zu sehen ist :) trotzdem danke schonmal

Luckie 17. Aug 2004 09:52

Re: Programm nur als Tray sichtbar
 
Delphi-Referenz durchsuchenHide heißt die Eigenschaft, die du suchst:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, Menus;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Item11: TMenuItem;
    Item21: TMenuItem;
    Item31: TMenuItem;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    IconData: TNotifyIconData;
  public
    { Public-Deklarationen }
    procedure WndProc(var Msg: TMessage); override;
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

////////////////////////////////////////////////////////////////////////////////
// auf Mausklicks reagieren, Fensterprozedur erweitern

procedure TForm1.WndProc(var Msg: TMessage);
var
  Point: TPoint;
begin
  if Msg.Msg = WM_USER + 20 then
  begin
    case Msg.lParam of
      WM_RBUTTONDOWN:
        begin
          SetForegroundWindow(Handle);
          GetCursorPos(Point);
          PopUpMenu1.PopUp(Point.X, Point.Y);
        end;
      WM_LBUTTONDOWN:
        begin
          //ShowMessage('links runter');
        end;
      WM_LBUTTONDBLCLK:
        begin
          Form1.Show;
          // Icon nur anzeigen wenn Fenster minimiert
          Shell_NotifyIcon(NIM_DELETE, @IconData);
        end;
    end;
  end;
  inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// beim Minimieren Fomr verstecken und Icon in die TNA

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType and $FFF0 = SC_MINIMIZE then
  begin
    Hide; // <-- Versteckt das Fenster und läßt es aus der Taskbar verschwinden
    // Icon nur anzeigen wenn Fenster minimiert
    Shell_NotifyIcon(NIM_ADD, @IconData);
  end
  else
    inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// Beim beenden Icon entfernen

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

////////////////////////////////////////////////////////////////////////////////
// Beim Erstellen des Formulares TNotifyIconData-Struktur initialisieren

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Application.ShowMainForm := False; //Programm gar nicht erst anzeigen
  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 := 'Dies ist ein TNA-Icon';
  //Shell_NotifyIcon(NIM_ADD, @IconData); // fügt das Icon ein end;
end;

end.

RuX 17. Aug 2004 10:51

Re: Programm nur als Tray sichtbar
 
nein hide kenn ich, das schaltet tform.visible auf false und versteckt somit auch das formular. hm sorry hatte mich unklar ausgedrückt: alles was ich verstecken will ist der balken in der taskleiste nicht aber die anwendung. ich will sozusagen anstatt dem balken ein trayicon. das trayicon soll immer zu sehen sein (aber damit hab ich ja auch keine probleme) und der taskbar programm balken nie.
franz alexanders tbm programm ist zb dazu in der lage, dazu gibs aber leider keine sourcen

glkgereon 17. Aug 2004 11:06

Re: Programm nur als Tray sichtbar
 
benutz doch einfach CoolTrayIcon

funzt super!

zum download zb auf
http://www.delphi32.com/vcl/5086/
http://www.chaho.de/templates/show_c...geID=1&GetID=2 (unten in der gruppe system)
http://www.delphipages.com/result.cfm?ID=1368

und vielen, vielen anderen sites

RuX 17. Aug 2004 11:16

Re: Programm nur als Tray sichtbar
 
nein danke wie schon gesagt möchte ich keine fremd komponente benutzen, cooltray icon bläht die anwendung von 200 auf >400k auf. auf dem zielsystem ist resourcensparen angesagt und angebracht und außerdem bin ich neugierig :coder2:

SleepyMaster 17. Aug 2004 11:22

Re: Programm nur als Tray sichtbar
 
Wenn ich dich richtig verstanden habe dürfte dir das helfen http://www.swissdelphicenter.ch/de/showcode.php?id=54

RuX 17. Aug 2004 11:45

Re: Programm nur als Tray sichtbar
 
Zitat:

Zitat von SleepyMaster
Wenn ich dich richtig verstanden habe dürfte dir das helfen http://www.swissdelphicenter.ch/de/showcode.php?id=54

:love:
wunderbar. bei den anderen beispielen wurde bei ShowWindow immer das Handle vom Formular verwendet was nicht funktioniert. Mit dem handle das GetWindow(Handle, GW_OWNER) zurückliefert funktioniert es aber einwandfrei :cheers:

noch ein kleines manko: windows reserviert anfangs trotzdem platz in der taskleiste für das programm. wenn man ein programm startet schieben sich die anderen ja etwas zusammen, vorrausgesetzt es sind genug. er erzeugt mir also beim start eine lücke. erst wenn ich was neues starte oder ein vorhandenes schließe zeichnet er die leiste neu und entfernt die lücke wieder. aber halb so wild.

aber hat jemand ne ahnung wieso mein tna icon verschwindet (beim drüberfahren, neuzeichnen) wenn ich davor während der laufzeit von formstyle = fsStayOnTop nach formstyle = fsNormal geschaltet habe? andersrum funktionierts :gruebel:

Igotcha 13. Sep 2004 10:50

Re: Programm nur als Tray sichtbar
 
Zitat:

Zitat von Luckie
Delphi-Referenz durchsuchenHide heißt die Eigenschaft, die du suchst:
...

Funktioniert bei meinem Anwendungsfall wunderbar. Nur, wie kann ich dann aus meiner Anwendung heraus, wenn das Fenster vom Style "Toolwindow" ist, meine Anwendung per Code minimieren.

Application.minimize, Form.Hide, etc. führen nicht dazu, dass mein Programm dann im Tray angezeigt wird. Im Fenstermenü über "Minimieren" geht es.

Gruß Igotcha


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 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