トップページ > 記事閲覧
ImGui で日本語入力を行うために IME を使用したい
名前:IRI 日時: 2023/02/13 00:44

管理人さん。 お疲れ様です。 DxLib と ImGui の併用環境で ImGui に対して日本語入力を行いたいのですが、自身の環境ではどうやら IME が立ち上がらず日本語入力を行うことが出来ないようでした。 >SetUseIMEFlag こちらの設定を行うと DxLib::SetHookWinProc で設定した関数に、アルファベットなどの同じ文字が二回渡されるようで、私の思う挙動ではありませんでした。 DxLib と ImGui の併用環境で、ImGui に対して日本語入力を行うことは可能なのでしょうか? ※ImGuiのみの環境であれば IME が立ち上がり日本語入力は可能でした。  また関係あるかは分かりませんが ImGui内部では IsWindowUnicode で受け取った文字に対して処理を分けているようです if (::IsWindowUnicode(hwnd)) { // You can also use ToAscii()+GetKeyboardState() to retrieve characters. if (wParam > 0 && wParam < 0x10000) io.AddInputCharacterUTF16((unsigned short)wParam); } else { wchar_t wch = 0; ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (char*)&wParam, 1, &wch, 1); io.AddInputCharacter(wch); }
メンテ

Page: 1 |

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

ImGui には詳しくないのですが、もしかしたらこちらと同じ原因でしょうか…? <IMEの変換候補が表示されない> https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4518 ↑ こちらのスレッドと同じ原因でしたら DxLib_Init の前に SetUseTSFFlag( FALSE ); という 記述を追加することでIMEを有効にすることができると思います m(_ _)m > Naohiro19さん ChatGTP、当たらずとも遠からずな返答で凄いですね (・・;; ( 結構詳しい内容ですし… )
メンテ
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での文字入力が出来ました。 ありがごうざいましました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存