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

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

Windows有一个展台(Kiosk)模式。展台模式可以使Windows作为数字标牌举行利用。具体请参考Windows 展台
配置完展台模式,重启设备后,Windows会以全屏的方式运行展台应用,无法进入桌面。有点雷同iPhone中的引导者模式。此时我们自己的应用如果设置了开机自启,也会运行,但是会被展台应用遮挡,无法显示在最前,即使设置了TOPMOST也没有用。其缘故原由是展台应用利用了UIAccess。
如图:将Windows安全中央为展台应用


那如何判断我们的应用现在已经被展台遮挡了呢?
配置展台时,系统会将展台账户的SID写入注册表HKLM\SOFTWARE\Microsoft\Windows\AssignedAccessConfiguration\Configs\的子级,我们只需要获取当进步程的用户令牌,根据令牌拿到SID,再查询此SID是否存在于注册表中即可。
关键代码如下:
  1. bool CheckIsKioskMode()
  2. {
  3.     HANDLE hToken = NULL;   
  4.     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
  5.     {
  6.         DWORD dwSize = 0;
  7.         if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &dwSize) && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
  8.         {
  9.             PTOKEN_USER pTokenUser = (PTOKEN_USER)malloc(dwSize);
  10.             if (GetTokenInformation(hToken, TokenUser, pTokenUser, dwSize, &dwSize))
  11.             {
  12.                 PSID pSid = pTokenUser->User.Sid;
  13.                 LPTSTR strSid = NULL;
  14.                 if (ConvertSidToStringSidW(pSid, &strSid))
  15.                 {
  16.                     std::wstring basePath = L"SOFTWARE\\Microsoft\\Windows\\AssignedAccessConfiguration\\Configs\";
  17.                     std::wstring registryPath = basePath + strSid;
  18.                     HKEY hKey;
  19.                     LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, registryPath.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
  20.                     LocalFree(strSid);
  21.                     free(pTokenUser);
  22.                     CloseHandle(hToken);
  23.                     if (result == ERROR_SUCCESS)
  24.                     {
  25.                         RegCloseKey(hKey);
  26.                         printf("当前进程所在的会话是展台Kiosk模式\n");
  27.                         return true;
  28.                     }
  29.                     else
  30.                     {
  31.                         return false;
  32.                     }
  33.                 }
  34.                 free(pTokenUser);
  35.             }
  36.         }
  37.         CloseHandle(hToken);
  38.     }
  39.     return false;
  40. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表