RGF 仓颉版输入类型枚举 EmInput 详解:原始输入(Raw Input)类型判定与事件接入

发布时间:2026/10/14 8:34:12
RGF 仓颉版输入类型枚举 EmInput 详解:原始输入(Raw Input)类型判定与事件接入 图形学桌面应用【免费下载链接】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仓颉 Windows 通用渲染框架在 rgf.rgf_core 子包中提供了一整套面向 Win32 的窗口事件封装EmInput正是其中用于标识原始输入Raw Input来源类型的核心枚举。它配合EvInput事件参数类将 Windows 的WM_INPUT0x00FF消息转换为类型安全的仓颉枚举值。读完本文你将掌握EmInput两个枚举取值的真实含义、四个成员方法的底层实现逻辑以及如何通过覆盖式onInput与绑定式bindInput两条路径接入原始输入事件。一、EmInput 是什么原始输入的类型标签EmInput定义在 src/rgf_core/rgf_proc.cj 中文档描述为输入类型其完整声明如下/** brief 输入类型 */ public enum EmInput{ | Input | InputSink ... }它只有两个枚举成员对应 Windows 原始输入机制中WM_INPUT消息wParam低字节的两种取值枚举成员数值e2Num 结果对应 Win32 常量含义Input0RIM_INPUT应用程序处于前台激活状态正在接收原始输入InputSink1RIM_INPUTSINK应用程序处于后台非激活仍接收原始输入需在注册时指定接收后台输入从源码结构看这两个成员顺序与 Win32 定义一一对应e2Num将Input映射为 0、将InputSink映射为 1正是为了让仓颉侧枚举与 Windows 系统层的RIM_INPUT/RIM_INPUTSINK数值完全对齐从而可以直接从消息参数还原出系统原始语义。为什么需要这个枚举WM_INPUT是 Windows 原始输入消息不会像WM_KEYDOWN那样自带按键虚拟键码而是通过wParam告知输入来源模式前台 / 后台、通过lParam携带指向RAWINPUT结构的指针。EmInput的价值就在于把wParam中晦涩的整型标志位包装成可读、可比较、可模式匹配的仓颉枚举让事件处理代码无需再与魔法数字打交道。二、枚举成员方法双向转换与比较运算EmInput除两个取值外还自带四个公开方法与仓库内大多数Em*枚举保持一致的工具方法四件套1.e2Num(tk: EmInput): UInt8—— 枚举转数值public const static func e2Num(tk: EmInput): UInt8{ return match (tk) { case Input 0 case InputSink 1 } }这是一个const static方法将枚举成员映射为UInt8数值供需要与 Win32 API、消息参数进行数值交互的场景使用。其源码实现见 src/rgf_core/rgf_proc.cj。2.num2e(num: UInt8): EmInput—— 数值转枚举public const static func num2e(num: UInt8): EmInput{ return match (num) { case 1 InputSink case _ Input } }这是e2Num的逆运算是整个框架解析WM_INPUT消息的关键入口EvInput事件参数类在构造时正是调用它来完成从消息参数到枚举的还原详见下一节。注意其容错设计case _ Input表明任何非 1 的数值都会安全回退到Input避免未知数值导致运行时异常。实现见 src/rgf_core/rgf_proc.cj。3.(right: EmInput): Bool与!(right: EmInput): Bool—— 比较运算符public operator func (right:EmInput):Bool{ return e2Num(this) e2Num(right); } public operator func !(right:EmInput):Bool{ return e2Num(this) ! e2Num(right); }两个运算符均通过e2Num的数值比较实现语义稳定Input Input、InputSink InputSink、Input ! InputSink。在实际事件处理中你可以放心地写出if (e.flag EmInput.Input) { ... }这类直观的判断。实现见 src/rgf_core/rgf_proc.cj。三、EmInput 的用武之地EvInput 事件参数类EmInput并非孤立存在它与 EvInput 事件参数类深度绑定。EvInput的定义位于 src/rgf_core/rgf_proc.cj/** brief 输入 - 事件参数 */ public open class EvInput : EvCore{ public let flag:EmInput; public let handle:CPointerUnit; OverflowWrapping public init(wParam:UInt64, lParam:Int64) { super(0x00FF /*WM_INPUT*/, wParam,lParam) flag EmInput.num2e(UInt8(wParam)) handle ruUllToPtr(ruInt64SafeToUIntNative(lParam)) } }EvInput暴露两个公开只读字段全部由构造函数从 Win32 消息参数自动解析字段类型来源与含义flagEmInput由wParam低字节经EmInput.num2e转换而来标识本次原始输入的来源模式前台Input/ 后台InputSinkhandleCPointerUnit由lParam经指针转换而来指向系统提供的RAWINPUT结构体含设备句柄、输入数据等底层信息可进一步配合ruSafeCStruct、ruUllToPtr等 RGF 工具函数解析这里有两个值得注意的源码细节flag的取值方向EmInput.num2e(UInt8(wParam))只取wParam的低 8 位。在 Win32 规范中WM_INPUT的wParam低字节正是RIM_INPUT(0) /RIM_INPUTSINK(1)高字节另含RIM_INPUTNOACTIVE等附加标志因此取低字节 枚举回退的写法恰好覆盖了类型判定需求。handle的指针化lParam在WM_INPUT中本身就是指向RAWINPUT的指针RGF 通过ruInt64SafeToUIntNativeruUllToPtr将其安全地还原为仓颉侧CPointerUnit供开发者自行按需读取原始数据。四、事件接入两条路径onInput 与 bindInputEmInput的枚举值最终通过EvInput事件抵达应用层。RGF 为WM_INPUT提供了与全框架一致的双模式事件接入方式路径一覆盖式分发 —— 重写onInputIEvent 接口声明了输入事件的默认回调// 窗口正在获取原始输入 func onInput(e: EvInput): Unit其默认实现位于 src/rgf_core/rgf_proc.cj// brief 窗口正在获取原始输入 func onInput(e:EvInput):Unit{ e.isOverride false }覆盖式分发的消息路由在 src/rgf_core/rgf_proc.cjcase 0x00FF /*WM_INPUT*/ { let eObj:EvInput EvInput(wParam,lParam) onInput(eObj) return (0,false/*eObj.isOverride*/) // -- 此事件要求始终传递以便执行清理 }注意源码注释特别强调WM_INPUT 事件要求始终传递isOverride被强制置为false返回值恒为false以便系统执行清理。这意味着即使你的应用没有消费该事件RGF 也不会吞掉它原始输入消息仍会沿窗口过程继续向下传递符合 Windows 原始输入协议的要求。路径二绑定式分发 —— 赋值bindInputIBindEvent体系下的绑定式入口bindInput属性声明于 src/rgf_core/rgf_proc.cj// brief 窗口正在获取原始输入 mut prop bindInput:Option(EvInput)-Unit{ get(){ None }set(v){ throw NoneValueException(rgfFunctionWillIgnored) } }其对应的绑定式消息路由在 src/rgf_core/rgf_proc.cjcase 0x00FF /*WM_INPUT*/ { let eObj:EvInput EvInput(wParam,lParam) bindInput?(eObj) return OptionInt64.None // -- 此事件要求始终传递以便执行清理 }同样可以看到始终传递的设计绑定式分发返回OptionInt64.None不拦截消息。若未实现绑定函数bindInput的赋值会被rgfFunctionWillIgnored异常拒绝属性 setter 的默认行为保证不会静默丢失事件。值得一提的是这些消息路由代码并非手写散布而是由宏系统统一生成覆盖式与绑定式的case 0x00FF分支分别对应 src/rgf_core/macros/rgf_proc_utils.cj 与 src/rgf_core/macros/rgf_proc_utils.cj 中的生成模板保证了两种模式行为一致、维护成本可控。五、典型用法示例判断输入来源模式结合以上内容一个典型的原始输入接入代码大致如下示意反映 RGF 的事件接入习惯// 覆盖式在自定义窗口类中重写输入事件 override func onInput(e: EvInput): Unit { // 判断输入来源模式 if (e.flag EmInput.Input) { // 前台激活状态下接收到的原始输入 // 可通过 e.handle 进一步解析 RAWINPUT 数据 } else if (e.flag EmInput.InputSink) { // 后台非激活状态下仍在接收的原始输入 } // 注意无需也无法阻止该消息继续传递isOverride 恒为 false } // 绑定式在事件绑定窗口上挂接回调 win.bindInput { e if (e.flag EmInput.Input) { // 处理前台原始输入 } e.isOverride false // 该事件要求始终传递以便执行清理 }六、注意区分EmInput 与 EmInputDeviceChangeEmInput常与同文件中的 EmInputDeviceChange 混淆两者语义完全不同务必区分枚举关联消息描述取值EmInputWM_INPUT0x00FF输入类型原始输入来自前台还是后台Input(0)、InputSink(1)EmInputDeviceChangeWM_INPUT_DEVICE_CHANGE0x00FE设备变更类型原始输入设备插拔事件Arrival(1)、Removal(2)、Unknow(0)EmInputDeviceChange由EvInputDeviceChange事件参数类承载src/rgf_core/rgf_proc.cj用于监听注册接收原始输入的窗口收到设备接入/移除的通知而EmInput关注的则是设备就绪后源源不断送达的输入数据本身。两者共同构成了 RGF 原始输入能力的设备层 数据层闭环。消息常量WM_INPUT/WM_INPUT_DEVICE_CHANGE定义见 src/win_def/hwinuser.cj。七、小结EmInput虽只含两个取值与四个方法却是 RGF 原始输入链路中承上启下的关键一环承上通过num2e将 Win32WM_INPUT消息的wParam低字节还原为类型安全的仓颉枚举Input/InputSink分别对应前台与后台两种接收模式启下以EvInput.flag字段的形式把类型信息带进onInput覆盖式与bindInput绑定式两条事件通道让开发者可以直接进行模式判断设计范式e2Num/num2e//!四件套与EmInputDeviceChange等其余Em*枚举保持一致是 RGF 统一枚举工具链的组成部分。如果需要深入原始输入数据的解析如通过e.handle读取RAWINPUT结构可结合 rgf.rgf_core 函数文档 中的ruSafeCStruct、ruRedefBit、ruUllToPtr等工具函数继续探索。赞分享图形学桌面应用【免费下载链接】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点击查看免费下载相关推荐Formtastic输入类型大全25种内置输入类型详解Formtastic输入类型大全25种内置输入类型详解 Formtastic是一个强大的Rails表单构建器DSL提供了丰富的输入类型来创建语义化、可访问的后端UI组件RGF_CJ 窗口激活类型枚举 EmActivate 详解从 Win32 消息到仓颉事件处理RGF_CJ 窗口激活类型枚举 EmActivate 详解从 Win32 消息到仓颉事件处理 EmActivate 是 RGF_CJRGF 仓颉版渲染与应图形学桌面应用RGF 仓颉版剪贴板内容类型枚举 EmClipboardFormat 完全解析与 Win32 剪贴板格式的一一映射RGF 仓颉版剪贴板内容类型枚举 EmClipboardFormat 完全解析与 Win32 剪贴板格式的一一映射 EmClipboardFormat 是 R图形学桌面应用上一篇VoltAgent A2A Server 实战指南用 Agent-to-Agent 协议将 TypeScript 智能体开放给其他 Agent 与 IDE下一篇解码ArknightsGameResource上万张明日方舟图标avatar到map的8大素材目录新手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询