“UWP”和“沉浸式”应用程序是一回事吗?如果不是,有什么区别?

c00*_*0fd 5 c++ winapi microsoft-metro uwp

我试图理解 Microsoft 使用的术语。当IsImmersiveProcess返回时TRUE,是否也意味着该进程是一个UWP应用程序,正如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);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,一个过程可以是UWP和不是Immersive,反之亦然?

编辑:查看IsImmersiveProcessAPI内部显示了以下非常简单的逻辑。不幸的是NtUserGetProcessUIContextInformationPROCESS_UICONTEXT_INFORMATION似乎没有记录。我只能猜测,该值0表示“经常” Win32进程和12immersive应用程序。不知道会有什么不同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);
Run Code Online (Sandbox Code Playgroud)

Vin*_*ent 4

“沉浸式”是 UWP 应用的旧名称。这是他们在 Windows 8 上的最初名称,后来称为“metro”、“store”,然后是“universal”应用程序。

任何来自商店且基于WinRT API 的应用程序都是“沉浸式”应用程序。选择沉浸式是因为该应用程序在 Windows 8 上全屏执行。

MSDN 文档正在消除歧义:

IsImmersiveProcess 函数

确定进程是否属于 Windows 应用商店应用程序。

MSDN 页面可用于IsImmersiveProcess

总结一下:

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