AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi NonVCL, Nachrichtenschleife und TrayIcon
Thema durchsuchen
Ansicht
Themen-Optionen

NonVCL, Nachrichtenschleife und TrayIcon

Ein Thema von OrallY · begonnen am 15. Jun 2003 · letzter Beitrag vom 24. Jun 2003
Antwort Antwort
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#1

NonVCL, Nachrichtenschleife und TrayIcon

  Alt 15. Jun 2003, 13:22
Ich habe mich jetzt mal endlich drangesetzt, um mir mal ein bisschen die NonVCL-Programmierung einzutrichtern. Dazu wollte ich ein kleines Programm schreiben, dass sich nur im TNA befindet. Schwierigkeiten macht mir aber bissher noch die Nachrichtenauswertung und noch ein Problem: Wenn ich das Programm starte, erscheinz zwar das TrayIcon, jedoch verschwindet es wieder, sobald man mit der Maus darüber fährt. Das Programm läuft allerdings noch weiter. Hier der Code:
Delphi-Quellcode:
program FirstStep;
uses
  Windows,Messages,ShellAPI;

var
  msg: TMsg;

function AddTrayIcon: boolean;
var
  IconData: TNOTIFYICONDATA;
begin
  with IconData do
    begin
      cbSize := SizeOf(TNOTIFYICONDATA);
      Wnd := hInstance;
      uID := 1;
      uFlags := NIF_ICON + NIF_TIP;
      hIcon := LoadIcon (0, IDI_APPLICATION);
      szTip := 'Tooltip';
    end;

  Result := Shell_NotifyIcon (NIM_ADD, @IconData);
end;

begin
  if not AddTrayIcon then
    exit;
  while true do
  begin
    if not GetMessage(msg, 0, 0, 0) then
      break;
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
  ExitCode := msg.wParam;
end.
Und wie schon gefragt: Wie kann ich jetzt eigentlich die Nachrichten, die mir die Nachrichtenschleife so fleißig abfängt auswerten bzw. darauf reagieren? Beim den Tuts, in denen ein Fenster erzeugt wurde, gab es eine Prozedur (oftmals names WndProc) deren Addresse beim Erzeugen der Form übegeben wurde.
Kurzum: Ich weiß nicht wie es geht und bitte um Hilfe.
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 15. Jun 2003, 13:44
Wie du schon richtig erkannt hast, brauchst du eine Fenster-Prozedur und ein Fenster um deine Nachrichten zu verarbeiten. Da führt kein Weg drumrum, da Windows nachrichten nur an Fenster schicken kann.

Erzeuge also mit CreateWindow einfach ein unsichtbares Fenster in dessen Fensterprozedur, du die Klicks vom Menü des TrayIcons auswertest.

Kuck dir mal mein Progamm NoteIt an, das läuft praktisch auch nur als TrayIcon im Hintergrund.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#3
  Alt 15. Jun 2003, 14:19
Vielen Dank! Klappt jetzt alles wunderbar. Der Fehler mit dem TrayIcon war, dass ich uID hInstance zugewiesen habe, anstatt des Fensterhandles HWnd.
Was genau ist eigentlich hInstance?

Ist es eigentlich Resourcenbelastender, wenn man extra eine Fensterklasse erzeugen muss?
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 15. Jun 2003, 14:26
Zitat von OrallY:
Was genau ist eigentlich hInstance?
hInstance ist das Handle der Instanz der Anwendung. Dieses wird von Windows zugeteilt. Die Variale wird in der Unit system.pas festgelegt.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#5

hInstance ist kein echtes Handle

  Alt 24. Jun 2003, 00:57
Die obige Aussage zu hInstance stimmte unter Win16. Inzwischen ist das kein Handle mehr. Es ist de facto eine zu hInstance gecastete Adresse des Moduls, welches durch hInstance bezeichnet wird. Deswegen gilt dieses Handle auch nur innerhalb eines Prozesses!

Intern wandelt Windows dann hInstance wieder zurück in eine Adresse, und kann dann zB zum Laden von Dialogen etc in dem Modul die Ressourcen finden und entsprechend laden.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 24. Jun 2003, 17:35
OK, wenn du das sagst, glaub ich es, ich hab nur den Text aus der Delphi-Hilfe wiederholt. Das da nicht alles stimmt, was drinsteht, ist ja nichts Neues.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  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 10:51 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