我有一个应用程序,我需要知道它运行的 Windows 移动设备何时停靠,有什么想法吗?
3 回答
除了 Thorsten 的建议,您还可以查找NOTIFICATION_EVENT_RS232_DETECTED
通知。当 USB 很少见时,事件名称是从后面遗留下来的,所以忽略它说 RS232 的事实,即使使用 USB,也会发生 RS232 事件。
您可以使用CeRunAppAtEvent
挂钩通知。同样,忽略 API 的名称所暗示的内容 - 您也可以使用它来设置可以 WaitForSingleObject 的系统事件。
有关详细信息和实施,请参阅此问题的答案。
当您可以解析 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);
以上所有答案都是正确的,但使用不同的方法。问题是,为什么您的应用需要知道设备是否已对接。
如果要使用 PC ActiveSync Paasthru TCP/IP 连接,则最好使用 PPP_PEER 解决方案。
如果您只需要知道,如果设备是外部供电的,那么最好使用 PowerstatusEx 和 AC_LINE。这也可以通过电源通知队列使用,因此应用程序不需要轮询状态(另请参见 NOTIFICATION_EVENT_RS232_DETECTED 方法)。
如果您只需要知道设备已被固定,则最好使用 NOTIFICATION_EVENT_RS232_DETECTED 方法。例如,如果您有一个车载底座,并且想要开始与连接到底座的车载黑盒通信。
您会看到,尽管所有解决方案乍一看都或多或少相同,但它们的意图却不同。