前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使 WPF 支持触摸板的横向滚动

使 WPF 支持触摸板的横向滚动

作者头像
walterlv
发布于 2018-09-18 05:02:54
发布于 2018-09-18 05:02:54
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

使 WPF 支持触摸板的横向滚动

发布于 2017-11-23 13:25 更新于 2018-08-12 08:02

微软终于开始学苹果一样好好做触摸板了(就是键盘空格键下面那一大块)。然而鉴于以前没有好好做,以至于 WPF 程序甚至都没有对触摸板的横向滚动提供支持(竖向滚动是直接使用了 MouseWheel,汗……)。但有些功能真希望能够支持横向滚动!

本文将介绍让触摸板支持横向滚动的方法,本质上也是用 MouseWheel,但却支持了横向。


中文 English

▲ 精确式触摸板

我们需要从 Windows 的窗口消息中获取 WM_MOUSEHWHEEL 消息。对,就是鼠标滚轮消息!以前我们只取了纵向数据,现在我们要取横向数据。

首先,我们需要能够监听得到消息才行。重写 WindowOnSourceInitialized 方法可以开始监听消息;如果代码没办法写到 Window 中,可以通过 Window.GetWindow(DependencyObject) 获取到窗口实例后监听它的 SourceInitialized 事件。如果拿不到这样的时机,则只要在任何 SourceInitialized 之后的时机(比如 Loaded)都可以写下面方法内部的两行代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override void OnSourceInitialized(EventArgs e)
{
    var source = PresentationSource.FromVisual(_board);
    ((HwndSource) source)?.AddHook(Hook);
}

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    // 在这里添加消息的处理。
    return IntPtr.Zero;
}

接下来,我们开始处理 WM_MOUSEHWHEEL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int WM_MOUSEHWHEEL = 0x020E;

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg)
    {
        case WM_MOUSEHWHEEL:
            int tilt = (short) HIWORD(wParam);
            OnMouseTilt(tilt);
            return (IntPtr) 1;
    }
    return IntPtr.Zero;
}

/// <summary>
/// 取指针所在高位数值。
/// </summary>
private static int HIWORD(IntPtr ptr)
{
    var val32 = ptr.ToInt32();
    return ((val32 >> 16) & 0xFFFF);
}

/// <summary>
/// 取指针所在低位数值。
/// </summary>
private static int LOWORD(IntPtr ptr)
{
    var val32 = ptr.ToInt32();
    return (val32 & 0xFFFF);
}

private void OnMouseTilt(int tilt)
{
    // 这里就是触摸板横向滚动的时机,参数是横向滚动的数值,就像鼠标滚轮纵向滚动的数值一样。
}

OnMouseTilt 中就可以写我们触摸板横向滚动的处理代码。

以上代码都可以封装成通用的方法,在 OnMouseTilt 中抛出一个类似于 MouseWheel 一样的事件是非常好的选择。

微软的 Microsoft Sculpt Comfort Mouse 鼠标滚轮也是支持横向滚动的,以上方法也可以支持。

本文会经常更新,请阅读原文: https://walterlv.com/post/handle-horizontal-scrolling-of-touchpad.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Support Horizontal Scrolling of TouchPad in WPF Application
发布于 2017-11-23 14:09 更新于 2018-08-12 08:02
walterlv
2018/09/18
7460
Support Horizontal Scrolling of TouchPad in WPF Application
WPF 从触摸消息转触摸事件
在 WPF 程序可能因为一些坑让程序触摸失效,如果此时还可以收到系统的触摸消息,那么可以通过从触摸消息转触摸事件解决程序触摸失效但不适合所有触摸失效程序
林德熙
2020/07/07
1.3K0
WPF 通过 RawInput 获取触摸消息
触摸在 Windows 下属于比较特殊的输入,不同于键盘和鼠标,键盘和鼠标可以通过全局 Hook 的方式获取到鼠标和键盘的输入消息。而触摸则没有直接的 Hook 的方法。如果期望自己的应用,可以在没有作为前台获取焦点的应用时,可以抓取到全局的触摸消息,抓取到其他应用程序的触摸输入,那么可以尝试使用 RawInput 的方式。通过 RawInput 的方式,可以让一个没有任何激活的、触摸直接命中的窗口的应用程序接收到全局的所有触摸消息
林德熙
2023/04/07
9341
WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹
本文将告诉大家如何在 WPF 里面,接收裸 Win 32 的 WM_Pointer 消息,从消息里面获取触摸点信息,使用触摸点信息绘制简单的笔迹
林德熙
2024/09/01
2070
WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹
WPF 如何确定应用程序开启了 Pointer 触摸消息的支持
因为 WPF 在开启 Pointer 和没有开启的基础表现几乎相同,因此从业务层很难了解到当前是否开启了 Pointer 消息。本文从开发者的角度,通过 Windows 消息判断当前是否开启 Pointer 支持
林德熙
2020/08/24
6890
WPF 编写一个测试 WM_TOUCH 触摸消息延迟的应用
我听说在 Win10 到 Win11 的系统版本左右,微软加上了一大波触摸性能优化,准确来说是 HID 性能优化。我想测试一下在这些系统下,采用从 Windows 消息接收到 WM_TOUCH 触摸消息的延迟将会是多少。本文将告诉大家我编写的测试应
林德熙
2023/04/07
6250
WPF 隐藏系统窗口菜单
本文告诉大家如何隐藏系统窗口菜单 系统的窗口菜单请看下图 通过在消息里面钩调一些消息的方式,此方法由 黄滨滨 大佬提供 private IntPtr Hook(IntPtr hwnd,
林德熙
2019/06/15
1.7K0
VB6对滚轮的支持
        我需要对Mapx控件支持鼠标滚轮,找了一个可以使用的代码,来自         http://blog.csdn.net/areful/archive/2007/10/19/1832010.aspx         需要注意的是,在FormLoad中增加Hook Map1.hWnd,在Form_Unload中增加UnHook Map1.hWnd         另外,在鼠标移动经过Map时,可以激发Map的mousemove事件,但滚轮无效,因为焦点不在Map上,可以用Map1.SetF
用户1075292
2018/01/23
1.1K0
WPF 使用 RawInput 接收裸数据
在 Windows 提供很底层的方法接收硬件设备的裸数据,通过接收裸数据可以做到性能更高的全局键盘,还能支持多个鼠标。但是用这个方法需要自己解析裸数据,同时会因为接受到很多消息降低性能
林德熙
2022/08/04
9800
WPF 添加窗口消息钩子方法
窗口消息钩子需要先拿到窗口指针然后需要在窗口初始化完成之后才可以做到,推荐的做法请看代码
林德熙
2019/06/15
9320
WPF 制作支持点击穿透的高性能的透明背景异形窗口
默认的 WPF 的支持点击穿透的透明背景窗口,是通过 AllowsTransparency 实现的,但是此方法的性能比较低。本文来告诉大家一个高性能的方法,通过此方法制作出来的 WPF 窗口可以获取很高的性能,设置透明和设置窗口不透明之间几乎没有性能差别
林德熙
2021/01/07
2.9K1
通过子类化窗口(SubClass)来为现有的某个窗口添加新的窗口处理程序(或者叫钩子,Hook)
创建窗口的时候,可以传一个消息处理函数。然而如果窗口不是自己创建的,还能增加消息处理函数吗?答案是可以的,除了 SetWindowsHookEx 来添加钩子之外,更推荐用子类化的方式来添加。
walterlv
2023/10/22
4640
wpf 单例
本文告诉大家如何做一个 wpf 单例程序。单例就是用户只能运行这个程序一次,也就是内存只有存在这个程序一个。
林德熙
2018/09/19
1.3K0
wpf 单例
WPF取色器开发
前言 这里全局的键盘钩子和全局鼠标钩子是为了定义快捷键。 获取鼠标坐标 using System.Runtime.InteropServices; namespace ColorPicker.Utils { internal class ZPoint { [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern bool GetCursorPos(out POINT pt);
码客说
2022/03/13
1.9K0
当无边框窗口被子窗口遮挡导致难以调节窗口大小时,可通过处理 NCHITTEST 消息重新支持调节窗口大小
做无边框窗口之后,我们有方法可以让窗口的标题栏区域和边缘调大小的区域继续正常工作,直到——这个窗口上面覆盖了其他的子窗口。这个子窗口会吃掉消息导致父窗口的边缘无法再继续处理这些消息。
walterlv
2023/10/22
4790
当无边框窗口被子窗口遮挡导致难以调节窗口大小时,可通过处理 NCHITTEST 消息重新支持调节窗口大小
WPF 渲染原理
在 WPF 最主要的就是渲染,因为 WPF 是一个界面框架。想用一篇博客就能告诉大家完整的 WPF 渲染原理是不可能的。本文告诉大家 WPF 从开发者告诉如何画图像到在屏幕显示的过程。本文是从一个很高的地方来看渲染的过程,在本文之后会添加很多博客来告诉大家渲染的细节。
林德熙
2018/09/19
3K0
WPF 渲染原理
WPF 通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸转换过来
本文将告诉大家如何在 WPF 或者其他 Win32 应用里面,在收到鼠标消息时,通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸消息提升而来
林德熙
2023/11/28
2880
WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)
发布于 2018-07-11 13:35 更新于 2018-07-12 11:44
walterlv
2018/09/18
4.4K0
WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)
WPF 稳定的全屏化窗口方法
本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法。在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边。本文的方法是基于 Win32 的,由 lsj 提供的方法,当前已在 500 多万台设备上稳定运行超过半年时间,只有很少的电脑才偶尔出现任务栏不消失的情况
林德熙
2021/08/13
5K0
什么是WPF_windows程序设计教程
(1)字参数(wParam) (2)长参数(lParam)   字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。
全栈程序员站长
2022/09/23
6950
什么是WPF_windows程序设计教程
推荐阅读
相关推荐
Support Horizontal Scrolling of TouchPad in WPF Application
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验