Ich auch nicht, aber was solls:
Delphi-Quellcode:
unit PopLst;
interface
uses
Menus, Messages;
type
TPopupListEx =
class(TPopupList)
private
procedure WndProc(
var Message: TMessage);
override;
public
PopupMenu: TPopupMenu;
MenuLoop: Boolean;
end;
implementation
procedure TPopupListEx.WndProc(
var Message: TMessage);
begin
case Message.Msg
of
WM_ENTERMENULOOP:
MenuLoop := true;
WM_EXITMENULOOP:
MenuLoop := false;
end;
inherited WndProc(
Message);
end;
end.
Wie du siehst warte ich auf die beiden Nachrichten WM_ENTERMENULOOP und WM_EXITMENULOOP. Die Zeit zwischen diesen beiden Nachrichten ist ziemlich genau die Zeit, während der ein Kontextmenü sichtbar ist. Du musst dann nur noch in deinem Projekt die globale Variable Menus.PopupList austauschen:
Delphi-Quellcode:
program Demo;
uses
Forms,
Menus,
DemoFrm in 'DemoFrm.pas' {DemoForm},
PopLst in 'PopLst.pas';
{$R *.res}
begin
PopupList.Free;
PopupList := TPopupListEx.Create;
Application.Initialize;
Application.CreateForm(TDemoForm, DemoForm);
Application.Run;
end.
Im Ereignis OnPopup deiner Kontextmenüs kannst du dann noch vermerken, welches Menü geöffnet wurde:
Delphi-Quellcode:
procedure TDemoForm.PopupMenuPopup(Sender: TObject);
begin
TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu;
end;
Theoretisch weißt du jetzt immer, welches PopupMenu zuletzt benutzt wurde, und ob es noch aktiv ist. Da der menu loop aber modal ist, weiß ich nicht so recht, wann du auf diese Information zugreifen willst - und warum.
marabu