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

在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中封装的子窗体代码:

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

主窗体的Hook代码:

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

1procedure TForm2.FormCreate(Sender: TObject);
2//窗体创建过程中的代码
3begin
4  //设置键盘钩子
5  hook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, 0, GetCurrentThreadID);
6end;
Code
1procedure TForm2.FormDestroy(Sender: TObject);
2//窗体销毁的代码
3begin
4  //释放键盘钩子
5  UnHookWindowsHookEx(hook);
6end;

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

时间: 2024-09-22 04:17:15

Delphi中在DLL中封装的VCL窗体Tab键响应的问题的相关文章

.Net中消除Dll中的dependency

我们在做.Net Class Library项目时常常会遇到这样的问题,我想生成一个dll供其它程序使用,但在我的项目里,又需要引用一些其它的reference,像ActiveX控件或其它dll,而这些控件或dll又没有strong name,不能写入到GAC(Global Assembly Cache)中,因而,在注册使用你的dll时,就必须带上这些引用的控件或dll,才能完成注册.然而,这并不是我们需要的,我们只想提供一个dll给人家用就行了,为什么还要带上一堆的控件或dll呢?别人也不愿意

Delphi中在DLL动态链接库中封装VCL的MDI子窗体

不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下: 1var 2 DllApp: TApplication;//定义保存原DLL的TApplication对象 3 DllScr: TScreen;//定义保存原DLL的TScreen对象 4 5procedure UnProcDll(Reason: Integer); register; 6//重新定义DLL入口函数 7begin 8 if

在Delphi中调用.Net编写的DLL中的函数

最近因公司群发邮件程式需要给注册一段时间没有激活的用户发激活邮件,邮件中有注册密码 需要还原发给用户 但由于密码加密是用C# 中的TripleDES完成,手头上又没有现成Delphi的实现.时间紧急,现翻译是来不及了,于是经过查资料反复实施 终于成功实现在Delphi中调用 C# 封装的DLL中的方法(Function)和过程(Procedure)现把实施步骤写下,以供有需要的XDJM分享: 1.建立:DotNetFunc.cs 封装要使用的Function.Procedure. 2.生成密钥文

解决ASP中Connection对像封装dll问题

     asp代码保密一直是令人头痛的问题,目前没有非常好的解决方案,无非用vb编译成dll,但工作量实在太大,于是一直苦苦寻求着另一种途径,本文详细介绍关于解决ASP中Connection对像封装dll问题的文章专题. 中午,突然灵感一发,"为什么不尝试用加密数据库?",通过对数据库设一个高强度的密码,然后用vb封装connection对像,将密码信息写在dll里,然后通过asp创建组件方式调用,就算人家拿了我的代码,也无法改动数据库! 于是,开始了一步步既痛苦又刺激的旅程.vb三

ASP中Connection对像封装dll解决方案

connection|封装|解决 asp代码保密一直是令人头痛的问题,目前没有非常好的解决方案,无非用vb编译成dll,但工作量实在太大,于是一直苦苦寻求着另一种途径... 中午,突然灵感一发,"为什么不尝试用加密数据库?",通过对数据库设一个高强度的密码,然后用vb封装connection对像,将密码信息写在dll里,然后通过asp创建组件方式调用,就算人家拿了我的代码,也无法改动数据库! 于是,开始了一步步既痛苦又刺激的旅程.vb三四年前用过,而且菜得不再菜,为了找思路,就上网搜,

将MFC Grid control封装为DLL的做法及其在DLL中的使用方法

MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图:   因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到: MFC Grid control2.27源码下载        MFC Gridcontrol的作者并没有将其封装为DLL,因为在程序的多个模块复用这个控件比较麻烦(需要在多个工程中加入其源码),因此最好将其封装为一个DLL.今天有同事反映在DLL的对话框中无法使用封装好的MFC Grid control,于是上网查了下资料,晚上摸索了一

Delphi从Dll中导出类

从Dll中导出类 ,想必大家首先想到的是使用 bpl 包.这种方式有一个不好 ,那就是使用者必须清楚这个包中含有那些类 ,也就是说必须知道类的名字 -- 这在一定意义上是个限制 ,试想一种情况 ,使用者定义了一个底层的抽象类 (abstract class),然后在此基础上定义了许多应用类 (concrete class),那么 ,对于使用者来说 ,他希望在不知道具体有哪些类的情况下能使用这些类 -- 这 么说似乎有些玄 ,但实际情况确实如此 ,因为定义抽象类的时候并不能预料到以 后会有多少个具

Win32 DLL和MFC DLL 中封装对话框

现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题.这里我们从Win32   DLL和MFC   DLL两个方面来分析并解决这个问题.           1.Win32   DLL               在Win32   DLL中使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件.然后使用DialogBox或者CreateDialog这两个函数(或相同作用的其它函数)来创建对话框,并定义

教你在java中使用dll方法

Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快 速,也能带来跨平台性. Java调用C/C写好的DLL库时,由于基本数据类型不同.使用字节序列可能有差异,所以在参数传递过 程中容易出现问题. 使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其中JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机 器上调用不同的本地