2009-12-22 5 views
10

Ich habe eine kuriose kleine App, die auf einem Bildschirm in Delphi geschriebenen Nummernblock/Taschenrechner erscheint. Ich würde es gerne so machen, wenn du 'Enter' drückst (auf dem Nummernblock) würdest du '=' drücken und wenn du 'Return' (auf der Haupttastatur) drückst, würdest du 'OK' drücken.Delphi: Kann ich zwischen Eingabetaste und Wagenrücklauf unterscheiden?

Es gibt einen OK-Button, der der Standardtyp des Formulars ist, der auf Enter oder Return reagiert. Es gibt auch einen onkeydown-Ereignishandler, der möglicherweise sowohl die Eingabe als auch die Rückgabe als vk_return erfassen kann. Aber seine Aufgaben werden von der Standard-Schaltfläche "OK" usurpiert.

Wenn ich den Unterschied zwischen return und enter kennen könnte, dann könnte ich meine Standardeigenschaft auf der OK-Schaltfläche loswerden und einfach den Click-Event-Handler der OK-Taste auf der Formular-Taste drücken, aber leider sind beide VK_RETURN.

Antwort

17

die WM_KEYDOWN Message-Handler außer Kraft setzen:

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

es implementieren, so dass es die Vorfahren für alles nennt, aber was Sie interessiert sind, können Sie den Unterschied zwischen der Return-Taste erkennen und der Enter-Taste durch die. "erweitertes" Bit im Schlüsseldatentelegrammfeld:

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;