c++ - "UWP"和 "Immersive"app 是同一个东西吗?如果不是,有什么区别?

标签 c++ winapi uwp microsoft-metro

我正在尝试理解 Microsoft 使用的术语。当IsImmersiveProcess返回 TRUE 是否也意味着该进程是一个 UWP 应用程序,由 TokenIsAppContainer 报告查询其 token ?

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

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 代表“常规”Win32 进程,12 代表 immersive 应用程序.不确定 12 有何不同?

enter image description here

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);

最佳答案

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

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

MSDN 文档正在消除歧义:

IsImmersiveProcess function

Determines whether the process belongs to a Windows Store app.

MSDN 页面可用于 IsImmersiveProcess

总结:

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

关于c++ - "UWP"和 "Immersive"app 是同一个东西吗?如果不是,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47389164/

相关文章:

c# - 如何像报纸一样将长文本分成几栏?

c# - UWP MediaElement 随机崩溃

c++ - 什么时候不应该使用虚拟析构函数?

c++ - 非托管 C++ 获取当前进程 ID? (控制台应用程序)

c++ - 避免在 ListView 中截断标签

c++ - 所有者使用 Windows API 绘制按钮的文本

c# - 在文本 block 中的文本上添加阴影

c++ - 网格中的空心方 block

c++ - 在 linux 中恢复串口

c++ - 最小无窗口 OpenGL 上下文初始化