【问题标题】:Detect if application is running on laptop [duplicate]检测应用程序是否在笔记本电脑上运行[重复]
【发布时间】:2011-01-31 09:49:18
【问题描述】:

可能重复:
How can I tell if a user is using a laptop

我正在尝试找出应用程序是在笔记本电脑上还是在台式机上运行,​​有什么想法可以实现吗?

注意:我只对用 Delphi 和/或 C++ 编写的 API 感兴趣。

编辑:我的目标平台是 Windows XP+,即使只有 Windows 7 也可以。

【问题讨论】:

  • 好问题,我不确定是否有明确的答案,因此请发表评论,但您可能会发现电池/电源 API 很有用?
  • 检查安装/运行应用程序的计算机是否有电池选项? :P 类似的东西? :D
  • 对话让我颤抖..“别让我思考”:)
  • 请注意,许多通过 USB 或串行端口连接的 UPS 系统在 Windows 中显示为“电池”,就像带电池的笔记本电脑一样。
  • 你为什么想知道这个?

标签: c++ delphi


【解决方案1】:

使用这个结构:SYSTEM_POWER_STATUS,并检查ACLineStatus 字段的值。

  • ACLineStatus = 0 => 系统未使用交流电源 > 笔记本电脑 + 电池
  • ACLineStatus = 1 => 系统正在使用交流电源 => 笔记本电脑 + 交流
  • ACLineStatus = 255 => 交流电源状态未知 => 桌面

免责声明:尝试使用这些。我没有声称他们是否可靠。但他们几乎是正确的。

--

编辑:

使用GetSystemPowerStatus获取上述结构的值。

顺便说一句,你也可以试验一下结构的其他字段;也许您可以找到一些有用的模式,为您提供不同字段值的组合,以帮助您可靠地检测应用程序是否在笔记本电脑上运行。

【讨论】:

  • FWIW,上周我将一个新的 USB 连接的 UPS 插入我的 Windows 2008 服务器,它自动检测到“电池”,现在显示所有与笔记本电脑相同的电池选项。我不认为电池是笔记本电脑的可靠指标。
  • @mj2008:每个人都在说同样的话“我不认为电池是笔记本电脑的可靠指标”,我不不同意他们。如果没有标准的方法可以完成这项工作,那么只能尝试不同的系统信息值、电池信息以及它们不同值的组合等,以可靠地检测(在某种程度上)应用程序是否在笔记本电脑上运行或不是。
  • 根据msdn.microsoft.com/en-us/library/aa373232(v=VS.85).aspx“无电池”应该是BatteryFlag == 128
【解决方案2】:

我认为没有标准的方法来检查应用程序是否在笔记本电脑上运行,但我认为也没有标准的理由需要知道这一点。

关键还在于,笔记本电脑与台式机并没有太大区别:有些笔记本电脑永远不会移动,我想可以构建一个带有嵌入式 UPS 的台式机(视为电池?)

我认为您应该确定它是否是一台笔记本电脑,使用您需要在笔记本电脑上签入的功能:

  • 您是否想知道它是否是笔记本电脑,因为如果计算机可以移动,您的应用程序需要表现不同?然后检查它是否插入了电池。

  • 您想知道它是否是笔记本电脑以查看是否可以修改硬件吗?在这种情况下,请检查主板型号或通过对话框询问。

  • 您是否需要检查一下,如果使用太频繁太长时间会不会烧死?只需监测温度...

【讨论】:

  • @peoro 好答案,相信我有很多理由来检查它是否在笔记本电脑上运行,例如最重要的是“避免应用程序执行/功能,以防它在笔记本电脑上运行“, 原因?性能,人们忘记了台式机(在大多数情况下)比他们的笔记本电脑(消费者)快得多,所以他们倾向于一次运行很多应用程序,现在真正的问题是我不知道它是否在服务器上运行,台式机或笔记本电脑...
  • @Dorin Duminica:然后检查您的机器性能:检查机器 CPU 或运行几秒钟的微型嵌入式基准测试。这样,您就可以为具有相同实际性能(等等)的全新笔记本电脑和旧台式机提供相同的功能。
  • @Dorin Duminica:所以您决定在客户的计算机上可以做什么或不可以做什么?基于它是笔记本电脑(可能是连接到电网和 GBit 以太网连接的 2.3 GHz 四核 i7)还是台式机(可能是在微弱的 UPS 电源和 11 MBit WLAN 上运行的 500 MHz PIII) ?我说让用户决定他的系统能做什么。
  • @DevSolar 是的,这就是我要做的,台式机都是双核,运行频率为 2.8 GHz+,具有全高清 LCD、2GB+ RAM 等。我关心的是使用的管理无论如何,启动时间超过 2 分钟的笔记本电脑(太多的应用程序。在后台运行......),如果我没记错的话,这个问题很清楚......
  • @Dorin Duminica:如果我有一个应用程序决定减少功能,因为它在笔记本电脑上运行,我会非常生气。现在..你不想惹恼管理层,是吗?
【解决方案3】:

我不相信有可靠的方法可以检测到这一点。

【讨论】:

  • @Dorin 您可以尝试 WMI,但这并不总是有效,或者在我的经验中确实很常见。您可以寻找电池,但有些笔记本电脑可以在没有电池的情况下运行。如果您能够告诉我们您将如何使用这些信息,我们或许可以建议一种替代方法。
  • 这个想法是,大多数时候我希望至少 70%+ 确定我知道 app.正在笔记本电脑或(台式机或服务器)上运行,以便我可以通过关闭功能等来适当地采取行动……没有什么“非常”具体的,但仍然。
【解决方案4】:

显然,隐藏的问题是公司的笔记本电脑通常没有足够的内存,但公司的台式机却有。为了解决这个特定问题,将使用的内存与安装的内存进行比较:EnumProcesses()GetProcessMemoryInfo 告诉你第一个; GetPhysicallyInstalledSystemMemory() 告诉你第二个。

如果它们太接近,您可以通知用户有 73 个正在运行的进程使用 2.5 GB,但只有 2GB RAM。这是您的程序无法启动的正当理由。

【讨论】:

    【解决方案5】:

    MSDN 讨论了用于电源和设备感知应用程序的 API here

    您还可以检查其他内容,例如:

    • 电池是否连接
    • 是否已连接触控板
    • 是否安装了 PC 卡
    • 具有特定类型的 CPU(低功耗、Atom 等)
    • 拥有笔记本电脑独有的屏幕。
    • 笔记本硬盘是 3.5 英寸

    如果上述某些情况属实,那么您可以假设是笔记本电脑。

    您也可以在安装时询问用户....

    【讨论】:

    • 用户可以毫无问题地将应用程序从一个系统复制到另一个系统,所以除非应用程序。能够检测系统,没有真正的方法来检查它在哪里运行,它可能随时从 VM 运行......
    【解决方案6】:

    这里有一堆其他答案和链接,您可能会发现对这个问题有用:

    How to detect when the laptop is running on batteries?

    How can I tell if a user is using a laptop

    后者还讨论了 WMI,而答案集中在 .NET 上,您可以使用 Delphi 的 WMI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多