为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,源码还是没有,一想转到微软的代码里就提示是否显示汇编:(