AGB  ·  Datenschutz  ·  Impressum  







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

Tray Programm ohne VCL

Ein Thema von Novo · begonnen am 24. Feb 2012 · letzter Beitrag vom 26. Feb 2012
Antwort Antwort
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#1

Tray Programm ohne VCL

  Alt 24. Feb 2012, 19:40
Hallo,
ich möchte eine kleine Tray App schreiben:
http://delphi.about.com/library/code/ncaa121801a.htm

Aber da diese ohne Forms auskommen soll, ist es Blödsinn die forms.pas mitzucompilen und das Fenster nur mit Application.ShowMainForm := False zu verstecken.

Wenn ich eine Console App schreibe und das {$APPTYPE CONSOLE} weglasse, habe ich aber kein
OnCreate und OnClose Event mehr. Das Programm beendet sich wenn es bei end ankommt.

Wie mache ich das nun?


Mfg Novo
Takeo
Don't make me angry...
You wouldn't like me when I'm angry!
Blut ist leben, Leben ist Blut, ins Licht geboren suchen wir die Dunkelheit!
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Tray Programm ohne VCL

  Alt 24. Feb 2012, 20:33
Du musst, ein Fenster per WinAPI erzeugen.
Ein Programm, das auf VCL-basiert, hat dies schon gemacht und hat eine sogenannte Message-Schleife.
Diese musst du selbst erzeugen.
Hab grad nicht den Link, aber Luckie hier im Forum, hat ein paar gute Demos, sowie eine Docu geschrieben, wie man sowas macht.

So oder so musst du ein Fenster erzeugen, du kannst aber die Höhe, Breite und Pos auf 0 setzten, dann ist es "unsichtbar".
Und danach kannst du das TrayIcon in etwa genauso erzeugen.
Ich glaub sogar bei den Demos ist eine TrayIcon Demo dabei, wie du sie haben willst.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#3

AW: Tray Programm ohne VCL

  Alt 24. Feb 2012, 20:38
0?
Warum nicht ausblenden? (Visible)


Wenn du eine Konsolenanwendung hast (egal ob mit oder ohne Konsolenfenster), dann gibt es keine Nachrichtenschkleife, welche bei der VCL im Application.Run; abgearbeitet wird.
Ohne Fenster beendet sich eine VCL-Anwendung natürlich. (genauer, wenn das Hauptfenster geschlossen wird oder es nie existierte)

Schau dich bei Luckie auf der Webseite mal um.
> NonVCL
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
madtom

Registriert seit: 24. Feb 2005
Ort: Hamburg
115 Beiträge
 
Delphi XE7 Professional
 
#4

AW: Tray Programm ohne VCL

  Alt 24. Feb 2012, 21:10
Hallo,
hier ist ein bißchen älterer Code, den ich vor längerer Zeit mal aus einer Newsgroup kopiert habe, funktioniert aber immer noch (bei mir Windoes 7 32bit). Eine Resourcendatei Icons.res für das Programm-Icon wird vorausgesetzt. Vielleicht kannst Du das Programm ja für deine Zwecke modifizieren.
Delphi-Quellcode:
program DeskPop;

uses
  Windows, Messages, ShellAPI, SysUtils;

{$R *.RES}
{$R ICONS.RES}

const
  AppName = 'DeskTop Hide';

var
  x: Integer;
  NID: TNotifyIconData;
  WndClass: array [0 .. 50] of Char;

procedure Panic(szMessage: PChar);
begin
  if szMessage <> nil then
    MessageBox(0, szMessage, AppName, MB_OK);
  Halt(0);
end;

procedure HandleCommand(Wnd: HWND; Cmd: Word);
begin
  case Cmd of
    Ord('A'):
      MessageBox(0, 'Freeware brian.slack@strath.ac.uk 1997', AppName, MB_OK);
    Ord('E'):
      PostMessage(Wnd, WM_CLOSE, 0, 0);
  end;
end;

function DummyWindowProc(Wnd: HWND; Msg, wParam: Word; lParam: LongInt): LongInt; stdcall;
var
  TrayHandle: THandle;
  DC: HDC;
  PM: HMENU;
  Pt: TPoint;
begin
  DummyWindowProc := 0;
  StrPCopy(@WndClass[0], 'Progman');
  TrayHandle := FindWindow(@WndClass[0], nil);
  case Msg of
    WM_CREATE: // Program initialisation - just set up a tray icon
      begin
        NID.cbSize := SizeOf(NID);
        NID.Wnd := Wnd;
        NID.uID := 1;
        NID.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
        NID.uCallBackMessage := WM_USER;
        NID.hIcon := LoadIcon(hInstance, 'MAINICON');
        lstrcpy(NID.szTip, 'Desktop is on');
        Shell_NotifyIcon(NIM_ADD, @NID);
      end;
    WM_DESTROY:
      begin
        Shell_NotifyIcon(nim_Delete, @NID);
        PostQuitMessage(0);
        ShowWindow(TrayHandle, SW_RESTORE);
      end;
    WM_COMMAND: // Command notification
      begin
        HandleCommand(Wnd, LoWord(wParam));
        Exit;
      end;
    WM_USER: // Had a tray notification - see what to do
      if (lParam = wm_LButtonDown) then
      begin
        if x = 0 then
        begin
          ShowWindow(TrayHandle, SW_HIDE);
          NID.hIcon := LoadIcon(hInstance, 'offICON');
          lstrcpy(NID.szTip, 'Desktop is off');
          Shell_NotifyIcon(NIM_MODIFY, @NID);
          x := 1
        end
        else
        begin
          ShowWindow(TrayHandle, SW_RESTORE);
          NID.hIcon := LoadIcon(hInstance, 'ONICON');
          lstrcpy(NID.szTip, 'Desktop is on');
          Shell_NotifyIcon(NIM_MODIFY, @NID);
          x := 0;
        end;
      end
      else if (lParam = wm_RButtonDown) then
      begin
        GetCursorPos(Pt);
        PM := CreatePopupMenu;
        AppendMenu(PM, 0, Ord('A'), 'About DeskTop Hide...');
        AppendMenu(PM, mf_Separator, 0, nil);
        AppendMenu(PM, 0, Ord('E'), 'Exit DeskTop Hide');
        SetForegroundWindow(Wnd);
        DC := GetDC(0);
        if TrackPopupMenu(PM, tpm_BottomAlign or tpm_RightAlign, Pt.x,
          GetDeviceCaps(DC, HORZRES) { pt.y } , 0, Wnd, nil) then
          SetForegroundWindow(Wnd);
        DestroyMenu(PM)
      end;
  end;
  DummyWindowProc := DefWindowProc(Wnd, Msg, wParam, lParam);
end;

procedure WinMain;
var
  Wnd: HWND;
  Msg: TMsg;
  Cls: TWndClass;
begin
  { Previous instance running ?  If so, exit }
  if FindWindow(AppName, nil) <> 0 then
    Panic(AppName + ' is already running.');

  { Register the window class }
  FillChar(Cls, SizeOf(Cls), 0);
  Cls.lpfnWndProc := @DummyWindowProc;
  Cls.hInstance := hInstance;
  Cls.lpszClassName := AppName;
  RegisterClass(Cls);

  { Now create the dummy window }
  Wnd := CreateWindow(AppName, AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, HInstance, nil);
  x := 0;
  if Wnd <> 0 then
  begin
    ShowWindow(Wnd, SW_HIDE);
    while GetMessage(Msg, 0, 0, 0) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
end;

begin
  WinMain;
end.
Thomas
Delphi Programming
  Mit Zitat antworten Zitat
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Tray Programm ohne VCL

  Alt 25. Feb 2012, 16:30
Du musst, ein Fenster per WinAPI erzeugen.
Will aber kein Fenster, es soll nur per WinAPI nen TrayIcon erstellen.

0?
Warum nicht ausblenden? (Visible)
Ohne Forms vcl ist das Programm sauschnell und viel kleiner (< 20 kb)
Wollte es halt mal so probieren.


Habe mir jetzt mal ne "Form ohne VCL" Demo besorgt und studiere sie mal
Takeo
Don't make me angry...
You wouldn't like me when I'm angry!
Blut ist leben, Leben ist Blut, ins Licht geboren suchen wir die Dunkelheit!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Tray Programm ohne VCL

  Alt 25. Feb 2012, 16:41
Will aber kein Fenster, es soll nur per WinAPI nen TrayIcon erstellen.
Du kannst das so viel wollen wir du willst, aber Windows verlangt eben nun mal ein Fenster für die Nachrichten Verarbeitung. Ein Trayicon ist nun mal an ein Fenster gebunden. Da kannst du mit dem Fuß noch so oft aufstampfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Novo

Registriert seit: 27. Mai 2007
122 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Tray Programm ohne VCL

  Alt 26. Feb 2012, 02:18
... Windows verlangt eben nun mal ein Fenster für die Nachrichten Verarbeitung. Ein Trayicon ist nun mal an ein Fenster gebunden.
WHAT xD Sowas dummes.
naja wenn ich per WinAPI ein kleines Fenster erzeuge und den dann "visible := false" mache dann sollte das ja gehen.

Sorry aber das ist mein erster NonVCL Versuch.
Takeo
Don't make me angry...
You wouldn't like me when I'm angry!
Blut ist leben, Leben ist Blut, ins Licht geboren suchen wir die Dunkelheit!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Tray Programm ohne VCL

  Alt 26. Feb 2012, 08:36
WHAT xD Sowas dummes.
naja wenn ich per WinAPI ein kleines Fenster erzeuge und den dann "visible := false" mache dann sollte das ja gehen.
Nur weil du ein Fenster erzeugst, sieht man das ja nicht gleich. Es geht ja nur darum, dass du ein Fensterhandle hast, über das die Kommunikation läuft. Mit der Anzeige eines Fensters hat das gar nichts zu tun.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Tray Programm ohne VCL

  Alt 26. Feb 2012, 10:55
Will aber kein Fenster, es soll nur per WinAPI nen TrayIcon erstellen.
Du kannst das so viel wollen wir du willst, aber Windows verlangt eben nun mal ein Fenster für die Nachrichten Verarbeitung. Ein Trayicon ist nun mal an ein Fenster gebunden. Da kannst du mit dem Fuß noch so oft aufstampfen.
Sicher? Gab es da nicht mal die Möglichkeit von der WinAPI aus ein Fenster vorzugaukeln über das die Nachrichten Schleifen laufen? Ich meine da mal sowas gelesen zu haben....
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#10

AW: Tray Programm ohne VCL

  Alt 26. Feb 2012, 12:01
Hier im Forum suchenMessageOnlyWindow (in Delphi ist in Delphi-Referenz durchsuchenApplication sowas ähnliches versteckt)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 12:41 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