首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF:是否有可能将普通鼠标事件"路由"到Windows 7中的触摸事件

在讨论WPF(Windows Presentation Foundation)中的鼠标事件和触摸事件之前,我们先来了解一下这两种事件。

鼠标事件:鼠标事件是在用户与计算机上的鼠标交互时触发的事件。这些事件包括鼠标按下、鼠标抬起、鼠标移动等。

触摸事件:触摸事件是在用户与触摸屏设备交互时触发的事件。这些事件包括触摸开始、触摸移动、触摸结束等。

现在,我们来回答你的问题:是否有可能将普通鼠标事件“路由”到Windows 7中的触摸事件?

答案是:可以的。在WPF中,可以通过使用鼠标事件和触摸事件之间的转换器,将鼠标事件转换为触摸事件。这样,在Windows 7中,用户可以使用鼠标来模拟触摸屏设备上的操作。

以下是一个简单的示例,展示了如何将鼠标事件转换为触摸事件:

代码语言:csharp
复制
public class MouseToTouchConverter
{
    public static readonly DependencyProperty EnabledProperty =
        DependencyProperty.RegisterAttached(
            "Enabled",
            typeof(bool),
            typeof(MouseToTouchConverter),
            new PropertyMetadata(false, OnEnabledChanged));

    public static bool GetEnabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(EnabledProperty);
    }

    public static void SetEnabled(DependencyObject obj, bool value)
    {
        obj.SetValue(EnabledProperty, value);
    }

    private static void OnEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as UIElement;
        if (element != null)
        {
            if ((bool)e.NewValue)
            {
                element.MouseLeftButtonDown += Element_MouseLeftButtonDown;
                element.MouseLeftButtonUp += Element_MouseLeftButtonUp;
                element.MouseMove += Element_MouseMove;
            }
            else
            {
                element.MouseLeftButtonDown -= Element_MouseLeftButtonDown;
                element.MouseLeftButtonUp -= Element_MouseLeftButtonUp;
                element.MouseMove -= Element_MouseMove;
            }
        }
    }

    private static void Element_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var element = sender as UIElement;
        if (element != null)
        {
            TouchDevice touchDevice = TouchDevice.GetFromElement(element);
            if (touchDevice != null)
            {
                touchDevice.Activate();
                touchDevice.ReportDown();
            }
        }
    }

    private static void Element_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        var element = sender as UIElement;
        if (element != null)
        {
            TouchDevice touchDevice = TouchDevice.GetFromElement(element);
            if (touchDevice != null)
            {
                touchDevice.ReportUp();
                touchDevice.Deactivate();
            }
        }
    }

    private static void Element_MouseMove(object sender, MouseEventArgs e)
    {
        var element = sender as UIElement;
        if (element != null)
        {
            TouchDevice touchDevice = TouchDevice.GetFromElement(element);
            if (touchDevice != null)
            {
                touchDevice.ReportMove();
            }
        }
    }
}

使用此转换器时,只需将其附加到需要模拟触摸事件的元素上,如下所示:

代码语言:xaml<Window ...
复制
        xmlns:local="clr-namespace:WpfApplication1">
    <Grid local:MouseToTouchConverter.Enabled="True">
        ...
    </Grid>
</Window>

这样,在Windows 7中,用户就可以使用鼠标来模拟触摸屏设备上的操作,从而实现更好的交互体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WPF 通过 InputManager 模拟调度触摸事件

在输入管理提供了调度事件方法,这个方法可以被传入路由事件,传入路由事件将会被调度路由事件指定元素上进行触发。...本文告诉大家如何模拟调度一个触摸事件 本文内容属于没有任何官方文档支持内容,以下是我看 WPF 源代码了解用法 在输入管理里面可以通过 System.Windows.Input.InputManager.Current...(_lastEventArgs); } } 在触摸之后点击鼠标,可以看到鼠标点击时候同样触发了触摸按下事件 那如果想要模拟触发触摸移动事件呢?...上面图片是测试工具 ManipulationDemo 显示,这个工具会在事件触发时候修改对应事件颜色,也就是在鼠标点击时候触发了触摸按下和移动和抬起 用这个方法就可以从路由事件这一层调度事件 上面的代码放在...(_lastEventArgs); 此时运行测试项目也可以看到和 ProcessInput 一样效果 本文其实是补充 WPF 触摸事件 后半部分,从 WPF 触摸路由事件,是如何从触摸事件让对应元素触发

79730

win10 uwp 获得Slider拖动结束

但是可以使用鼠标放开值,在 UWP 把触摸放开、鼠标这些叫 Pointer 那么是否监听 PointerReleased 就可以获得鼠标放开,实际监听也拿不到事件。...这时候使用 F5 运行项目,可以看到,在鼠标松开不会进入断点。 那么是否其他事件可以使用?实际上只有 SizeChanged ,他无法获得鼠标松开值,也就是拖动结束值。...原因就是在底层进入 PointerReleased 使用了 e.Handle = true ,在 UWP 路由事件,如果一个元素已经被设置事件处理,那么一般添加事件函数就不会执行,如果需要这个事件函数执行...,那么需要使用后台代码说无论是否在底层处理,都需要触发,这样就可以使用在鼠标放开拿到值。...参见:UWP开发大坑之—路由事件 - 快乐 就在你博客 源代码:[免费]SlideMove 1.0-CSDN下载 ----

95210
  • win10 uwp 获得Slider拖动结束

    但是可以使用鼠标放开值,在 UWP 把触摸放开、鼠标这些叫 Pointer 那么是否监听 PointerReleased 就可以获得鼠标放开,实际监听也拿不到事件。...这时候使用 F5 运行项目,可以看到,在鼠标松开不会进入断点。 那么是否其他事件可以使用?实际上只有 SizeChanged ,他无法获得鼠标松开值,也就是拖动结束值。...原因就是在底层进入 PointerReleased 使用了 e.Handle = true ,在 UWP 路由事件,如果一个元素已经被设置事件处理,那么一般添加事件函数就不会执行,如果需要这个事件函数执行...,那么需要使用后台代码说无论是否在底层处理,都需要触发,这样就可以使用在鼠标放开拿到值。...参见:UWP开发大坑之—路由事件 - 快乐 就在你博客 源代码:[免费]SlideMove 1.0-CSDN下载

    61620

    win10 uwp 获得Slider拖动结束

    但是可以使用鼠标放开值,在 UWP 把触摸放开、鼠标这些叫 Pointer 那么是否监听 PointerReleased 就可以获得鼠标放开,实际监听也拿不到事件。...这时候使用 F5 运行项目,可以看到,在鼠标松开不会进入断点。 那么是否其他事件可以使用?实际上只有 SizeChanged ,他无法获得鼠标松开值,也就是拖动结束值。...原因就是在底层进入 PointerReleased 使用了 e.Handle = true ,在 UWP 路由事件,如果一个元素已经被设置事件处理,那么一般添加事件函数就不会执行,如果需要这个事件函数执行...,那么需要使用后台代码说无论是否在底层处理,都需要触发,这样就可以使用在鼠标放开拿到值。...参见:UWP开发大坑之—路由事件 - 快乐 就在你博客 源代码:[免费]SlideMove 1.0-CSDN下载

    90420

    WPF 触摸事件

    触摸线程转换到主线程,然后从主线程封装为路由事件模块请看下面 ? 路由事件需要封装触摸消息并且找到命中元素 ?...在触摸过程会调用 StylusPlugIn 是 WPF 提供快速拿到触摸方法,如果是从路由事件,需要等待主线程和其他代码,这样无法做到比较快拿到触摸。...这里一些细节,如在触摸传入数据是如何拿出来,如何从触摸点找到对应元素进行路由。...在 WPF 中通过消息循环将不同消息发送到不同处理,而 InputManager 就是处理输入相关,这个类会除了从底层消息和参数转换为路由事件,并且告诉 WPF 触发是哪个元素事件。...关于路由事件是如何触摸对应元素,就需要大家去看下InputManager 是如何做,在底层还是调用 MouseDevice GlobalHitTest 方法 下面来告诉大家触摸初始化 初始化触摸

    1.3K20

    WPF 非客户区触摸鼠标点击响应

    默认在 WPF 里面是不响应非客户区鼠标事件,但响应触摸事件 在没有喝下午茶时候 lsj 告诉我,在项目里面在一个定制窗口里面的非客户区用鼠标点击不了一个按钮,但是用触摸可以点击按钮。...本金鱼一开始认为这是之前修复问题,但是作为金鱼已经不记得是怎么修了,为了让本金鱼下次遇到触摸鼠标问题时候可以解决,于是写了这个博客 本文将会告诉大家在 WPF 里面关于非客户区触摸鼠标点击响应...支持继承,也就是可以在窗口设置,这样所有在窗口里面的按钮都支持在标题栏点击 如何开启 Pointer 消息请看 win10 支持默认把触摸提升鼠标事件 打开 Pointer 消息 我和 lsj 使用...spy++ 知道在 WPF 标题栏点击时候是可以收到 Windows 鼠标消息,也就是这里是 WPF 处理 我和 lsj 说也许是之前 WPF 框架大佬写时候还不知道触摸,于是处理了鼠标事件...现在 lsj 正在看 WPF 源代码,想要找到是如何让标题栏支持触摸但是不支持鼠标点击 在 WPF 下,可以在非客户区触摸拖动时候,同时触发触摸拖动和窗口拖动。

    1.3K20

    WPF 底层 从手指触摸屏幕笔迹在屏幕显示中间步骤

    整个 WPF 就是一个UI框架,一个 UI 框架最重要是 交互 和 显示 部分,而书写这个功能将会完全贯穿 WPF 整个框架功能。...当前触摸 HID 标准,任何走标准 HID 设备硬件设备,只要实现得对,咱上层软件是不需要关注硬件细节。...更多有关协议部分请看 Windows Pen 协议 规避了硬件设备,此时咱就不需要画精力去了解硬件设备收集触摸机制,以及封装数据和系统解包是如何做WPF 触摸在系统最底层使用是...RealTime Stylus StylusPlugIn 收到消息或在 Touch 等事件收到消息,请看 WPF 触摸事件 这就是需要涉及整个 WPF 命中测试以及触摸输入机制,这也就是从手指触摸到屏幕... Effect 机制,通过 HLSL 对画面显示进行优化,这部分属于像素着色器知识 WPF 触摸事件 WPF 最简逻辑实现多指顺滑笔迹书写 Windows Pen 协议 WPF 渲染原理

    1.2K20

    dotnet Framework 源代码 · Ink

    收集点 在 WPF 可以通过 Stylus 收集按下和移动这些,但是大家也知道,路由事件是需要时间比较长,可能在 Ink 收到之前,就有其他元素收到,他在收到做了很多其他业务,这时就会影响笔画。...所有的 UIElement 都有 Pulgin ,这个属性可以从 UIElement 拿到原始触摸,这样可以比路由事件更快拿到用户按下。从这里拿到触摸可能是在其他线程。...转静态 在书写完成之后,可以通过路由事件在主线程收到 Up 消息,判断当前已经一个笔迹可以收集 在动态笔迹书写时候,主线程也通过路由事件收集触摸信息,于是在判断一个笔迹可以转静态时候,主线程就创建一个...而主线程做很多业务逻辑,在用户触摸到屏幕时候收到事件,按照路由事件判断用户触摸是那个元素做不同业务,此时就不能让动态笔迹模块监听主线程事件和回调,因为完全在不知道主线程会使用哪个模块进行转换笔迹...因为这就是第二个原因,在 WPF 主线程和渲染线程分开,而笔迹线程和渲染线程分开,也就是笔迹线程告诉渲染线程动态笔迹层笔迹要消息,渲染线程从屏幕移除动态笔迹层是延迟,而主线程从告诉渲染线程绘制笔迹渲染线程将笔迹绘制屏幕也是延迟

    62020

    WPF 高性能笔

    这个需要从触摸开始讲。在我另一篇博客告诉大家从触摸事件,在 WPF 是通过触摸线程拿到触摸信息。 在触摸线程获取触摸消息时候,会根据收到触摸消息转发不同方法。...在转发过程,在 WPF 会通过 StylusPlugins 里静态字典,存放用户设置类。在触摸线程会通过判断触摸点时候在命中对应元素矩形区判断当前时候命中这个元素。...这里判断命中测试和 WPF命中测试使用不是同相同方法,这里只是简单获取每个界面元素矩形,然后用触摸点坐标判断是否在这个矩形内,也就是不判断元素是否被其他元素挡住。...因为这个过程是从触摸线程拿到,而且触摸线程在执行 StylusPlugin 后才执行路由事件代码,使用 StylusPlugin 速度会比路由事件快很多,加上路由事件需要做命中测试,可能用户会在路由事件做很多事件...OnStylusDownProcessed 可以判断是否失焦 OnStylusUpProcessed 那么在这里类,几乎可以不写代码就获得触摸事件,从这里获得触摸事件路由会快,因为这里是 rawStylusInput

    75640

    WPF 高性能笔

    这个需要从触摸开始讲。在我另一篇博客告诉大家从触摸事件,在 WPF 是通过触摸线程拿到触摸信息。 在触摸线程获取触摸消息时候,会根据收到触摸消息转发不同方法。...在转发过程,在 WPF 会通过 StylusPlugins 里静态字典,存放用户设置类。在触摸线程会通过判断触摸点时候在命中对应元素矩形区判断当前时候命中这个元素。...这里判断命中测试和 WPF命中测试使用不是同相同方法,这里只是简单获取每个界面元素矩形,然后用触摸点坐标判断是否在这个矩形内,也就是不判断元素是否被其他元素挡住。...因为这个过程是从触摸线程拿到,而且触摸线程在执行 StylusPlugin 后才执行路由事件代码,使用 StylusPlugin 速度会比路由事件快很多,加上路由事件需要做命中测试,可能用户会在路由事件做很多事件...OnStylusDownProcessed 可以判断是否失焦 OnStylusUpProcessed 那么在这里类,几乎可以不写代码就获得触摸事件,从这里获得触摸事件路由会快,因为这里是 rawStylusInput

    43030

    .net Framework 源代码 · Ink 使用思想收集点如何画出 StrokeStylusPlugIns动态笔迹转静态

    思想 国际惯例,系统调度单位是线程,如果一个线程做了很多事情,那么这个线程对每个事情做时间将会比较少。为了做到在用户触摸时候就显示用户触摸点,就需要使用一个线程在检查是否有用户输入,画出来。...收集点 在 WPF 可以通过 Stylus 收集按下和移动这些,但是大家也知道,路由事件是需要时间比较长,可能在 Ink 收到之前,就有其他元素收到,他在收到做了很多其他业务,这时就会影响笔画。...所有的 UIElement 都有 Pulgin ,这个属性可以从 UIElement 拿到原始触摸,这样可以比路由事件更快拿到用户按下。从这里拿到触摸可能是在其他线程。...转静态 在书写完成之后,可以通过路由事件在主线程收到 Up 消息,判断当前已经一个笔迹可以收集 在动态笔迹书写时候,主线程也通过路由事件收集触摸信息,于是在判断一个笔迹可以转静态时候,主线程就创建一个...因为动态笔迹不知道静态笔迹什么时候才渲染完,在动态笔迹使用了 MediaContext RenderComplete 事件判断是否渲染完成 参见:Viewports and content (Windows

    1K30

    浅谈 Windows 桌面端触摸架构演进

    在这里是无法说明架构,每个公司都可以使用自己方式开发。请看 Windows for Pen Computing 在 XP 时候,此时触摸屏成为 HID 设备,也就是了标准。...,于是提出了 Windows Inking Service Platform 请看 WPF 触摸事件 在 Win7 这个触摸架构就是古代触摸 很多开发者都会反馈在 Win7 开发触摸失效问题,如...WPF 客户端开发需要知道触摸失效问题 和需要区分 Touch 和 Stylus 和鼠标事件,这样开发成本比较高 在 Windows 8 提出了现代触摸方法,通过 Pointer 表示,无论是鼠标还是触摸还是笔都是使用相同...Pointer 消息,这个触摸架构将会对触摸很好支持。...触摸事件 WPF 客户端开发需要知道触摸失效问题 ---- 本文会经常更新,请阅读原文: https://blog.lindexi.com/post/%E6%B5%85%E8%B0%

    1.2K20

    通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效问题(问题篇)

    占用: 当前系统中有 较高 CPU 占用率 可能还有一些尚不确定条件: 是否对 .NET Framework 版本要求?...是否Windows 操作系统版本要求?...将以上所有条件组合起来,对于触摸失效问题描述为: 当运行任意 WPF 程序时,如果此时操作系统较高 CPU 占用,并且此时存在带有触摸 HID 设备插拔,那么此 WPF 程序可能出现“触摸失效...触摸失效原因初步分析 WPF 从收集设备触摸到大多数开发者所熟知 Stylus 和 Mouse 事件需要两个不同线程完成。...由于 WPF 触摸原理涉及较多类型和源码,需要大量篇幅描述,所以不在本文中说明。

    88010

    win10 支持默认把触摸提升 Pointer 消息

    WPF 经常需要重写一套触摸事件,没有UWPPointer那么好用。 如果一直都觉得 WPF 触摸不好,或想解决 WPF 触摸问题,但是没有方法,那么请看下面。...只要新建框架为 .net 4.7 以上,运行系统是 Windows 10 Creators Update 1703 10.0.15063 就可以。 打开新建工程,设置框架。 ?...然后打开 App.config,添加支持把触摸和笔鼠标 <AppContextSwitchOverrides value="Switch.System.<em>Windows</em>.Input.Stylus.EnablePointerSupport...因为<em>有</em>小伙伴说使用了我上面代码无法打开 Pointer 消息,我看了他代码,发现他写错了,所以我把全部 App.config 代码写出来。 <?...<em>WPF</em> 下,请参阅 <em>WPF</em> dotnet core 如何开启 Pointer 消息<em>的</em>支持 ----

    44820

    WPF面试题大全,秒杀面试官必备

    19、在WPF中,什么是DataContext?它作用是什么? 20、WPFMVVM模式是什么?它优势是什么? 21、WPFWindows Forms相比哪些优势?...输入系统:WPF提供了丰富输入系统,处理用户交互,如鼠标、键盘、触摸和触控笔输入。它包括事件处理、命令路由和输入手势,用于构建交互式应用程序。 答案有点多。...10、WPF路由事件哪三种方式/策略(冒泡 直接 隧道)? 答:直接路由事件(Direct Routed Events):直接路由事件是在特定元素上引发并处理事件。...这三种路由事件传播方式提供了灵活事件处理机制,使开发人员能够在不同层次元素上捕获和处理事件,从而实现更加灵活和扩展用户界面交互。...21、WPFWindows Forms相比哪些优势? 答:WPFWindows Forms 都是用于开发 Windows 桌面应用程序框架。

    73710

    WPF 客户端开发需要知道触摸失效问题

    在说 WPF 开发时候,如果开发应用是触摸应用,那么熟悉小伙伴会说到触摸失效问题。...无法在系统和任何应用使用多指触摸 应用触摸失效 在某个应用里面无法用触摸,但是可以使用鼠标 在应用里面所有触摸都转鼠标,也就是收不到Touch事件,同时收不到多指触摸 系统触摸失效和应用触摸失效不同在于...此时就需要系统做转发了 但是在 win7 时候,多指触摸还没有完善,很多古老程序不知道触摸消息,如果此时 Windows 直接发送触摸消息给所有应用。...系统将会在上层虚拟化出对应设备,这些都是软件设备,让对应应用独占,这样每个应用对独占设备做了不清真的处理也不会影响其他程序 也就是从硬件触摸到达应用需要经过系统,而应用程序是否真的触摸,还需要系统给应用程序一个触摸设备或触摸信息...,然后检查系统是否打上了驱动以及是否开启多指触摸支持 WPF 程序无法触摸操作?

    2.2K40

    WPF --- 触摸屏下两个问题

    引言 本篇文章分享一下之前遇到WPF应用在触摸屏下使用时两个问题。...期间遇到了两个问题: WPF触摸屏下,如果有滚动条(ScrollViewer)情况下,默认包含触底反馈功能,就是触摸屏滑动到底或从底滑到顶,界面都会出现抖动情况。...DataGrid 中时,使用滑轮界面无法滚动问题,那么解决触摸屏触点在 DataGrid 中无法滚动问题,也是一样思路,根据触点偏移量,模拟鼠标滚轮偏移量,在调用鼠标滚动事件,模拟滚动,代码如下...小结 总的来说,大部分鼠标触摸事件是类似的,但是有些场景下,可能两者不通用。所以可能需要自行测试一下,保证软件稳定性。...本文中解决方案不一定最完美的解决方案,如果各位看官更好解决方案,望不吝赐教。

    21610

    dotnet 从入门放弃 500 篇文章合集

    本文是记录我从入门放弃写博客 博客包括 C#、WPF、UWP、dotnet core 、git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门放弃...无法登陆 VisualStudio 自定义外部命令 win 消息 win10 17025 触摸bug win10 edge扩展 win10 sdk 是否向下兼容 win10 UWP 蜘蛛网效果 win10...win10 uwp 通知列表 win10 uwp 重启软件 win10 uwp 非ui线程访问 ui win10 uwp 音频 win10 使用 SMB v1 win10 安装Mpi win10 支持默认把触摸提升鼠标事件...Windows 10 16251 添加 api windows 10预览版升级win10 7月29 10240.16384 windows-10「设置」应用完整ms-settings快捷方式汇总 win...DataGridTextColumn wpf 绑定 TextLength WPF 编译为 AnyCPU 和 x86 什么区别 WPF 获得触摸精度和触摸WPF 获得触笔悬停元素上 WPF 解决

    10.4K20

    WPF 触屏事件后触发鼠标事件问题及 DataGrid 误触问题

    WPF 触屏事件后触发鼠标事件问题及 DataGrid 误触问题 目录 一、触屏事件连带触发鼠标事件问题 二、DataGrid 误触问题及解决方法 独立观察员 2021 年 10 月 10 日 一、...触屏事件连带触发鼠标事件问题 这个是 WPF 已知问题,网络上也有一些讨论,但是没有一个完美的方法来解决。...所以,一个说法是,只使用鼠标事件就行了,比如就单单使用 PreviewMouseDown 事件,或者按钮的话直接使用 Click 事件,或者使用命令(Command),这种方法理论上是可以,但是实际情况下...真实触摸时会触发 PreviewTouchDown 事件,而误触时(点击弹窗取消后在空白处点击多次会误触表格)则不会(因为那个只触发鼠标事件),所以只要在鼠标事件 PreviewMouseDown 中能够判断出是否是触屏操作连带触发就行了...所以,在触摸事件,以及鼠标事件单纯鼠标触发情况下,都对 IsRealTouch 赋值为 true 即可。

    2.8K10

    WPF 模拟触摸设备

    Activate 方法会调用一次 UpdateDirectlyOver 这个方法调用 GetTouchPoint 传入一个空参数,用来判断当前是否命中元素,一般都是没有命中,需要到 ReportDown...方法在当前点到元素触摸触摸按下路由事件,可以看到此时路由事件是不需要再获取当前触摸点,因为只是在点到元素触摸事件,如果这个元素需要知道当前触摸点,只需要在方法使用参数 e.GetTouchPoint...因为获取触摸点方法是可以重写,所以第一次获取用于命中测试触摸点可以和元素收到触摸事件获取触摸点返回不同点 只需要拿到了对应元素就可以在元素触发事件,从触摸事件请看WPF 触摸事件 调用...ReportMove 移动方法也是差不多,首先通过 UpdateDirectlyOver 找到命中测试元素,然后触发路由事件。...(); 通过这个方法模拟触摸可以走原有的 WPF 触摸命中测试,也能走路由事件 关于 WPF 触摸事件请看 WPF 触摸事件 本文用到代码放在 github 更多触摸请看 WPF 触摸相关

    71260
    领券