トップページ > 記事閲覧
IME使用の未確定文字があるか判別したいです
名前:ひとし 日時: 2014/12/22 14:35

チャットシステムみないなのを作っているのですけれど、英数字のみなら全く問題ないのですが IME使用時の未確定文字があるのにInputHandleの文字は0文字とされてチャットモードが抜けてしまいます Check関数を呼び出すメイン側で他の処理をしているため、キーが確定されるまで待っていることが不可能なため IME使用時の未確定文字があるか、ないかを判別したいのですが、可能なのでしょうか? 半角/全角 あ お の状態の未確定状態です(スペース・変換押されると青になる一歩手前の状態です。なお、青の候補状態の時にもエンターキーは反応させたくないです) どのような方法で可能なのでしょうか? 申し訳ございませんがご教授よろしくお願いします。 void Check(){ if (CheckHitKey(KEY_INPUT_RETURN)) { //押された瞬間・押されている間 Chat_RETURN_KeyFlg = 1; } else if (Chat_RETURN_KeyFlg == 1 && CheckHitKey(KEY_INPUT_RETURN)==0){ //離された瞬間 if (ChatFlg == 1){ //チャットモード動作中 GetKeyInputString(ChatSend_Str, InputHandle); //入力文字列を取得 if (strlen(ChatSend_Str) == 0){ //入力文字数が0文字なら ChatFlg = 0; //チャットモードを抜ける ここが英数字なら問題ないのですが、日本語の未確定文字になると打ってる途中なのに抜けてしまう } else{ //送信処理 } } else{ //チャットモード停止中 ChatFlg = 1; // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) InputHandle = MakeKeyInput(50, FALSE, TRUE, FALSE); //SetKeyInputString(UserID_Str, InputHandle); // 作成したキー入力ハンドルをアクティブにする SetActiveKeyInput(InputHandle); } } if(ChatFlg == 1){ // 入力途中の文字列を描画 DrawKeyInputString(125, 615, InputHandle); } }
メンテ

Page: 1 |

Re: IME使用の未確定文字があるか判別したいです ( No.1 )
名前:Nameless 日時:2014/12/22 18:29

MakeKeyInput第三引数はTRUEで半角文字のみになります。つまり全角文字の入力を受け付けません。 これも全角入力がうまくいかない原因です。 要はEnterキーが押されたとき変換などが行われていなければ入力を終了し、文字列を取得したいのですよね? だとしたら自分でEnterキーの入力を調べなくても CheckKeyInput関数を使えば入力が終わっているかどうか取得できるので、 毎ループチェックしていれば入力が終わったタイミングで文字列を取得することができます。 その他にも気になるところはあったのですが、 とりあえず ・Chat_RETURN_KeyFlgは他の関数では使われていない ・InputHandleも他の関数で使われていない ・送信処理の中にChatFlg = 0;が含まれている などの前提のもとにそれっぽいものを組んでみました。 //InputHandleは-1で初期化してください void Check(){ if (ChatFlg == 1){ //チャットモード動作中 switch (CheckKeyInput(InputHandle)){ case 0://入力が終わってない break; case 1://入力が終わった GetKeyInputString(ChatSend_Str, InputHandle); //入力文字列を取得 if (ChatSend_Str[0] != '\0'){ //入力文字数が1文字以上なら //送信処理 } ChatFlg = 0;//チャットモード停止 SetKeyInputString("", InputHandle);//入力された文字をクリア break; //case 2://キャンセルされた // break; } // 入力途中の文字列を描画 DrawKeyInputString(125, 615, InputHandle); } else{ //チャットモード停止中 if (CheckHitKey(KEY_INPUT_RETURN)){//押された瞬間・押されている間 Chat_RETURN_KeyFlg = 1; } else{//押されてない if (Chat_RETURN_KeyFlg == 1){//離された瞬間 ChatFlg = 1;//チャットモードに変更 if (InputHandle == -1){//まだキー入力ハンドルを作っていないなら // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); } //SetKeyInputString(UserID_Str, InputHandle); // キー入力ハンドルをアクティブにする SetActiveKeyInput(InputHandle); } Chat_RETURN_KeyFlg = 0;//押されてないことを記録 } } }
メンテ
Re: IME使用の未確定文字があるか判別したいです ( No.2 )
名前:管理人 日時:2014/12/23 13:49

処理に関するご助言は Namelessさんがされているので、私は 「IME使用の未確定文字があるか判別」する方法を・・・ IMEで入力中の情報を取得する GetIMEInputData という関数があるのですが、 この関数の戻り値がIME入力中ではない場合は戻り値が NULL なるので、 それでIME入力中かどうかを判断することができます if( GetIMEInputData() != NULL ) { // IME入力中 } else { // IME入力中ではない }
メンテ
Re: IME使用の未確定文字があるか判別したいです ( No.3 )
名前:ひとし 日時:2015/01/07 11:17

返事が遅くなり大変申し訳ございません 私用で忙しくて開発できる時間がありませんでした、申し訳ございません 今作成しているのは、簡単なミニゲームで、画面の下にチャットモードがあるタイプです チャットモードは、ラテールやメイプルストーリーと同じような感じです エンターキーを押されたらチャットモードになり、送信内容を打てます エンターキーの動作 @なにも確定されていない・未確定の文字(日本語)がなければ通常モードに移行しす Aなにも確定されていない・未確定の文字(日本語)があればチャットモードのままです B確定された文字がある・未確定の文字(日本語)がなければ送信処理を行います。チャットモードのままです C確定された文字がある・未確定の文字(日本語)があればチャットモードのままです エンターキーが離れた瞬間に処理したい(長く押されている間は処理をしなくて、離された瞬間にチャットモード・通常モードを切り替えたい)ので D通常モード→チャットモード Eチャットモード→通常モード Eのチャットモード→通常モードに変わるときが離された瞬間に送信処理を行いたいのですがどうすればよいのでしょうか? 色々試行錯誤しましたが、できませんでした 申し訳ございませんが、どうぞよろしくお願いいたします
メンテ
Re: IME使用の未確定文字があるか判別したいです ( No.4 )
名前:Nameless 日時:2015/01/07 14:21

とりあえず、前のプログラムを ・入力が終了したときの動作(1と3)をエンターキーが離されるまで保留しておく ・チャットモードから通常モードに変えるときを入力文字数が0文字のときに限定 ・チャットモードから通常モードに変えるときにも送信処理をする という風に書き直してみました。 //InputHandleは-1で初期化してください void Check(){ static int EnterReleaseWaitFlag = 0;//1のときエンターが離されるのを待っている状態 int IsEnterReleaseNow = 0;//エンターキーが離された瞬間なら1 if (CheckHitKey(KEY_INPUT_RETURN)){//押された瞬間・押されている間 Chat_RETURN_KeyFlg = 1; } else{//押されてない if (Chat_RETURN_KeyFlg == 1){//離された瞬間 IsEnterReleaseNow = 1; } Chat_RETURN_KeyFlg = 0;//押されてないことを記録 } if (ChatFlg == 1){ //チャットモード動作中 if (EnterReleaseWaitFlag == 1)//このフラグが立っているときはエンターが離されるのを待つ { if (IsEnterReleaseNow == 1)//離された瞬間 { //送信処理 if (ChatSend_Str[0] == '\0') //入力文字数が0文字なら { ChatFlg = 0;//チャットモード停止 } else { // キー入力ハンドルを再度アクティブにする SetActiveKeyInput(InputHandle); } EnterReleaseWaitFlag = 0;//フラグリセット SetKeyInputString("", InputHandle);//入力された文字をクリア } } else{ switch (CheckKeyInput(InputHandle)){ case 0://入力が終わってない break; case 1://入力が終わった GetKeyInputString(ChatSend_Str, InputHandle); //入力文字列を取得 EnterReleaseWaitFlag = 1;//処理待ちフラグを立てる break; //case 2://キャンセルされた // break; } // 入力途中の文字列を描画 DrawKeyInputString(125, 615, InputHandle); } } else{ //チャットモード停止中 if (IsEnterReleaseNow == 1){//離された瞬間 ChatFlg = 1;//チャットモードに変更 if (InputHandle == -1){//まだキー入力ハンドルを作っていないなら // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) InputHandle = MakeKeyInput(50, FALSE, FALSE, FALSE); } //SetKeyInputString(UserID_Str, InputHandle); // キー入力ハンドルをアクティブにする SetActiveKeyInput(InputHandle); } } }
メンテ
Re: IME使用の未確定文字があるか判別したいです ( No.5 )
名前:ひとし 日時:2015/01/08 10:30

Nameless様、ありがとうございます 思い通りの動作ができました 解決いたしました。本当にありがとうございましたm(__)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存