キーの状態を調べる-1



GetKeyState() でキーの状態を調べて表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明です。

  1. 新規プロジェクト(KeyState)を作成してソースプログラムの最初の部分を表示して下さい。
    左矢印(←)と右矢印(→)の状態を記録する領域を定義します。
        // グローバル変数:
        BOOL    Left,Right;
        
  2. 関数の宣言に続いて次の関数を追加して下さい。
    キーをセンスして左矢印と右矢印の状態を Left と Right に記録する関数です。
    ESC キーが押されるとプログラムを終了します。
    キーの状態が変化すると InvalidateRect() で画面に表示します。
    InvalidateRect() と UpdateWindow() を対で使用することが多いのですが、UpdateWindow() を省略しても 差し支え無いようです。
        void  KeyState(HWND hwnd)
        {   BOOL    state;
            if (GetKeyState(VK_ESCAPE)<0)
            {   PostMessage(hwnd,WM_CLOSE,0,0);
                return;
            }
            if (GetKeyState(VK_LEFT)<0)     state= TRUE;
            else                            state= FALSE;
            if (Left!=state)
            {    Left= state;
                 InvalidateRect(hwnd,NULL,TRUE);
            }
            if (GetKeyState(VK_RIGHT)<0)    state= TRUE;
            else                            state= FALSE;
            if (Right!=state)
            {    Right= state;
                 InvalidateRect(hwnd,NULL,TRUE);
            }
        }
        
  3. InitInstance() を表示して下さい。
    大きな画面は必要ないので、ウインドウのサイズを小さくします。
        BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
        {
                :
            hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                   CW_USEDEFAULT, CW_USEDEFAULT, 200, 150, NULL, NULL, hInstance, NULL);
        
  4. CALLBACK WndProc() を表示して下さい。
    左矢印と右矢印の状態を表示します。
            case WM_PAINT:
                hdc = BeginPaint (hWnd, &ps);
                // TODO: この位置に描画用のコードを追加してください...
                if (Left==TRUE)     TextOut(hdc,50,20,"LEFT ON ",8);
                else                TextOut(hdc,50,20,"LEFT OFF",8);
                if (Right==TRUE)    TextOut(hdc,50,50,"RIGHT ON ",9);
                else                TextOut(hdc,50,50,"RIGHT OFF",9);
                EndPaint( hWnd, &ps );
                break;
        
  5. WinMain() を表示して下さい。
    今回のように直接キーをセンスするときは TranslateMessage() は不要です。
    別にコメントにする必要は無いのですが削除しても動くことを確かめて下さい。
        // メイン メッセージ ループ:
        while( GetMessage(&msg, NULL, 0, 0) ) 
        {
            if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) 
            {
                //TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            KeyState(msg.hwnd);
        }
        
  6. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    左矢印と右矢印キーを押すと表示状態が変わることを確かめて下さい。

超初心者のプログラム入門(Win32API C++)