デルファイ:私はのは、キーとキャリッジリターンを入力するテンキーを区別することはできますか?
-
21-09-2019 - |
質問
私は、Delphiで書かれた画面上のnumberpad /電卓をポップアップする趣のある小さなアプリケーションを持っています。私はあなたが(テンキー上)「を入力」を押したので、もし、それはあなたが「=」を押すことだろうと、あなたが(メインキーボード上)「リターン」を押した場合は、「OK」を押すことと思いますしたいのですが。
を入力または戻り当たっに応答フォームのデフォルトの男でOKボタンがあります。 潜在的に捕捉し、両方の入力し、VK_RETURNとして返すことがありますOnKeyDownイベントハンドラもあります。しかし、その職務は、デフォルトの「OK」ボタンによって奪われています。
私はリターンの違いを知っていて、入ることができるならば、私はOKボタンを、私のデフォルトのプロパティを取り除くことができ、ちょうどフォームのキーダウン機能上のOKボタンのクリックイベントハンドラを打つんが、それらは両方ともVK_RETURNある悲しいかなます。
解決
WM_KEYDOWNメッセージハンドラをオーバーライドます:
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
それはあなたに興味を持っているものが、何のための祖先を呼び出すようにそれを実装するあなたは、キーデータメッセージフィールド内の「拡張」ビットでリターンキーとEnterキーの違いを検出することができます。
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;
所属していません StackOverflow