如何正确恢复FMX表格?

时间:2014-10-11 11:06:31

标签: delphi firemonkey delphi-xe5

使用菜单栏按钮最小化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表单观察到这种行为。这对我来说似乎是一个明显的错误,有没有更好的方法来解决它?

2 个答案:

答案 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&#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;
相关问题