私は自分のプログラムのnotifyIconを作成しています。将来的にはOSに依存しませんが、今のところwin-32部分を書いています。
WM_RBUTTONDOWN メッセージを受信した後に popupmenu を表示すると、メニューが表示されますが、このメニューはタスクバーの後ろにあります。タスクバーの前にある通常のメニューを作成する方法は?
問題は fmx.popupmenu にあります。VCL.popupmenu と同じ動作をすると仮定するのは間違っていますか?
編集されたコード:
{$IFDEF MSWINDOWS}
Tray:=TPWTrayIcon.Create((handle));
{$ENDIF MSWINDOWS}
Tray.popupmenu:=pmTray;
constructor TPWTrayIcon.Create(pHANDLE:TFMXHandle);
Var
HIco: HICON;
p:tMenuitem;
begin
{$IFDEF MSWINDOWS}
FHandle := AllocateHWnd(HandleIconMessage);
AHandle := FmxHandleToHWND(pHandle);
try
Hico:= LoadIcon(MainInstance,'MAINICON');
tIcon.cbSize := sizeof(tIcon);//TNotifyIconData);
with tIcon do begin
Wnd := FHandle;
uID := 123;
//guidItem:=123;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_GUID or NIF_TIP;
uCallbackMessage := WM_NOTIFYICON;
hIcon := HIco;
uVersion:=NOTIFYICON_VERSION_4;
end;
Shell_NotifyIcon(NIM_ADD, @tIcon);
Shell_NotifyIcon(NIM_SETVERSION, @tIcon);
except
end;
{$ENDIF MSWINDOWS}
end;
procedure TPWTrayIcon.HandleIconMessage(var Msg: TMessage);
var
tmpPoint:TPoint;
begin
if Msg.Msg = WM_NOTIFYICON then begin
case LOWORD(Msg.LParam )of
WM_RBUTTONDOWN:
if Assigned(PopUp) then begin
Cardinal(tmpPoint):=(GetMessagePos);
{EDIT: the following doesnt work in Firemonkey}
//SetForegroundWindow(Application.Handle);
//Application.ProcessMessages;
if SetForegroundWindow(AHANDLE) then
Popup.Popup(tmpPoint.X,tmpPoint.Y);
end;
end;
end;
編集:回避策:
VCL.Menu を使用します。Firemonkey.menus の代わりに