Delphi Получение «Ctrl Tab» и «Ctrl Shift Tab» в приложении - PullRequest
2 голосов
/ 23 февраля 2010

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

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

Ответы [ 2 ]

5 голосов
/ 23 февраля 2010

Вкладка, как и клавиши со стрелками, ввод и выход, являются специальными клавишами, используемыми в диалоговой навигации.Когда элемент управления хочет получить эти ключи, он должен указать это, отвечая на 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).

4 голосов
/ 23 февраля 2010

Вы можете управлять сообщением CM_DIALOGKEY в своем компоненте для перехвата Ctrl + Tab и Ctrl + Shift + Tab .

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;
...