Delphi 在应用程序中获取“Ctrl Tab”和“Ctrl Shift Tab”

Posted

技术标签:

【中文标题】Delphi 在应用程序中获取“Ctrl Tab”和“Ctrl Shift Tab”【英文标题】:Delphi Getting 'Ctrl Tab' and 'Ctrl Shift Tab' in application 【发布时间】:2011-01-19 20:19:08 【问题描述】:

在我的应用程序中,我使用选项卡,我自己的组件,比如 Google chrome。每个选项卡都引用一个资源管理器组件,因此它基本上是一个选项卡式浏览器/资源管理器。我的问题是我想使用 CTRL+ TABCTRL+SHIFT +TAB kbd> 导航选项卡。设置 forms.KeyPreview 将无济于事,因为 tab 键是特殊键。我怎样才能以一种简单的方式添加对我的导航愿望的支持。如果需要,我可以修改组件。如果有帮助,我的组件基于 TCustomControl。

亲切的问候 罗伊·M·克莱弗

【问题讨论】:

【参考方案1】:

您可以在您的组件中管理CM_DIALOGKEY消息来拦截Ctrl + TabCtrl + Shift + 制表符

procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;

检查此示例

procedure TYourComponent.CMDialogKey(var Message: TCMDialogKey);
begin
  if (Focused) and (Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then
  begin
   if GetKeyState(VK_SHIFT) then
    GoBackwardPage()//you must write this method
   else
    GoForwardPage()//you must write this method
    Message.Result := 1;
  end
   else
    inherited;
end;

【讨论】:

我现在差不多就是这样:) 谢谢!【参考方案2】:

Tab 和方向键一样,enter 和 escape 是对话框导航中使用的特殊键。当控件想要接收这些键时,它必须通过响应WM_GETDLGCODE 来表明这一点。就像下面的这段代码。然后当 Tab 被按下时你会收到一个 KeyDown 事件。

procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;

procedure TYourControl.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
 inherited;
 Msg.Result := Msg.Result or DLGC_WANTTAB;
end;

另见here 和here。

PS:并确保您的控件具有焦点,否则您将一无所获(如果 CanFocus 则 SetFocus;在 MouseDown 中)。

【讨论】:

嗯,这帮助我走上了正轨……我的资源管理器中有一些代码阻止了键在某些条件下工作。现在我让它工作了。谢谢!

以上是关于Delphi 在应用程序中获取“Ctrl Tab”和“Ctrl Shift Tab”的主要内容,如果未能解决你的问题,请参考以下文章

在tmux中绑定Ctrl+Tab和Ctrl+Shift+Tab

如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?

当前按住 Alt/Ctrl 时,如何在 Alt+Tab/Ctrl+Tab 之后重新映射键?

如何在 extjs 3.4 中处理 ctrl+tab 键?

用于 RibbonTab 的 WPF IsSelected 绑定在 ctrl+tab 上停止工作

Eclipse 的 Visual Studio Ctrl+Tab 和 Ctrl+Shift+Tab 等效项