文字メッセージ
仮想キーコードを文字にする
前回の WM_KEYDOWN などは、キーが押された時に発生するメッセージでした
しかしこれは、どのキーが押されたとかという部分に興味を示しません
もし、入力された文字や数値に興味がある場合はこれだけでは処理できない
その気になれば、仮想キーコードからメッセージを処理することもできるが
それには膨大な時間と労力を費やすことになるでしょう
仮想キーコードを実際の文字に変換するにはTranslateMessage()を用います
BOOL TranslateMessage(CONST MSG *lpMsg);
lpMsg には、MSG構造体変数へのポインタを指定します
メッセージキューに文字メッセージがポストされたときは0以外
されなかった時は0の値が返ります
このファンクションはメッセージループで呼び出すのが一般的です
WM_KEYDOWNメッセージが発生するとWM_CHARメッセージを生成します
WM_CHAR は、ウィンドウズプロシージャの第三引数WPARAMに文字コードを渡します
LPARAMの値は変更しません(WM_KEYDOWNなどと同じ)
このメッセージを処理した場合は0を返します
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CHAR:
hdc = GetDC(hwnd);
TextOut(hdc , 10 , 10 , TEXT(" ") , 4);
TextOut(hdc , 10 , 10 , (PTSTR)&wp , 1);
ReleaseDC(hwnd , hdc);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
このプログラムは、キーボードの文字や数値キーを押すと
ウィンドウ左上部に入力された1文字を表示するというものです
通常は、WM_CHARを処理するだけで十分ですが
Altキー を押しながらのシステムキーストロークを処理したい場合
WM_SYSCHARメッセージを使います
システム文字であるということ以外は、WM_CHARメッセージとパラメータは同じです
さらに、これ以外にアメリカ仕様以外のキーボードを使用している場合
その国語独自のアクセント文字などが存在します
このようなキーをデッドキーと呼びますが、これに対するメッセージもあります
WM_CHARに対してWM_DEADCHAR、WM_SYSCHARに対してWM_SYSDEADCHARです
しかし、プログラムが必要とする情報はWM_CHARだけで受け取ることができるので
通常 WM_CHAR 以外のメッセージが処理されることはありません
これらは、デッドキャラクタメッセージが押された時に何らかの処理をしたい場合に用います
最後に、WM_CHAR は必ずWM_KEYDOWNの後に生成されることにも注目してください
//WM_SYSCHAR は WM_SYSKEYDOWN の後になる