2009-12-22 364 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;