【问题标题】:Detect Desktop availability from Metro application (detect ARM, detect Windows RT system)从 Metro 应用程序检测桌面可用性(检测 ARM,检测 Windows RT 系统)
【发布时间】:2012-08-29 15:20:43
【问题描述】:

这是一个与Get OS-Version in WinRT Metro App C# 相关的问题,但不是其重复项。

是否有任何选项可以从 Metro 应用程序中检测系统上是否有可用的桌面功能?我知道不支持检测操作系统版本,这没关系。

但是,我的 Metro 应用程序需要知道运行它的系统上是否有可用的桌面。

我所说的桌面是指可扩展桌面 - 桌面,可以安装第 3 方桌面应用程序。正如我们所知,基于 ARM 的单元也将拥有桌面,但仅限于 Microsoft 内置程序。

我能否区分我的 Metro 应用程序是在具有不可扩展桌面的基于 ARM 的平板电脑上运行,还是在具有可扩展桌面的所有其他(基于 Intel 的)设备上运行?

【问题讨论】:

  • 你想解决什么场景?为什么商店应用需要了解桌面?

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


【解决方案1】:

经过更广泛的搜索后,我找到了GetNativeSystemInfo 方法。提示立即出现在 SO 网站上 - 这个question。 Windows 应用商店应用程序似乎完全支持这种方法 - 尽管使用了 pinvoke,但 App Cert Kit 测试运行顺利。

我最终得到了以下代码:

    [DllImport("kernel32.dll")]
    internal static extern void GetNativeSystemInfo(ref SystemInfo lpSystemInfo);

    internal static bool IsArmBased()
    {
        var sysInfo = new SystemInfo();
        GetNativeSystemInfo(ref sysInfo);
        return sysInfo.wProcessorArchitecture == ProcessorArchitectureArm; //ushort 5
    }

这似乎是我一直在寻找的解决方案。如果不是,请告诉我,或者让我知道与这种方法相关的任何问题。谢谢。

【讨论】:

  • 如果从现在开始的几个版本中,Microsoft 决定发布适用于 x86 处理器的 Windows RT 版本,您的应用会发生什么情况(注意:这纯属猜测 - 我不知道这是否在计划中)?使用处理器架构似乎不太适合确定您所在的操作系统是否允许任意桌面应用程序。
  • 我也会简单地发布新版本;)但同意这肯定不是最佳解决方案。但是,如果背后的理念是:不要搜索硬件、平台、操作系统,而是搜索功能,那么我希望在未来的某个版本中,将有一个简单的 API 调用来确定桌面功能......
  • 为什么? Jeff Brand 在上面问了这个问题:如果您知道自己在一台能够运行任意桌面应用程序的机器上运行,您会采取什么不同的做法?
【解决方案2】:

如果这是 HTML,你可以使用window.cpuClass 来获取它是 ARM、x86 还是 amd64。

非动态版本是使用特定于目标的架构而不是 AnyCPU,然后使用带有#ifdefs 的风格在构建时对其进行硬编码。但是,您必须向商店提交 3 个包裹。

【讨论】:

  • 哦,好吧,关于 3 个包的想法将是一个解决方案。然而 3 种不同的包装有什么缺点呢?更多的维护,可能会给最终用户带来更多的困惑,还有......?
  • 最终用户不会感到困惑。他们只是从商店安装应用程序,一切都看起来很完美——他们不知道他们得到了哪个包。对你来说,你有 3 个包要上传,根据你的测试理念,有 3 个包要测试。
【解决方案3】:

使用 try {} catch(){} 访问这些库,如果出现任何问题,假设 ARM 版本。

【讨论】:

  • Rob 具体是哪些库?
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多