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 NonVCL, Nachrichtenschleife und TrayIcon (https://www.delphipraxis.net/5666-nonvcl-nachrichtenschleife-und-trayicon.html)

OrallY 15. Jun 2003 12:22


NonVCL, Nachrichtenschleife und TrayIcon
 
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.

Luckie 15. Jun 2003 12: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.

OrallY 15. Jun 2003 13: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?

Chewie 15. Jun 2003 13:26

Zitat:

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.

Gast 23. Jun 2003 23:57

hInstance ist kein echtes Handle
 
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.

Chewie 24. Jun 2003 16: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.


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