程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#下實現空白窗體上中文輸入,可以實現類PS的文字工具(1)

C#下實現空白窗體上中文輸入,可以實現類PS的文字工具(1)

編輯:關於C語言

在空白窗體上打開輸入法,在C#裡的空白窗口是無論如何也是打不開輸入法.設 置了this.ImeMode= ImeMode.NoControl也是無法打開輸入法的錄字窗口.去 Microsoft 開發論壇上問了一些問題.感謝周雪峰版主與Riquel_Dong 版主給的 指點.用了API函數: ImmAssociateContext(IntPtr hWnd, IntPtr hIMC);終 於把輸入法給調了出來,它的功能是把輸入與指定的窗口進行關聯.

代碼如 下:

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

現在可以調用輸入法了.可是又出現了新的問題. 怎麼樣取得輸入法錄字窗體上的字呢.

當打開輸入法輸入文字時,會發送 WM_IME_CHAR的消息.我們在這個消息下處理下就可以得到漢字了

可以用 IMM的函數: ImmGetCompositionString(IntPtr hIMC, int dwIndex,  StringBuilder  lpBuf, int dwBufLen);取得錄字窗體上輸入的漢字或者 NUICODE類的字.當然,這裡就不研究別的了.只說漢字問題.

取字的代碼如 下:

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;

OK,.好象是大功告成了.測試了一下才發現打印出來的都 是重復的文字.比如輸入”為人民服務”,打印出的卻是”為為人 人民民服服務務”我的天吶,問題出在哪裡呢.

去查了一下MSDN.對 WM_IME_CHAR有這樣的說明:

the WM_IME_CHAR message includes a double-byte character and the application passes this message to  DefWindowProc

是不是問題就出在這裡了.是發送消息兩次的問題.

看了一個網上的討論,得出一個解決方案:加上判斷

if  (m.WParam.ToInt32() == PM_REMOVE)
{
}

測試.終於 沒有了問題了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved