【CSharp】在WPF程序中防止触笔(Stylus)输入
本文最后更新于 2024-11-11,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。
前言
在WPF中使用WebView2时,发现无法在触摸屏中对WebView2打开的网页进行滑动操作,经过研究发现,WPF内置的触笔和触摸支持与WebView2中的触笔和触摸存在冲突,需要禁用掉WPF内置的触笔和触摸支持才能解决。
解决方案
方法一
使用AppContextSwitchOverrides禁用WPF内置的触笔和触摸支持
在你的应用程序的app.config
文件中添加以下配置,可以关闭WPF内置的实时触摸(RealTimeStylus)支持,从而改用Windows触摸消息(WM_TOUCH
):
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
</runtime>
</configuration>
方法二
使用反射禁用WPF的RealTimeStylus
public static void DisableWPFTabletSupport()
{
// Get a collection of the tablet devices for this window.
TabletDeviceCollection devices = System.Windows.Input.Tablet.TabletDevices;
if (devices.Count > 0)
{
// Get the Type of InputManager.
Type inputManagerType = typeof(System.Windows.Input.InputManager);
// Call the StylusLogic method on the InputManager.Current instance.
object stylusLogic = inputManagerType.InvokeMember("StylusLogic", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, InputManager.Current, null);
if (stylusLogic != null)
{
// Get the type of the stylusLogic returned from the call to StylusLogic.
Type stylusLogicType = stylusLogic.GetType();
// Loop until there are no more devices to remove.
while (devices.Count > 0)
{
// Remove the first tablet device in the devices collection.
stylusLogicType.InvokeMember("OnTabletRemoved", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, stylusLogic, new object[] { (uint)0 });
}
}
}
}
注意
如果你的WPF程序中还包含了其他的需要滑动操作的控件,如果禁用了WPF内置的触笔输入会导致其他控件无法进行滑动操作,此方案仅适用于WPF程序中只有WebView2一个需要滑动操作的控件。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果