Windows展台模式及其应用

Windows操作系统具有一个展台(Kiosk)模式,使其可以用于数字标牌展示。在配置完展台模式并重启设备后,Windows会以全屏方式运行展台应用,无法进入桌面,类似于iPhone的引导者模式。此时,即使我们的应用设置了开机自启,也会被展台应用遮挡,无法显示在最前,即使设置了 TOPMOST 也没有用。这是因为展台应用使用了 UIAccess

当将Windows安全中心设置为展台应用时,系统会将展台账户的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;
}

以上是关于Windows展台模式的相关信息,以及如何判断应用是否被展台遮挡的方法。

以下是两张相关图片:

标签:游戏攻略