在Windows Mobile開發中遇到一個問題,就是在使用者改變IME時動態改變表單的高度,而IME控制項InputPanel中沒有IME改變的事件,因些要對IME改變的事件進行捕獲。在網上搜尋了到了相關的代碼,但是有一些問題,作了一些修改後可以正常使用。基本原理是對InputPanel進行擴充,通過訊息捕獲添加IME改變的事件InputMethodChanged。代碼如下:
/// <summary>
/// InputPanel擴充類。
/// LastUpdate:2007-12-26 NSnaiL
/// </summary>
public class InputPanelEx : InputPanel
{
#region Fields
/// <summary>
/// 當IME切換時發生。
/// </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);
}
public new void Dispose()
{
Msg.Dispose();
base.Dispose();
}
#endregion
}
需要注意的是,在退出表單時一定要調用InputPanelEx的Dispose()方法,否則會出問題。