質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

16116閲覧

C#でフリガナの自動入力について

OY_hironet

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/06/26 07:00

C#でテキストボックスAに入力された文字のフリガナをBのテキストボックスに表示しようとしてます。
例えば、山田太郎とテキストを続けて入力した場合にはOKなのですが、
山田と入力してから太郎と入力すると最後の文言「タロウ」のみが表示されてしまいます。
これを続けて表示する手立てはございますでしょうか。

以下にソースを記述しておきます。

C#

1using System.Runtime.InteropServices; 2 3public string Furigana = ""; 4const int GCS_RESURTREADSTR = 0x0200; 5 6[ DllImport("imm32.dll" )] 7static extern IntPtr ImmGetContext( IntPtr hWnd); 8[ DllImport("imm32.dll" )] 9static extern int ImmGetCompositionString( 10 IntPtr hiMC, int dwIndex, StringBuilder lpBuf, int dwBufLen); 11[ DllImport("imm32.dll" )] 12static extern bool ImmReleaseContext( IntPtr hWnd, IntPtr hiMC); 13 14private void txtSecName_Leave(object sender, EventArgs e) 15{ 16 17 string tmpStr; 18 IntPtr himc = ImmGetContext(txtSecName.Handle); 19 20 try 21 { 22 int dwSize = ImmGetCompositionString(himc, GCS_RESURTREADSTR, null, 0); 23 StringBuilder lpBuf = new StringBuilder(dwSize); 24 25 ImmGetCompositionString(himc, GCS_RESURTREADSTR, lpBuf, dwSize); 26 lpBuf.Length = dwSize; 27 tmpStr = lpBuf.ToString(); 28 Furigana += tmpStr; 29 txtSecFuri.Text = Furigana; 30 } 31 finally 32 { 33 ImmReleaseContext(txtSecName.Handle, himc); 34 35 } 36}

イベントとして「KeyDown」も試してみましたが、思うようにいきませんでした。

サンプルを見て作成をしたので本質的なことが理解できていないのだと思いますのでよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

当該サイトに載っていた方法で解決しました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/875imeyomi/imeyomi.html

投稿2016/06/30 01:45

OY_hironet

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

txtSecFuri.Text += Furigana;
簡単に済ませるならこれでどうですか?
削除に対応しようと思えばなかなか大変だと思いますが、そこまでしているものもあまりないと思います。

投稿2016/06/26 09:32

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OY_hironet

2016/06/26 22:37

ご回答有難うございます。 残念ながらこれも試しておりますが、状況は変わらない様子です。 以下の記述を付け加えてみたところ、希望通りに出るようになったのですが、どういうわけか、入力文字のひらがなが繰り返し出てしまいます。 例)山田→ヤマダヤマダ、太郎→タロウタロウ 以下は追加したものです。 [DllImport("imm32.dll")] public static extern int ImmSetCompositionString(IntPtr hImc, int dwIndex, int lpComp, int dwCompLen, System.Text.StringBuilder lpRead, int dwReadLen); private void txtSyaName_TextChanged(object sender, EventArgs e) { string tmpStr; IntPtr himc = ImmGetContext(txtSyaName.Handle); try { int dwSize = ImmGetCompositionString(himc, GCS_RESURTREADSTR, null, 0); StringBuilder lpBuf = new StringBuilder(dwSize); ImmGetCompositionString(himc, GCS_RESURTREADSTR, lpBuf, dwSize); lpBuf.Length = dwSize; tmpStr = lpBuf.ToString(); Furigana = tmpStr; txtSyaFuri.Text += Furigana; System.Text.StringBuilder S = new StringBuilder(""); ImmSetCompositionString(himc, GCS_RESURTREADSTR, 0, 0, S, 0); } finally { ImmReleaseContext(txtSyaName.Handle, himc); } } 他のイベントでも同様の結果となります。 忙しい中恐縮ですが、よろしくお願いいたします。
Zuishin

2016/06/26 23:57

二回目が同じものであったら抑制すればいいんじゃないでしょうか? IME によっては確定しなくても変換するたびにテキストを書き換えるなど、仕様は色々あったと思います。
Zuishin

2016/06/27 00:00

あと、ATOK だったか MS-IME だったか、そもそも ImmGetCompositionString によるフリガナの取得ができないものがありました。 その系統の API は古いものとして使われなくなりつつあるはずです。
OY_hironet

2016/06/28 01:02

前略、色々とコメントしていただき有難うございます。 残念ながらスキル不足により、記述されている内容のほとんどが理解できません。 (フリガナの取得ができない)ということで、今回は実装を見送ることにします。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問