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;
}
C++判断当前程序是否运行在Windows展台(Kiosk)模式下的更多相关文章
- [转]判断程序是否运行在 Windows x64 系统下
以下功能代码判断是否运行在 Windows x64 下.本例使用 Windows API 函数 IsWow64Process,具体请参考MSDN文档:http://msdn.microsoft.com ...
- Inno Setup安装、卸载时判断是否程序正在运行
var ErrorCode: Integer; IsRunning: Integer; // 安装时判断客户端是否正在运行 function InitializeSetup(): Boolean; b ...
- 运行于Windows内建账户下的服务访问映射网络驱动器的方法
Windows服务如果是运行在本地系统帐户下或本地服务帐户下,它只能访问这个账户自己创建的映射驱动器,UNC路径访问则不受次限制. LocalService Account (NT AUTHORITY ...
- Xcode/iOS: 如何判断代码运行在DEBUG还是RELEASE模式下?
原帖链接:http://stackoverflow.com/a/9063469 首先确定下项目的 Build Settings 是否已经设置过宏定义 DEBUG,如何看呢? 点击 Build Sett ...
- 【译】x86程序员手册38-10.2实在址模式下的软件初始化
10.2 Software Initialization for Real-Address Mode 实地址模式的软件初始化 In real-address mode a few structur ...
- Docker - 运行 containers 使用在 swarm 模式下创建的 overlay 模式的 network
前言 在Docker engine v1.12, 使用Swarm可以方便的创建overlay模式的网络,但是它只能被swarm下面的service所使用的,相对于container,这个网络是完全隔离 ...
- C# 判断某程序是否运行
[DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [Dl ...
- windows命令行模式下无法打开python程序解决方法
今天刚开始学Python,首先编写一个简单地hello world程序,想在命令行模式运行,结果出现下面: 经过一番思考,发现用cd命令可以解决这件事,看下图: 这样就解决了.
- 在 Windows 8、Windows 10 桌面模式下的 .NET Framework 程序中,引用 Windows.Runtime 的 API。
参考:1.https://www.cnblogs.com/webtojs/p/9675956.html 2.http://jennal.com/2016/04/28/using-windows-run ...
- [Selenium]Grid模式下运行时打印出当前Case在哪台node机器上运行
当Case在本地运行成功,在Grid模式下运行失败时,我们需要在Grid模式下进行调试,同时登录远程的node去查看运行的情况. Hub是随机将case分配到某台node上运行的,怎样知道当前的cas ...
随机推荐
- 【python爬虫案例】用python爬豆瓣电影TOP250排行榜!
目录 一.爬虫对象-豆瓣电影TOP250 二.python爬虫代码讲解 三.同步视频 四.获取完整源码 一.爬虫对象-豆瓣电影TOP250 前几天,我分享了一个python爬虫案例,爬取豆瓣读书TOP ...
- Typora+免费图床,构建随处可用的Markdown文档
Typora+PicGo+Gitee自动上传图片 视频教程: https://www.bilibili.com/video/BV1hT4y1f7Mf?from=search&seid=1546 ...
- Windows server 2012 R2开机进入cmd,关闭后黑屏
出现此问题,一般只有两种情况,操作系统装置前和操作系统装置后出现: 第一种: 装置操作系统的时候没有选择"Windows Server 2012 R2 Strandard( 带有GUI的服务 ...
- 记录一次uniapp使用scrollview
在uni-app框架下,使用scroll-view进行下拉加载时,不要设置 scroll-top 或者 scroll-left 否则会出现,页面抖动的情况
- CentOS7部署ES(单机)
一.创建路径,解压 ## 创建路径 [root@localhost /]# cd /data [root@localhost data]# mkdir ES ## 解压 [root@localhost ...
- C 语言编程 — 异常处理
目录 文章目录 目录 前文列表 异常处理 perror() 和 strerror() 输出异常信息 程序退出状态 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基 ...
- java获取Linux和window系统多网卡mac地址和IP
public static List<Map<String, String>> getMacAndIp() throws SocketException { List<M ...
- 用STM32F4的DMA实现高速、实时的同步并行通信——以读取高速ADC为例[原创www.cnblogs.com/helesheng]
大概6-7年前,在网上看到过一篇用STM32F1的DMA控制GPIO输出高速数字波形的帖子.觉得很有意思,就自己试了试:控制GPIO输出波形翻转的速度最高只能达到3-4MHz,且容易受到STM32F1 ...
- RuoYi(若依)前后端分离版本,windows下部署(nginx)
摘自:https://blog.csdn.net/yueyekkx/article/details/105505490 上一篇用了tomcat部署(https://blog.csdn.net/yuey ...
- layUI table.reload 刷新表格
table.reload('test', { url: tableUrl + "&vkey=" + g_vkey });