トップページ > 過去ログ > 記事閲覧
MakeKeyInputで入力が勝手に完了される
名前: 日時: 2010/03/17 20:49

エンターキーを押すと入力ハンドルをアクティブ化するプログラムを作成したのですが、 アクティブ化してもすぐにCheckKeyInputで得られる値が1になってしまいます。 エンターキーを押しているのが原因かと思い、 適当にウェイトを入れてみたのですが全く改善しません。どうしてでしょうか。 元のソースは長いので、余計な部分を省いたものを載せておきます。 #define LOOPCHECK(key) (!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2(key) && !key[KEY_INPUT_ESCAPE]) int db_edit_main(){ int InputHandle; int key[256],action=0,waittimer=0; char name[100]; // キー入力ハンドル生成 InputHandle = MakeKeyInput(100,TRUE,FALSE,FALSE); while(LOOPCHECK(key) && action >= 0){ switch(action){ case 0: if(key[KEY_INPUT_RETURN]==1){ action = 1; waittimer = 10; } break; case 1: if(waittimer>0){ waittimer--; if(!waittimer) SetActiveKeyInput(InputHandle); // アクティブ化 break; } DrawKeyInputString(320,57+18*1,InputHandle); DrawKeyInputModeString(640,480); if(CheckKeyInput(InputHandle)){ GetKeyInputString(name,InputHandle); action = 0; } break; } ScreenFlip(); } DeleteKeyInput(InputHandle); // InputHandle削除 return 0; }

Page: 1 |

Re: MakeKeyInputで入力が勝手に完了される ( No.1 )
名前:いっち 日時:2010/03/18 01:45

試してみたのですが、現状の動作として"MakeKeyInput"を行ってから "SetActiveKeyInput"を行うまでのキー入力をすべて拾ってくるようです。 ですので、事前に"MakeKeyInput"を行っておいて、キー入力をトリガーにして "SetActiveKeyInput"を行うという使い方は出来ないようです。 対策としては"SetActiveKeyInput"を行う直前に"MakeKeyInput"を行い、 "CheckKeyInput"が入力済みになったら"DeleteKeyInput"を行うという方法で回避可能でした。 KeyInput系のこの動作が仕様かバグかは微妙なところだと思います。 管理人さんの見解をお待ちしたほうが良いかもしれません。 //-- テストソース --// #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char String[256]; int InputHandle; ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); InputHandle = MakeKeyInput( 50, FALSE, FALSE, FALSE ); SetKeyInputString( "test", InputHandle ); while ( !ProcessMessage( ) ) { if ( CheckHitKey( KEY_INPUT_X ) ) // この時点でX以外のキーを押すとすべて拾ってくる break; ClearDrawScreen( ); DrawString( 0, 0, "PUSH X KEY", GetColor( 255, 255, 255 ) ); ScreenFlip( ); } SetActiveKeyInput( InputHandle ); while ( !ProcessMessage( ) ) { if ( CheckKeyInput( InputHandle ) != 0 ) break; ClearDrawScreen( ); DrawKeyInputModeString( 640, 480 ); DrawKeyInputString( 0, 0, InputHandle ); GetKeyInputString( String , InputHandle ); DrawString( 0, 16, String, GetColor( 255, 255, 255 ) ); ScreenFlip( ); } GetKeyInputString( String , InputHandle ); DeleteKeyInput( InputHandle ); ClearDrawScreen( ); DrawString( 0, 0, "あなたが入力した文字列は" , GetColor( 255, 255, 255 ) ); DrawString( 0, 16, String, GetColor( 255, 255, 255 ) ); ScreenFlip( ); WaitKey( ); DxLib_End( ); return 0; }
Re: MakeKeyInputで入力が勝手に完了される ( No.2 )
名前: 日時:2010/03/19 08:10

ありがとうございます。 MakeKeyInputを実行した時点から入力を受け付けているんですね。 ご指摘の通り > 対策としては"SetActiveKeyInput"を行う直前に"MakeKeyInput"を行い、 > "CheckKeyInput"が入力済みになったら"DeleteKeyInput"を行うという方法で回避可能でした。 このようにすることで希望の動作を得ることができました。
Re: MakeKeyInputで入力が勝手に完了される ( No.3 )
名前:管理人 日時:2010/03/22 01:47

MakeKeyInput の文字列入力は GetInputChar等の文字列入力と同じ機能を使用していますので SetActiveKeyInput を呼ぶ前に入力文字列をクリアする ClearInputCharBuf を呼べば SetActiveKeyInput を 実行する前に入力した文字が全部アクティブになった文字列入力ハンドルで入力したことになってしまうということはなくなります ただ、SetActiveKeyInput を呼ぶ前に入力した文字まで SetActiveKeyInput でアクティブにした文字列入力ハンドルの 入力にして欲しいケースというのは考え難いので、SetActiveKeyInput の中で ClearInputCharBuf を呼ぶように DXライブラリのプログラムを変更することにしました その変更を加えたバージョンをアップしましたので、もしご必要でしたらお使い下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: MakeKeyInputで入力が勝手に完了される ( No.4 )
名前:いっち 日時:2010/03/22 18:32

> SetActiveKeyInput を呼ぶ前に入力文字列をクリアする ClearInputCharBuf を呼べば SetActiveKeyInput を > 実行する前に入力した文字が全部アクティブになった文字列入力ハンドルで入力したことになってしまうということはなくなります "ClearInputCharBuf"の存在を失念しておりました。申し訳ありません。 変更確認しました。 対応ありがとうございます。

Page: 1 |