32795


お世話になっております。  
Visual Studio Community  
C# Windowsフォームアプリケーションにて

TextBoxやRichTextBoxで日本語または全角英数を入力した際に  
TextChangedイベントを発生させたいのですが

文字の下に波線が表示されている（変換確定前)の状況では  
Enterキーを押して変換確定させない限り  
TextChangedイベントが発生しないようです。

変換確定前の文字列入力した際にもTextChangedイベントを呼び出したいのですが  
方法、アドバイス、ご意見 いただけませんでしょうか？  
よろしくお願いいたします。


CC BY-SA 3.0
2017-02-19T15:35:03.643
32794
2017-02-19T16:07:13.413
20645
question
c#
C# TextChangedイベントを日本語変換前でも発生させる


`KeyDown`イベントを使用すればよいのでは。  
なお入力中のテキストはこの時点では反映されていませんので、この場合は[`ImmGetCompositionStringW`](https://msdn.microsoft.com/ja-
jp/library/windows/desktop/dd318553\(v=vs.85\).aspx)関数を使用します。

[code]

    [DllImport("imm32.dll")]
    public static extern IntPtr ImmGetContext(IntPtr hWnd);
    
    [DllImport("Imm32.dll")]
    public static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
    
    [DllImport("Imm32.dll", CharSet = CharSet.Unicode)]
    private static extern int ImmGetCompositionStringW(IntPtr hIMC, int dwIndex, byte[] lpBuf, int dwBufLen);
    
    private const int GCS_COMPSTR = 8;
    
    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        var c = ImmGetContext(textBox1.Handle);
    
        if (c == IntPtr.Zero)
        {
            return;
        }
    
        try
        {
            var buf = new byte[256];
    
            // IME入力値の取得
            var length = ImmGetCompositionStringW(c, GCS_COMPSTR, buf, buf.Length);
            if (length >= 0)
            {
                var composition = Encoding.Unicode.GetString(buf, 0, length);
    
                // 現在の入力内容
                Console.WriteLine(
                    textBox1.Text.Substring(0, textBox1.SelectionStart)
                    + composition
                    + textBox1.Text.Substring(textBox1.SelectionStart + textBox1.SelectionLength));
            }
            else
            {
                // エラー
            }
        }
        finally
        {
            ImmReleaseContext(textBox1.Handle, c);
        }
    }
    
[/code]

ただ`TextBox`を継承して`WndProc`メソッドで`WM_IME_COMPOSITION`メッセージを処理する方が確実かもしれません。


CC BY-SA 3.0
2017-02-19T15:56:07.557
32795
2017-02-19T16:07:13.413
2017-02-19T16:07:13.413
5750
5750
32794
answer