FrontPage

キーボードイベントを扱う

キーボードイベントを受けるマクロにWM_KEYDOWNとWM_CHARがある。
ウィンドウプロシージャでイベントを受け、WPARAMの値からキーコードまたは文字を取り出すことができる。

制約

.NET関数・MFCを使用しないこと。

コメント

ウィンドウがアクティブな状態で何かキーを押すと、メッセージボックスからキーコードと文字を確認できます。
2つのマクロの動きの違いを味わってください。(あなたの環境でもWM_CHARが先に判定されますか?)

メイン部分の記述はしませんが、適当なプロシージャのswitch文に追加してもらえればすぐにテストできると思います。
UNICODEを意識したtstringについては、C++入門/Unicodeに対応する を参照。

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ) //                                          //
{                                                               //                                                //
    switch( msg )                                               // メッセージを判定                               //
    {                                                           //                                                //
    case WM_COMMAND:                                            // コマンドを拾う場合                             //
        switch( LOWORD( wp ) )                                  // コマンドの種別によって分岐処理                 //
        {                                                       //                                                //
        case WM_KEYDOWN:                                        // WM_KEYDOWNを拾う場合の動作                     //
        {                                                       //                                                //
            if(19 == wp)                                        // pauseキー(コード19)かを判定(例外キーテスト)    //
            {                                                   // pauseキーが押された場合                        //
                PostQuitMessage( END_MSG );                     // 全終了                                         //
            }                                                   //                                                //
                                                                //                                                //
            tstring numMsg( _T("押されたキーのコードは 【") );  // メッセージ表示用                               //
            TCHAR *codeNum;                                     // 整数を文字列に変換するため                     //
                                                                //                                                //
            codeNum = new TCHAR[4];                             // メモリ割当て                                   //
            memset( codeNum, '\0', sizeof(codeNum) );           // 割当てられた領域の初期化                       //
                                                                //                                                //
            _itot( (int)wp, codeNum, 10 );                      // 10進整数を文字列に変換する                   //
                                                                //                                                //
            numMsg.append( (TCHAR*)codeNum );                   // メッセージ編集 文字コード(仮想コード)          //
            numMsg.append( _T("】 です。\n") );                 // メッセージ編集                                 //
                                                                //                                                //
            numMsg.append( _T("文字は 【") );                   // メッセージ編集                                 //
            numMsg.append( (PTSTR)&wp );                        // メッセージ編集 キーの判定                      //
            numMsg.append( _T("】 です。") );                   // メッセージ編集                                 //
                                                                //                                                //
            delete [] codeNum;                                  // 割当てられた領域の解放                         //
                                                                //                                                //
            MessageBox( NULL, numMsg.c_str(), _T("StyleMod"), MB_OK ); // 画面表示                                //
                                                                //                                                //
            return PROCESS_OK;                                  // 処理終了                                       //
        }                                                       //                                                //
                                                                //                                                //
        case WM_CHAR:                                           // WM_CHARを拾う場合の動作                        //
        {                                                       //                                                //
            tstring numMsg( _T("押されたキーのコードは 【") );  // メッセージ表示用                               //
            TCHAR *codeNum;                                     // 整数を文字列に変換するため                     //
                                                                //                                                //
            codeNum = new TCHAR[4];                             // メモリ割当て                                   //
            memset( codeNum, '\0', sizeof(codeNum) );           // 割当てられた領域の初期化                       //
                                                                //                                                //
            _itot(                                              // 10進整数を文字列に変換する                   //
                (int)wp,                                        //                                                //
                codeNum,                                        //                                                //
                10 );                                           //                                                //
                                                                //                                                //
            numMsg.append( (TCHAR*)codeNum );                   // メッセージ編集 文字コード(WM_CHAR)             //
            numMsg.append( _T("】 です。\n") );                 // メッセージ編集                                 //
                                                                //                                                //
            numMsg.append( _T("文字は 【") );                   // メッセージ編集                                 //
            numMsg.append( (PTSTR)&wp );                        // メッセージ編集 文字の判定                      //
            numMsg.append( _T("】 です。") );                   // メッセージ編集                                 //
                                                                //                                                //
            delete [] codeNum;                                  // 割当てられた領域の解放                         //
                                                                //                                                //
            MessageBox( NULL, numMsg.c_str(), _T("StyleMod"), MB_OK ); // 画面表示                                //
                                                                //                                                //
            return PROCESS_OK;                                  // 処理終了                                       //
        }                                                       //                                                //
                                                                //                                                //
    case WM_DESTROY:                                            // ウィンドウ破棄のとき                           //
        PostQuitMessage( END_MSG );                             // 終了メッセージを送る                           //
        return PROCESS_OK;                                      // 正常終了                                       //
    }                                                           //                                                //
                                                                //                                                //
    return DefWindowProc( hWnd, msg, wp, lp );                  // 他のメッセージは、デフォルトの処理を行う       //
                                                                //                                                //
}

参考ページ

http://wisdom.sakura.ne.jp/system/winapi/win32/win30.html
http://wisdom.sakura.ne.jp/system/winapi/win32/win31.html


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:06 (5191d)