c#设置触控屏触控自动映射到扩展屏

概要

在大多数系统中,触摸屏和触控笔的使用并不常见,相关的解决方案也较少。在Windows系统中,触摸屏和触控笔通常通过USB连接,并默认映射到主屏幕。如果没有进行额外设置,以下两种场景可能导致问题:

  1. 主屏幕为非触控屏幕,扩展屏幕为触控屏幕,导致在扩展屏上的操作实际影响主屏幕。
  2. 主屏幕为触控屏幕,扩展屏幕为非触控屏幕,需要将触控和笔操作映射到扩展屏幕。

本文介绍了一种通过代码将触控/笔操作映射到扩展屏幕的方法,并确保设置实时生效,对用户透明。文末提供了源码下载链接。

分析

上述两种场景表明,需要一种方法或工具来校正触控屏的笔/消息,以对应正确的屏幕。

解决办法

1. 使用系统自带的MultiDigiMon.exe工具

  • 通过“控制面板” -> “平板电脑设置”进行设置。
  • 使用命令行(以管理员权限运行cmd):
    C:\Windows\System32>MultiDigiMon.exe -touch
    C:\Windows\System32>MultiDigiMon.exe -pen
    

优点:直接调用系统软件设置,不要更多的代码投入
缺点:MultiDigiMon.exe需要用户手动确认,不能自动处理

2. 使用代码自动校正

感谢显示器与触摸屏的一对一绑定原理和解析的作者,通过将其思路转化为C#代码,实现了实时生效的解决方案。

2.1 找到当前触控/笔的设备路径

触控设备通过HID通信,根据usage过滤设备:

  • 触控设备:0x04
  • 笔设备:0x02

以下是获取设备路径的C#代码示例:

        /// <summary>
        /// 获取触控屏设备
        /// </summary>
        /// <param name="isTouch">true:触控  false:笔</param>
        /// <returns></returns>
        public static IntPtr GetTouchDeviceHandle(bool isTouch)
        {
   
            var usage = isTouch
                ? Native.NativeMethods.TouchScreenUsage//0x04
                : Native.NativeMethods.PenUsage;//0x02
            uint count = 0;
            NativeMethods.GetRawInputDeviceList(null, out count, (uint)Marshal.SizeOf(typeof(RAWINPUTDEVICELIST)));

            RAWINPUTDEVICELIST[] list = new RAWINPUTDEVICELIST[count];
            if (GetRawInputDeviceList(list, out count, (uint)Marshal.SizeOf(typeof(RAWINPUTDEVICELIST))) != 0)
            {
   
                foreach (RAWINPUTDEVICELIST device in list)
                {
   
                    if (ValidateDevice(device.hDevice,usage))
                    {
   
                        return device
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值