在我看来,这是一个罕见的问题,因此我不确定在这里能否得到答案。我正在发布重现此错误的过程,希望对您有所帮助。

您是否曾经尝试通过在Jcef(Java-Chromium嵌入式框架)示例应用程序(简单或详细)中通过执行window.open(url)而获得的浏览器实例中执行client.createBrowser(startUrl, useOSR, isTransparent)来打开新窗口,并且注意到奇怪的行为?每当创建一个与主窗口分开的新窗口时,单击新窗口都不会使其位于最前面(或处于焦点)。主窗口(包含浏览器UIComponent的JFrame)立即夺取焦点,并将另一个窗口发送回去。在下面的图片中,w3schools的tryit编辑器在主窗口中打开,而我在新窗口中打开https://stackoverflow.com

java - Jcef Windows表现异常-LMLPHP

现在,如果我尝试通过单击将打开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)。这个问题应该现在就解决了。

08-06 11:46