识别窗口的变体

Identifying variations of windows

本文关键字:窗口 识别      更新时间:2023-10-16

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

#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任何x86程序都应设置为DESKTOP,PC_APP x86上的Windows应用商店应用程序,因此我在DESKTOP之前检查PC_APP。然后,PHONE_APP Windows 8 Phone应用程序,并且APP是为所有内容定义的,因此我认为如果其他应用程序都没有成功,我们必须使用WinRT应用程序。这是对的吗?另外,我相信此标头仅包含在最新版本的MSVC中,在默认为Win32检查之前,我应该使用什么截止点?2011年之前的东西足够好吗?

根据您要区分这些的原因,有比您的方法更好的方法来解决此问题。 例如,如果您想知道可以访问什么 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