zoukankan      html  css  js  c++  java
  • BCB 如何拦截TAB键消息

    最近项目中一个需求,按下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 自定义的消息。

  • 相关阅读:
    Bower 使用
    为什么是static?
    多重继承 -Javascript中的apply与call详解
    留用 未验证 js适配根字体大小
    Js作用域与作用域链详解
    理解AngularJS中的依赖注入
    渐进增强 优雅降级
    前后台数据交换的几种方式:
    then()方法是异步执行
    HTML怎么让img 等比例缩放
  • 原文地址:https://www.cnblogs.com/songr/p/5069503.html
Copyright © 2011-2022 走看看