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

1. 主窗体用Hook技术捕获Tab按键并向活动子窗体发送一个Tab键按下的消息

2. 子窗体手动定义一个Tab键被按下的处理(需要用到FormKeyDown事件)。

3. 移动到下一个焦点的WinAPI函数:Perform(WM_NEXTDLGCTL,0,0);

4.移动到上一个焦点的函数:Perform(WM_NEXTDLGCTL,1,0)

DLL中封装的子窗体代码:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (ssShift in Shift) AND (Key = VK_TAB) then
    Perform(WM_NEXTDLGCTL,1,0)
  else if Key = VK_Tab then
    Perform(WM_NEXTDLGCTL,0,0);
end;

主窗体的Hook代码:

function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;
//实现回调函数
begin
  //Tab键处理函数
  if (nCode = HC_ACTION) AND (wParam = VK_TAB) AND (lParam = 983041) then
  begin
    if screen.ActiveForm.Handle <> Form2.Handle then
      SendMessage(screen.ActiveForm.Handle, WM_KEYDOWN,VK_TAB,0);//直接跳到下一个控件上
  end;
  Result := CallNextHookEx(hook,nCode,wParam,lParam);
end;

procedure TForm2.FormCreate(Sender: TObject);
//窗体创建过程中的代码
begin
  //设置键盘钩子
  hook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, 0, GetCurrentThreadID);
end; 


procedure TForm2.FormDestroy(Sender: TObject);
//窗体销毁的代码
begin
  //释放键盘钩子
  UnHookWindowsHookEx(hook);
end;

var
  hook: HHook;//设置Hook单元变量
 
{在Implementation部分上面Interface部分声明键盘钩子回调函数; 其参数传递方式要用 API 的 stdcall}
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;stdcall;

http://blog.csdn.net/sgd317/article/details/6420627

delphi 中封装的VCl窗体Tab键响应问题的更多相关文章

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

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

  2. Delphi中封装ADO之我重学习记录

    delphi adodataset ctstatic 数据是缓存在服务器端还是客户端 答:客户端,开启本地缓存功能后,就能数据在本地批量修改后,再批量提交,减少了网络传送   原创,专业,图文 Del ...

  3. Delphi中实现MDI子窗体(转)

        Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...

  4. DELPHI中如何让FORM窗体透明,只显示控件?

    DELPHI中如何让FORM窗体透明,只显示控件?分享到: 对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理 回复次数:7largewanglargewanglargewang等级:Blank ...

  5. python中使用空格还是使用 Tab键缩进的建议

    对于程序员来说,其实Tab和空格远远不只是“立场”问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格不会出现这个问题,因 ...

  6. 在Ubuntu16.04中python环境下实现tab键补全

    1.编写tab.py的代码: 1 #!/usr/bin/env python 2 # python startup file 3 import sys 4 import readline 5 impo ...

  7. BCB/Delphi中常用的VCL函数说明(文件函数)

    --------------------文件操作--------------------函数名称:ChangeFileExt函数说明:更改指定文件的扩展名,函数原型如下:AnsiString __fa ...

  8. BCB/Delphi中常用的VCL函数说明(字符串函数)

    本文档是ccrun(老妖)根据网上资料整理而成. --------------------内存分配--------------------函数名称:AllocMem函数说明:在队中分配指定字节的内存块 ...

  9. gwt CellTable中的控件按Tab键切换

    默认是 cellTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); 如果要Tab,则设置为DISABLED; 并将其t ...

随机推荐

  1. PHP如何知道一个类中所有的方法

    当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了, ...

  2. leetcode819

    public class Solution { public string MostCommonWord(string paragraph, string[] banned) { //"a, ...

  3. C# 发送和接受Get请求

    1.发送Get请求 public static string HttpGet(string Url, string postDataStr) { HttpWebRequest request = (H ...

  4. mysql数据库怎么安装到自己的电脑上?

    安装mysql1.安装过程中输⼊入Y确认继续安装 2.设置密码1.第⼀一次设登陆密码 2.第⼆二次验证密码 安装完成

  5. percona xtradb cluster test

    docker run --rm -ti -e CLUSTER_NAME=test -e MYSQL_ALLOW_EMPTY_PASSWORD=1 --entrypoint="bash&quo ...

  6. Plugins in Unity

    [Plugins in Unity] In Unity, you normally use scripts to create functionality but you can also inclu ...

  7. highchart 曲线图

    $(function() { Highcharts.setOptions({ global: { useUTC: false } }); var chart = new Highcharts.Char ...

  8. Linux虚拟机磁盘扩容

    扩容步骤如下: 1.添加一块物理硬盘 2.fdisk将硬盘分区,选primary分区,创建1-4个 3.分区类型格式化,选择t,输入LVM代号 4.分好后按w退出 如果是调整原有逻辑卷大小,则先调整原 ...

  9. 28-Truck History(poj1789最小生成树)

    http://poj.org/problem?id=1789 Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submiss ...

  10. freemaker 优缺点 及 应用配置

    通俗的讲,freemaker其实就是一个模板引擎.什么意思呢?——Java可以基于依赖库,然后在模板上进行数据更改(显示). 在模板中,您专注于如何呈现数据,而在模板外(后台业务代码),您将专注于呈现 ...