RGF 仓颉版 Win32 手势通知结构体 tagGESTURENOTIFYSTRUCT 全解析:字段语义、ABI 布局与事件接入
图形学桌面应用【免费下载链接】RGF_CJRGF是仓颉Windows系统下的通用渲染框架兼应用开发框架。RGF仓颉版后续简称RGF基于RGF(C/C版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能力以及常用的桌面应用开发工具并且提供对接Direct3D的相关接口以满足开发者对3D画面渲染的需求。在Windows开发方面RGF在子包内也提供开箱即用的Windows API确保熟悉Win32的开发者快速上手。此外RGF还提供一些常用功能的封装如XAudio2、MF以辅助开发者实现音频、摄像头等扩展功能的管理。项目地址https://gitcode.com/Cangjie-SIG/RGF_CJ点击查看免费下载导读tagGESTURENOTIFYSTRUCT是 RGF 仓颉版RGF_CJ在rgf.win_def子包中提供的一个与 Win32 手势触控机制直接相关的原生结构体用于承载WM_GESTURENOTIFY0x011A消息的附加数据——包括触控设备实例、目标窗口句柄、设备坐标位置与标志位等。本篇以该结构体的 API 参考文档为骨架结合 hwinuser.cj 的源码定义、rgf_proc.cj 的事件封装实现逐字段讲解其类型、默认值与底层含义并演示它如何通过EvGestureNotify接入 RGF 的事件体系让熟悉 Win32 的开发者能够快速定位、读懂并在自己的窗口中处理手势通知数据。结构体定位Win32 手势通知消息的数据载体在 RGF 的rgf.win_def子包中hwinuser.cj 定义了手势相关的两条窗口消息常量WM_GESTURE0x0119实际的手势动作消息WM_GESTURENOTIFY0x011A手势通知消息在触控设备到达/移除等场景下由系统向窗口发送用于告知应用当前手势状态并允许其配置手势。tagGESTURENOTIFYSTRUCT正是WM_GESTURENOTIFY消息中lParam所指向的数据结构。其声明如下C public struct tagGESTURENOTIFYSTRUCTC注解表明该结构体被标记为 C 兼容extern C ABI类型保证其在内存中的布局与 Win32 原生 SDK 结构体一致从而可以通过指针安全地与系统消息进行互操作。完整的定义位于 src/win_def/hwinuser.cj#L1237-L1245。五个字段逐一解析API 参考文档中罗列了该结构体的五个公开字段各字段的声明、类型与默认值如下cbSize结构体大小public var cbSize: UINT 0类型UINT在 wintype.cj 中定义为UInt32的类型别名该字段用于存放结构体自身的字节大小是 Win32 消息结构体的惯用约定系统据此校验传入指针的合法长度在 RGF 封装层中该值直接由系统填充解析侧无需主动维护。dwFlags标志位public var dwFlags: DWORD 0类型DWORD同样在 wintype.cj 中定义为UInt32该字段承载本次通知的标志信息。仓库在 hwinuser.cj 中同时提供了与之配套的两个标志常量GIDC_ARRIVAL 1触控设备到达与GIDC_REMOVAL 2触控设备移除可用于与dwFlags比对以判断触控设备的变化类型。hwndTarget目标窗口句柄public var hwndTarget: HWND HWND()类型HWND在 hwindef.cj 中定义为CPointerUNUSED即窗口句柄的指针形式该字段标识手势通知所指向的目标窗口。ptsLocation设备坐标位置public var ptsLocation: POINTS POINTS()类型POINTS在 hwindef.cj 中定义为tagPOINTS结构体tagPOINTS 内部包含两个SHORTInt16类型的成员x、y表示屏幕坐标点。值得注意此处使用POINTS短整型坐标而非POINT长整型坐标可见该字段用于承载压缩后的位置信息。dwInstanceID设备实例标识public var dwInstanceID: DWORD 0类型DWORD即UInt32该字段标识发起通知的触控输入设备实例 ID可用于区分多个触控设备。字段速查表字段声明类型实际类型默认值语义cbSizeUINTUInt320结构体字节大小dwFlagsDWORDUInt320通知标志可对比GIDC_ARRIVAL/GIDC_REMOVALhwndTargetHWNDCPointerUNUSEDHWND()目标窗口句柄ptsLocationPOINTStagPOINTSPOINTS()屏幕坐标SHORT类型 x/ydwInstanceIDDWORDUInt320触控设备实例 ID关于字段顺序与内存布局的一点说明需要留意API 参考文档tagGESTURENOTIFYSTRUCT.md中字段的罗列顺序为cbSize → dwFlags → dwInstanceID → hwndTarget → ptsLocation而源码 hwinuser.cj#L1237-L1245 中实际定义的成员顺序为cbSize → dwFlags → hwndTarget → ptsLocation → dwInstanceID。由于该结构体带有C注解其真实内存布局以源码定义顺序为准该顺序与 Win32 原生GESTURENOTIFYSTRUCT的标准布局保持一致。在通过指针读取如ptr.read()或跨 FFI 边界传递时务必以源码中的成员顺序作为唯一依据文档罗列顺序仅作字段清单参考。类型别名与指针类型除结构体本体外hwinuser.cj 还提供了两个配套类型别名也收录在 类型别名.md 与 类型别名.md#L860-L862 中public type GESTURENOTIFYSTRUCT tagGESTURENOTIFYSTRUCT public type PGESTURENOTIFYSTRUCT CPointertagGESTURENOTIFYSTRUCTGESTURENOTIFYSTRUCT去掉tag前缀的别名与 Win32 SDK 命名习惯一致日常使用更简洁PGESTURENOTIFYSTRUCT指向该结构体的指针类型。由于WM_GESTURENOTIFY的lParam携带的正是结构体指针该别名在消息解析场景中最为常用。在 RGF 事件体系中的接入EvGestureNotify 封装tagGESTURENOTIFYSTRUCT的价值最终体现在 RGF 的事件体系中。在 rgf_proc.cj#L3259-L3290 中RGF 将WM_GESTURENOTIFY封装为EvGestureNotify事件类对应 EvGestureNotify.md其核心解析逻辑如下public open class EvGestureNotify : EvCore{ public var cbSize:UInt32; public var dwFlags:UInt32; public var hwndTarget:RgfHwnd; public var ptsLocation:Point; public var dwInstanceID:UInt32; internal let ptr:CPointerGESTURENOTIFYSTRUCT; internal var Obj:GESTURENOTIFYSTRUCT; OverflowWrapping public init(wParam:UInt64, lParam:Int64) { super(0x011A /*WM_GESTURENOTIFY*/, wParam,lParam) ptr CPointerGESTURENOTIFYSTRUCT(ruUllToPtr(ruInt64SafeToUIntNative(lParam))) Obj unsafe{ ptr.read() } // 逐字段拷贝为 RGF 友好的类型 cbSize Obj.cbSize dwFlags Obj.dwFlags hwndTarget Obj.hwndTarget.toUIntNative() ptsLocation Point(Int32(Obj.ptsLocation.x),Int32(Obj.ptsLocation.y)) dwInstanceID Obj.dwInstanceID } // postProcess() 反向写回原始结构体此处略 }这段实现清晰展示了结构体在框架中的实际用法通过CPointerGESTURENOTIFYSTRUCT将lParam转换为结构体指针用unsafe { ptr.read() }一次性读出原生结构体逐字段转换为 RGF 更友好的类型——HWND转为RgfHwnd、POINTS转为Point同时把SHORT提升为Int32供上层业务直接使用事件类还提供postProcess()方法将修改后的字段反向写回原始结构体用于需要回写系统参数的场景。消息分发onGestureNotify 与 bindGestureNotify在 RGF 的消息分发层WM_GESTURENOTIFY同时接入了两套事件 API继承式接口IEvent接口提供onGestureNotify(e: EvGestureNotify): Unit对应文档 IEvent.md#L714-L719 中标注的“本消息可设置手势配置”分发实现在 rgf_proc.cj#L5300-L5304绑定式接口IBindEvent接口提供bindGestureNotify: Option(EvGestureNotify) - Unit属性对应 IBindEvent.md#L378-L380分发实现在 rgf_proc.cj#L7461-L7464。两条分发路径的源码中都带有同一行关键注释// 本消息始终应该从 DefWindowProc 返回值这意味着WM_GESTURENOTIFY是一个“只读通知 配置入口”性质的消息——应用在处理完EvGestureNotify读取结构体字段、必要时修改配置后不应吞掉消息返回值而是应当返回DefWindowProc的处理结果让系统继续完成手势相关的默认处理。这也是tagGESTURENOTIFYSTRUCT相比普通消息结构体在使用上最需要注意的约定。小结tagGESTURENOTIFYSTRUCT是 RGF 仓颉版对接 Win32 手势触控机制的底层数据契约它由C注解保证 ABI 兼容五个字段分别承担结构体大小、通知标志、目标窗口、设备坐标与设备实例 ID 的传递配合 hwinuser.cj 中的GESTURENOTIFYSTRUCT/PGESTURENOTIFYSTRUCT别名以及 rgf_proc.cj 中EvGestureNotify的指针解析与类型转换开发者可以在不接触裸指针的情况下读取全部字段并通过onGestureNotify/bindGestureNotify接入自己的窗口逻辑。需要进一步查阅完整定义与关联常量时可参考 变量与常量.md 中的WM_GESTURENOTIFY说明及 readme.md 的结构体索引。赞分享图形学桌面应用【免费下载链接】RGF_CJRGF是仓颉Windows系统下的通用渲染框架兼应用开发框架。RGF仓颉版后续简称RGF基于RGF(C/C版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能力以及常用的桌面应用开发工具并且提供对接Direct3D的相关接口以满足开发者对3D画面渲染的需求。在Windows开发方面RGF在子包内也提供开箱即用的Windows API确保熟悉Win32的开发者快速上手。此外RGF还提供一些常用功能的封装如XAudio2、MF以辅助开发者实现音频、摄像头等扩展功能的管理。项目地址https://gitcode.com/Cangjie-SIG/RGF_CJ点击查看免费下载相关推荐RGF 仓颉版 win_def 子包中的 SECURITY_ATTRIBUTES 结构体字段定义与 Win32 API 实战指南RGF 仓颉版 win_def 子包中的 SECURITY_ATTRIBUTES 结构体字段定义与 Win32 API 实战指南 本篇技术指南聚焦 RGF 仓图形学桌面应用RGF仓颉版 EvChar 字符输入事件解析从 Win32 消息到仓颉事件对象的完整链路RGF仓颉版 EvChar 字符输入事件解析从 Win32 消息到仓颉事件对象的完整链路 本篇围绕 RGF仓颉版RGF_CJ rgf.rgf_core 子图形学桌面应用仓颉版 RGF 中 Win32 安全描述符结构体 _SECURITY_DESCRIPTOR 完整解析仓颉版 RGF 中 Win32 安全描述符结构体 _SECURITY_DESCRIPTOR 完整解析 导读本文以 RGF 仓颉版RGF_CJ win_de图形学桌面应用上一篇Karate测试框架完全指南从入门到精通的实战教程下一篇终极LastPass CLI指南如何在命令行中高效管理你的密码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

UDP广播实战:从原理到跨平台稳定收发的完整指南

UDP广播实战:从原理到跨平台稳定收发的完整指南

1. 项目概述:为什么一个“UDP广播demo”值得花一整天认真写透UDP广播这个概念,听起来像教科书里被翻旧了的一页纸——很多刚学网络编程的人,第一反应是:“不就是发个包,让局域网里所有机器都收到吗?”但真当…

2026/10/15 6:14:42 阅读更多 →
Spring事件机制实战:用ApplicationEventPublisher实现业务解耦

Spring事件机制实战:用ApplicationEventPublisher实现业务解耦

做后端开发的人应该都有过这种经历:一个下单接口,业务代码越堆越多。一开始只是保存订单,后面要扣库存、发短信、发优惠券、加积分、通知财务……新需求一个接一个,每次都要打开核心 Service 往里面塞代码。改到后面,下…

2026/10/15 6:14:42 阅读更多 →
Java工程师24周转型Agent工程师:从LLM基础到多Agent协作实战

Java工程师24周转型Agent工程师:从LLM基础到多Agent协作实战

1. 为什么Java老手转Agent工程师反而有优势这两年Agent Engineer这个岗位火得有点不讲道理。招聘网站上挂出来的JD,薪资区间普遍比同级别的后端开发高出30%到50%,而且很多岗位明确写着“有后端经验者优先”。我身边不少写了五六年Java的朋友都在问同一个…

2026/10/15 6:14:42 阅读更多 →

最新新闻

Java反射机制原理、优化与实践指南

Java反射机制原理、优化与实践指南

1. 反射机制的本质与核心价值Java反射是运行时动态获取类信息并操作类成员的能力集合。与静态编码不同,反射允许程序在编译期未知具体类的情况下,通过Class对象完成方法调用、字段存取等操作。这种能力源于JVM的类型信息保留机制——即使经过编译擦除&am…

2026/10/15 6:56:51 阅读更多 →
QT Socket 客户端服务端一体化调试工具:原理、实现与避坑指南

QT Socket 客户端服务端一体化调试工具:原理、实现与避坑指南

简介:本资源是一份基于Qt的TCP网络编程实战项目源码,面向具备一定C与Qt基础、希望掌握网络通信开发的初学者和进阶开发者。项目将TCP客户端与服务器端功能集成于同一GUI程序,借助Qt Network模块中的QTcpSocket与QTcpServer类,演示…

2026/10/15 6:56:51 阅读更多 →
空间站锂离子电池技术解析与应用前景

空间站锂离子电池技术解析与应用前景

1. 项目背景与核心价值在太空探索领域,能源系统堪称航天器的"心脏"。最近我国空间站开展的新型锂离子电池在轨实验,标志着空间能源技术迈入新阶段。作为一名曾参与卫星电源系统设计的工程师,我深知这项实验对后续深空探测任务的意义…

2026/10/15 6:56:51 阅读更多 →
PyTorch深度学习实战:动态图、自动求导与训练调优全解析

PyTorch深度学习实战:动态图、自动求导与训练调优全解析

1. 为什么“PyTorch”这三个字值得反复咀嚼如果你最近在技术社区里闲逛,或者翻看各类招聘需求,会发现“PyTorch”这个词的出现频率高得离谱。它不只是一个深度学习框架的名字,更像是一张通行证——从学术论文的代码复现,到工业级推…

2026/10/15 6:56:51 阅读更多 →
C语言经典练手题:水仙花数拆解循环与取余的巧妙应用

C语言经典练手题:水仙花数拆解循环与取余的巧妙应用

这两年我一直在坚持整理一套C语言入门练手题,专栏名字就叫“菜鸟编程C语言100例”。前面三道题分别过了一遍变量与数据类型、格式化输出、if-else分支判断,到了第四题,我想着该让循环结构登场了。但纯写一个“for循环讲解”又太枯燥&#xff…

2026/10/15 6:56:51 阅读更多 →
SpringBoot+Vue轻量级博客系统设计与实现

SpringBoot+Vue轻量级博客系统设计与实现

1. 项目概述:SpringBootVue轻量级博客系统设计去年帮学弟评审毕业设计时,发现市面上很多博客系统要么功能冗余,要么扩展性差。于是我们决定用SpringBootVue搭建一个轻量级但五脏俱全的在线创作社区。这个系统最核心的特点是采用前后端分离架构…

2026/10/15 6:55:51 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →