CefSharp WPF 无法向浏览器发送按键消息的解决办法(卡了我一整天,坑爹死了,吐血整理)

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
在这里插入图片描述

おすすめ

転載: blog.csdn.net/COFACTOR/article/details/115429325