2012-12-07 33 views
0

我有一个应用程序,我需要知道它运行的Windows移动设备何时停靠,任何想法如何做到这一点?Windows Mobile设备可以检测它的停靠时间吗?

+0

可能重复? http://stackoverflow.com/questions/3440517/detecting-when-a-pocket-pc-is-docked-in-a-cradle-in-windows-mobile-2003 – nk2003dec

+0

@ nk2003dec:不,那个问题是关于从PC端检测它,这个问题是关于检测它的设备端。 – ctacke

回答

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线状态,即,它当前是否连接到电源适配器。无论是否连接到个人电脑,设备都处于支架状态时都是如此。

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); 
+0

使用ppp_peer假定您正在PC上运行ActiveSync/WMDC。设备不会启动TCP/IP连接。 – josef

+0

是的,使用WM/WCE设备时通常是这种情况。设备本身不会创建TCP连接,但是*如果要与ActiveSync主机通信,则PPP_PEER是您可以使用的计算机名称。 –

+0

Downvoter,关注为什么你downvote一个完全有效的答案? –

3

除了托尔斯滕的建议,你也可以寻找的NOTIFICATION_EVENT_RS232_DETECTED通知。当USB很罕见的时候,事件名称就是从后面遗留下来的,所以忽略它说RS232的事实,即使是在USB发生RS232事件的情况下。

您可以使用CeRunAppAtEvent挂钩通知。同样,忽略API的名称意味着什么 - 您也可以使用它来设置可以WaitForSingleObject的系统事件。

See the answer to this question的细节和实施。

1

以上所有答案都是正确的,但使用不同的方法。问题是,为什么你的应用程序需要知道设备是否停靠。

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

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

如果您只需要知道,该设备已装载,NOTIFICATION_EVENT_RS232_DETECTED方法是最好的。例如,如果您有车辆停靠站并想开始与连接到停靠站的车辆黑匣子进行通信。

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

相关问题