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内部显示了以下非常简单的逻辑。不幸的是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);
Run Code Online (Sandbox Code Playgroud)
“沉浸式”是 UWP 应用的旧名称。这是他们在 Windows 8 上的最初名称,后来称为“metro”、“store”,然后是“universal”应用程序。
任何来自商店且基于新WinRT API 的应用程序都是“沉浸式”应用程序。选择沉浸式是因为该应用程序在 Windows 8 上全屏执行。
MSDN 文档正在消除歧义:
IsImmersiveProcess 函数
确定进程是否属于 Windows 应用商店应用程序。
MSDN 页面可用于IsImmersiveProcess
总结一下: