在.net cf(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件

来源:互联网 发布:python 图像增强 编辑:程序博客网 时间:2024/06/11 22:34
在进行Windows Mobile编程的时候,经常需要将Form上控件的Location随输入法面板的高度改变而调整,以免被面板遮盖。

    但是.Net CF的InputPanel控件只给我们提供了EnabledChanged(即输入法打开/关闭)事件,这就意味着在Enabled属性没有发生变化的情况下进行输入法切换,我们便无法及时获取新的面板高度以做出相应处理。

    有过Win32 sdk编程经验的朋友都知道,用户对应用程序产生的动作是首先以消息的形式传递给操作系统,操作系统根据消息中的窗口句柄(hWnd)回调该窗口的的消息 响应函数而得到应用程序的反馈的。既然.Net CF没有对此消息进行封装,那么我们只好自己手动处理消息了。

    在Windows环境下我们可以通过重写System.Windows.Forms.Form类的WndProc()函数来实现对该窗体消息的控制。但 CE环境下,WndProc()函数被挪到了Microsoft.WindowsCE.Forms.MessageWindow类,我们可以继承此类并在 WndProc()函数中处理0x001A(WM_WININICHANGE或WM_SETTINGCHANGE)消息来实现输入法改变事件。

    下面是我实现的一个InputPanel扩展类,增加了InputMethodChanged事件。
using System;
using Microsoft.WindowsCE.Forms;

/// <summary>
/// InputPanel扩展类。
/// LastUpdate:2007-12-26 NSnaiL
/// </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

    
public InputPanelEx()
    {
        Msg 
= new MsgHook(this);
    }

    
#endregion
}

 
原创粉丝点击