最近在开发一个串口终端软件,需要实现输入汉字,也就是类似于超级终端那样,输入一个汉字或一串汉字立马就发送到串口。
对于字母,很简单,监控按键就可以,如果是汉字,那就不行了。因为汉字是输入法输入的,文本控件不支持输入法输入产生事件。所以就需要另辟蹊径。
网上找了很久,始终没有找到好的方案,后来
参考了这篇博客点击打开链接
找到了思路,只不过楼主没有把问题完美解决。所以我在他的基础上彻底解决了问题
首先是如何得到输入法的结果
代码如下:
</pre><pre name="code" class="csharp">eGCS_RESULTSTR = 0x0800,
public class GetImeComposition
{
[DllImport("Imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hWnd);
[DllImport("Imm32.dll")]
public static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
[DllImport("Imm32.dll", CharSet = CharSet.Unicode)]
private static extern int ImmGetCompositionStringW(IntPtr hIMC, int dwIndex, byte[] lpBuf, int dwBufLen);
/*
* handle 需要处理的控件的句柄
* */
public string CurrentCompStr(IntPtr handle)
{
IntPtr hIMC = ImmGetContext(handle);
try
{
int strLen = ImmGetCompositionStringW(hIMC, (int)emImeGcs.eGCS_RESULTSTR, null, 0);
if (strLen > 0)
{
byte[] buffer = new byte[strLen];
ImmGetCompositionStringW(hIMC, (int)emImeGcs.eGCS_RESULTSTR, buffer, strLen);
return Encoding.Unicode.GetString(buffer);
}
else
{
return string.Empty;
}
}
finally
{
ImmReleaseContext(handle, hIMC);
}
}
}
接着是自定义控件
不同的控件需要建立不同的类,这里我用了RichTextBox
public class CmdRichTextBox : RichTextBox
{
public delegate void PrecessImeStrCallBack(string str);
public PrecessImeStrCallBack ProcessIme = null;
private GetImeCom