1、首先,CEF 有一套自己的消息循环机制,因此一般的调用 Windows API 向 CefSharp 浏览器所在的窗口发送按键消息的方法是行不通的。
2、CefSharp 既可以嵌入 WinForm 应用程序,也可以嵌入 WPF 应用程序。CefSharp 本身带有向浏览器发送按键消息的 SendKeyEvent 函数。使用方法是:
Browser.GetBrowserHost().SendKeyEvent(KeyDownEnd);
其中,Browser 是 CefSharp 浏览器的实例:
using CefSharp.Wpf;
// ......
ChromiumWebBrowser Browser;
或
<wpf:ChromiumWebBrowser Name="Browser" Grid.Row="2"/>
而该函数的参数是 CefSharp 定义的 KeyEvent 类型。例如
internal readonly KeyEvent KeyDownEnd = new() {
FocusOnEditableField = false,
IsSystemKey = false,
Type = KeyEventType.KeyDown,
WindowsKeyCode = 35
};
在填入 WindowsKeyCode 参数时要特别留意:
首先,该参数的值应当为操作系统的虚拟键码。参见
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
WinForm 的 Keys Enum 的值是完全与这一套虚拟键码相同的:
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.keys?view=net-5.0
但是 WPF 的 Key Enum 的值有不同:
https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.key?view=net-5.0
以 End 键为例,上面三份文档给出的值分别为:
所以,如果你要向浏览器发送 End 键,而 WindowsKeyCode 参数填写了 21,则浏览器不会有任何反应。只有填写 23h 或者 35 ,才相当于在浏览器中按下了 End 键。
坑爹的是,到了 UWP ,虚拟键码又被改回来了:
https://docs.microsoft.com/en-us/uwp/api/windows.system.virtualkey?view=winrt-19041