"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 显示了以下非常简单的逻辑。不幸的是 NtUserGetProcessUIContextInformation
和 PROCESS_UICONTEXT_INFORMATION
似乎没有记录。我只能猜测值 0
代表 "regular" Win32 进程,1
和 2
代表 immersive
应用程序。不确定 1
与 2
有何不同?
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 应用程序可以在应用程序容器中选择 到 运行 以提高其安全性。每个应用程序都必须决定它想要什么。
我正在尝试了解 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 显示了以下非常简单的逻辑。不幸的是 NtUserGetProcessUIContextInformation
和 PROCESS_UICONTEXT_INFORMATION
似乎没有记录。我只能猜测值 0
代表 "regular" Win32 进程,1
和 2
代表 immersive
应用程序。不确定 1
与 2
有何不同?
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 应用程序可以在应用程序容器中选择 到 运行 以提高其安全性。每个应用程序都必须决定它想要什么。