这在我看来是一个罕见的问题所以我不确定我会在这里得到答案。我发布了重现此错误的程序,希望您能够帮助我。
您是否尝试过在Jcef(Java-Chromium Embedded Framework)示例应用程序(简单或详细)中执行window.open(url)
获取的浏览器实例中执行client.createBrowser(startUrl, useOSR, isTransparent)
并注意到奇怪的行为?每当在主窗口之外创建新窗口时,单击新窗口不会将其置于前面(或聚焦)。主窗口(包含浏览器的UIComponent的JFrame)立即窃取焦点并将其他窗口发回。在下图中,w3schools的tryit编辑器在主窗口中打开,我在新窗口中打开https://stackoverflow.com。
现在,如果我尝试通过点击将打开stackoveflow的窗口移到前面,大约100毫秒(或更短)它停留在前面,然后主窗口“偷”回焦点并显示在它上面,就像它在图片中。
您可以通过在Jcef中创建MainFrame
实例时加载网址https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open来检查是否发生了这种情况。
//inside main method
MainFrame mf = new MainFrame("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open", OS.isLinux(), false);
然后打开一个新窗口,只需在w3schools的tryit编辑器中运行此代码,然后点击右侧的“试用”:
<!DOCTYPE html>
<html>
<body>
<p>Click the button to open a new browser window.</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction() {
window.open("https://www.stackoverflow.com");
}
</script>
</body>
</html>
我非常需要帮助。我也在CEF论坛上发布了这个问题,但没有得到维护者的任何回复。另外,我想我应该提到每次创建新窗口时都会发生这种情况,不必使用JavaScript创建。例如,如果我打开包含通过执行browser.getDevTools()
获得的开发人员工具栏的JDialog,则该应用程序的行为相同。我可能在这里做一些非常愚蠢的事情,但我无法弄清楚。让我知道我做错了什么。此外,如果您尝试重现错误并发现窗口没有任何问题,请在评论中告诉我。我正在使用从Visual Studio 2015中的源代码构建的Jcef(用于CEF3的Java绑定)库。我正在运行Windows 10 64位。谢谢!
答案 0 :(得分:2)
感谢CEF论坛,我能够解决这个问题。
Windows上的焦点问题归因于Java_org_cef_browser_CefBrowser_1N_N_1SetFocus中的FocusParent
调用。
要解决此问题,请在java_cef/src/native/CefBrowser_N.cpp
中注释掉以下内容(第1269至1278行)。
#if defined(OS_WIN)
if (enable == JNI_FALSE) {
HWND browserHandle = browser->GetHost()->GetWindowHandle();
if (CefCurrentlyOn(TID_UI))
FocusParent(browserHandle);
else
CefPostTask(TID_UI, base::Bind(&FocusParent, browserHandle));
}
#endif
在Visual Studio中重建解决方案,重建java类(compile.bat win64
)然后运行它(run.bat win64 Release detailed
)。问题现在应该消失了。