戎玉珂 发表于 2025-6-4 16:47:33

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

Windows有一个展台(Kiosk)模式。展台模式可以使Windows作为数字标牌进行使用。具体请参考Windows 展台
配置完展台模式,重启设备后,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;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

届表 发表于 2025-12-7 01:23:34

分享、互助 让互联网精神温暖你我

村亢 发表于 2026-1-22 04:45:14

喜欢鼓捣这些软件,现在用得少,谢谢分享!

任修 发表于 2026-1-22 13:33:38

谢谢楼主提供!

梦霉 发表于 2026-1-23 07:58:55

喜欢鼓捣这些软件,现在用得少,谢谢分享!

劳暄美 发表于 2026-1-24 09:50:04

过来提前占个楼

旌磅箱 发表于 2026-1-24 11:42:53

东西不错很实用谢谢分享

予捻 发表于 2026-1-25 10:15:41

热心回复!

伯绮梦 发表于 2026-1-25 12:09:08

谢谢楼主提供!

肿圬后 发表于 2026-1-27 02:32:38

感谢,下载保存了

訾懵 发表于 2026-1-28 02:56:18

分享、互助 让互联网精神温暖你我

砂歹汤 发表于 2026-1-28 09:58:11

懂技术并乐意极积无私分享的人越来越少。珍惜

纪睐讦 发表于 2026-1-28 17:32:17

感谢分享,学习下。

郦珠雨 发表于 2026-1-29 02:19:36

感谢分享,下载保存了,貌似很强大

表弊捞 发表于 2026-1-29 08:50:23

感谢分享

东新 发表于 2026-2-1 08:55:03

热心回复!

仇华乐 发表于 2026-2-1 20:22:47

谢谢分享,辛苦了

越蔓蔓 发表于 2026-2-3 07:38:54

鼓励转贴优秀软件安全工具和文档!

笃扇 发表于 2026-2-3 08:08:16

喜欢鼓捣这些软件,现在用得少,谢谢分享!

讥慰捷 发表于 2026-2-6 21:29:12

yyds。多谢分享
页: [1] 2
查看完整版本: C++判断当前程序是否运行在Windows展台(Kiosk)模式下