C#版で入力文字列を受け取ろうとした時に、現在のDxDLL.csでは問題があります。
具体的には、引数が「out char」となっている部分が「1バイト文字1個」しか
返せないため、2文字以上や2バイト文字の取得が不可能となってしまっています。
C#(というか.Net)では、Win32なDLLからCHAR配列の文字列を取得する時は
「System.Text.StringBuilder」を使用するのがお約束のようで、その様に
DxDLL.csを書き換えてとりあえず動作することが確認できたので、公式配賦に
反映されたらいいなぁと思いつつ報告します。
DxDLL.csの変更(out char を System.Text.StringBuilder にする)
※下記関数以外にも多数あるようですが、これでテストしました。DxLib.dllはそのままでOKです。
[DllImport("DxLib.dll")]
extern static int dx_GetKeyInputString(System.Text.StringBuilder StrBuffer, int InputHandle);
//extern static int dx_GetKeyInputString( out char StrBuffer, int InputHandle);
public static int GetKeyInputString(System.Text.StringBuilder StrBuffer, int InputHandle)
//public static int GetKeyInputString( out char StrBuffer, int InputHandle)
{
return dx_GetKeyInputString(StrBuffer, InputHandle);
//return dx_GetKeyInputString( out StrBuffer , InputHandle );
}
試したC#のMain関数部分
[STAThread]
static int Main()
{
DX.ChangeWindowMode(TRUE);
DX.SetGraphMode(640, 480, 16);
if (DX.DxLib_Init() == -1)
return -1;
//
try
{
bool IsInput = true;
int iWhite = DX.GetColor(255, 255, 255);
DX.SetDrawScreen(DX.DX_SCREEN_BACK);
DX.ChangeFont("MS ゴシック");
DX.SetFontSize(16);
//入力結果を受け取るためのバッファ
//char[] cBuf = new char[101];
System.Text.StringBuilder sBuf = new System.Text.StringBuilder(101);
//キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし)
int InputHandle = DX.MakeKeyInput(100, FALSE, FALSE, FALSE);
DX.SetActiveKeyInput(InputHandle);
//
while (DX.ProcessMessage() == 0 && DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 0)
{
DX.ClearDrawScreen();
if (IsInput)
{
if (DX.CheckKeyInput(InputHandle) != 0)
{
//DX.GetKeyInputString(out cBuf[0], InputHandle); //★これだと動作しても最初の1文字しか取れない、たまにエラーになることも
DX.GetKeyInputString(sBuf, InputHandle); //★DLLから文字列を取得するときはStringBuilderを使うのが.Netのお約束らしい
IsInput = false;
}
else
{
DX.DrawKeyInputString(10, 10, InputHandle);
DX.DrawKeyInputModeString(26, 26);
}
}
else
{
//DX.DrawString(10, 10, new string(cBuf), iWhite);
DX.DrawString(10, 10, sBuf.ToString(), iWhite);
}
DX.ScreenFlip();
}
return 0;
}
finally
{
DX.DxLib_End();
}
}