我们从 Form 的源码中看到, 指定的快捷键是一个数字, 譬如 Ctrl+A, 对应着数字: 16449
其实这是一个 Word 类型的数字; 快捷键的参数是 TShortCut 类型的, 它定义在 Classes 单元的第92行(Delphi 2007):
TShortCut = Low(Word)..High(Word);
Menus 单元有两个函数: TextToShortCut、ShortCutToText, 可以互相转换它们.
Word 是双字节, 有一个高字节、一个低字节.
高字节用来储存辅助键, 就是 Shift、Ctrl、Alt 和它们的组合; 低字节储存单键对应的键值.
对组合键的键值, Delphi 规定如下:
譬如: 16449, 用十六进制表示是: $4041; 高字节 $40 表示 Ctrl, 低字节 $41 表示字母 A.
既然如此, 不用它的转换函数, 我们自己也可以转换了:
其实这是一个 Word 类型的数字; 快捷键的参数是 TShortCut 类型的, 它定义在 Classes 单元的第92行(Delphi 2007):
TShortCut = Low(Word)..High(Word);
Menus 单元有两个函数: TextToShortCut、ShortCutToText, 可以互相转换它们.
它是根据什么原理用一个数字记下了一个字符串的呢? 我没有深究, 只是根据已知数据猜了一下.var w: Word; s: string; begin w := TextToShortCut('Ctrl+A'); ShowMessage(IntToStr(w)); {16449} s := ShortCutToText(16449); ShowMessage(s); {Ctrl+A} end;
Word 是双字节, 有一个高字节、一个低字节.
高字节用来储存辅助键, 就是 Shift、Ctrl、Alt 和它们的组合; 低字节储存单键对应的键值.
对组合键的键值, Delphi 规定如下:
辅助键 | 值 |
---|---|
Shift | $20 |
Ctrl | $40 |
Shift+Ctrl | $60 |
Alt | $80 |
Shift+Alt | $A0 |
Ctrl+Alt | $C0 |
Shift+Ctrl+Alt | $E0 |
譬如: 16449, 用十六进制表示是: $4041; 高字节 $40 表示 Ctrl, 低字节 $41 表示字母 A.
既然如此, 不用它的转换函数, 我们自己也可以转换了:
不过, 我在整理所有可用的快捷键列表时, 碰见了太多重复值(就是一个快捷键对应着好多个数值), 还不知是什么原理.var w: Word; h,l: Byte; begin w := 16449; h := Hi(w); {获取高字节} l := Lo(w); {获取低字节} ShowMessage(IntToHex(h,2)); {40} ShowMessage(IntToHex(l,2)); {41} end;
分类:
菜单相关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧