Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dynamische Images erzeugen, OnMouseDown Message? (https://www.delphipraxis.net/137516-dynamische-images-erzeugen-onmousedown-message.html)

schwa226 22. Jul 2009 14:40


Dynamische Images erzeugen, OnMouseDown Message?
 
Hi,

ich habe ein Form, wo ich je nach belieben Dynmaisch neue Images hinzufüge.
Jedem Image weise ich bei der Erstellung die gleiche OnMouseDown Funktion zu.

Wenn man nun ein Image drückt kann ich durch den Sender heraus finden ob Image[0], Image[1],... gedrückt wurde.

Soweit so gut, jedoch möchte ich die Message erhalten was das System erzeugt.

Sowas wie das hier:
OnMyMessage(var Msg: TMessage); message

Dann filtere ich die Msg nach WM_LBUTTONDOWN, WM_RBUTTONDOWN, usw.
Trifft der Case zu wird die Msg an ein anderes, externes Hwnd per Sendmessage weiter geleitet.

Jedoch weis ich nicht wie ich das einrichten kann, dass ich immer noch den Sender ermitteln kann, den jedes Image hat ein anderes externes Hwnd. Oder steht der Sender auch in der Msg drinnen?

Medium 22. Jul 2009 15:59

Re: Dynamische Images erzeugen, OnMouseDown Message?
 
OnMouseDown liefert doch auch einen Parameter mit der Rechts- und Linksklick identifiziert.

SimStar001 22. Jul 2009 16:49

Re: Dynamische Images erzeugen, OnMouseDown Message?
 
Delphi-Quellcode:
if Button = mbleft then
  dosomething
    else
      dosomthingelse;

schwa226 22. Jul 2009 19:17

Re: Dynamische Images erzeugen, OnMouseDown Message?
 
Das habe ich bereits so versucht!

Filtern des Buttons und dann per Sendmessage je nach Button per Sendmessage weiter!

Ein Programm das z.B. JvTrayIcon verwendet nimmt den Mouse Click nicht an. Da taucht dann das Popup Menu, dass normal mit der rechten Mouse Taste geöffnet wird nicht auf!

Bei anderen Anwendungen gibt es dann aber keine Probleme und rechte & linke Mouse Taste wird aktzeptiert!

Medium 23. Jul 2009 00:00

Re: Dynamische Images erzeugen, OnMouseDown Message?
 
Da wird dir auch kein Weiterreichen der Message weiter helfen. Die schaut nämlich nicht so viel anders aus wie deine selbst gesendete. Das Problem dürfte hier viel mehr das SysTray sein, das nicht wie andere normale Fenster reagiert. (Was nix mit JvTrayIcon an und für sich zu tun haben dürfte.)

Erzähl uns lieber was genau du letztlich vor hast, und evtl. kommen wir zusammen auf eine Lösung. (Ich hab eine Vermutung, würd's aber gern genauer wissen.)

schwa226 23. Jul 2009 06:33

Re: Dynamische Images erzeugen, OnMouseDown Message?
 
Ich arbeite an einem kleinen Shell-Ersatz.
d.h. Explorer.exe wird gar nicht gestartet.

Ich erzeuge ein Fenster: 'Shell_TrayWnd' und seine 3 Childs TrayNotifyWnd, SysPager, ToolbarWindow32.
Habe gehört, dass manche Anwendungen danach suchen und abstürzen wenn die Childs nicht gefunden werden.

Nach dem Erzeugen sende ich noch die Message:

SendMessage(HWND_BROADCAST, RegisterWindowMessage('TaskbarCreated'), 0, 0);

Dann melden sich der Großteil der Anwendungen mit der WM_COPYDATA bei meinem 'Shell_TrayWnd' Fenster.
Alle Icons bekomme ich nur wenn ich einen Neustart mache. Das ist mit dem Explorer aber genau so - also OK.

Je nach NIM_ADD, NIM_MODIFY oder NIM_REMOVE Update/füge hinzu/entferne ich Icons.
Jedes Icon sendet mir seine TNotifyIconData und somit habe ich für jedes Icon dann die Callback & Hwnd & uID.

Weiterleiten tu ich z.b so:

Delphi-Quellcode:
Sendmessage(MyIcon[i].Wnd,
            MyIcon[i].uCallbackMessage,
            MyIcon[i].uID,
            WM_LBUTTONDOWN);
Und das nimmt mir nicht jede Anwendung an!? Kaspersky z.B. geht linke & rechte Mouse super. Bei einer anderen Anwendung wie z.B. Windows Update Icon geht nichts!


EDIT: Habe mir nun etwas die JEDI angesehen:

Die Unit JvTrayIcon sucht nach der
Delphi-Quellcode:
TOOLBARCLASSNAME = 'ToolbarWindow32';
Davon will es sich ein TRect holen (Poistion der TNA):

Delphi-Quellcode:
        // Retrieve the button rectangle..
        SendMessage(ToolbarHandle, TB_GETITEMRECT, Index, Longint(Data));
        // ..and copy it to the current process. If it fails no need to continue
        if not ReadProcessMemory(FData, SizeOf(IconRect), IconRect) then
          Exit;
Da wird es schon mal aussteigen. Da muss ich anscheinend noch etwas nachbessern...

Auch das habe ich gefunden:
Delphi-Quellcode:
{ We get the following messages while clicking:

  Shell version < 5.0                |  Shell version >= 5.0
                                     |
  Single click    Double click     |  Single click         Double click
                                     |
  WM_BUTTONDOWN   WM_BUTTONDOWN    |  WM_BUTTONDOWN        WM_BUTTONDOWN
  WM_BUTTONUP     WM_BUTTONUP      |  WM_BUTTONUP          WM_BUTTONUP
                   WM_BUTTONDBLCLK  |  WM_CONTEXTMENU (*)   WM_CONTEXTMENU (*)
                   WM_BUTTONUP      |                        WM_BUTTONDBLCLK
                                     |                        WM_BUTTONUP
                                     |                        WM_CONTEXTMENU (*)
  (*) if clicked with the right mouse button.

  o We use the tisClicked flag to indicate that we received a WM_BUTTONDOWN;
     if we receive a WM_BUTTONUP we can then make a difference between button ups
     from double click and from single clicks. DoClick is thus not called twice
     for double clicks.
     (similar to csClicked flag in TControl.ControlState)
  o Normal behaviour for window controls is to call both DoClick and DoDoubleClick
     when the user double clicks the control. For the tray icon we don't want that.
     We use the tisWaitingForDoubleClick flag to indicate that we received a
     WM_BUTTONDOWN and WM_BUTTONUP and thus want to call DoClick. But instead of
     calling DoClick we start a timer; if we receive a WM_BUTTONDBLCLK before the
     timer ends, the user double clicked the icon otherwise it was a single click.
  o For Shell32.dll versions before 5.0 we call DoContextPopup in WM_BUTTONUP
     to simulate WM_CONTEXTMENU messages.

  Thus the result is:

  Shell version < 5.0                     |  Shell version >= 5.0
                                          |
  Single click        Double click      |  Single click        Double click
                                          |
  WM_BUTTONDOWN       WM_BUTTONDOWN     |  WM_BUTTONDOWN       WM_BUTTONDOWN
    OnMouseDown         OnMouseDown     |    OnMouseDown         OnMouseDown
  WM_BUTTONUP         WM_BUTTONUP       |  WM_BUTTONUP         WM_BUTTONUP
    Start Timer         Start Timer     |    Start Timer         Start Timer
    OnMouseUp           OnMouseUp       |    OnMouseUp           OnMouseUp
    OnContextPopup (*)  OnContextPopup (*)| WM_CONTEXTMENU (*)  WM_CONTEXTMENU (*)
  WM_TIMER            WM_BUTTONDBLCLK   |    OnContextPopup       OnContextPopup
    OnClick     (**)   Stop Timer      |  WM_TIMER            WM_BUTTONDBLCLK
                         OnDoubleClick   |    OnClick    (**)    Stop Timer
                       WM_BUTTONUP       |                         OnDoubleClick
                         OnMouseUp       |                       WM_BUTTONUP
                         OnContextPopup  |                         OnMouseUp
                                          |                       WM_CONTEXTMENU (*)
                                          |                         OnContextPopup

   (*) if clicked with the right mouse button.
  (**) OnClick comes after the OnMouseUp. Another design decision could
       be to also delay OnMouseUp.
}


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