【问题标题】:Delphi: Can I differentiate between numpad's enter key and carriage return?Delphi:我可以区分数字键盘的回车键和回车吗?
【发布时间】:2009-12-22 21:09:30
【问题描述】:

我有一个古色古香的小应用程序,它会在屏幕上弹出一个用 Delphi 编写的数字键盘/计算器。我想这样做,如果您按“输入”(在数字键盘上),您将按“=”,如果您按“返回”(在主键盘上),您将按“确定”。

有一个 OK 按钮,它是表单的默认按钮,它响应按 enter 或 return。 还有一个 onkeydown 事件处理程序,它可能会捕获 Enter 并返回为 vk_return。但是它的职责被默认的“确定”按钮篡夺了。

如果我能知道 return 和 enter 之间的区别,那么我可以摆脱 OK 按钮上的默认属性,只需在表单按键功能上点击 OK 按钮的 click 事件处理程序,但可惜它们都是 VK_RETURN .

【问题讨论】:

    标签: delphi keyboard-input


    【解决方案1】:

    覆盖 WM_KEYDOWN 消息处理程序:

      procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
    

    实现它,以便它调用祖先的任何东西,而不是您感兴趣的东西。您可以通过密钥数据消息字段中的“扩展”位检测返回键和回车键之间的区别:

    procedure TForm1.WMKeyDown(var Message: TWMKeyDown);
    const
      // Message.KeyData format:
      // [0..15 repCount][16..23 scan code][24 extended bit][25..28 reserved]
      // [29 context][30 previous state][31 transition state]
      KD_IS_EXTENDED = 1 shl 24;
    begin
      if Message.CharCode <> VK_RETURN then
      begin
        inherited;
        Exit;
      end;
      if (KD_IS_EXTENDED and Message.KeyData) <> 0 then
        ShowMessage('Keypad Enter')
      else
        ShowMessage('Return');
    end;
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2018-03-07
      • 2011-06-16
      • 2013-08-08
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多