11

Delphiで書かれた画面上の数字パッド/電卓をポップアップする趣のある小さなアプリがあります。「Enter」(テンキー上)を押した場合は「=」を押し、「return」(メインキーボード上)を押した場合は「OK」を押します。

EnterキーまたはReturnキーを押すと応答する、フォームのデフォルトのユーザーである[OK]ボタンがあります。Enterとreturnの両方をvk_returnとしてキャプチャする可能性のあるonkeydownイベントハンドラーもあります。しかし、その義務はデフォルトの「OK」ボタンによって奪われています。

returnとenterの違いを知ることができれば、OKボタンのデフォルトのプロパティを削除し、フォームキーダウン機能でOKボタンのクリックイベントハンドラーを押すだけで済みますが、残念ながら、どちらもVK_RETURNです。

4

1 に答える 1

19

WM_KEYDOWNメッセージハンドラーをオーバーライドします。

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

関心のあるもの以外のすべての祖先を呼び出すように実装します。キーデータメッセージフィールドの「extended」ビットによって、リターンキーとエンターキーの違いを検出できます。

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;
于 2009-12-22T21:44:46.457 に答える