【问题标题】:Detect application running in WinRT mode by PID通过 PID 检测在 WinRT 模式下运行的应用程序
【发布时间】:2012-08-28 21:59:31
【问题描述】:

概述
我需要通过进程/PID 检测给定的应用程序是否在 WinRT(又名“Metro”)模式下运行。有什么好的方法吗?

失败的尝试和观察

  • OpenProcess() 并调用 Call GetPackageId() 检查 != APPMODEL_ERROR_NO_PACKAGE:这似乎适用于某些进程,而在 Metro 模式下运行的 Chrome 等其他进程无法通过检查。
  • Metro 应用似乎总是由 svchost.exe 托管(例如它们的父级)

有什么想法吗?请省略任何“不要那样做”或“为什么?”回答,因为它们对这个特定问题没有帮助。

【问题讨论】:

  • 您如何部署应用程序?通过包裹?
  • 哪个应用程序?调用应用程序(需要此信息)是标准 Windows 服务。
  • 您尝试验证的应用程序。因为如果应用程序没有正确部署为一个包,那么它就不会有任何包信息
  • 我需要验证任意 PID。 GetPackageId() 是尝试“破解”以实现我的目标,但如上所述对许多应用程序没有帮助。
  • 我试图说明的一点是,如果 GetPackageId 失败,很可能是因为它是一个错误部署的应用程序。如果您只需要验证正确部署的应用程序 - 例如那些在应用程序容器中运行的应用程序容器,那么您的 GetPackageId 解决方案可能会成功。

标签: windows-8 microsoft-metro windows-runtime


【解决方案1】:

IsImmersiveProcess 如果进程在 Metro 模式下运行,将返回 true。请注意,如果检测应用程序作为服务运行,则此调用始终返回 false。

【讨论】:

    【解决方案2】:

    如果 Metro 应用程序正在运行 WWA Applet,则从 PID 获取命令行参数并查看它是否为 WWAHOST.exe。例如,并非所有 Metro 应用程序都作为 WWA 小程序运行,IE 在 Metro 模式下作为独立 exe 运行。

    这听起来可能有点杂乱无章,但在检测 IE 是否处于 Metro 模式时对我有用。 Metro模式下的IE进程仍然是iexplore.exe。 Metro 模式下的根父进程是 Wininit.exe,非 Metro 模式下是 explorer.exe。 因此,找到 IE PID 的根父 PID,然后从父 PID 中获取父进程名称,然后将其与“Wininit.exe”或“Explorer.exe”进行比较

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2014-09-17
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多