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