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

Roy*_*ver 2 navigation delphi user-interface tabs components

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

亲切的问候Roy M Klever

Lar*_*ens 5

选项卡,如箭头键,输入和转义是对话框导航中使用的特殊键.当控件想要接收这些键时,它必须通过响应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;
Run Code Online (Sandbox Code Playgroud)

另见这里这里.

PS:并确保您的控件具有焦点,或者您根本不会收到任何内容(如果CanFocus然后是SetFocus;在MouseDown中).


RRU*_*RUZ 5

您可以管理组件中的 CM_DIALOGKEY 消息来拦截Ctrl+TabCtrl+ Shift+ Tab

procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
Run Code Online (Sandbox Code Playgroud)

检查这个样本

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;
Run Code Online (Sandbox Code Playgroud)