支持输入法变更事件的InputPanel

针对Windows Mobile设备的小屏幕问题,本文介绍了一种自定义输入面板控件的方法,以解决输入法弹出时遮挡输入控件的问题。通过监听输入法切换事件并调整控件位置,提升了用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Windows Mobile编程中,经常会使用到输入法,微软的.net compact framework中提供了InputPanel控件,该控件是系统全局性的,提供了EnabledChanged事件,在输入法弹出和关闭时触发该事件。

然而,在Windows Mobile软件很小的屏幕下,当输入法弹出后,很多接收输入的控件便会被遮挡住,用户只能在不知道自己输入是否正确的情况下进行输入,简直使用户成为了盲人,用户体验极其之差。

一般情况下,可以通过注册EnabledChanged事件,在其中通过获取Inputpanel的Bounds.Height的到输入法控件遮挡住的范围,然后将该范围内所有的接受输入的控件移到输入法没有遮盖住的区域。

这样做确实能够解决一部分问题,但当用户进行输入发切换的时候,问题又出现了,因为每种输入法面板的大小不不同的,也许上种输入法没有将接受输入的控件遮挡住,而你刚切换的输入法便将其遮盖住了,用户体验问题再次出现。

而在.net compact framework中的InputPanel控件中,并没有提供输入法切换能够触发的事件,怎么办?只好自己写一个输入法控件了,当然,该控件是继承Inputpanel的,否则,我还没那么强大。

控件代码

using System;
using Microsoft.WindowsCE.Forms;

/// <summary>
/// 支持输入法切换的输入面板
/// </summary>
public class InputPanelEx : InputPanel
{
#region Fields

/// <summary>
/// 当输入法切换时发生。
/// </summary>
public event EventHandler InputMethodChanged;
private MsgHook Msg;
internal class MsgHook : MessageWindow
{
#region Fields

private const int WM_SETTINGCHANGE = 0x001A;
private InputPanelEx BaseObject;

#endregion

#region Methods

public MsgHook(InputPanelEx baseObj)
{
BaseObject = baseObj;
}

protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SETTINGCHANGE)
BaseObject.InputMethodChanged(this, EventArgs.Empty);
base.WndProc(ref m);
}

#endregion
}

#endregion

#region Methods
/// <summary>
/// 支持输入法切换事件的输入面板
/// </summary>
public InputPanelEx()
{
Msg = new MsgHook(this);
}

#endregion
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值