スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

XNAの日本語入力

以前弐本後入力の記事を書いた時、春条様からトラックバックを頂きました。

記事を見に行ってみるとコントロールを使用する際に速度が問題になっていたのですが、それを解決する方法が載っており非常にためになりました。

しかしながらその方法の問題にも触れておりまして、

「テキストボックス」を追加したら日本語入力どころかキーボード入力すらできないではないか?!

という問題。

こちらでも試してみたところ。。同じ問題に。涙。
プロシージャをフックしてコントロールにキー関係やIME関係のメッセージを渡しても同様に変化なし。
記事をいろいろ見て回っても解決せず。
いろいろ弄っていたら一回だけ入力できるようになったけどなぜか文字化けしておりました。
途中で面倒になったので

えーい!XNAからIMEを直接APIで入力BOX実装しちゃえ!

ということに。
さすが思い切りだけはいいえせプログラマ

以下資料

API
EnableEUDC ユーザ定義文字の利用を設定する
EnumRegisterWordProc ImmEnumRegisterWord のコールバック関数
ImmAssociateContext コンテキストハンドルの関連付けを行う
ImmConfigureIME IMEのプロパティ設定ダイアログボックスの表示を行う
ImmCreateContext IMEコンテキストを生成する
ImmDestroyContext IMEコンテキストを解放する
ImmEnumRegisterWord 登録されている単語を列挙する
ImmEscape 言語に依存した操作を行う
ImmGetCandidateList 単語の候補リストを取得する
ImmGetCandidateListCount 候補リストのサイズを取得
ImmGetCandidateWindow 候補リストウィンドウに関する情報を取得する
ImmGetCompositionFont コンポジションウィンドウで利用するフォントを取得する
ImmGetCompositionString 変換文字列を取得する
ImmGetCompositionWindow コンポジションウィンドウに関する情報を取得する
ImmGetContext 指定ウィンドウのコンテキストハンドルを取得する
ImmGetConversionList 文字または単語から単語リストを返す
ImmGetConversionStatus 現在の変換ステータスを取得する
ImmGetDefaultIMEWnd IMEクラスのデフォルトウィンドウを取得する
ImmGetDescription IMEの説明文字列を取得する
ImmGetGuideLine ガイドライン文字列を取得する
ImmGetIMEFileName IMEのファイル名を取得する
ImmGetOpenStatus IMEのオープン状態を取得する
ImmGetProperty プロパティを取得する
ImmGetRegisterWordStyle スタイルサポートのリストを取得する
ImmGetStatusWindowPos ステータスウィンドウの位置を取得する
ImmGetVirtualKey 処理後の入力メッセージのオリジナル仮想キーを取得する
ImmInstallIME IMEのインストールを行う
ImmIsIME IMEのハンドルであるかを返す
ImmIsUIMessage IMEウィンドウのウィンドウメッセージを処理する
ImmNotifyIME 入力コンテキストの状態変更を問い合わせる
ImmRegisterWord 単語登録を行う
ImmReleaseContext ImmGetContextで取得したハンドルを解放する
ImmSetCandidateWindow 候補リストウィンドウに関する情報を設定する
ImmSetCompositionFont コンポジションウィンドウで利用するフォントを設定する
ImmSetCompositionString 変換文字列を設定する
ImmSetCompositionWindow コンポジションウィンドウに関する情報を設定する
ImmSetConversionStatus 現在の変換ステータスを設定する
ImmSetOpenStatus IMEのオープン状態を設定する
ImmSetStatusWindowPos ステータスウィンドウの位置を設定する
ImmSimulateHotKey ホットキーをシミュレートする
ImmUnregisterWord 単語を削除する


IMEから受信するウィンドウメッセージ
WM_IME_CHAR IMEが取得した文字を受信
WM_IME_COMPOSITION 変換が実行されたことを受信する(フラグはGCS_xxxxx)
WM_IME_COMPOSITIONFULL コンポジションウィンドウの領域が以上広がらないときに受信する
WM_IME_CONTROL アプリケーションが生成したIMEウィンドウに処理要求を行う (コマンドはIMC_xxxxx)
WM_IME_ENDCOMPOSITION 変換が終了したことを受信する
WM_IME_KEYDOWN IMEが受信したWM_KEYDOWNを受信する
WM_IME_KEYUP IMEが受信したWM_KEYUPを受信する
WM_IME_NOTIFY アプリケーションが生成したIMEウィンドウに処理要求を行う (コマンドはIMN_xxxxx)
WM_IME_SELECT カレントのIMEが変更されたことを受信する
WM_IME_SETCONTEXT アプリケーションが生成したIMEウィンドウに処理要求を行う (コマンドはISC_xxxxx)
WM_IME_STARTCOMPOSITION 変換が開始されたことを受信する



これだけで何とかなると思ったのですが・・・
あれ?XPで動くのにVistaでうごかない!ってなりました。
途方に暮れていたところ有力情報GET
それが以下。どーん!

ImmGetCandidateList
WM_IME_SETCONTEXTでlParamのISC_SHOWUICANDIDATEWINDOWフラグがリセットされている場合に限り、
Candidate Listを取得することが可能です
ただし、TSFによってWM_IME_SETCONTEXTによらずに代替することが可能です
UILess ModeはVistaでサポートされた機能です。それ以前のWindowsではサポートされていません
UILess Mode OverviewのドキュメントがMSDNにアップされる予定です


書いてあるとおりフラグをリセットしたら無事に変換情報を取得できましたとさ。
文字は入力できるようになったけどインターフェイスを作ってないので今日も画像なし・・・


ねよっと。

コメントの投稿

非公開コメント

No title

おお~やってのけましたね~
流石です。

この方法、試す前にその実装に掛かる手間の多さに
「もし駄目だったら」と思うと手が出なくて(^^;


おれたちにできない事を平然とやってのけるッ
そこにしびれる憧れるぅ!!!


正にそんな感じです。

これで出来る事は分かったので、
私はもう少し簡単で早い実装を探して
だめそうな時、おかげですんなり諦めがつきそうですw

Re: No title

コメント無視していてすいませんでした。
(いつもボケーっとしているので気付きませんでした)

> この方法、試す前にその実装に掛かる手間の多さに
> 「もし駄目だったら」と思うと手が出なくて(^^;

これも考えもしませんでした(涙)
頭が弱いのは便利ですよ!!

テキストBOXの件、もっといい解決策を見つけたかったのですが至らず申し訳けありませんでした。
今後ともごひいきよろしくお願いしまっす(>_<)
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。