none
WPFアプリケーション上でのIME API(Imm32.dll)を利用したフリガナの取得について RRS feed

  • 質問

  • 現在、WindowsFormを使用したアプリケーションをWPFアプリケーションに移植する作業を行っているのですがタイトルのようにIME APIを利用してTextBox等に漢字を入力し変換確定した際にフリガナを取得する処理の移植が難航しています。移植方法をご教授願えないでしょうか?

    WindowsFormアプリケーションでは以下のように処理を行っていました
    1.フリガナ取得対象コントロールのハンドルを取得
    2.NativeWindowを継承したクラス内で対象コントロールのハンドルをAssignHandlesでウィンドウに割り当てる
    3.NativeWindowを継承したクラス内でWndProcをオーバーライド
    4.オーバーライドしたWndProc内でWM_IME_COMPOSITIONを受信した際にImmGetContextで入力コンテキストを取得し、ImmGetCompositionStringでフリガナを取得する

    現状、HwndSourceでウィンドウのハンドルを取得して処理が行えないか試みてみましたが変換確定時にWM_IME_COMPOSITIONが受信できず解決できていない状況です。
    2016年8月2日 8:56

回答

  • Microsoft Visual Studio International Feature Packによみがなを取得できるYomiganaWPFTextBoxというコントロールがあります。

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:y="clr-namespace:Microsoft.International.Windows.Controls;assembly=YomiganaWPFTextBox"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <y:YomiganaWPFTextBox YomiganaChanged="YomiganaWPFTextBox_YomiganaChanged" />
            <TextBlock x:Name="yomi" />
        </StackPanel>
    </Window>
    namespace WpfApplication1
    {
        public partial class MainWindow : System.Windows.Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void YomiganaWPFTextBox_YomiganaChanged(object sender, System.Windows.RoutedEventArgs e)
            {
                var yomiTextBox = (Microsoft.International.Windows.Controls.YomiganaWPFTextBox)sender;
                this.yomi.Text = yomiTextBox.TextCaptured;
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2016年8月2日 9:33
    • 回答としてマーク u.daichi 2016年8月3日 7:41
    2016年8月2日 9:30

すべての返信

  • Microsoft Visual Studio International Feature Packによみがなを取得できるYomiganaWPFTextBoxというコントロールがあります。

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:y="clr-namespace:Microsoft.International.Windows.Controls;assembly=YomiganaWPFTextBox"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <y:YomiganaWPFTextBox YomiganaChanged="YomiganaWPFTextBox_YomiganaChanged" />
            <TextBlock x:Name="yomi" />
        </StackPanel>
    </Window>
    namespace WpfApplication1
    {
        public partial class MainWindow : System.Windows.Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void YomiganaWPFTextBox_YomiganaChanged(object sender, System.Windows.RoutedEventArgs e)
            {
                var yomiTextBox = (Microsoft.International.Windows.Controls.YomiganaWPFTextBox)sender;
                this.yomi.Text = yomiTextBox.TextCaptured;
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2016年8月2日 9:33
    • 回答としてマーク u.daichi 2016年8月3日 7:41
    2016年8月2日 9:30
  • すでに gekka さんが回答されてますが、私の方では StackOverFlow に同様の質問があったのでお知らせします。

    http://stackoverflow.com/questions/7290134/immgetcontext-return-0-in-wpf

    フックの登録・解除については、こちらのソースが参考になると思います。

    https://github.com/Grabacr07/XamClaudia/blob/master/PerMonitorDpi/Views/PerMonitorDpiWindow.cs

    #手抜きですみません(汗


    本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?

    2016年8月2日 9:37
    モデレータ
  • 返信ありがとうございます。

    まず、なるべく元の処理から変更を行わないという方針でしたので、ひらぽんさんに教えて頂いたStackOverFlowの同様の質問の回答を試してみたのですがやはり変換確定時にWM_IME_COMPOSITIONの発生を確認できなかった為、gekkaさんに教えて頂いたYomiganaWPFTextBoxコントロールを使用する方法で実装を行おうかと思います。
    2016年8月3日 7:41