【问题标题】:TCustomControl executing Keyboard eventsTCustomControl 执行键盘事件
【发布时间】:2015-07-29 06:53:30
【问题描述】:

我的 TCustomControl 后代运行良好,但 TCustomControl 缺少驱动键盘事件 KeyDown、KeyUp 等的代码(如命中消息或其他内容)。 我知道 TCustomControl 是 TWinControl 的后代,TForm 也是,但我不知道在 TForm 中寻找什么来驱动它的键盘事件。我只是看不到它。我不希望在外部占用 TForm 的键盘事件,因此它们不能在标准 Delphi 代码中使用。任何有真实经验的人都会听到。 我已经考虑过 CN_KEYDOWN、CN_KEYUP 消息,但我不知道如何正确实现它,我认为无论如何我需要一个更全面的消息。

procedure TBaseControl.KeyBourdProc(var Message: TMessage);
begin
  try
    with Message do
    begin
      case Msg of
        WM_KEYDOWN,
        WM_SYSKEYDOWN: if DoKeyDown(TWMKey(Message)) then Exit;
        WM_CHAR: if DoKeyPress(TWMKey(Message)) then Exit;
        WM_KEYUP,
        WM_SYSKEYUP: if DoKeyUp(TWMKey(Message)) then Exit;
        CN_KEYDOWN,
        CN_CHAR, CN_SYSKEYDOWN,
        CN_SYSCHAR:
        begin
          WndProc(Message);
          Exit;
        end;
      end;
      Result := CallWindowProc(FDefKBProc, FKBHandle, Msg, WParam, LParam);
    end;
  except
    Application.HandleException(Self);
  end;
end;

但这在我的创作中是不正确的

FDefKBProc := Pointer(GetWindowLong(FKBHandle, GWL_WNDPROC));

【问题讨论】:

  • 欢迎来到 StackOverflow。 TWinControl 已经为您处理接收击键。如果您希望控件在具有输入焦点时响应特定的击键,只需覆盖虚拟的KeyDown()KeyUp()KeyPress() 方法。如果这不能解决您的问题,请编辑您的问题以澄清您遇到的问题。
  • 这正是我期望它做的事情,但它根本没有。 Delphi 断点清楚地显示没有线程通过并且没有读取代码。我有继承的基础......到位,但什么都没有
  • 我相信我处于未知领域,因为 TCustomControl 的所有后代都是网格并且没有网格使用键盘输入。添加到 TGrid 的编辑可以做到。所以我也在问 TCustomControl 是否阻止了键盘数据。
  • 并非TCustomControl 的所有后代都是网格。 你的自定义控件是网格吗?听起来这个问题需要更多信息......
  • 只需覆盖 Remy 提到的虚拟方法。显然,如果您的表单设置了 KeyPreview,那么您的控件将不会看到关键事件。

标签: delphi delphi-7 vcl


【解决方案1】:

删除问题中的所有代码。尤其是替换窗口过程的部分。相反,只需根据需要覆盖KeyDownKeyUpKeyPress,并在那里添加您的处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2022-01-22
    • 2018-02-13
    • 2014-05-03
    • 2017-05-29
    相关资源
    最近更新 更多