Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Windows messages der Taskbar? (https://www.delphipraxis.net/30828-windows-messages-der-taskbar.html)

Helmi 29. Sep 2004 21:21


Windows messages der Taskbar?
 
Hallo,

weiss jemand welche Windows-Messages die Taskbar ausgibt?

mir gehts hauptsächlich um dem SysTray-Teil (also die Icons neben der Uhr links)

Ich möchte darauf reagieren wenn sich da was rührt (Resize)

mfg
Helmi

Remote1 29. Sep 2004 22:02

Re: Windows messages der Taskbar?
 
schau dir mal das an:
Zitat:

Dafür gibt es die API-Funktion Shell_NotifyIcon() und den Daten-Record TNotifyIconData. Und so bindet man das ganze in ein Programm ein (Beispiel von Heino Tiedemann):
Delphi-Quellcode:
uses
  ShellAPI;

const
  WM_TASKABAREVENT = WM_USER+1; //Taskbar message
[...]

type
  TMainForm = class(TForm)
[...]
private
    { Private-Deklarationen }
    procedure TaskbarEvent(var Msg: TMessage);
      Message WM_TASKABAREVENT;
[...]

{Message-Prozedur für das TrayIcon}
procedure TMainForm.TaskbarEvent(var Msg: TMessage);
var Point : TPoint;
begin

  { Die WM_TaskbarEvent-Message "Msg" gibt in Msg.LParam
    das genaue Ereignis an. Msg.LParam kann folgende Werte für
    Mausereignisse annehmen:

    WM_MouseMove
    WM_LButtonDown
    WM_LButtonUp
    WM_LButtonDblClk
    WM_RButtonDown
    WM_RButtonUp
    WM_RButtonDblClk }

  { Eventhandler-Beispiele von Robert Fischer: }
  case Msg.LParam of
    WM_LBUTTONDBLCLK:
      begin
        //Mach etwas nach einem Doppelklick...
      end;
    WM_LBUTTONUP:
      begin
        //Mach etwas nach einem Linksklick...
      end;
    WM_RBUTTONUP:
      begin
        // Rechtsklick
        // Diese Zeile ist wichtig, damit das PopupMenu korrekt
        // wieder geschlossen wird:
        SetForegroundWindow(Handle);
        // PopupMenu anzeigen:
        GetCursorPos(Point);
        PopupMenu1.Popup(Point.x, Point.y);
        //oder ohne Variable Point:
        //PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
      end;
  end;
end;

{TrayIcon mit dem Hauptformular erzeugen}
procedure TMainForm.FormCreate(Sender: TObject);
var
  NotifyIconData: TNotifyIconData;
begin
  Fillchar(NotifyIconData,Sizeof(NotifyIconData),0);
  NotifyIconData.cbSize := Sizeof(NotifyIconData);
  NotifyIconData.Wnd   := Handle;
  NotifyIconData.uFlags := NIF_MESSAGE
    or NIF_ICON
    or NIF_TIP;
  NotifyIconData.uCallbackMessage := WM_TASKABAREVENT;
  NotifyIconData.hIcon := Application.Icon.Handle;
  NotifyIconData.szTip := 'Hinweistext für das TrayIcon';
  Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
end;

{TrayIcon mit dem Hauptformular zerstören}
procedure TMainForm.FormDestroy(Sender: TObject);
var
  NotifyIconData: TNotifyIconData;
begin
  FillChar(NotifyIconData,Sizeof(NotifyIconData),0);
  NotifyIconData.cbSize := Sizeof(NotifyIconData);
  NotifyIconData.Wnd   := Self.Handle;
  NotifyIconData.uFlags := NIF_MESSAGE
    or NIF_ICON
    or NIF_TIP;
  NotifyIconData.uCallbackMessage := WM_TASKABAREVENT;
  NotifyIconData.hIcon := Application.Icon.Handle;
  NotifyIconData.szTip := 'Punkt';
  Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
end;


Helmi 8. Nov 2004 19:13

Re: Windows messages der Taskbar?
 
Hallo,

jetzt muss ich schon wieder mit meinem Problem anfangen :wall:

Also es geht nochmals um mein Problem von oben...

mit dem Beispiel vom "Remote1" ist mir leider nicht geholfen.

Nochmals mein Problem:

Ich habe ein TrayIcon links neben der Uhr erzeugt.
Nun möchte ich rausfinden ob sich die Position des TrayIcons in dem SysTray ändert

Praktisch wäre es wenn man ne Message (so ne Art OnChange) des SysTray abfangen könnte.

Ich hab mal ein wenig geforscht und hab schon mal das Handle des SysTray rausgefunden (siehe Code):

Code:
var
  hWnd: THandle;

begin
  // Fenster anhand des Titelzeilentext suchen
  hWnd := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'TrayNotifyWnd', nil);

  showmessage(IntToStr(hWnd));

  If hWnd <> 0 then
    Sendmessage(HWnd, WM_RBUTTONDOWN, 0, 0); //nur als Beispiel
    Sendmessage(HWnd, WM_RBUTTONUP, 0, 0);   //nur als Beispiel
Ich bräuchte so was änliches wie:
procedure TForm1.WMSysTrayChange (var Msg : TWMSysTrayChange);

Bitte hilft mir :-) - ich bin schon fast verzweifelt...

mfg
Helmi

Luckie 8. Nov 2004 19:43

Re: Windows messages der Taskbar?
 
Wozu musst du wiisen, wo sich dein Icon in der TNA befindet?

Helmi 8. Nov 2004 19:52

Re: Windows messages der Taskbar?
 
Ich zeige über dem TrayIcon eine Form in Form (ein Wortwitz :-)) einer Sprechblase an.

Um gleich mal der Frage entgegen zu treten, ich benutze extra nicht die Windows-Sprechblasen weil diese nicht bei Win98 gehen.

Deshalb erzeuge ich meine eigene.

Nun hab ich ein Problem: die Spitze der Sprechblase soll auf das icon zeigen. Dazu brauch ich die Position des Icons. Auch wenn sich die Position des Icons in der TNA verändert hat (damit die spitze immer über dem Icon angezeigt werden kann)

Ich hoffe das macht mein problem deutlicher

mfg
Helmi


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