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

   在进行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 

    
Fields#region Fields 

    
/**//// <summary> 
    
/// 当输入法切换时发生。 
    
/// </summary> 

    public event EventHandler InputMethodChanged; 
    
private MsgHook Msg; 
    
internal class MsgHook : MessageWindow 
    

        
Fields#region Fields 

        
private const int WM_SETTINGCHANGE = 0x001A
        
private InputPanelEx BaseObject; 

        
#endregion
 

        
Methods#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
 

    
Methods#region Methods 

    
public InputPanelEx() 
    

        Msg 
= new MsgHook(this); 
    }
 

    
#endregion
 
}

本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http:
// www.zxbc.cn/html/cshorpsl/2613342913002.html

转载于:https://www.cnblogs.com/fxwdl/archive/2008/02/28/1084942.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值