【问题标题】:How to properly restore an FMX form?如何正确恢复 FMX 表格?
【发布时间】:2014-10-11 11:06:31
【问题描述】:

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

【问题讨论】:

  • 什么版本的 FMX?
  • 这是 XE5 更新 2,如果这就是您的意思,我不知道 FMX 的不同版本。
  • 同意,这就是我的意思。

标签: delphi firemonkey delphi-xe5


【解决方案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

【讨论】:

【解决方案2】:
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;

【讨论】:

  • setfocus(h);结束前;至少是在应用程序级别控制击键或鼠标事件的选项,例如,如果在主窗体内创建的另一个面板(对象)上触发 mousemove 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多