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

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

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

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

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

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

关键代码如下:

cpp 复制代码
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;
}
相关推荐
wljy19 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
云泽8089 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
繁华落尽,倾城殇?9 小时前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
代码村新手10 小时前
C++-二叉搜索树
开发语言·c++
智者知已应修善业10 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业10 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
玖釉-14 小时前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表
Mister西泽15 小时前
C++ Primer Plus 第六版 编程练习题及详细答案
开发语言·c++·学习·visual studio
Qt程序员15 小时前
从上电到系统就绪:ARM+U-Boot 嵌入式 Linux 启动流程
linux·运维·c++·内核·设备树·嵌入式·ram
cany100016 小时前
C++ -- lambda捕获
c++