Я создал пользовательский элемент управления, в который я пытаюсь отправить вход. Это примет вход мыши и сообщит о MouseDown, MouseMove и MouseUp правильно, но по любой причине, это не примет ввод с клавиатуры. То, когда я нажимаю на него, это не получает фокус, и любые клавиши, которые я нажимаю, интерпретируются любым управлением, уже имело фокус.
Это - вероятно, что-то действительно простое. Первое место я думавший посмотреть был в свойстве ControlStyle, но единственная вещь I видит в helpfile о вводе с клавиатуры, csNoStdEvents
, который отключает его, и мое управление не имеет этого. Таким образом, что я должен сделать для создания его так, мое управление может получить фокус ввода?
Несколько вещей, которые можно попробовать:
MouseDown
вызовите Windows.SetFocus(Handle)
. По моему опыту, функция WinAPI SetFocus
часто работает лучше, чем метод VCL SetFocus
. WM_GETDLGCODE
ответьте Message.Result := Message.Result или DLGC_WANTCHARS или DLGC_WANTARROWS или DLGC_WANTTAB или DLGC_WANTALLKEYS
;Может ли это быть так же просто, как вызов SetFocus при нажатой кнопке мыши?
procedure TYourCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
inherited;
if CanFocus then
SetFocus;
end;
У вас установлен WS_TABSTOP
? Я считаю, что без этого у вас не будет фокуса ввода. Но это основано на воспоминаниях почти 10 лет назад, когда я писал свой собственный редактор кода с подсветкой синтаксиса, для которого я давно потерял исходный код.
{TWinControl.} TabStop: = True;
подойдет. Приложение для быстрого тестирования с компонентом, не выполняющим никаких действий, производным от TWinControl
и отображающим диалог для ключевых событий, похоже, показывает, что это имеет значение.
Я проверил код своего элемента управления и не вижу ничего, что могло бы помешать его работе. Вы вызываете "унаследованный" в процедуре создания?
Я обрабатываю следующее, но ничего особенного:
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
Доступно ли нажатие клавиши на уровне формы? То есть KeyPreview включен и можно ли увидеть нажатие клавиши в событии OnKeypress формы? Вы можете следить за ним оттуда в отладчике. Подходит ли элемент управления (как указал Дэн) для ввода с клавиатуры? Например, TLabel, хотя и отображает текст, является графическим элементом управления.