在我看来,这是一个罕见的问题,因此我不确定在这里能否得到答案。我正在发布重现此错误的过程,希望对您有所帮助。
您是否曾经尝试通过在Jcef(Java-Chromium嵌入式框架)示例应用程序(简单或详细)中通过执行window.open(url)
而获得的浏览器实例中执行client.createBrowser(startUrl, useOSR, isTransparent)
来打开新窗口,并且注意到奇怪的行为?每当创建一个与主窗口分开的新窗口时,单击新窗口都不会使其位于最前面(或处于焦点)。主窗口(包含浏览器UIComponent的JFrame)立即夺取焦点,并将另一个窗口发送回去。在下面的图片中,w3schools的tryit编辑器在主窗口中打开,而我在新窗口中打开https://stackoverflow.com。
现在,如果我尝试通过单击将打开stackoveflow的窗口置于最前面,大约100毫秒(或更短的时间)它会停留在前面,但是主窗口“偷”焦点向后并显示在其上方,就像它在图片。
您还可以通过在Jcef中创建MainFrame
实例时加载url 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,则该应用程序的行为相同。我在这里做的事可能很愚蠢,但我无法弄清楚。让我知道我在做什么错。另外,如果您尝试重现该错误,但发现Windows没有任何问题,请在评论中告知我。我正在使用从Visual Studio 2015中的源代码构建的Jcef(用于CEF3的Java绑定)库。我正在运行Windows 10 64位。谢谢! 最佳答案
感谢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
)。这个问题应该现在就解决了。