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

转载 2011年05月15日 01:36:00

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

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;

delphi写的DLL子窗体生成为主程序的TabSheet

  • 2008年09月26日 20:23
  • 88KB
  • 下载

Delphi Dll插件窗体中遇到的各种问题

最近在公司写一个外壳程序,调用DLL插件把FORM嵌入到EXE中的一个PANEL中,其中遇到了不少的问题,大部分已经解决,还有几个至今没有找到解决方法,有待研究,也希望知道解决方法的富翁共享一下研究成...
  • y281252548
  • y281252548
  • 2016年05月10日 14:44
  • 1646

如何传递[Ctrl]+[Tab] 到 MDI子窗体

我在MDI 子窗体有个TabControl控件(如PageControl), 当按下Ctrl+Tab 或 Ctrl+Shift+Tab 组合键时,应用程序切换到了下一个MDI子窗口,而不是改变TabC...
  • zhnglicho
  • zhnglicho
  • 2012年12月18日 13:56
  • 1649

delphi操作字符串时,tab符号的操作

用#9查找tab符号:ipos := pos(#9,sTmp)
  • bq_cui
  • bq_cui
  • 2008年06月23日 09:23
  • 3202

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

在DLL中封装的VCL窗体Tab键响应的问题 在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息。基本顺序...
  • sgd317
  • sgd317
  • 2011年05月15日 01:36
  • 843

delphi标签化窗体

  • 2016年12月15日 22:33
  • 5.49MB
  • 下载

Delphi中窗体响应按键步骤

1.因为KeyPreview默认是 False;我们这里需要响应键盘事件的话,需要将其修改为True;所以KeyPreview:=True; 这对一些快捷键会有用。在窗体属性上修改KeyPreview...
  • liquanhai
  • liquanhai
  • 2010年04月16日 20:55
  • 5716

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

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

建立Delphi窗体模板

最近在写一个信息管理系统,为了方便使用Delphi先建立一个模板窗体,以后就可以直接使用这个窗体来建立客户窗体了。窗体要实现以下功能:1.       这个窗体是作为MDI子窗体使用的,Delphi默...
  • stosc
  • stosc
  • 2007年02月28日 18:37
  • 2047

tabcontrol增加form窗体

TabPage tab = new TabPage(); tab.Name = "formname"; tab.Text = "窗体1";//抬头 Form1 form = new Form1(...
  • Sky_Cat
  • Sky_Cat
  • 2016年11月15日 12:33
  • 474
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DELPHI 在DLL中封装的VCL窗体Tab键响应的问题
举报原因:
原因补充:

(最多只允许输入30个字)