Einzelnen Beitrag anzeigen

r29d43

Registriert seit: 18. Jan 2007
289 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Wie im IOTA-Package rauskriegen, ob die IDE gerade ein KontextMenü anzeigt?

  Alt 1. Aug 2021, 17:38
thx.

@UweRaabe, anno 2013 war mal unter http://delphi.about.com/od/adptips20...opuplistex.htm diese kleine Unit downloadbar mit der man das aber für normale Applications ganz gut konnte.

Delphi-Quellcode:
 unit PopupListEx;

// kopiert von: http://delphi.about.com/od/adptips2006/qt/popuplistex.htm

 interface
 
 uses windows,Controls;
 
 const
    CM_MENU_CLOSED = CM_BASE + 1001;
    CM_ENTER_MENU_LOOP = CM_BASE + 1002;
    CM_EXIT_MENU_LOOP = CM_BASE + 1003;

var PopupWinIsUp : boolean = false; // von mir noch hinzugefügt am 12.04.2013
 
 implementation

 uses Messages, Forms, Menus;
 
 type
    TPopupListEx = class(TPopupList)
    protected
      procedure WndProc(var Message: TMessage) ; override;
    private
      procedure PerformMessage(cm_msg : integer; msg : TMessage) ;
    end;
 
 { TPopupListEx }
 procedure TPopupListEx.PerformMessage(cm_msg: integer; msg : TMessage) ;
 begin
// if Screen.Activeform <> nil then
// Screen.ActiveForm.Perform(cm_msg, msg.WParam, msg.LParam) ;
    Application.MainForm.Perform(cm_msg, msg.WParam, msg.LParam) ; // von mir für die beiden Zeilen darüber eingefügt am 04.04.2013
 end;
 
 procedure TPopupListEx.WndProc(var Message: TMessage) ;
 begin
    case message.Msg of
      WM_ENTERMENULOOP: begin PerformMessage(CM_ENTER_MENU_LOOP, Message); PopupWinIsUp := true; end;
      WM_EXITMENULOOP : begin PerformMessage(CM_EXIT_MENU_LOOP, Message); PopupWinIsUp := false; end;
      WM_MENUSELECT :
      with TWMMenuSelect(Message) do
      begin
        if (Menu = 0) and (Menuflag = $FFFF) then
        begin
          PerformMessage(CM_MENU_CLOSED, Message);
          PopupWinIsUp := false;
        end;
      end;
    end;
    inherited;
 end;
 
 initialization
    Popuplist.Free; //free the "default", "old" list
    PopupList:= TPopupListEx.Create; //create the new one
    // The new PopupList will be freed by
    // finalization section of Menus unit.
 end.
Beim Übertragen auf mein IOTA-Package bekam ich aber leider immer irgendwo ein Exception. Auch wenn ich in der PerformMessage-Proc anstelle von ActiveForm bzw. MainForm dann das Editor-Window angab. Letzteres ist ja (gemäß Post#13 in Link) ein TWinControl dessen WinProc man überschreiben kann und wo ich dann versuchte, diese in obiger Unit dorthin abgeschickten cm_msgs wieder in Empfang zu nehmen bzw. darauf zu regieren. Müsste mal irgendjemand austüfteln, ob und wie das auch bei IOTA-Packages funktionieren kann.


@stahli, geht leider nicht, weil Editor.focused auch dann true ausgibt, wenn gerade das KontextMenü oder auch das Hauptmenü angezeigt wird. Ansonsten funktioniert Editor.focused allerdings normal.

Ich habe das jetzt aber einfach so gelöst, indem ich mit meinem eigenen Spyer die Class des KontextMenü-Wins und die des Hauptmenü-Wins ermittelt habe und jetzt per FindWindow in einer TimerProc einfach danach suche. Also in etwa so:

Delphi-Quellcode:
  aMenuWinIsVisible := (FindWindow('TCustomActionPopupMenuEx','') <> 0) // wenn KontextMenü sichtbar
                       or (FindWindow('TIDEStylePopupMenu','') <> 0); // wenn HauptMenü sichtbar

Geändert von r29d43 ( 1. Aug 2021 um 17:48 Uhr)
  Mit Zitat antworten Zitat