我为我的自定义 cefsharp 浏览器实现了 IKeyboardHandler 接口。
代码示例如下所示:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var browser = new ChromiumWebBrowser("https://google.com/");
browser.KeyboardHandler = new PreviewKeyboardHandler();
this.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
}
public class PreviewKeyboardHandler : IKeyboardHandler
{
public PreviewKeyboardHandler()
{
}
public bool OnKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
return false;
}
public bool OnPreKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
if (!chromiumWebBrowser.IsBrowserInitialized)
{
return false;
}
switch ((Keys)windowsKeyCode)
{
case Keys.F12:
browser.ShowDevTools();
break;
case Keys.F5:
if (modifiers == CefEventFlags.ControlDown)
{
// ctrl + F5
browser.Reload(true);
}
else
{
// F5
browser.Reload();
}
break;
}
return false;
}
}
我现在面临一些奇怪的行为。当我按“Shift”+“[”在网页文本框中输入“{”时,DevTools 会自动打开。当我在网页的文本框中输入“t”时,网页会自动重新加载。我该如何解决这个问题?
cefsharp版本为92.0.260,.NET Framework 4.6
我认为由于某种原因,按钮使用“windowsKeyCode”映射不正确。 也许在“OnPreKeyEvent”中使用“nativeKeyCode”会更好,它会返回唯一的代码。
通过以下两种方式之一更改“OnPreKeyEvent”方法可以完全解决上述问题,但是如果您想解决“windowsKeyCode”值中的错误,最好询问“Cefsharp.Winforms”NuGet的作者打包以修复错误或从他们那里获取建议。
使用“nativeKeyCode”,代码修改如下:
public bool OnPreKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
const int KEY_F5 = 0x3F0001;
const int KEY_F12 = 0x580001;
if (!chromiumWebBrowser.IsBrowserInitialized)
{
return false;
}
switch (nativeKeyCode)
{
case KEY_F12:
browser.ShowDevTools();
break;
case KEY_F5:
if (modifiers == CefEventFlags.ControlDown)
{
// ctrl + F5
browser.Reload(true);
}
else
{
// F5
browser.Reload();
}
break;
}
return false;
}
但是如果你想使用“windowsKeyCode”的方式来实现,我不推荐这种方式,那么应该更改如下:
public bool OnPreKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
if (!chromiumWebBrowser.IsBrowserInitialized)
{
return false;
}
switch ((Keys)windowsKeyCode)
{
case Keys.F12:
if (modifiers != CefEventFlags.ShiftDown)
browser.ShowDevTools();
break;
case Keys.F5:
if (modifiers == CefEventFlags.ControlDown)
{
// ctrl + F5
browser.Reload(true);
}
else
{
// F5
if (nativeKeyCode != 20) // Keys.T - Keys.A + 1 = 20
browser.Reload();
}
break;
}
return false;
}