管理人様
いつも楽しくDXライブラリを利用させていただいています(^^)
報告なのですが、
MakeKeyInputの第5引数DoubleCharOnlyFlagをTRUEにすると、
GetKeyInputStringで入力文字列を取得できません。
症状は、
バージョン3.14aで発生しますが、
バージョン3.13dでは発生しません。
3.13e以降でDXライブラリ内部での文字コードの扱いが
変わったことによるものかなと推測しています。
■環境
Windows7 Home Edition
Visual Studio 2012 Express for Windows Desktop
DXライブラリ Ver.3.14a
■再現ソース
#include <DxLib.h>
#include <string>
#include <Imm.h>
#pragma comment(lib, "imm32.lib")
// 文字列用のバッファサイズ
static const unsigned int BUF_SIZE = 256 ;
// (自作関数)IMEを自動的に全角ひらがなに変更する
void SetIMEZenkakuHiragana()
{
HIMC hImc = ::ImmGetContext( DxLib::GetMainWindowHandle() ) ;
::ImmSetOpenStatus( hImc, TRUE ) ;
DWORD dwConversion = 0 ;
DWORD dwSentence = 0 ;
// 現在の変換状態を取得
::ImmGetConversionStatus( hImc, &dwConversion, &dwSentence ) ;
// 全角ひらがな
dwConversion |= IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE ;
dwConversion &= ~IME_CMODE_KATAKANA ;
// 変換状態を再設定
::ImmSetConversionStatus( hImc, dwConversion, dwSentence ) ;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// 初期設定
DxLib::ChangeWindowMode( TRUE ) ;
// 初期化
if( DxLib::DxLib_Init() != 0 ){ return -1 ; }
// 裏画面設定
DxLib::SetDrawScreen( DX_SCREEN_BACK ) ;
// フォントハンドル
const int fontHandle = DxLib::CreateFontToHandle( "メイリオ", 22, 0, DX_FONTTYPE_ANTIALIASING_4X4, DX_CHARSET_SHFTJIS ) ;
const int fontColor = DxLib::GetColor( 255, 255, 255 ) ;
// IME使う
DxLib::SetUseIMEFlag( TRUE ) ;
// (自作関数)IMEを自動的に全角ひらがなに変更する
SetIMEZenkakuHiragana() ;
// キー入力ハンドルを作成 ※全角文字のみ
const int KHandle = DxLib::MakeKeyInput( BUF_SIZE, FALSE, FALSE, FALSE, TRUE ) ;
// キー入力ハンドルをアクティブにする
DxLib::SetActiveKeyInput( KHandle ) ;
// 入力文字列用のバッファ
char CharBuf[BUF_SIZE] ;
// メインループ
while( DxLib::ProcessMessage() == 0 && DxLib::CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面クリア
DxLib::ClearDrawScreen() ;
// キー入力ハンドルから入力文字列を取得する
DxLib::GetKeyInputString( CharBuf, KHandle ) ;
// 入力文字列を描画
DxLib::DrawStringToHandle( 0, 0, CharBuf, fontColor, fontHandle ) ;
// 入力が終了しているかチェックする
const int chk = DxLib::CheckKeyInput( KHandle ) ;
if( chk == 1 )
{
DxLib::DrawStringToHandle( 0, 40, "入力完了", fontColor, fontHandle ) ;
}
// 画面フリップ
DxLib::ScreenFlip() ;
// 適当なウェイト
::Sleep( 16 ) ;
}
// 終了
DxLib::DxLib_End() ;
return 0 ;
}