Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么赢了';我的控件不能接受键盘输入吗?_Delphi_Focus_Custom Controls_Component Design - Fatal编程技术网

Delphi 为什么赢了';我的控件不能接受键盘输入吗?

Delphi 为什么赢了';我的控件不能接受键盘输入吗?,delphi,focus,custom-controls,component-design,Delphi,Focus,Custom Controls,Component Design,我已经构建了一个自定义控件,试图将输入发送到该控件。它将接受鼠标输入并正确报告MouseDown、MouseMove和MouseUp,但无论出于何种原因,它都不会接受键盘输入。当我点击它时,它不会接收到焦点,我按下的任何键都会被已经有焦点的控件解释 这可能很简单。我想看的第一个地方是ControlStyle属性,但在帮助文件中我能看到的关于键盘输入的唯一内容是csNoStdEvents,它禁用了它,而我的控件没有。那么,我需要做些什么才能使我的控件能够接收输入焦点呢?在表单级别可以使用按键吗?也

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


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

在表单级别可以使用按键吗?也就是说,是否启用了KeyPreview,您是否可以在表单的OnKeypress事件中看到击键?您可以在调试器中从此处开始跟踪它。控件(如Dan所示)是否适合键盘输入?例如,TLabel虽然显示文本,但它是一个图形控件。

我已经检查了控件的代码,但看不到任何可能停止此操作的内容。是否在创建过程中调用“继承的”

我确实处理以下事项,但没有什么特别之处:

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;

您有
WS\u TABSTOP
设置吗?我相信,没有这些,你就没有输入焦点。但这是基于近10年前的回忆,当时我正在编写自己的语法突出显示代码编辑器,我早就失去了它的源代码


{TWinControl.}TabStop:=True应该这样做。一个快速测试应用程序,它有一个从TWinControl派生的不做任何事情的组件,并显示一个关键事件对话框,这似乎表明它起到了很大的作用。

它能像在鼠标按下时调用SetFocus那样简单吗

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

  if CanFocus then
    SetFocus;
end;
有几件事可以尝试:

  • MouseDown
    上,调用
    Windows.SetFocus(Handle)
    。根据我的经验,WinAPI函数
    SetFocus
    通常比VCL的
    SetFocus
    方法工作得更好
  • 响应
    WM_GETDLGCODE
    消息,使用
    message.Result:=message.Result或DLGC_WANTCHARS或DLGC_WANTARROWS或DLGC_WANTTAB或DLGC_wantalkeys进行回复

能否显示一些代码?我在想也许你继承了TControl而不是TCustomControl。。。(TControl不是TWinControl,没有窗口句柄,无法获取输入焦点-think:TLabel)它继承自TCustomControl。只是尝试了一下,似乎没有任何改变。我仍然无法获得键盘焦点。我坚信这就是问题所在。谢谢。要么接受你的,要么接受拉尔斯的,因为你俩都有办法把SetFocus放在MouseDown里面,这很管用。我选择你的是因为WM_GETDLGCODE的东西,我也需要它,因为我需要专门捕捉箭头键。仅仅要求
DLGC_WANTALLKEYS
,还不够吗?@Andreas为什么不呢?我对文档的解释显然是错误的。@David:你得问问微软。我只知道,
DLGC\u WANTARROWS或DLGC\u WANTTAB或DLGC\u WANTALLKEYS
DLGC\u WANTALLKEYS
不是一回事。当然,从数学的角度来看(只看数值),这是微不足道的,但操作系统也会以不同的方式对待这两个值。因此,不需要,您需要分别添加选项卡和箭头。例如,请参见。@Andreas,谢谢。碰巧我只想知道我在做什么,即使这样的启蒙只是昙花一现!