お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」

[Q]
ある仮想キーの状態を取得したい。

[A]
ある仮想キーの状態は API の GetKeyState 関数を使えば取得できます。

   GetKeyState( 仮想キーコード )
    ■戻り値の型
   SHORT( Smallint )型(符号付き16ビット整数)

   ■戻り値の意味
   ◎上位ビットが1
     指定した仮想キーが押されている。

             if GetKeyState( VK_SHIFT ) and $8000 <> 0 then
               {... Shift Key が押されている時の処理 ...};

       あるいは、符号付き整数の上位ビットが1→負数を表
     しますので、

             if GetKeyState( VK_SHIFT ) < 0 then
               {... Shift Key が押されている時の処理 ...};

       のようにして判別できます。
      なお、状態を調べたい仮想キーが文字または数字キー
     である場合には、

             if GetKeyState( Ord('A') ) < 0 then {...};
                            ~~~~~~~~
      のようにします。

    ◎上位ビットが1以外
     指定した仮想キーは押されていない。

             if GetKeyState( VK_CONTROL ) >= 0 then
               {... Ctrl Key が押されていない時の処理 ...};

       のようにして判別できます。

    ◎下位ビットが1
     トグル状態である。(トグル状態とは、例えば CapsLock
     Key のようにオン・オフ状態を指定できるキーでキーが
     オン状態であるとき。)

             if GetKeyState( VK_CAPITAL ) and 1 > 0 then
               {... CapsLock Key がオンである時の処理 ...};

       のようにして判別できます。

    ◎下位ビットがゼロ
     トグル解除(オフ)の状態である。

             if GetKeyState( VK_KANA ) and 1 = 0 then
               {... KANA Key がオフである時の処理 ...};

       のようにして判別できます。


 ≪参考≫:トグル状態の取得は無理ですが、 GetAsyncKeyState 関数
     でもキーの状態を調べることができます。また、仮想キー
     全体の情報を取得するには GetKeyboardState 関数を使い
     ます。(詳しくは API のヘルプを GetKeyState などで検
     索してみて下さい。 )
[例]

  Edit1 で Enter Key が押されたとき、 Shift Key が押されていたら
TabStop が True であるひとつ前の TabOrderのコントロールに、Shift
Key が押されていなかったら次のコントロールにフォーカスを移動させ
ます。

 //================================================================
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Char(VK_RETURN) then
    begin
      SelectNext(ActiveControl, GetKeyState(VK_SHIFT) >= 0, True);
  //  SendMessage( Handle, WM_NEXTDLGCTL,
  //              Ord( GetKeyState(VK_SHIFT) < 0 ), 0 );{でも可}
      Key := #0;
    end;
end;
//================================================================


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。

Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会