使用菜单栏按钮最小化FMX表单,然后通过单击任务栏图标进行恢复将使表单返回到前台,但不会激活窗口。表格也被最小化"直接"而是应用动画"收缩"任务栏的窗口。不会触发表单OnActivate事件。
奇怪的是,如果我修补WindowProc并在停用时调用带有SW_RESTORE的ShowWindow,则单击任务栏图标后将正确恢复表单。我不确定为什么。最小化动画仍然没有被解雇。
procedure TForm1.WindowProc(var Msg: TMessage);
begin
case Msg.Msg of
WM_ACTIVATE: if (Msg.WParamLo = WA_INACTIVE) then ShowWindow(WindowHandleToPlatform(Handle).Wnd, SW_RESTORE);
end;
Msg.Result := CallWindowProc(OrgWndProc, WindowHandleToPlatform(Handle).Wnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;
我可以在Windows 8上用空白的FMX HD表单观察到这种行为。这对我来说似乎是一个明显的错误,有没有更好的方法来解决它?
答案 0 :(得分:1)
我想我通过修改 FMX.Platform.Win.pas 文件解决了这个问题。在 TPlatformWin.CreateAppHandle 方法中,您需要评论(或删除)这些行:
FApplicationHWND := CreateWindowEx(WS_EX_WINDOWEDGE or WS_EX_APPWINDOW, FMAppClass.lpszClassName,
PChar(LApplicationTitle), WS_POPUP or WS_GROUP, 0, 0, 0, 0, GetDesktopWindow, 0, HInstance, nil);
Winapi.Windows.ShowWindow(FApplicationHWND, SW_SHOWNORMAL);
我认为该解决方案来自Embarcadero论坛。消息已经消失,但无论如何我会给你链接,以防它回来:https://forums.codegear.com/thread.jspa?messageID=556541򇷽
答案 1 :(得分:-1)
procedure Tmainform.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Single);
var
h:thandle;
begin
h:=FmxHandleToHWND(Handle);
if getforegroundwindow <> h then
begin
SetForeGroundWindow(h);
BringWindowToTop(h);
SetCursorPos(Left + round(X), Top + round(Y));
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;