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