在.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事件。
但是.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
}
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
}
- 在.net cf(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件
- 在.Net CF(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件
- 在.net cf(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件
- 在.net cf(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件
- 支持输入法变更事件的InputPanel
- 支持输入法变更事件的InputPanel
- 支持输入法变更事件的InputPanel
- [CF.Skills]在.NET CF中嵌入Media Player(C#)
- 在.NET CF中嵌入Media Player(C#)
- c#.NET考证中添加数值改变事件
- Windows Mobile .Net CF中电话状态的捕获
- 如何在程序中激活/关闭输入法面板?
- 在控制台程序中捕获事件
- 程序中何时刷新SIP输入面板
- 在.net cf中处理Windows消息
- EditText的高度跟随输入法改变
- Asp.net中在GridView数据绑定事件中改变显示内容要注意的问题
- 在VC6.0中创建和使用静态链接库&amp;amp;&amp;amp;C如何调用C++ 成员函数
- 发现一个国内Liferay开发的站点
- 全面介绍Windows内存管理机制及C++内存分配实例(三):虚拟内存
- 程序员的职业生涯规划(转载)
- 程序员和妓女(转载)
- EJB分布处理机制和数据访问对象工厂模式解读
- 在.net cf(C#)中捕获输入法面板(InputPanel&SIP)高度改变事件
- Oracle 从sql*plus向shell传递变量
- GPRS及GSM拨号过程记录
- SQL Server常用的系统存储过程应用实例(转载)
- VB清除IE缓存
- scheme 入门之 hello world
- 在窗体运行后,可通过鼠标拖动控件来移动控件位置(c#) (转载)
- Asp.Net学习:细节性问题
- .NET Framework终于开源了!