gpt4 book ai didi

forms - Delphi:当监视器配置更改时如何恢复表单的原始位置?

转载 作者:行者123 更新时间:2023-12-03 18:20:57 26 4
gpt4 key购买 nike

我有一个多表单应用程序,其中子表单在启动时位于第二个监视器上,此时保存其 BoundsRect。

当计算机的显示配置更改时,Windows 会将窗体移动到第一(主)显示器。我可以使用 WM_DISPLAYCHANGE 捕获此更改:

procedure WMDisplayChange(var msg: TWMDisplayChange); message WM_DISPLAYCHANGE;

我感兴趣的是,当子窗体重新出现在配置中时,将其移回到第二个显示器(即 Screen.MonitorCount 从 1 变为 2),例如:

childForm.BoundsRect := childForm.m_WorkingBounds;
// (or)
childForm.BoundsRect := Screen.Monitors[Screen.MonitorCount-1].BoundsRect;

但是这个分配没有任何影响——子窗体保留在监视器 0 上。

我尝试过其他方法,例如 SetWindowPos(),但没有成功......

最佳答案

问题的根源在于 Delphi VCL 在监视器实际更改时不会刷新其内部监视器列表。你必须强制自己恢复活力。

监视器使用 TScreen.GetMonitors 方法刷新,不幸的是,该方法是私有(private)方法,因此您无法直接调用它。

但是,TApplication.WndProc(var Message: TMessage) 处理 WM_WTSSESSION_CHANGE 并在收到该消息后调用 Screen.GetMonitors - 这是实现目标的最良性方式.

当您收到监视器更改的通知时,只需将其发送到应用程序:

SendMessage(Application.Handle, WM_WTSSESSION_CHANGE, 0, 0);

关于forms - Delphi:当监视器配置更改时如何恢复表单的原始位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com