日本語入力が途中で勝手に確定
- 題名: 日本語入力が途中で勝手に確定
- 著者: Hiro
- 日時: 2012/03/07 15:04:27
- ID: 30056
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 日本語入力が途中で勝手に確定
- 著者: まっつ
- 日時: 2012/03/07 15:32:34
- ID: 30057
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 日本語入力が途中で勝手に確定
- 著者: Hiro
- 日時: 2012/03/09 8:55:27
- ID: 30062
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.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;
}