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

BCB 如何拦截TAB键消息的更多相关文章

  1. Win32对话框模板创建的窗口上响应键消息,Tab焦点切换消息,加速键消息

    今天在学习的时候,发现对话框上不响应键盘消息,查了老半天,终于成功了,现分享出来, 1,首先要在消息循环的时候加如下代码. int WINAPI WinMain(_In_ HINSTANCE hIns ...

  2. 修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615 在duilib中,按tab键会让焦点在Button一类的控 ...

  3. 在DLL中封装的VCL窗体Tab键响应的问题

    在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Ta ...

  4. 再谈vc发送键盘、组合键消息

    关于向Windows窗口发送Alt组合键的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多, 但就是没有很好解决问题. 之前找到一个能正确发送的code:(Alt+A) PostMes ...

  5. delphi 中封装的VCl窗体Tab键响应问题

    在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Ta ...

  6. Win32 键盘事件 - 击键消息、字符消息、插入符号(光标)

    注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 以下内容主 ...

  7. 转:设置Eclipse中的tab键为4个空格的完整方法

    from: https://my.oschina.net/xunxun10/blog/110074   设置Eclipse中的tab键为4个空格的完整方法 收藏 XunXun10 发表于 4年前 阅读 ...

  8. 什么时候使用tab键来对齐代码和代码的风格

    在大括号嵌套语法中, 最好是左右(前后) 大括号单独占一行, 这样的嵌套关系最清晰 也就是说, c/c++的风格是最清晰的. 而java php将 左大括号放在上一行的末尾, 稍次一点. 不过在if ...

  9. 使用回车键代替TAB键 需jquery1.4.2版本

    1 $(document).ready(function () { 2 $(':input:text:first').focus(); 3 $(':input:enabled').addClass(' ...

随机推荐

  1. std::replace函数

    需包含头文件#include <algorithm> template <class ForwardIterator, class T> void replace (Forwa ...

  2. Cron 表达式学习

    1.7个子域的说明 cron 的表达式是字符串,实际上是由七子表达式(从左到右),描述个别细节的时间表.这些子表达式是分开的空白. 顺序(从左到右) 子串 有效数字 有效字符 1 Seconds(秒) ...

  3. Eclipse配置编写HTML/JS/CSS/JSP页面的自动提示

    我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...

  4. nginx passwd (http://www.voidcn.com/article/p-suebfyqy-nx.html)

    操作系统CentOS 7.2 nignx 1.10.1 首先我们用Nginx提供HTTP的Basic Auth功能,配置了需要输入的用户名和密码,才能访问网站. 我们使用htpasswd来生成密码信息 ...

  5. [CF991D]Bishwock_状压dp

    Bishwock 题目链接:http://codeforces.com/problemset/problem/991/D 数据范围:略. 题解: 一眼题. 首先,每个$L$最多只占用两列,而且行数特别 ...

  6. Git Bash输错账号密码如何重新输入

    很多时候我们容易在Git Bash操作的时候,不慎输入错误的用户名或密码,此时一直提示: remote: Incorrect username or password ( access token ) ...

  7. Redis 学习笔记(篇十):Sentinel

    Sentinel(哨兵)是 Redis 的高可用解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主 ...

  8. 后端排序,debug模式中map的顺序出错

    js中map遍历的顺序是按照插入的顺序来执行的.如果map的来源是字符串转换的,那么就会按照字符串中key值的顺序进行遍历.千万不要被debug中显示的顺序误导,这里应该是为了方便查看对key进行了字 ...

  9. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  10. GoLang语言环境搭建及idea集成开发(超详细)

    一.所需安装包(windows) 1. https://golang.org/dl/  下载 MSI installer.不会翻墙的自己找国内下载,双击运行,按照提示安装即可.环境变量自动配置 2.i ...