为WinForms程序添加Form级快捷键的最简单方式
Form.KeyDown, KeyUp, KeyPress在给程序添加快捷键时都不好使,因为某些控件会拦截按键信息,比如你在Form上放一个Button,把焦点移到它上面,随便按个什么键,Form.KeyXXX都是不会引发的。
解决这个问题的正规方法是重写Form.ProcessCmdKey方法,它会在控件处理按键信息之前被调用。但是,假如要更方便,更灵活地处理快捷键--比如由另一个类处理,这个方法就不适用了。这时,最好的办法是:
给窗体添加一个额外的菜单,设计好菜单项的Click事件处理器,然后给它设置ShortcutKeys属性,最后,设置菜单的Visible为false.
需要注意的是,如果你一个窗体有多于一个菜单的话,并且不同的菜单里的菜单项的快捷键有重复的,这时最多只有一个菜单项的事件处理器会被调用,具体说就是按照菜单项被Add到父菜单项的DropDownItems里的顺序(无论父菜单项有没有被Add到另一个父控件中去!)查找,第一个Enable为真的菜单项,它的事件处理器会被调用。这个优先顺序与菜单的可见与否无关,但是与Enable有关。
ps:在使用微软的Debug Symbols + Reflector的人肉调试过程中,发现几行代码,作用是如果一个WinForms进程附加了调试器,那么在这个程序里按Ctrl+Break会使用Debuger冻结程序。
pps: .Net Framework的源代码是不是还不可用? 按Scott的截图设置了VS 2008 Express,结果只能得到Symbols,源码还是没有,一想转到微软的代码里就提示是否显示汇编:(
解决这个问题的正规方法是重写Form.ProcessCmdKey方法,它会在控件处理按键信息之前被调用。但是,假如要更方便,更灵活地处理快捷键--比如由另一个类处理,这个方法就不适用了。这时,最好的办法是:
给窗体添加一个额外的菜单,设计好菜单项的Click事件处理器,然后给它设置ShortcutKeys属性,最后,设置菜单的Visible为false.
需要注意的是,如果你一个窗体有多于一个菜单的话,并且不同的菜单里的菜单项的快捷键有重复的,这时最多只有一个菜单项的事件处理器会被调用,具体说就是按照菜单项被Add到父菜单项的DropDownItems里的顺序(无论父菜单项有没有被Add到另一个父控件中去!)查找,第一个Enable为真的菜单项,它的事件处理器会被调用。这个优先顺序与菜单的可见与否无关,但是与Enable有关。
ps:在使用微软的Debug Symbols + Reflector的人肉调试过程中,发现几行代码,作用是如果一个WinForms进程附加了调试器,那么在这个程序里按Ctrl+Break会使用Debuger冻结程序。
pps: .Net Framework的源代码是不是还不可用? 按Scott的截图设置了VS 2008 Express,结果只能得到Symbols,源码还是没有,一想转到微软的代码里就提示是否显示汇编:(
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~