Re: ImGui で日本語入力を行うために IME を使用したい ( No.1 ) |
- 名前:Naohiro19 日時:2023/02/13 11:36
ChatGTPによると以下のような回答がされています。
このような問題は一般的に、DxLib が提供するウインドウ処理フック(SetHookWinProc)と ImGui が独自に管理するウインドウ処理との調整が必要な場合があります。
DxLib の SetUseIMEFlag 設定を行っても IME が正常に動作しない場合は、ImGui のウインドウ処理と同じように IME のハンドリングを実装する必要があります。このためには ImGui のウインドウ処理と DxLib のウインドウ処理を一元管理する必要があります。
ImGui のウインドウ処理には ImGui::GetIO().AddInputCharacterUTF16 関数を利用して文字情報を追加することができますが、これを実現するためには DxLib のウインドウ処理と同じように IME のハンドリングを実装する必要があります。この方法に関しては ImGui のドキュメントやサンプルコードを参考にするとよいです。
|
Re: ImGui で日本語入力を行うために IME を使用したい ( No.2 ) |
- 名前:管理人 日時:2023/02/13 23:14
|
Re: ImGui で日本語入力を行うために IME を使用したい ( No.3 ) |
- 名前:IRI 日時:2023/02/14 01:22
管理人さん
>こちらのスレッドと同じ原因でしたら DxLib_Init の前に SetUseTSFFlag( FALSE ); という
>記述を追加することでIMEを有効にすることができると思います m(_ _)m
いま自分の環境で発生している問題は IME が立ち上がらず日本語が何も入力できないというものですので、どうやら別件の問題のようでした。
色々と試した見たところ、DxLib::SetHookWinProcでフックしている関数の最後に
> return ::DefWindowProc(hWnd, msg, wParam, lParam);
という記述を追加する。
メインループに
>MSG msg;
>while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)){
> ::TranslateMessage(&msg);
> ::DispatchMessage(&msg);
>}
という記述を追加する。
上記の二つを行うことで IME は立ち上がるようになりました。しかし、予測変換の欄は表示されませんでした。SetUseTSFFlag の設定を行っても非表示のままでした。
ただ、日本語入力で「あいえうお」と入力すると「BあDいFうHえJお」という文字 ImGui へ引き渡され、また ImGui の描画領域が通常よりも小さくなってしまい、加えてアプリ終了時に DxLib がクラッシュするようです。
|
Re: ImGui で日本語入力を行うために IME を使用したい ( No.4 ) |
- 名前:管理人 日時:2023/02/14 01:45
SetUseTSFFlag( FALSE ); ではだめでしたか…
何か色々と試行錯誤してみないと解決しない雰囲気を感じるので、もしよろしければ
IRIさんが ImGui を試されているプロジェクトを zipなどで圧縮してこちらのメールアドレス
BQE00322(あっとまーく)nifty.com
( (あっとまーく) を @ に置き換えてください )
に送っていただけないでしょうか? m(_ _)m
|
Re: ImGui で日本語入力を行うために IME を使用したい ( No.5 ) |
- 名前:IRI 日時:2023/02/14 22:15
管理人さん
メールを送りました。よろしくお願いいたします。
|
Re: ImGui で日本語入力を行うために IME を使用したい ( No.6 ) |
- 名前:管理人 日時:2023/02/15 02:26
メールありがとうございます、手元でも現象を確認することが出来ました
色々試したのですが、最終的には以前 ImGui をDXライブラリで使用できるようにされた方の
プログラムを使用させていただいて解決しました
まず LmdImGuiHelper::WndProc はこちらのようにしてください
LRESULT __stdcall LmdImGuiHelper::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) {
SetUseHookWinProcReturnValue(TRUE) ;
return true;
}
//IME関連はOSに任せる
switch( msg )
{
case WM_IME_SETCONTEXT :
case WM_IME_STARTCOMPOSITION :
case WM_IME_ENDCOMPOSITION :
case WM_IME_COMPOSITION :
case WM_IME_NOTIFY :
case WM_IME_REQUEST :
SetUseHookWinProcReturnValue(TRUE) ;
return DefWindowProc( hWnd , msg , wParam , lParam ) ;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_KEYMENU) { // Disable ALT application menu
SetUseHookWinProcReturnValue(TRUE) ;
return 0;
}
break;
}
return 0;
}
SetUseHookWinProcReturnValue(TRUE); を実行しないとこちらの関数を出た後、
DXライブラリのメッセージコールバック処理が行われるのですが、こちらの関数内で
メッセージを処理した場合は SetUseHookWinProcReturnValue(TRUE); を実行して
DXライブラリのメッセージコールバック処理を行わないようにすると上手くいくようです
あと、上記の変更を行えば他に特別な処理は必要ありませんでしたので、LmdSystem::Main の中にある
if (true) {
MSG msg;
while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
↑
こちらは削除してしまっても大丈夫です
よろしければお試しください m(_ _)m
 |
Re: ImGui で日本語入力を行うために IME を使用したい ( No.7 ) |
- 名前:IRI 日時:2023/02/16 01:01
管理人さん
記載いただいた方法で無事、IMEでの文字入力が出来ました。
ありがごうざいましました!
|