首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實現空白表單中文輸入(一):從無法開啟 IME 到解決重複字元問題

     編輯:關於C語言

問題背景:空白表單無法啟動輸入法

C# WinForms 的空白表單預設無法開啟輸入法錄字視窗,設定 this.ImeMode = ImeMode.NoControl 也無效。經 Microsoft 論壇專家指點,使用 ImmAssociateContext API 將輸入法上下文與視窗關聯,終於喚出輸入法。

關鍵代碼:關聯 IME 上下文

if (m.Msg == WM_IME_SETCONTEXT && m.WParam.ToInt32() == 1)
{
    ImmAssociateContext(this.Handle, m_hImc);
}

新挑戰:如何取得錄字視窗的文字?

輸入文字時會發送 WM_IME_CHAR 訊息,在此處理即可取得漢字。使用 ImmGetCompositionString 擷取組合字串:

case WM_IME_CHAR:
    int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null, 0);
    size += sizeof(Char);
    ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);
    sb.Append(str.ToString());
    MessageBox.Show(str.ToString());
    IntoText();
    isShowChina = true;
    break;

驚人發現:輸出重複文字!

輸入「為人民服務」,卻輸出「為為人人民民服服務務」。查閱 MSDN 發現:WM_IME_CHAR 訊息包含雙位元組字元,應用程式若傳給 DefWindowProc 會導致雙重處理。

解決方案:加入 PM_REMOVE 判斷

if (m.WParam.ToInt32() == PM_REMOVE)
{
    // 處理組合字串
}

測試確認:問題徹底解決,不再出現重複字元。

核心心得

  1. 空白視窗需手動關聯 IME 上下文(ImmAssociateContext)
  2. 攔截 WM_IME_CHAR 而非 WM_CHAR 取得中文
  3. 必須檢查 PM_REMOVE 避免雙重處理
  4. ImmGetCompositionString 配合 GCS_RESULTSTR 取得確定字串
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved