FMX中TWebBrowser用Edge引擎时Input点击失焦问题求助
FMX TWebBrowser EdgeOnly模式下元素点击后立即失焦问题
问题现象
- Windows系统下,FMX应用使用
TWebBrowser并设置WindowsEngine := TWindowsEngine.EdgeOnly时,网页内的<input>元素点击后会立即失去焦点 - 多次点击后该现象消失,但通过Alt+Tab切换应用再返回后问题复现
- 外接第二块屏幕时无此问题,切换为
IEOnly模式也正常
复现环境
Delphi FMX代码
procedure TForm1.FormCreate(Sender: TObject); begin var browser := TWebBrowser.Create(Self); browser.WindowsEngine := TWindowsEngine.EdgeOnly; browser.Align := TAlignLayout.Client; browser.URL := 'http://localhost:8000/test.html'; Self.AddObject(browser); end;
测试HTML文件(test.html)
<!DOCTYPE html> <html lang="en"> <head> <title>Test</title> </head> <body> <input type="text" name="test"> </body> </html>
可能的解决方法
延迟设置WebBrowser焦点
避免控件创建时和FMX窗体的焦点逻辑冲突,通过异步队列延迟赋予焦点:procedure TForm1.FormCreate(Sender: TObject); begin var browser := TWebBrowser.Create(Self); browser.WindowsEngine := TWindowsEngine.EdgeOnly; browser.Align := TAlignLayout.Client; browser.URL := 'http://localhost:8000/test.html'; Self.AddObject(browser); // 异步延迟设置焦点 TThread.Queue(nil, procedure begin browser.SetFocus; end); end;窗体激活时强制聚焦WebBrowser
在窗体OnActivate事件中重新设置WebBrowser焦点,解决Alt+Tab切换后的焦点丢失问题:procedure TForm1.FormActivate(Sender: TObject); begin if Assigned(browser) then browser.SetFocus; end;调整WebView2初始化与页面加载顺序
等待WebBrowser完全初始化后再加载页面,避免加载过程中的焦点竞争:procedure TForm1.FormCreate(Sender: TObject); begin var browser := TWebBrowser.Create(Self); browser.WindowsEngine := TWindowsEngine.EdgeOnly; browser.Align := TAlignLayout.Client; browser.OnDidFinishLoad := BrowserDidFinishLoad; Self.AddObject(browser); end; procedure TForm1.BrowserDidFinishLoad(Sender: TObject); begin var webBrowser := Sender as TWebBrowser; webBrowser.URL := 'http://localhost:8000/test.html'; webBrowser.SetFocus; end;检查并调整显示器DPI设置
单屏幕下的高DPI缩放可能导致WebView2焦点判定异常,可尝试:- 将显示器缩放比例调整为100%测试
- 在项目文件中启用高DPI支持:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE or IMAGE_FILE_DPI_AWARE}
内容的提问来源于stack exchange,提问作者bas
相关产品推荐
相关产品推荐

