none
入力補完について RRS feed

  • 質問

  • お世話になります。


    開発環境:VS2005、C#

    現在、スクリーンキーボードを自作しまして、そのスクリーンキーボードに、日本語入力補完機能(Googleサジェストや、http://www13.ocn.ne.jp/~koro/の様な)を実装しようと取り組んでいます。

    しかし、自分ひとりではどのように進めていけばよいのか詰まった状態になってしまいました。

    スクリーンキーボードに日本語入力補完機能を実装する上で、どのような手順で制作していくのが良いのか、また、既存のシステム等があり、それをソフトに組み込むことができたりする方法でも結構ですので、ご教授していただけると幸いです。

    宜しくお願いいたします。

     

     

    2006年11月9日 14:28

すべての返信

  • いわゆる予測変換と呼ばれるものですね。基本的には読み仮名から変換確定したものを覚えておき、次に入力があった時に候補として表示するような形でしょう。これではあまりに大雑把すぎますね。(^^;
    予測変換とか予測入力で調べられてみると、何か情報が得られるかもしれません。
    ちなみに、IME2007には搭載されるようですね。

    2006年11月9日 14:57
    モデレータ
  • 早速の返信有難うございます。

    予測変換でも検索したのですが、なかなかこれだ!と思うものがヒットしません・・・

    Ajaxでは入力補完が出来ることはしっていますが、AjaxをC#に取り組むことはできるでしょうか?

    また自分なりに考えたのは、スクリーンキーボードで打った文字をいったんテキストファイル等で履歴を残すといった流れにしたらどうかと思うのですが。。。

    2006年11月9日 15:10
  • > Ajaxでは入力補完が出来ることはしっていますが、AjaxをC#に取り組むことはできるでしょうか?

    Ajaxでやってるのはサーバ上にいくつかの入力候補を登録しておき、2~3文字入力したところでそれにあうようなデータを取り出して見せる、というだけの仕組みですね。
    はやとさんが言っているように、履歴を残すなどしてそこから表示させる、といった形であれば同じことができそうですね。

     

    2006年11月10日 1:29
  • 2005からはこういうのも使えるようです。
    http://www.atmarkit.co.jp/fdotnet/dotnettips/423autocompsource/autocompsource.html

    はやとさんの用件を満たすかはわかりませんが。

    2006年11月10日 1:52
  • アドバイス有難うございます。

    早速オートコンプリート機能を試してみました。

    オートコンプリート機能ですと、

    日本語の場合は文字を確定(Enterで)した際に、登録してある文字の候補を表示する。

    といった機能のようでした。

     

    私が実現したい機能はオートコンプリートと近いのですが、日本語入力の場合に文字を確定せずとも候補を表示したいと考えております。

    具体的には、

    朝、ありがとう・・・、を登録してあり、

    あ と入力するだけで、 朝、ありがとう を表示するといったような感じです。

     

    このようなことはオートコンプリートでは実現できますでしょうか?

    2006年11月10日 10:07
  • 日本語入力の途中の状態では、IME がテキストを握っている or TextServiceFramework がテキストを持っているので、確定しなければ TextBox が文字が入ったと判断できないのではないでしょうか?

    目的の手段を実現するためには、IME の機能に頼らずに日本語を入れるか、IME か TextServiceFramework から編集中のテキスト(CompositionString)を得る必要がありますけど…後者は IME 自身の変換機能と干渉してしまうと思います。

     

    2006年11月10日 10:45
  • >IME の機能に頼らずに日本語を入れるか

    とは具体的にはどのようにするということでしょうか?

    後者のIMEと干渉してしまうというのは、リサーチの過程で目にしたことがあるので、ぜひ前者でやってみようかと思うので、宜しくお願いします。

    2006年11月10日 11:38
  • どのようなアプリケーションを作成されようとしているのか、あまり理解していないですのですが…仮想キーコードから文字へのマッピングを自前で用意してしまえば可能です。(他にも方法はあるのでしょうけれど)

    例えば、VK_A がキーボードイベントとして飛んできた場合には、「あ」が入力されたものとして扱えば良いわけです。(ローマ字入力の場合には、ですが)

    勿論、子音+母音の場合には直前の文字と組み合わせて、ローマ字仮名のテーブル(これは自前で用意することになるのでしょうか)を引く必要があります。

    # 仮名入力の場合には、仮想キーコードから「仮名」へのマッピングが必要になりますけど。

     

    2006年11月10日 11:57
  • ・仮想キーコードから文字へのマッピングを自前で用意する

    とは具体的にはどのようなことでしょうか?

     現状でaボタンのコードは、

            const int VK_A = 0x41;


            private void aButton_Click(object sender, EventArgs e)
            {
                INPUT input = new INPUT();
                input.type = INPUT_KEYBOARD;
                input.ki.wScan = 0;
                input.ki.time = 0;
                input.ki.dwExtraInfo = GetMessageExtraInfo();

                input.ki.wVk = (ushort)VK_A;
                input.ki.dwFlags = 0;      //Key Down

                SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT)));

                input.ki.wVk = (ushort)VK_A;
                input.ki.dwFlags = KEYEVENTF_KEYUP;  //Key Up

                SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT)));
            }

    というふうにしております。

     

    作成しようとしているアプリケーションは、スクリーンキーボードに入力補完機能を実装する。といったものです。

    例えば、

    スクリーンキーボードのa(コントロールボタン)をクリックすると、今まで入力してきた単語・文章を表示して、表示された単語・文章をクリックすると、アクティブになっている他のアプリケーション(テキストファイルなど)のカーソルの場所に入力される。

    といった感じです。

    ただ、単語・文章などの候補表示をどのようにすると制作しやすいのか(右クリックで表示されるメニュー表示やスクリーンキーボードにコンボボックスを配置するなど)という部分も悩んでおります。

    何か良い方法があればお願いいたします。

    2006年11月11日 17:21