Windows 8 从Metro应用程序检测桌面可用性(检测ARM、检测Windows RT系统)

Windows 8 从Metro应用程序检测桌面可用性(检测ARM、检测Windows RT系统),windows-8,arm,microsoft-metro,windows-runtime,desktop,Windows 8,Arm,Microsoft Metro,Windows Runtime,Desktop,这是一个与之相关但不是重复的问题 是否有任何选项可以从Metro应用程序检测系统上是否有可用的桌面功能?据我所知,操作系统版本的检测是不受支持的,这是可以的 但是,我的metro应用程序需要知道它运行的系统上是否有可用的桌面 所谓桌面,我指的是可扩展桌面-桌面,在这里可以安装第三方桌面应用程序。正如我们所知,基于ARM的设备也将拥有桌面,但只有使用Microsoft内置程序 我是否可以区分我的Metro应用程序是在基于ARM的平板电脑上运行,而不是在所有其他(基于英特尔的)设备上运行,而这些设备

这是一个与之相关但不是重复的问题

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

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

所谓桌面,我指的是可扩展桌面-桌面,在这里可以安装第三方桌面应用程序。正如我们所知,基于ARM的设备也将拥有桌面,但只有使用Microsoft内置程序


我是否可以区分我的Metro应用程序是在基于ARM的平板电脑上运行,而不是在所有其他(基于英特尔的)设备上运行,而这些设备是在具有不可扩展桌面的平板电脑上运行?

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

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


非动态版本是使用特定于目标的体系结构而不是任何CPU,然后在构建时使用带有#ifdef的风格对其进行硬编码。但是,您必须向商店提交3个软件包。

经过更广泛的搜索后,我找到了一种方法。提示就在这个网站上。Windows应用商店应用程序似乎完全支持这种方法——尽管使用了pinvoke,但应用程序证书工具包测试运行顺利

我最终得到了以下代码:

    [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
    }

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

您想解决什么情况?为什么商店应用程序需要了解桌面?具体是哪些库,Rob?哦,好的,关于3个软件包的想法将是一个解决方案。然而,3种不同的包装有哪些缺点?更多的维护,可能会让最终用户更加困惑,而且…?最终用户不会感到困惑。他们只是从商店安装应用程序,一切都看不见——他们不知道他们得到的是哪个软件包。对你来说,你有3个软件包要上传,根据你的测试理念,还有3个软件包要测试。如果从现在开始的几个版本中,微软决定发布一个适用于x86处理器的Windows RT版本,你的应用会怎么样(注:这纯粹是猜测,我不知道这是否在计划中)?使用处理器体系结构似乎是判断您所使用的操作系统是否允许任意桌面应用的一个糟糕方法。我也将发布新版本;)但我同意这肯定不是一个最佳解决方案。然而,如果背后的理念是:不要搜索硬件、平台、操作系统,而是搜索功能,那么我希望在未来的版本中,会有一个简单的API调用来了解桌面功能……为什么?杰夫·布兰德(Jeff Brand)在上面问了这个问题:如果你知道你在一台能够运行任意桌面应用程序的机器上运行,你会采取什么不同的做法?