当初考えていたAPIが機能しなかったので、「キーボードのキーを押したことにする」APIを使って
ソフトキーボードを実現するサンプルを作成してみました、よろしければご覧ください
あと、下記のサンプルは再変換の機能を使用していますので、No.2 の暫定最新版をお使いください m(_ _)m
#include "DxLib.h"
#define TOPSPACE 64
#define SPACE 48
#define XNUM 16
#define YNUM 5
// 文字テーブル
const char *CharTable[ XNUM ][ YNUM ] =
{
"あ", "い", "う", "え", "お",
"か", "き", "く", "け", "こ",
"さ", "し", "す", "せ", "そ",
"た", "ち", "つ", "て", "と",
"な", "に", "ぬ", "ね", "の",
"は", "ひ", "ふ", "へ", "ほ",
"ま", "み", "む", "め", "も",
"や", "ゐ", "ゆ", "ゑ", "よ",
"ら", "り", "る", "れ", "ろ",
"わ", "を", "ん", "っ", " ",
"が", "ぎ", "ぐ", "げ", "ご",
"ざ", "じ", "ず", "ぜ", "ぞ",
"た", "ぢ", "づ", "で", "ど",
"ば", "び", "ぶ", "べ", "ぼ",
"←", "→", "BS", "DEL", "変換",
"変←", "変→", "変↑", "変↓", "確定",
} ;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int i ;
int j ;
int KeyInputHandle ;
int MouseInputEdge = 0 ;
int MouseInputNow = 0 ;
int MouseInputOld = 0 ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// 画面は横長に
SetGraphMode( 1024, 480, 32 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// キー入力ハンドルの作成
KeyInputHandle = MakeKeyInput( 256, FALSE, FALSE, FALSE, FALSE ) ;
// 作成したキー入力ハンドルをアクティブにする
SetActiveKeyInput( KeyInputHandle ) ;
// メインループ(何かキーが押されたらループを抜ける)
while( ProcessMessage() == 0 )
{
// マウスの入力更新
MouseInputOld = MouseInputNow ;
MouseInputNow = GetMouseInput() ;
MouseInputEdge = MouseInputNow & ~MouseInputOld ;
// 左クリックされたら処理
if( MouseInputEdge & MOUSE_INPUT_LEFT )
{
int PressX ;
int PressY ;
int MouseX ;
int MouseY ;
// マウスカーソルの位置から押されたマスを割り出す
GetMousePoint( &MouseX, &MouseY ) ;
PressX = MouseX / SPACE ;
PressY = ( MouseY - TOPSPACE ) / SPACE ;
// マスの範囲内のみ処理
if( PressX >= 0 && PressX < XNUM ||
PressY >= 0 && PressY < XNUM )
{
int StrLen ;
const char *Chr ;
const IMEINPUTDATA *IMEData ;
// 押されたマスの文字列を取得
Chr = CharTable[ PressX ][ PressY ] ;
// IMEの状態も取得
IMEData = GetIMEInputData() ;
// "←"が押されたら←キーを押したことにする
if( strcmp( Chr, "←" ) == 0 )
{
keybd_event( VK_LEFT, 0, 0, 0 ) ;
keybd_event( VK_LEFT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
// "→"が押されたら→キーを押したことにする
if( strcmp( Chr, "→" ) == 0 )
{
keybd_event( VK_RIGHT, 0, 0, 0 ) ;
keybd_event( VK_RIGHT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
// "変換"が押されたら変換キーが押されたことにする
if( strcmp( Chr, "変換" ) == 0 )
{
keybd_event( VK_CONVERT, 0, 0, 0 ) ;
keybd_event( VK_CONVERT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
// "確定"が押されたらEnterキーが押されたことにする
if( strcmp( Chr, "確定" ) == 0 )
{
keybd_event( VK_RETURN, 0, 0, 0 ) ;
keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
// "BS"が押されたらBackSpaceキーが押されたことにする
if( strcmp( Chr, "BS" ) == 0 )
{
keybd_event( VK_BACK, 0, 0, 0 ) ;
keybd_event( VK_BACK, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
// "DEL"が押されたらDeleteキーが押されたことにする
if( strcmp( Chr, "DEL" ) == 0 )
{
keybd_event( VK_DELETE, 0, 0, 0 ) ;
keybd_event( VK_DELETE, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
// "変←"が押されたら文字列変換中にシフトキー+←キーが押されたことにする
if( strcmp( Chr, "変←" ) == 0 )
{
// 変換中ではなかったら何もしない
if( IMEData != NULL && IMEData->CandidateNum != 0 )
{
keybd_event( VK_SHIFT, 0, 0, 0 ) ;
keybd_event( VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0 ) ;
keybd_event( VK_LEFT, 0, KEYEVENTF_KEYUP, 0 ) ;
keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
}
else
// "変→"が押されたら文字列変換中にシフトキー+→キーが押されたことにする
if( strcmp( Chr, "変→" ) == 0 )
{
// 変換中ではなかったら何もしない
if( IMEData != NULL && IMEData->CandidateNum != 0 )
{
keybd_event( VK_SHIFT, 0, 0, 0 ) ;
keybd_event( VK_RIGHT, 0, KEYEVENTF_EXTENDEDKEY, 0 ) ;
keybd_event( VK_RIGHT, 0, KEYEVENTF_KEYUP, 0 ) ;
keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
}
else
// "変↑"が押されたら文字列変換中に↑キーが押されたことにする
if( strcmp( Chr, "変↑" ) == 0 )
{
// IME入力中ではないか変換リストが出ていない場合は"変換"と同じ動作にする
if( IMEData == NULL || IMEData->CandidateNum == 0 )
{
keybd_event( VK_CONVERT, 0, 0, 0 ) ;
keybd_event( VK_CONVERT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
{
keybd_event( VK_UP, 0, 0, 0 ) ;
keybd_event( VK_UP, 0, KEYEVENTF_KEYUP, 0 ) ;
}
}
else
// "変↓"が押されたら文字列変換中に↓キーが押されたことにする
if( strcmp( Chr, "変↓" ) == 0 )
{
// IME入力中ではないか変換リストが出ていない場合は"変換"と同じ動作にする
if( IMEData == NULL || IMEData->CandidateNum == 0 )
{
keybd_event( VK_CONVERT, 0, 0, 0 ) ;
keybd_event( VK_CONVERT, 0, KEYEVENTF_KEYUP, 0 ) ;
}
else
{
keybd_event( VK_DOWN, 0, 0, 0 ) ;
keybd_event( VK_DOWN, 0, KEYEVENTF_KEYUP, 0 ) ;
}
}
else
// それ以外の場合は文字列をキー入力に送る
{
StrLen = strlen( Chr ) ;
for( i = 0 ; i < StrLen ; i ++ )
{
StockInputChar( Chr[ i ] ) ;
}
}
}
}
// 画面のクリア
ClearDrawScreen() ;
// 文字一覧とマスの枠を描画する
for( i = 0 ; i < YNUM ; i ++ )
{
for( j = 0 ; j < XNUM ; j ++ )
{
DrawString(
j * SPACE + 8, i * SPACE + TOPSPACE + 8,
CharTable[ j ][ i ], GetColor( 255,255,255 )
) ;
DrawBox(
j * SPACE, i * SPACE + TOPSPACE,
( j + 1 ) * SPACE, ( i + 1 ) * SPACE + TOPSPACE,
GetColor( 255,255,255 ), FALSE
) ;
}
}
// 入力が終了している場合は終了
if( CheckKeyInput( KeyInputHandle ) != 0 ) break ;
// 入力モードを描画
DrawKeyInputModeString( 1024, 480 ) ;
// 入力途中の文字列を描画
DrawKeyInputString( 0 , 0 , KeyInputHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}