Jcef windows 行为异常
Jcef windows behaving strange
这对我来说似乎是一个罕见的问题,所以我不确定我会在这里得到答案。我正在发布重现此错误的过程,希望您能帮助我。
你有没有试过在Jcef(Java-Chromium Embedded Framework)例子中做client.createBrowser(startUrl, useOSR, isTransparent)
获得的浏览器实例中通过执行window.open(url)
打开一个新的window应用程序(简单或详细)并注意到奇怪的行为?每当在主 window 之外创建新的 window 时,单击新的 window 不会将其置于最前面(或聚焦)。主要 window(包含浏览器的 UIComponent 的 JFrame)立即窃取焦点并将另一个 window 发回。在下图中,w3schools 的 tryit 编辑器在主 window 中打开,我在新 window 中打开 https://whosebug.com。
现在,如果我尝试通过单击将打开 stackoveflow 的 window 置于最前面,大约 100 毫秒(或更短)它会停留在最前面,然后主要 window "steals" 向后聚焦并显示在其上方,就像在图片中一样。
您可以通过在 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);
然后打开一个新的window,只需在w3schools的tryit编辑器中运行这段代码,然后点击右边的'Try it':
<!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.whosebug.com");
}
</script>
</body>
</html>
我非常需要这方面的帮助。我也在 CEF 论坛上发布了这个问题,但没有得到维护者的任何回应。另外,我想我应该提到每次创建新的 window 时都会发生这种情况,不必使用 JavaScript 创建它。例如,如果我打开一个包含通过执行 browser.getDevTools()
获得的开发人员工具栏的 JDialog,应用程序的行为相同。我可能在这里做了一些非常愚蠢的事情,但我无法弄清楚。让我知道我做错了什么。另外,如果您尝试重现错误并且发现 windows 没有任何问题,请在评论中告诉我。我正在使用 Visual Studio 2015 年从源代码构建的 Jcef(Java CEF3 绑定)库。我是 运行ning 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
)。问题应该已经解决了。
这对我来说似乎是一个罕见的问题,所以我不确定我会在这里得到答案。我正在发布重现此错误的过程,希望您能帮助我。
你有没有试过在Jcef(Java-Chromium Embedded Framework)例子中做client.createBrowser(startUrl, useOSR, isTransparent)
获得的浏览器实例中通过执行window.open(url)
打开一个新的window应用程序(简单或详细)并注意到奇怪的行为?每当在主 window 之外创建新的 window 时,单击新的 window 不会将其置于最前面(或聚焦)。主要 window(包含浏览器的 UIComponent 的 JFrame)立即窃取焦点并将另一个 window 发回。在下图中,w3schools 的 tryit 编辑器在主 window 中打开,我在新 window 中打开 https://whosebug.com。
现在,如果我尝试通过单击将打开 stackoveflow 的 window 置于最前面,大约 100 毫秒(或更短)它会停留在最前面,然后主要 window "steals" 向后聚焦并显示在其上方,就像在图片中一样。
您可以通过在 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);
然后打开一个新的window,只需在w3schools的tryit编辑器中运行这段代码,然后点击右边的'Try it':
<!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.whosebug.com");
}
</script>
</body>
</html>
我非常需要这方面的帮助。我也在 CEF 论坛上发布了这个问题,但没有得到维护者的任何回应。另外,我想我应该提到每次创建新的 window 时都会发生这种情况,不必使用 JavaScript 创建它。例如,如果我打开一个包含通过执行 browser.getDevTools()
获得的开发人员工具栏的 JDialog,应用程序的行为相同。我可能在这里做了一些非常愚蠢的事情,但我无法弄清楚。让我知道我做错了什么。另外,如果您尝试重现错误并且发现 windows 没有任何问题,请在评论中告诉我。我正在使用 Visual Studio 2015 年从源代码构建的 Jcef(Java CEF3 绑定)库。我是 运行ning windows 10 64 位。谢谢!
感谢 CEF 论坛,我得以解决此问题。
Windows 上的焦点问题是由于 Java_org_cef_browser_CefBrowser_1N_N_1SetFocus 中的 FocusParent
调用造成的。
要修复它,请在 java_cef/src/native/CefBrowser_N.cpp
.
#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
)。问题应该已经解决了。