最近项目中一个需求,按下Tab键,按照指定的顺序进行跳转。
在实现的过程中发现,Tab按下的时候,会让当前控件失去焦点。并跳转到其他可焦点控件 例如 TEdit,TButton 等。
究其原理,是因为按下Tab,由于某种机制(应该是windows 或者是 BCB 自己 响应系统热键 ,这里没有结论,后续继续研究)导致控件跳转。
那么问题定位在:如何拦截这个控件按下Tab 的消息处理。
起初尝试了各种 windowsProc 进行拦截,并没有用。
后来发现,在Form里,有一个Bug级别的键盘响应事件。OnShortCut
其中,AdvStringGrid1 就是,我想拦截Tab热键的控件。
见下面代码
void __fastcall TForm1::FormShortCut(TWMKey &Msg, bool &Handled) { if (Msg.CharCode == VK_TAB && ActiveControl != NULL && ActiveControl->Name == "AdvStringGrid1") { Handled = true; //当设置为True的时候,消息将作为快捷拦下来,不再继续派发。 } }
另外关于这个函数还有下面特征
1,任何键盘按下,都会响应。而且比窗体消息优先响应。
2,如果有Form 叠加 (Form1 贴在Form2 上面),最底层的Form才会接收到ShortCut
3,Msg 参数的Msg 属性,会响应2次,一次是 0x00BD , 一次是 0XB016 均在MSDN查不到是什么消息。估计是VCL 自定义的消息。