如何截获带文本输入的控件的输入法输入结果 C#

最近在开发一个串口终端软件,需要实现输入汉字,也就是类似于超级终端那样,输入一个汉字或一串汉字立马就发送到串口。

对于字母,很简单,监控按键就可以,如果是汉字,那就不行了。因为汉字是输入法输入的,文本控件不支持输入法输入产生事件。所以就需要另辟蹊径。

网上找了很久,始终没有找到好的方案,后来

参考了这篇博客点击打开链接

找到了思路,只不过楼主没有把问题完美解决。所以我在他的基础上彻底解决了问题


首先是如何得到输入法的结果

代码如下:

</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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值