Check if a PopUp Menu is open

Spread the love

Check if a PopUp Menu is open

Using the WM_MENUSELECT message of the form won’t work to check if
the popup is open. Simply because the parent of the popup is not the
form (check the popup method of TPopupMenu). A workaround is to use
the api call yourself :

type
  TForm1 = class(TForm)
    {...}
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    IsMenuOpen: Boolean;
    procedure WMMENUSELECT(var msg: TWMMENUSELECT); message WM_MENUSELECT;
  end;

{...}
implementation

{...}

procedure TForm1.WMMENUSELECT(var msg: TWMMENUSELECT);
begin
  inherited;
  IsMenuOpen := not ((msg.MenuFlag and $FFFF > 0) and
    (msg.Menu = 0));
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then
    with ClientToScreen(Point(X, Y)) do
      TrackPopupMenuEx(PopupMenu1.Handle, TPM_LEFTALIGN, X, Y,
        Self.Handle, nil);
end;