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

質問
-
現在、WindowsFormを使用したアプリケーションをWPFアプリケーションに移植する作業を行っているのですがタイトルのようにIME APIを利用してTextBox等に漢字を入力し変換確定した際にフリガナを取得する処理の移植が難航しています。移植方法をご教授願えないでしょうか?
WindowsFormアプリケーションでは以下のように処理を行っていました
1.フリガナ取得対象コントロールのハンドルを取得
2.NativeWindowを継承したクラス内で対象コントロールのハンドルをAssignHandlesでウィンドウに割り当てる
3.NativeWindowを継承したクラス内でWndProcをオーバーライド
4.オーバーライドしたWndProc内でWM_IME_COMPOSITIONを受信した際にImmGetContextで入力コンテキストを取得し、ImmGetCompositionStringでフリガナを取得する
現状、HwndSourceでウィンドウのハンドルを取得して処理が行えないか試みてみましたが変換確定時にWM_IME_COMPOSITIONが受信できず解決できていない状況です。
回答
-
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!)
すべての返信
-
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!)
-
すでに 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?