C++判断当前程序是否运行在Windows展台(Kiosk)模式下

cnblogs 2024-06-26 08:09:12 阅读 77

Windows有一个展台(Kiosk)模式。展台模式可以使Windows作为数字标牌进行使用。具体请参考Windows 展台

配置完展台模式,重启设备后,Windows会以全屏的方式运行展台应用,无法进入桌面。有点类似iPhone中的引导者模式。此时我们自己的应用如果设置了开机自启,也会运行,但是会被展台应用遮挡,无法显示在最前,即使设置了TOPMOST也没有用。其原因是展台应用使用了UIAccess

如图:将Windows安全中心为展台应用

image

image

那如何判断我们的应用现在已经被展台遮挡了呢?

配置展台时,系统会将展台账户的SID写入注册表HKLM\SOFTWARE\Microsoft\Windows\AssignedAccessConfiguration\Configs\的子级,我们只需要获取当前进程的用户令牌,根据令牌拿到SID,再查询此SID是否存在于注册表中即可。

关键代码如下:

bool CheckIsKioskMode()

{

HANDLE hToken = NULL;

if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))

{

DWORD dwSize = 0;

if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &dwSize) && GetLastError() == ERROR_INSUFFICIENT_BUFFER)

{

PTOKEN_USER pTokenUser = (PTOKEN_USER)malloc(dwSize);

if (GetTokenInformation(hToken, TokenUser, pTokenUser, dwSize, &dwSize))

{

PSID pSid = pTokenUser->User.Sid;

LPTSTR strSid = NULL;

if (ConvertSidToStringSidW(pSid, &strSid))

{

std::wstring basePath = L"SOFTWARE\\Microsoft\\Windows\\AssignedAccessConfiguration\\Configs\\";

std::wstring registryPath = basePath + strSid;

HKEY hKey;

LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, registryPath.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hKey);

LocalFree(strSid);

free(pTokenUser);

CloseHandle(hToken);

if (result == ERROR_SUCCESS)

{

RegCloseKey(hKey);

printf("当前进程所在的会话是展台Kiosk模式\n");

return true;

}

else

{

return false;

}

}

free(pTokenUser);

}

}

CloseHandle(hToken);

}

return false;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。