【问题标题】:How to track WinRT applications (in Win32 it was simple)?如何跟踪 WinRT 应用程序(在 Win32 中很简单)?
【发布时间】:2012-11-26 09:32:35
【问题描述】:

在“旧”时代,我为 Windows 用户创建了简单的工具,它可以跟踪他们在电脑前所做的事情(简单的活动监视器)。我使用的是 Win32 api 和 GetForegroundWindow、GetWindowThreadProcessId 等函数。

昨天我安装了新的 Windows 8 并且厌倦了运行我的程序。我获得了 50% 的成功:对于“经典”桌面,它像往常一样工作:)。 对于 Metro UI,我只有一个应用程序:WWAHost :( 没有任何细节。

所以我的问题是:有没有办法在 Metro UI 中跟踪活动的应用程序? 感谢您的帮助

更新: 我正在尝试从 Win32 访问 Metro UI 应用程序,我知道从另一个 Metro 应用程序访问 Metro 应用程序是不可能的

【问题讨论】:

  • 您是否尝试过 GetPackageFullName 或 GetApplicationUserModelId,希望能够消除 Windows Web 应用程序的歧义?
  • @DwayneRobinson 我应该如何使用这些方法?

标签: windows windows-8 windows-runtime


【解决方案1】:

您会看到,在 WinRT 中,您的应用程序是最顶层的应用程序。当您的应用程序不是最顶层的应用程序时,您的线程将被挂起,内核将不会为您的应用程序安排更多操作。故事结束。

这意味着您想要完成的工作无法在 WinRT 中完成。您的想法更像是一个常驻应用程序或可以访问桌面的服务。这些应用程序有两个优点。 1)他们总是在运行。而且,2)他们有 API 来做你想做的事。

WinRT 有意将应用置于沙盒中,以保护用户的体验、性能和电池寿命。您的情景和分数与您的情况更加相似,这凸显了对桌面应用程序的持续需求。 (只要对这些类型的应用程序有持续的需求;))。

抱歉,如果这是个坏消息。

至于列举其他应用。这也是不可能的。您无法知道是否安装了另一个应用程序或它是否正在运行。您可以通过协议激活或文件激活或(在某种意义上)通过共享合约调用另一个应用程序。但是您不知道他们是否收到消息以及用户是否首先安装了它。这是设计使然。

值得一提的是,您可以在 WinRT 应用程序中调用 Win32 API。它会导致很多问题,并且可能会让人头疼以获得商店的认证。但即便如此,并非所有 API 都对您开放。而且你会发现这个特殊的用例是行不通的。

【讨论】:

  • 我在更新中写了这个:我正在尝试从 Win32 api 访问 WinRT,而不是从 WinRT 访问 WinRT
【解决方案2】:

我相信这是不可能的。在 Windows 8 'Metro' 中,只有一个应用程序处于活动状态。当最上面的应用程序正在运行时,所有其他应用程序将处于暂停状态。这使得无法编写一个应用程序来监视当前正在执行的其他应用程序。

请参阅numerous articles on the Windows 8 app lifecycle

【讨论】:

  • +1,虽然我不会将其描述为原因。原因很简单,操作系统旨在隐藏 WinRT 应用程序的信息。 几个没有其他应用程序实际上正在运行,与WinRT应用程序无关。
  • 但是在 Windows 的桌面版本中,我有“经典”应用程序与 WinRT 应用程序并排运行,所以也许从“经典”win32 我可以访问用户正在做什么?
  • 我相信 Garath 正在寻找一种方法来从他的 Win32 程序中获取当前正在运行的 Metro™/Modern©/Lollipop® 应用程序,而不是另一个棒棒糖应用程序。
  • 完全正确 :) 我知道从我的 Metro 应用程序中访问另一个 Metro 应用程序是不可能的:)
  • 显然,从桌面程序枚举 Metro 应用程序是可能的,因为任务管理器可以做到这一点。我不熟悉任何新的 WinRT API,但必须有一些用于应用枚举的东西。
猜你喜欢
  • 2012-04-06
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多