Windows Mobile 设备是不是可以检测到它何时停靠?

Posted

技术标签:

【中文标题】Windows Mobile 设备是不是可以检测到它何时停靠?【英文标题】:Can the Windows Mobile device detect when it's docked?Windows Mobile 设备是否可以检测到它何时停靠? 【发布时间】:2012-12-07 06:50:39 【问题描述】:

我有一个应用程序,我需要知道它运行的 Windows 移动设备何时停靠,有什么想法吗?

【问题讨论】:

可能重复? ***.com/questions/3440517/… @nk2003dec: 不,这个问题是关于从 PC 端检测它,这个问题是关于检测它设备端。 【参考方案1】:

除了Thorsten 的建议,您还可以查找NOTIFICATION_EVENT_RS232_DETECTED 通知。事件名称是 USB 很少见时的传统名称,因此请忽略它说 RS232 的事实,即使使用 USB,也会发生 RS232 事件。

您可以使用CeRunAppAtEvent 来挂钩通知。同样,忽略 API 的名称所暗示的内容 - 您也可以使用它来设置可以 WaitForSingleObject 的系统事件。

See the answer to this question 了解详情和实施。

【讨论】:

【参考方案2】:

当您可以解析 PPP_PEER 机器名称时,Windows Mobile 设备即被对接,该名称可用于设备与其对接的主机之间的 TCP 通信。但是,仅当底座实际连接到 PC 时才适用。

   

public static bool ActiveSyncConnected

    get
    
        try
        
            IPHostEntry entry = Dns.GetHostEntry("PPP_PEER");
            return true;
        
        catch
        
            return false;
        
    

   

另一种解决方案(至少对于工业设备而言)是检查 AC 线路状态,即它当前是否连接到电源适配器。无论设备是否连接到 PC,当设备处于支架状态时都是如此。

public bool CurrentlyConnectedToACLine

    get
    
        SYSTEM_POWER_STATUS_EX status = new SYSTEM_POWER_STATUS_EX();
        if (GetSystemPowerStatusEx(status, true))
            return status.ACLineStatus != 0;
        else
            return false;
    


[StructLayout(LayoutKind.Sequential)]
internal class SYSTEM_POWER_STATUS_EX

    public byte ACLineStatus = 0;
    public byte BatteryFlag = 0;
    public byte BatteryLifePercent = 0;
    public byte Reserved1 = 0;
    public uint BatteryLifeTime = 0;
    public uint BatteryFullLifeTime = 0;
    public byte Reserved2 = 0;
    public byte BackupBatteryFlag = 0;
    public byte BackupBatteryLifePercent = 0;
    public byte Reserved3 = 0;
    public uint BackupBatteryLifeTime = 0;
    public uint BackupBatteryFullLifeTime = 0;


[DllImport("coredll.dll")]
private static extern bool GetSystemPowerStatusEx(SYSTEM_POWER_STATUS_EX lpSystemPowerStatus, bool fUpdate);

【讨论】:

使用 ppp_peer 假定您在 PC 上运行 ActiveSync/WMDC。设备不会启动 TCP/IP 连接。 是的,在使用 WM/WCE 设备时通常是这种情况。设备本身不会创建 TCP 连接,但如果您想与 ActiveSync 主机通信,PPP_PEER 是您可以使用的机器名称。 投反对票的人,想评论一下为什么你投了一个完全有效的答案吗?【参考方案3】:

以上所有答案都是正确的,但使用不同的方法。问题是,为什么您的应用需要知道设备是否已对接。

如果要使用 PC ActiveSync Paasthru TCP/IP 连接,则最好使用 PPP_PEER 解决方案。

如果您只需要知道设备是否由外部供电,那么最好使用 PowerstatusEx 和 AC_LINE。这也可以通过电源通知队列使用,这样应用就不需要轮询状态(另请参阅 NOTIFICATION_EVENT_RS232_DETECTED 方法)。

如果您只需要知道设备已安装好,最好采用 NOTIFICATION_EVENT_RS232_DETECTED 方法。例如,如果您有一个车载底座,并且想要开始与连接到底座的车载黑盒通信。

你看,虽然所有解决方案乍一看都差不多,但它们的意图却不同。

【讨论】:

以上是关于Windows Mobile 设备是不是可以检测到它何时停靠?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Mobile移动端访问后台服务设备类型检测网站偏好及分辨率感知

移动设备检测

如何让 Windows Mobile 设备中心连接到模拟器

检测移动设备访问你的网站

使用 Django 和 Python 3 检测移动设备

显示当前电池电量的 gui 控件 windows mobile C#