"UWP" 和 "Immersive" app 是一回事吗?如果不是,有什么区别?

Is "UWP" and "Immersive" app the same thing? And if not, what's the difference?

我正在尝试了解 Microsoft 使用的术语。当IsImmersiveProcess returns TRUE does it also mean that the process is a UWP app as reported by the TokenIsAppContainer查询其令牌时?

这是一个小代码片段来说明我的意思:

HANDLE hProc = ::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
if (hProc)
{
    HANDLE hToken;
    if (::OpenProcessToken(hProc, TOKEN_QUERY, &hToken))
    {
        DWORD dwAppContainer = 0;
        DWORD dwDummy = 0;
        if (::GetTokenInformation(hToken, TokenIsAppContainer, &dwAppContainer, sizeof(dwAppContainer), &dwDummy))
        {
            wprintf(L"isUWP=%d\n", dwAppContainer);
        }

        ::CloseHandle(hToken);
    }

    wprintf(L"isImmersive=%d\n", ::IsImmersiveProcess(hProc));

    ::CloseHandle(hProc);
}

换句话说,进程可以是UWP而不是Immersive,反之亦然吗?

编辑: 向内看 IsImmersiveProcess API 显示了以下非常简单的逻辑。不幸的是 NtUserGetProcessUIContextInformationPROCESS_UICONTEXT_INFORMATION 似乎没有记录。我只能猜测值 0 代表 "regular" Win32 进程,12 代表 immersive 应用程序。不确定 12 有何不同?

EDIT2: 根据 eryksun 在下面评论中的发现,NtUserGetProcessUIContextInformation 函数可能已被声明为:

enum PROCESS_UICONTEXT{
    PROCESS_UICONTEXT_DESKTOP = 0,
    PROCESS_UICONTEXT_IMMERSIVE,
    PROCESS_UICONTEXT_IMMERSIVE_BROKER,
    PROCESS_UICONTEXT_IMMERSIVE_BROWSER
};

enum PROCESS_UI_FLAGS{
    PROCESS_UIF_NONE = 0,
    PROCESS_UIF_AUTHORING_MODE,
    PROCESS_UIF_RESTRICTIONS_DISABLED
};

struct PROCESS_UICONTEXT_INFORMATION{
    PROCESS_UICONTEXT Context;
    PROCESS_UI_FLAGS flags;
};

BOOL WINAPI NtUserGetProcessUIContextInformation(HANDLE hProc, PROCESS_UICONTEXT_INFORMATION* pProcInfo);

"Immersive" 是 UWP 应用程序的旧名称。这是他们在 Windows 8 上的初始名称,然后称他们为 "metro"、"store",然后是 "universal" app.

任何来自商店并基于 new WinRT API 的应用都是 "immersive" 应用。选择沉浸式是因为该应用程序在 Windows 8.

上全屏执行

MSDN 文档正在消除歧义:

IsImmersiveProcess function

Determines whether the process belongs to a Windows Store app.

MSDN 页面可用于 IsImmersiveProcess

总结:

  • 应用容器中的所有 Store/WinRT/UWP 个应用程序 运行。这是由 OS.
  • 强制执行的
  • Legacy win32 应用程序可以在应用程序容器中选择 到 运行 以提高其安全性。每个应用程序都必须决定它想要什么。