''[[FrontPage]]''
* キーボードイベントを扱う [#b4997401]
キーボードイベントを受けるマクロにWM_KEYDOWNとWM_CHARがある。~
ウィンドウプロシージャでイベントを受け、WPARAMの値からキーコードまたは文字を取り出すことができる。~
** 制約 [#p1aef515]
.NET関数・MFCを使用しないこと。~
*** コメント [#z9e0080d]
ウィンドウがアクティブな状態で何かキーを押すと、メッセージボックスからキーコードと文字を確認できます。~
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 ); // 他のメッセージは、デフォルトの処理を行う //
// //
}
*** 参考ページ [#xb0c11fb]
http://wisdom.sakura.ne.jp/system/winapi/win32/win30.html~
http://wisdom.sakura.ne.jp/system/winapi/win32/win31.html~