之前遇到过一个加速键表即使是填写了菜单ID与加速键对应关系,但由于Focus不在MainFrame上(有可能是其他窗口如ControlBar)而造成加速键不作用的问题,所以采用了KeyBoard Hook的方式来进行处理快捷键。
具体用法可以参考::SetWindowsHookEx这个API。
::SetWindowsHookEx需要传入一个回调函数,这个回调函数中就可以进行键盘消息处理。
为了方便映射到MainFrame的功能,我在回调函数中又调用了MainFrame的一个专门处理键盘消息的自定义函数。
然后再自定义函数中,将键盘消息转换为对应WM_COMMAND消息进行再次转发。
这样就实现了加速键相当的功能。
这种方式在处理加速键上很有效,由于整个系统有几十个菜单项具有加速键,所以一次性处理起来也很方便。
然而麻烦还是产生了,在VS2008上,我发现使用这种方式后,菜单的加速键是可以起作用了,效果也很好。
唯一的麻烦是,无法再UI上看到相应菜单的加速键。
比如‘File’->'New'后面一般都跟一个Ctrl+N, 'File'->'Open'后面一般跟一个Ctrl+O,但这个程序中只能看到‘New’,'Open',不见了加速键的标签。
看资源 New的名字是'New\tCtrl+N', 好像\t后面都被截断了。为了验证我的想法,我把'New\tCtrl+N'改为'New Ctrl+N'效果是有了,加速键可以显示在菜单项上。
但是几个菜单项之间的加速键对不齐(本来这些应该是右对齐)。
后来新建一个MFC Project,发现人家这个是可以正常显示的,百思不得其解。百度,Google也无法搜到答案。
对比两个工程,也没发现什么问题,我的CMFCMenuBar和MFC生成的Project并无明显差异。
后来只能从资源本身来入手,我的思路是,先改MFC生成的那个Project看看能不能整成不能显示加速键的效果。
MFC自动生成的Project,有个加速键表,而我的Project由于是自己处理加速键,所以加速键表我都给删除了。
我将MFC Project的加速键表中的项目删除,发现一样没有了加速键显示在菜单项上。
因此,我认为,应该是MFC在处理加速键的时候,这些信息还是需要填写。所以在我自己的工程中加上加速键表信息。
加上之后,清理下注册表(VS2008会把UI Doking信息填入到注册表)。显示一切正常。
特此记录以备忘。