我构建了一个简单的 Delphi 程序来测试 Martin Schneider 在 StackOverflow 上提供的两个解决方案:
...但是当程序被拖到缩放到175%的显示器上时,页面内容仍然未缩放。
这是我的 Martin 的“解决方案 2”的代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.IOUtils,
Vcl.StdCtrls, Vcl.ExtCtrls, ShellAPI, Vcl.ComCtrls, Vcl.ToolWin, System.StrUtils,
ShlObj, System.UITypes, Vcl.OleCtrls, SHDocVw,
Winapi.Mshtmhst;
type
TDpiAwareWebBrowser = class(TWebBrowser, IDocHostUIHandler)
strict private
// IDocHostUIHandler "override"
function GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT; stdcall;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
DOCHOSTUIFLAG_DPI_AWARE = $40000000;
function TDpiAwareWebBrowser.GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT;
begin
// original code from TWebBrowser.GetHostInfo
pInfo.cbSize := SizeOf(pInfo);
pInfo.dwFlags := 0;
pInfo.dwFlags := pInfo.dwFlags or DOCHOSTUIFLAG_NO3DBORDER;
pInfo.dwFlags := pInfo.dwFlags or DOCHOSTUIFLAG_THEME;
pInfo.dwFlags := pInfo.dwFlags or DOCHOSTUIFLAG_DPI_AWARE; // NEW added flag
Result := S_OK;
//ResizeScrollBars; // will be called by subsequent routines anyway.
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
var wb:= TDpiAwareWebBrowser.Create(Form1);
TWinControl(wb).Parent:= Form1;
wb.align:= alClient;
wb.Navigate('https://google.com');
end;
end.
在此屏幕截图中,您可以看到测试程序的标题栏对于设置为 175% 的显示器进行了正确缩放,但基于 TWebBrowser 的组件却没有:
这是显示显示器缩放比例的屏幕截图:
我还实现了 Martin 的“解决方案 1”,如 Windows 注册表的屏幕截图所示:
我正在使用Delphi 11:
我正在 VMware Workstation 16 Pro 虚拟机内的 Windows 10 上进行开发。
为了响应 SilverWarior 的建议,我尝试通过下面的 Windows 注册表 FEATURE_BROWSER_EMULATION 键添加浏览器模拟。遗憾的是,浏览器内容在任何情况下都不会缩放到显示器的 dpi。
接下来,我尝试通过 Meta Tag 进行浏览器模拟。在任何情况下,浏览器内容都无法正确缩放。
我错过了什么?
将您的 TWebBrowser 切换到 Edge 引擎,它具有对 HiDPI 和许多其他功能的现代支持。详细信息:http://docwiki.embarcadero.com/RADStudio/en/Using_TEdgeBrowser_Component_and_Changes_to_the_TWebBrowser_Component
另外,不要忘记在安装应用程序期间运行 WebView2 安装程序。详细信息请参见:https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution