支持输入法变更事件的InputPanel

来源:互联网 发布:wdcp php版本升级 编辑:程序博客网 时间:2024/04/30 20:01

在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
}