为什么我的控件不接受键盘输入?

时间:2010-05-12 12:40:37

标签: delphi focus custom-controls component-design

我已经构建了一个自定义控件,我正在尝试将输入发送到。它将接受鼠标输入并正确报告MouseDown,MouseMove和MouseUp,但无论出于何种原因,它都不接受键盘输入。当我点击它时,它没有得到焦点,我按下的任何键都被任何具有焦点的控件解释。

这可能非常简单。我想看的第一个地方是在ControlStyle属性中,但我在帮助文件中看到的关于键盘输入的唯一内容是csNoStdEvents,它会禁用它,而我的控件没有。那么我需要做些什么才能让我的控件能够获得输入焦点?

5 个答案:

答案 0 :(得分:7)

要尝试的一些事项:

  • MouseDown上,拨打Windows.SetFocus(Handle)。根据我的经验,WinAPI函数SetFocus通常比VCL的SetFocus方法更好。
  • 在回复WM_GETDLGCODE消息时,请回复Message.Result := Message.Result or DLGC_WANTCHARS or DLGC_WANTARROWS or DLGC_WANTTAB or DLGC_WANTALLKEYS;

答案 1 :(得分:4)

它可以像在鼠标按下时调用SetFocus一样简单吗?

procedure TYourCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
  inherited;

  if CanFocus then
    SetFocus;
end;

答案 2 :(得分:2)

您是否设置了WS_TABSTOP?如果没有这个,你没有输入焦点,我相信。但这是基于近10年前的回忆,当时我正在编写自己的语法高亮代码编辑器,我早就失去了源代码。

{TWinControl.}TabStop := True;应该这样做。一个带有从TWinControl派生的无所事事组件并显示关键事件对话框的快速测试应用程序似乎表明它完全不同。

答案 3 :(得分:1)

我已经检查了我的控件的代码,我看不到任何可能阻止这种工作的东西。你在Create过程中调用“inherited”吗?

我确实处理了以下内容,但没有什么特别之处:

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;

答案 4 :(得分:0)

表单级别的按键是否可用?也就是说,KeyPreview是否已启用,您是否可以在表单的OnKeypress事件中看到击键?您可以在调试器中从那里跟随它。控件(如Dan所示)是否适合键盘输入?例如,TL​​abel虽然显示文本,但却是一个图形控件。