AGB  ·  Datenschutz  ·  Impressum  







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

Menu Ownerdraw

Ein Thema von EWeiss · begonnen am 7. Mär 2019 · letzter Beitrag vom 13. Mär 2019
Antwort Antwort
Seite 2 von 3     12 3      
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 13:54
Anbei mal ein Minimalbeispiel (ja, das geht in der Tat recht schnell) zum nachdebuggen in einer höheren Delphiversion, die schon VCL Styles unterstützt (z.B. die Delphi Community Editon).

Du kannst ja einfach mal nachvollziehen, wie in procedure TSysPopupStyleHook.WMPRINT(var Message: TMessage); der Hintergrund bei der Message WM_PRINT (791) gezeichnet wird.
Angehängte Dateien
Dateityp: zip PopupFromToolbar.zip (41,4 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 14:31
Danke werde es mir anschauen..

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 15:06
Report:
Ist einfach mit seiner Engine aber nicht auf meiner weise..
Ich kann nicht erkennen wo das Event ausgelöst wird.. bei mir sollte es eigentlich WM_LBUTTONDOWN sein.

Aber ich bekomme kein gültiges Handle.
Ich klicke ja auf den Tollbarbutton nur welches Handle ist das bekomme ja nur das von der Toolbar selbst zurück geliefert.
Nicht das des Button den ich klicke noch das vom Menu.

Wenn ich das auf seine weise mache schlägt es fehl.
Delphi-Quellcode:
    WM_LBUTTONDOWN:
      begin
        Style := GetWindowLongPtr(WinHandle, GWL_STYLE);
        if (Style and WS_POPUP = WS_POPUP) then
        begin
          if HToolBarMenu <> 0 then
            ToolBarSubClass(hToolbarMenu);
        end;
      end;
Hmmm schwierig..
PS:
Werde es wohl erst mal verwerfen komme nicht an das Handle.

gruss

Geändert von EWeiss ( 7. Mär 2019 um 16:13 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 16:22
mach doch mal ein FindWindowEx auf den Klassennamen '#32768'.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 16:43
mach doch mal ein FindWindowEx auf den Klassennamen '#32768'.
Habe ich schon versucht.. schlägt fehlt in der ToolBarProc.. WM_LBUTTONDOWN und WM_PRINT

Danke.
Werde es so lassen wie es ist. Kann man nichts machen ohne das ich jetzt fremden Quelltext verwende.

gruss

Geändert von EWeiss ( 7. Mär 2019 um 18:05 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 19:44
Wahrscheinlich ist das Popupfenster nicht sofort da. Warte doch ein paar Millisekunden und suche dann.
Du könntest aber auch den Callstack im Beispiel hoch debuggen und Schritt für Schritt verstehen lernen, wie es da in Verbindung mit der Styleengine von Embarcadero gelöst wird.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 20:09
Du könntest aber auch den Callstack im Beispiel hoch debuggen und Schritt für Schritt verstehen lernen, wie es da in Verbindung mit der Styleengine von Embarcadero gelöst wird.
Danke habe das schon gemacht und verstehe was er macht aber es lässt sich so einfach nicht in mein Projekt integrieren.
Er verwendet dafür den "CBT Hook in Verbindung mit SetWindowsHookEx" habe mich aber damit noch nie beschäftigt müsste mich also da erstmal einlesen.

Nur ob sich der Aufwand lohnt ist fraglich.
Zitat:
Wahrscheinlich ist das Popupfenster nicht sofort da. Warte doch ein paar Millisekunden und suche dann.
Ein warten bringt nichts selbst über EnumClientWindows komme ich nicht ans ziel.
Auch ein "Windows Detective" listet mir das Menu nicht auf wenn es angezeigt wird.
Er erkennt es nicht von daher kann ich auch nicht sagen wodurch es aufgerufen wird auch wenn ich es theoretisch weis (Beim Klick auf den Button halt)

gruss

Geändert von EWeiss ( 7. Mär 2019 um 20:19 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 23:25
Auch ein "Windows Detective" listet mir das Menu nicht auf wenn es angezeigt wird.
Er erkennt es nicht von daher kann ich auch nicht sagen wodurch es aufgerufen wird auch wenn ich es theoretisch weis
Das ist doch jetzt Quatsch.

Die Informationen aus den ersten Absatz in meiner ersten Antwort habe ich mir ja nicht ausgedacht, sondern direkt aus dem Windows Detective abgelesen.
Kennst du das Tool?

https://www.thewindowsclub.com/window-detective
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#19

AW: Menu Ownerdraw

  Alt 7. Mär 2019, 23:35
Auch ein "Windows Detective" listet mir das Menu nicht auf wenn es angezeigt wird.
Er erkennt es nicht von daher kann ich auch nicht sagen wodurch es aufgerufen wird auch wenn ich es theoretisch weis
Das ist doch jetzt Quatsch.

Die Informationen aus den ersten Absatz in meiner ersten Antwort habe ich mir ja nicht ausgedacht, sondern direkt aus dem Windows Detective abgelesen.
Kennst du das Tool?

https://www.thewindowsclub.com/window-detective
Quatsch? Ok anbei ein Screenshot!
Nun zeige mir bitte die Classe #32768

Warum soll ich dir irgendwas erzählen was nicht stimmt! Bringt mich in keinem Fall weiter.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:55 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: Menu Ownerdraw

  Alt 8. Mär 2019, 01:17
Destotrotz das ich mit "Windows Detective" die Class nicht finde versuche ich es jetzt auf diesen weg.
OK ist im Log zu finden seltsames Konzept..

Delphi-Quellcode:
function CBTHookProc(nCode: Integer; wP: WPARAM; lP: LPARAM): LRESULT; stdcall;
var
  buf: array[0..128] of Char;
  Style: DWORD;
begin
  if nCode < 0 then
  begin
    result := CallNextHookEx(FHook, nCode, wP, lP);
    exit;
  end;

  case nCode of
    HCBT_CREATEWND:
      begin
        CBTSturct := PCBTCreateWnd(lP)^;
        GetClassName(wP, buf, SizeOf(buf));
        if (Integer(CBTSturct.lpcs.lpszClass) = 32768) then
        begin
          CBTMenuHandle := wP;
          Style := GetWindowLongPtr(CBTMenuHandle, GWL_STYLE);
          if (Style and WS_POPUP = WS_POPUP) then
            ToolBarMenuSubClass(CBTMenuHandle);
        end;
        result := 0;
        exit;
      end;

    HCBT_DESTROYWND:
      if FHook <> 0 then
      begin
        UnhookWindowsHookEx(FHook);
        ToolBarMenuUnSubClass(CBTMenuHandle);
      end;
  end;
  result := CallNextHookEx(FHook, nCode, wP, lP);
end;
Delphi-Quellcode:
function ToolBarProc(WinHandle: HWND; Msg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
var
  hDCTemp: HDC;
  rc, rw: TRect;
  ps: TPaintStruct;
  lpt: TPoint;
  DC: HDC;
  hDCBack: HDC;
begin
  Result := 0;

  case Msg of

    WM_LBUTTONDOWN:
      FHook := SetWindowsHookEx(WH_CBT, @CBTHookProc, 0, GetCurrentThreadId);
Das Problem das ich nun aber habe ist das 2 mal die Class "#32768" gefunden wird das verursacht nun richtige Probleme da ich nicht weis
welches handle nun gültig ist.

Dementsprechend wird jetzt auch 2 mal die Subclass ToolBarMenuSubClass(CBTMenuHandle); aufgerufen.

gruss

Geändert von EWeiss ( 8. Mär 2019 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:55 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