2009-12-22 43 views
10

我有一个古怪的小应用程序,弹出一个在Delphi中编写的屏幕数字键盘/计算器。我想这样做如果你按'enter'(在数字键盘上),你会按'=',如果你按'return'(在主键盘上),你会按'OK'。Delphi:我可以区分numpad的回车键和回车吗?

有一个确定按钮是表单的默认人物,它响应输入或返回。 还有一个onkeydown事件处理程序,它可能会捕获Enter和返回为vk_return。但其职责被默认的“确定”按钮所篡夺。

如果我可以知道返回和输入的区别,那么我可以删除OK按钮上的默认属性,只需点击确定按钮的单击事件处理程序的表单按键功能,但可惜它们都是VK_RETURN。因此,它要求任何东西,但你感兴趣的祖先

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

实现它可以检测到返回键,并用回车键的区别:

回答

17

重写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;