DOBON.NET DOBON.NETプログラミング掲示板過去ログ

日本語入力が途中で勝手に確定

環境/言語:[Windows Vista/7 C# VC2010 Winアプリ]
分類:[.NET]

奇怪な現象かもしれませんがアドバイスいただけたらと思います。

下記のサンプルを利用してテキストエディターのようなものを作成しております。
http://www.codeproject.com/Articles/10675/Enabling-syntax-highlighting-in-a-RichTextBox

この時、いつのころからかはわかりませんが、日本語入力が途中で勝手に確定されてしまいます。

タイプ中の場合は、タイプに少し時間が空くとそこですべてがひらがなに確定され、変換ボタンを押した場合でも1回目の変換はしますが、そこで確定し次はできません。

もちろん他のアプリやワードではそのような奇怪な動作はしません。

このアプリの問題と考えています。

コードは、
public class SyntaxRichTextBox : System.Windows.Forms.RichTextBox
で派生継承した richTextBox をフォームに配置している。
syntaxRichTextBox2_TextChangedなどは位置してます。
(click, MouseDown, KeyDown, KeyPressなども)
SyntaxRichTextBoxのコードは、下部です。(一部抜粋)

動作は、テキストボックスにIMEで日本語を入力すると確定前にsyntaxRichTextBox2_TextChangedが呼び出されています。もちろんその前に、SyntaxRichTextBox.WndProc次に、SyntaxRichTextBox.OnTextChangedと呼び出された後です。

そのTextChengedを抜けると文字が確定しているようです。

そこで質問、
1.日本語入力中で確定前(文字に破線のアンダーラインがある状態)でTextChengedなど通常呼び出されますか?ググってみるとWPFあるらしい

2.回避する方法はありますか?OutLook2007でAtok使用では飽きるような事例がありましたが、この件とは関係なさそう...

ちなみに、Microsoft Office IME 2007を使っています。
また上記現象は、Windows7とWindows Vista の両者で確認できました。



public class SyntaxRichTextBox : System.Windows.Forms.RichTextBox
{
:
サンプルのまま

public void BkLine(int /*line*/mmm) カーソルの行を反転表示(追加)
{
SendMessage(this.Handle, 0x000B, 0, 0);

// 現在のカーソル位置保存
int pos = SelectionStart;

int current = (int)SendMessage(this.Handle, EM_LINEFROMCHAR, -1, 0);
int start = (int)SendMessage(this.Handle, EM_LINEINDEX, current + 1, 0);
int len = (int)SendMessage(this.Handle, EM_LINELENGTH, /*SelectionStart*/start, 0);

// 背景を消す
SelectAll();
SelectionBackColor = Color.White;
if (start > -1 && len > 0){
Select(start, len); // 変更したい文字列を選択
if (bLineColorFlag){
SelectionStart = start;
SelectionLength = len;
bool abc = SelectionColor.IsNamedColor;
SelectionColor = cLineColor;
}
else
SelectionBackColor = cLineColor; // 色を設定
}

SendMessage(this.Handle, 0x000B, 1, 0);
Refresh();
SelectionStart = pos;
}
:
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x00f){
if (m_bPaint)
base.WndProc(ref m);
else
m.Result = IntPtr.Zero;
}
else
base.WndProc(ref m);
}

// カーソル移動の検出を知らせるイベント
public event EventHandler TextChanged;

protected override void OnTextChanged(EventArgs e)
{
// Calculate shit here.
m_nContentLength = this.TextLength;

int nCurrentSelectionStart = SelectionStart;
int nCurrentSelectionLength = SelectionLength;

m_bPaint = false;

// Find the start of the current line.
m_nLineStart = nCurrentSelectionStart;
while ((m_nLineStart > 0) && (Text[m_nLineStart - 1] != '\n'))
m_nLineStart--;
// Find the end of the current line.
m_nLineEnd = nCurrentSelectionStart;
while ((m_nLineEnd < Text.Length) && (Text[m_nLineEnd] != '\n'))
m_nLineEnd++;
// Calculate the length of the line.
m_nLineLength = m_nLineEnd - m_nLineStart;
// Get the current line.
m_strLine = Text.Substring(m_nLineStart, m_nLineLength);

// Process this line.
ProcessLine();

// イベントが未発生であれば、発生させる <- RichTextBox_TextChanged
if (TextChanged != null) <- を発生させるために追加
{
TextChanged(this, e);
}

m_bPaint = true;
}
参考までに。
私も同様の現象にあったことがあります。
ただし、環境は全く違います。
 その時は、IMEを最新のものに変えたら現象は出なくなりました。
IME関連の不具合は奇怪な現象が起きるので、原因の特定が困難で困りますよね(^^;
■No30057に返信(まっつさんの記事)
>  参考までに。
> 私も同様の現象にあったことがあります。
> ただし、環境は全く違います。
>  その時は、IMEを最新のものに変えたら現象は出なくなりました。
>

お世話になります。

「Microsoft Office IME 2010」に更新しましたが、同様の現象が起こります。
このアプリのどこかに不具合があると考えられるのですが、何がおかしいのでしょうか?

推測でもいいので何かアドバイスください。

DOBON.NET | プログラミング道 | プログラミング掲示板