Delphi Получение 'Ctrl Tab' и 'Ctrl Shift Tab' в приложении

В своем приложении я использую вкладки, свой собственный компонент, вроде Google Chrome. Каждая вкладка ссылается на компонент проводника, поэтому в основном это обозреватель / проводник с вкладками. Моя проблема в том, что я хочу использовать CTRL + TAB и CTRL + SHIFT + TAB для навигации по вкладкам. Настройка forms.KeyPreview не поможет, так как клавиша табуляции является специальной клавишей. Как я могу простым способом добавить поддержку моего желания навигации. При необходимости я могу изменить компонент. Мой компонент основан на TCustomControl, если это помогает.

С уважением, Рой М. Клевер


person Roy M Klever    schedule 22.02.2010    source источник


Ответы (2)


Tab, как и клавиши со стрелками, Enter и Escape - это специальные клавиши, используемые в диалоговой навигации. Когда элемент управления хочет получить эти ключи, он должен указать это, ответив на WM_GETDLGCODE. Как этот код ниже. Затем вы получите событие KeyDown при нажатии Tab.

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

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

Также см. здесь и здесь.

PS: И убедитесь, что ваш элемент управления находится в фокусе, иначе вы вообще ничего не получите (если CanFocus, то SetFocus; в MouseDown).

person Lars Truijens    schedule 22.02.2010
comment
Что ж, это помогло мне встать на правильный путь ... У меня был код в моем проводнике, который не позволял клавишам работать при определенных условиях. Теперь у меня все работает. Спасибо! - person Roy M Klever; 23.02.2010

Вы можете управлять сообщением 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;
person RRUZ    schedule 22.02.2010
comment
Почти как сейчас :) Спасибо! - person Roy M Klever; 23.02.2010