Welcome

首页 / 软件开发 / C# / C#下实现空白窗体上中文输入,可以实现类PS的文字工具

C#下实现空白窗体上中文输入,可以实现类PS的文字工具2011-05-16 博客园 &小兽屋在空白窗体上打开输入法,在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)
{
}

测试.终于 没有了问题了