PDA上控制软键盘

虽然NETCF设计为运行在WINCE上面,但它实际上是一个完整版Framework的一个子集,确实可以运行在PC上面,有时候项目会要求能够同时运行在PDA和PC上面。但是,使用NETCF编写PDA,PC兼容的托管应用程序并不是一件简单的事情,近期的几篇文章将会通过实际项目中遇到的问题,介绍相应的处理方法。

在WinCE中,有时需要控制软键盘,这个可以通过Microsoft.WindowsCE.Forms.InputPanel().Enabled属性来进行简单的设置。这种解决方法在硬件设备和模拟器中运行良好,因为他们是由精装版的Framework来执行的。问题是有的应用会要求程序能够在PC上面兼容运行,此处命名空间Microsoft.WindowsCE并不存在与PC上完整的Framework中,因此,这样编出来的程序在PC上面直接运行的话是会出现无法预料的异常的。由于在PC上运行时,已经失去了软键盘的特性,界面上也不会有软键盘存在,而我们的目标是使应用程序尽可能的能够兼容的运行在PDA和PC上面,因此在此我们尝试放弃Microsoft.WindowsCE.Forms.InputPanel而寻找更合适的方案。

有人也许会说,在运行的时候判断是否运行在WINCE上,如果是,再调用该属性控制软键盘,如果不是,就什么都不错。答案是不行,我自己做过测试,还是会弹出异常,似乎只要这种代码存在于程序中,只要执行到该代码段所在的函数体中,不管是否执行该段代码,都会抛出异常,可能是完整版的Framework在处理这种代码时产生的问题。

目前我发现的行之有效的方法是使用P/Invoke方法直接调用底层API函数,类似于DllImport("coredll")]声明的函数在PC上时,我们可以通过避免该函数执行的方法来避免异常的抛出,从而达到期望的兼容性。

经过查询,SipShowIM是可以控制软键盘的底层函数,我们将代码包装如下,注意Framework.IsNetCF是另外一个辅助类,用于判断代码是否运行在WinCE上面,目前有很多中方法可以判断,在该blog中有2篇文章对此有介绍。 代码如下:

C#示例代码:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Runtime.InteropServices;

namespace  MiniCafe.Util
{
    
public class Keyboard
    
{
        
/// <summary>
        
/// don't use Microsoft.WindowsCE.Forms.InputPanel().Enabled,
        
/// it will throw exception in pc
        
/// </summary>
        
/// <param name="flags"></param>
        
/// <returns></returns>

        [DllImport("coredll")]
        
public static extern bool SipShowIM(long flags);

        
public static void Show()
        
{
            
if (Framework.IsNetCF)
            
{
               
                SipShowIM(
1);
            }

        }

        
public static void Close()
        
{
            
if (Framework.IsNetCF)
            
{
                SipShowIM(
0);
            }

        }

    }

}

VB.NET#示例代码:

Imports System.Runtime.InteropServices

Public Class frmMain
    Private Sub TextBox2_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.GotFocus
        Keyboard.Show()
    End Sub
    Private Sub TextBox2_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.LostFocus
        Keyboard.Close()
    End Sub
End Class

Public Class Keyboard
    <DllImport("coredll", CharSet:=CharSet.Auto, CallingConvention:=3)> _
    Public Shared Function SipShowIM(ByVal flags As Integer) As Boolean
    End Function
    Public Shared Sub Show()
        SipShowIM(1)
    End Sub
    Public Shared Sub Close()
        SipShowIM(0)
    End Sub
End Class

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值