我正在尝试理解 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 内部显示了以下非常简单的逻辑。不幸的是,NtUserGetProcessUIContextInformation
和 PROCESS_UICONTEXT_INFORMATION
似乎没有记录。我只能猜测值 0
代表“常规”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);
最佳答案
“沉浸式”是 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/