识别窗口的变化

时间:2014-02-11 08:26:36

标签: c++ windows visual-c++

我正在编写一个我想在各种平台的程序中使用的库。以下是我检测不同版本Windows的方法:

#if defined(_MSC_VER)

    #include <winapifamily.h>
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)

        // Windows PC Store App
        #define OS_WINDOWS_STORE

    #endif

    #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

        // Windows Desktop App
        #define OS_WINDOWS

    #endif

    #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)

        // Windows Phone App
        #define OS_WINDOWS_PHONE

    #endif

    #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)

        // Windows RT Store App
        #define OS_WINDOWS_RT

    #endif

#elif defined(_WIN32_) || defined(_WIN32)

    // Windows Desktop App
    #define OS_WINDOWS

#endif

我的理解是WINAPI_FAMILY_PARTITION应该设置为DESKTOP用于任何x86程序,PC_APP用于windows存储应用程序在x86上,所以我在DESKTOP之前检查PC_APP。然后,PHONE_APP用于Windows 8 Phone应用程序,并且APP是为所有内容定义的,因此我假设如果没有其他成功,我们必须使用WinRT应用程序。它是否正确?另外,我相信这个标题只包含在MSVC的最新版本中,在默认为Win32检查之前我应该​​使用的截止点是什么? 2011年之前的任何事情都足够好吗?

1 个答案:

答案 0 :(得分:0)

根据您想要区分这些问题的原因,有比您的方法更好的方法来解决这个问题。例如。如果您想知道可以访问哪种API,则应该使用推荐的方法,并在代码中的适当位置检查WINAPI_FAMILY_PARTITION

如果您想使用您的方法,则存在许多问题。首先,你有#ifdefs不匹配。其次,WINAPI_PARTITION_APP是不推荐使用的常量,与WINAPI_FAMILY_PC_APP相同。第三,如果你真的想要识别Windows RT版本,则需要检查CPU,而不是WINAPI_FAMILY,因为Windows RT(即ARM上的Windows 8.1)和Windows 8.1 Store(即x86或x86-64上的Windows应用商店应用)两者都有相同的API。

#if defined(_MSC_VER)

    #include <winapifamily.h>
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)

        #if _M_ARM

            // Windows RT Store App
            #define OS_WINDOWS_RT

        #else

            // Windows PC Store App
            #define OS_WINDOWS_STORE

        #endif

    #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

        // Windows Desktop App
        #define OS_WINDOWS

    #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)

        // Windows Phone App
        #define OS_WINDOWS_PHONE

    #endif

#elif defined(_WIN32_) || defined(_WIN32)

    // Windows Desktop App
    #define OS_WINDOWS

#endif