デルファイ:私はのは、キーとキャリッジリターンを入力するテンキーを区別することはできますか?

StackOverflow https://stackoverflow.com/questions/1949168

  •  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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top