- ベストアンサー
WINAPIでキーから文字列を入力できない
今,WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)内の case WM_CHAR:で wsprintf(input, "入力=\"%c\"", (int)wp); としているのですが,今の状態では文字列を入力できません。 どうすればいいでしょうか、教えて下さい。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
文字列の格納の仕方でしたか(^_^;) それなら、 case WM_CHAR: wsprintf( input, "%s%c", input, (int)wp ); break; で出来ますよ。 (ただし、inputの配列をオーバーした時の処理はしていません) あとは表示するときに TCHAR buf[ 256 ]; wsprintf( buf, "入力=\"%s\"", input ); という様に表示用の変数で 表示を行えば完了です。
その他の回答 (5)
- YukiHanabi
- ベストアンサー率46% (6/13)
//サンプルコードですので注意して使ってください #include <windows.h> #include <cstring> #include <cstdio> LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); char str[255]; // 出力される文字 int X=0, Y=0; // 現在の表示される位置 int max_X, max_H; // 画面のサイズ HDC hhdc; HBITMAP hbit; HBRUSH hbrush; int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE , LPSTR , int _int) { /* TranslateMessage(&msg); // 記入もれしていないということなのでここいらへんは省略します */ } LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HDC hdc; static PAINTSTRUCT ps; switch(message) { case WM_CREATE: // 画面のサイズを取得する max_X = GetSystemMetrics(SM_CXSCREEN); max_H = GetSystemMetrics(SM_CYSCREEN); hdc = GetDC(hwnd); hhdc = CreateCompatibleDC(hdc); hbit = CreateCompatibleBitmap(hdc, max_X, max_H); SelectObject(hhdc, hbit); hbrush = (HBRUSH) GetStockObject(WHITE_BRUSH); SelectObject(hhdc, hbrush); PatBlt(hhdc, 0, 0, max_X, max_H, PATCOPY); ReleaseDC(hwnd, hdc); break; case WM_CHAR: hdc = GetDC(hwnd); sprintf(str, "%c", (char) wParam); // 文字を文字列にする // 改行処理 if((char)wParam == '\r') { Y += 11; X = 0; } else { TextOut(hhdc, X, Y, str, strlen(str)); TextOut(hdc, X, Y, str, strlen(str)); X += 11; } ReleaseDC(hwnd, hdc); break; case WM_PAINT: // 再描画とかでのメッセージ hdc = BeginPaint(hwnd, &ps); // デバイスコンテキストを取得する BitBlt(hdc, 0, 0, max_X, max_H, hhdc, 0, 0, SRCCOPY); EndPaint(hwnd, &ps); break; case WM_DESTROY: // プログラムを終了する DeleteDC(hhdc); DeleteObject(hbit); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } /////////////////// 以上のコード(一部省略)で作業ウインドウにキーボードから文字の入力ができるとおもいます、 また、strcpy という関数で文字と文字の合成もできますよ。
お礼
大部分のコードを載せていただいてありがとうございます。 せっかく教えていただいたのに自分の勉強不足で上手く活用することができませんでした。 もっと学び教えていただいたコードを上手く用いたプログラムを作れるようにしたいと思います。 またよろしくお願いします。
- BlueStones
- ベストアンサー率65% (13/20)
inputの型が間違っているか、 画面の更新を行っていなくて確認ができてない可能性があります。 この場合はinputの型はTCHAR型の配列が適しています。 (宣言例) TCHAR input[ 256 ]; 画面の更新はいろいろありますが、 InvalidateRect( hWnd, NULL, TRUE ); で可能です。 参考になりましたでしょうか。
補足
回答ありがとうございます。 ご指摘の通りにTCHAR型に変更したのですが上手くいきませんでした。 画面の更新についてはInvaidataRectですでに行なっており、入力文字が毎回変わって表示されるので問題はないかと思います。 今現在typingゲームに近いものを作っているのですが文字列入力ができなければ完成しないので困っています。 お手数ですがWM_CHARの中をここに書いたら見て問題点を指摘していただけないでしょうか?
- YukiHanabi
- ベストアンサー率46% (6/13)
No,2で意見したものです、 先ほどのコートは、case WM_CHAR: に記述してください、 WM_CREATEに書くのは、間違いです。
補足
返答が遅れてしまって大変申し訳ありません。 教えていただいたコードを使っていろいろ試したのですがうまくいきません。自分の知識が足りないのはわかっているのですが、お手数ですが動くサンプルコードを教えていただけないでしょうか?お願いします。
- YukiHanabi
- ベストアンサー率46% (6/13)
int X=0, Y=0; // 現在の出力座標のカーソル位置 以下のようなコードをcase WM_CREATE:内に記述してもらえば文字を文字列として扱えると思います、 hdc = GetDC(hwnd);//通常は、case WM_CREATE:に記述 sprintf(str, "%c", (char) wParam); if((char)wParam == '\r') //改行処理,他にも処理も必要ですが省略します、 { Y += 11; X = 0; }else { TextOut(hhdc, X, Y, str,strlen(str)); // 再描画用のHDCへ TextOut(hdc, X, Y, str,strlen(str)); // ウィンドウに出力する X += 11; } ReleaseDC(hwnd, hdc); // case WM_DESTROY:等に書くべきですがここに
- namacya
- ベストアンサー率8% (21/243)
TranslateMessage() を使用してください。
補足
返答が遅れてしまって大変申し訳ありません。 TranslateMessage()は使っているのですがどう使えばキーボードからの文字列入力が行えるのかわかりません、できればサンプルコードお願いします。
補足
一応文字列を入力できるようになりました。ありがとうございます。 ただ問題なのがWM_CHAR内で ・ ・ ・ wsprintf( input, "%s%c", input, (int)wp ); ・ ・ となるので文字列となる前に次の処理に行ってしまいます。 何か上手く処理する方法はないでしょうか?