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+ TAB 和 CTRL+SHIFT +TAB kbd> 导航选项卡。设置 forms.KeyPreview 将无济于事,因为 tab 键是特殊键。我怎样才能以一种简单的方式添加对我的导航愿望的支持。如果需要,我可以修改组件。如果有帮助,我的组件基于 TCustomControl。
亲切的问候 罗伊·M·克莱弗
【问题讨论】:
【参考方案1】:您可以在您的组件中管理CM_DIALOGKEY消息来拦截Ctrl + Tab和Ctrl + 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 之后重新映射键?