C# Windows Mobile设备是否可以在';船靠岸了吗?

C# Windows Mobile设备是否可以在';船靠岸了吗?,c#,windows-mobile,dock,C#,Windows Mobile,Dock,我有一个应用程序,我需要知道它运行的windows mobile设备何时对接,有什么办法吗?当您可以解析PPP_对等机器名时,windows mobile设备将对接,该名称可用于设备与其对接的主机之间的TCP通信。然而,只有当支架实际连接到PC时,才是如此 public static bool ActiveSyncConnected {     get     {         try         {             IPHostEntry entry = Dns.GetHost

我有一个应用程序,我需要知道它运行的windows mobile设备何时对接,有什么办法吗?

当您可以解析PPP_对等机器名时,windows mobile设备将对接,该名称可用于设备与其对接的主机之间的TCP通信。然而,只有当支架实际连接到PC时,才是如此

public static bool ActiveSyncConnected
{
    get
    {
        try
        {
            IPHostEntry entry = Dns.GetHostEntry("PPP_PEER");
            return true;
        }
        catch
        {
            return false;
        }
    }
}

public static bool ActiveSyncConnected
{
    get
    {
        try
        {
            IPHostEntry entry = Dns.GetHostEntry("PPP_PEER");
            return true;
        }
        catch
        {
            return false;
        }
    }
}
另一个解决方案(至少对于工业设备)是检查交流线路状态,即它当前是否连接到电源适配器。当设备处于摇篮中时,无论是否连接到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_对等计算机名称时,Windows Mobile设备将被停靠,该名称可用于设备与其停靠的主机之间的TCP通信。然而,只有当支架实际连接到PC时,才是如此

public static bool ActiveSyncConnected
{
    get
    {
        try
        {
            IPHostEntry entry = Dns.GetHostEntry("PPP_PEER");
            return true;
        }
        catch
        {
            return false;
        }
    }
}

public static bool ActiveSyncConnected
{
    get
    {
        try
        {
            IPHostEntry entry = Dns.GetHostEntry("PPP_PEER");
            return true;
        }
        catch
        {
            return false;
        }
    }
}
另一个解决方案(至少对于工业设备)是检查交流线路状态,即它当前是否连接到电源适配器。当设备处于摇篮中时,无论是否连接到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);

除了Thorsten的建议之外,您还可以查找
通知\u事件\u RS232\u检测到的
通知。事件名称是从USB很少见的时候遗留下来的,所以忽略一个事实,它说RS232,即使使用USB,也会发生RS232事件

您可以使用
CeRunAppAtEvent
挂接通知。同样,忽略API名称的含义-您也可以使用它设置一个系统事件,您可以在该事件上等待SingleObject


有关详细信息和实施。

除了Thorsten的建议外,您还可以查找
通知\u事件\u RS232\u检测到的
通知。事件名称是从USB很少见的时候遗留下来的,所以忽略一个事实,它说RS232,即使使用USB,也会发生RS232事件

您可以使用
CeRunAppAtEvent
挂接通知。同样,忽略API名称的含义-您也可以使用它设置一个系统事件,您可以在该事件上等待SingleObject


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

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

如果您只需要知道,如果设备是外部供电的,那么最好使用PowerstatusEx和AC_线。这也可以通过电源通知队列使用,这样应用程序就不需要轮询状态(另请参见通知事件RS232检测方法)

如果您只需要知道设备已被吊篮,则最好采用通知事件RS232检测方法。例如,如果您有一个车辆停靠点,并且希望开始与连接到停靠点的车辆黑盒通信


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

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

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

如果您只需要知道,如果设备是外部供电的,那么最好使用PowerstatusEx和AC_线。这也可以通过电源通知队列使用,这样应用程序就不需要轮询状态(另请参见通知事件RS232检测方法)

如果您只需要知道设备已被吊篮,则最好采用通知事件RS232检测方法。例如,如果您有一个车辆停靠点,并且希望开始与连接到停靠点的车辆黑盒通信


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

可能重复吗@nk2003dec:不,这个问题是关于从PC端检测它,这个问题是关于从设备端检测它。可能是重复的吗@nk2003dec:不,这个问题是关于从PC端检测它,这个问题是关于从设备端检测它。使用ppp_peer假设您在PC上运行ActiveSync/WMDC。设备不会启动TCP/IP连接。是的,这通常是在使用WM/WCE设备时的情况。设备本身不会创建TCP连接,但如果您想与ActiveSync主机通信,PPP_PEER是您可以使用的计算机名称。Downvoter,是否要说明为什么您会对完全有效的答案进行Downvoter?使用PPP_PEER假设您在PC上运行ActiveSync/WMDC。设备不会启动TCP/IP连接。是,使用WM/WCE设备时通常会出现这种情况。设备本身不会创建TCP连接,但如果您想与ActiveSync主机通信,PPP_PEER是您可以使用的机器名。Downvoter,是否要评论一下您为什么对完全有效的答案进行Downvoter?