我的应用程序中托管了一个 ActiveX 控件。该控件是使用 Delphi 导入组件菜单导入的。
ActiveX 控件包含一个用于用户输入的编辑框。当我在自己的沙箱应用程序(不是 Delphi 应用程序)中运行该控件时,箭头键按预期工作,在编辑控件内移动光标。
然而,当我运行我的 Delphi 应用程序时,箭头键的行为似乎发生了变化。它看起来更像是 Tab 键。
我认为这是由于 VCL 处理击键的方式造成的。有什么想法可以解决这个问题吗?
最佳答案
控件应处理 WM_GETDLGCODE
并至少在结果中包含 DLGC_WANTARROWS
。
此外,如果 ActiveX 控件是用 Delphi 编写的,并且在其 ControlStyle
中使用 csReflector
,则应使用 WM_KEYDOWN
重新构建它,并且WM_KEYUP
(以及任何其他必需的)消息处理程序添加到 AxCtrls
单元中的 TReflectorWindow
类,以将消息委托(delegate)给 VCL 控件:
procedure TReflectorWindow.WMKeyDown(var Message: TMessage);
begin
Message.Result := FControl.Perform(Message.Msg, Message.WParam, Message.LParam);
end;
procedure TReflectorWindow.WMKeyUp(var Message: TMessage);
begin
Message.Result := FControl.Perform(Message.Msg, Message.WParam, Message.LParam);
end;
这似乎足以在我使用 D2007 的测试中工作。
关于delphi - ActiveX 控件在 Delphi 应用程序中托管时无法正确处理箭头键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2222937/