CEF4Delphi应用加载CEF 117.2.5后全局字体缩小问题求助
问题
将CEF版本从96升级至117.2.5后,基于Delphi 2007开发的32位Windows应用在加载CEF库后,整个应用的字体全部缩小。该应用结构复杂,包含大量动态加载的BPL库。
奇怪的是,此问题仅出现在部分未安装Delphi IDE的机器(Win10 Enterprise N和Win10 Professional 64位)上,且无论是否加载网页都会触发。
CEF加载代码如下:
sciezkaRoot := IncludeTrailingPathDelimiter(GetRootPath()); sciezkaBinariow := sciezkaRoot + CHROMIUM_FOLDER_BINARIOW; sciezkaProcesu := sciezkaRoot + CHROMIUM_FOLDER_KOMUNIKACJA_MARKETINGOWA + CHROMIUM_PROCES_EXE; try if not FileExists(sciezkaProcesu) then raise Exception.Create('Brak wymaganego pliku w lokalizacji:' + #13 + sciezkaProcesu); uCEFApplication.GlobalCEFApp := TCefApplication.Create(); with uCEFApplication.GlobalCEFApp do begin ShowMessageDlg := False; MissingBinariesException := True; BackgroundColor := ColorToTCefColor(clBtnFace); Cache := fKatalogCache; EnablePrintPreview := False; EnableGPU := False; FrameworkDirPath := sciezkaBinariow; ResourcesDirPath := sciezkaBinariow; LocalesDirPath := sciezkaBinariow + 'locales'; LocalesRequired := 'pl'; Locale := 'pl'; SetCurrentDir := True; BrowserSubprocessPath := sciezkaProcesu; Result := StartMainProcess(); end; except on e: Exception do begin FreeAndNil(uCEFApplication.GlobalCEFApp); Result := False; end; end;
成因分析
- DPI感知设置冲突:CEF 100+版本默认启用系统级DPI感知,而Delphi 2007原生VCL应用默认未声明DPI感知。未安装Delphi IDE的机器没有相关兼容性设置兜底,CEF加载后会强制修改整个进程的DPI感知模式,导致VCL控件字体按高DPI缩放规则被缩小(比如系统DPI为120时,未感知的应用会被系统缩放到96DPI显示效果,字体看起来变小)。
- 缺失Delphi运行时兼容性配置:安装Delphi IDE的机器会自动添加针对老版本Delphi应用的兼容性注册表项(比如强制DPI不缩放),未安装IDE的机器无此配置,CEF的DPI感知设置直接生效,引发字体缩放异常。
- CEF初始化的全局设置覆盖:即使未加载网页,CEF在
StartMainProcess()阶段就会初始化全局DPI相关钩子和设置,覆盖VCL应用的默认行为。动态加载的BPL库作为进程内共享资源,也会受此全局设置影响,导致整个应用字体统一缩小。
内容的提问来源于stack exchange,提问作者Wolf Raider
相关产品推荐
相关产品推荐

