c++屏蔽Win10系统快捷键
很久之前实现的功能,也是参考其他人的实现,时间太久,具体参考哪里已经记不得了。
这里不仅能屏蔽一般的快捷键,还可以屏蔽ctrl+atl+del。
int globlePid = ;
HHOOK keyHook = NULL;
HHOOK mouseHook = NULL; //键盘钩子过程
LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//在WH_KEYBOARD_LL模式下lParam 是指向KBDLLHOOKSTRUCT类型地址
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
//如果nCode等于HC_ACTION则处理该消息,如果小于0,则钩子子程就必须将该消息传递给 CallNextHookEx
//if (nCode == HC_ACTION){
if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(VK_SHIFT) & 0x8000){
qDebug() << "Ctrl+Shift+Esc";
return ;
}
else if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000){
qDebug() << "Ctrl+Esc";
return ;
}
else if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN){
qDebug() << "Alt+Tab";
return ;
}
else if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN){
qDebug() << "Alt+Esc";
return ;
}
else if (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN){
qDebug() << "LWIN/RWIN";
return ;
}
else if (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN){
qDebug() << "Alt+F4";
return ;
} //return 1;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
//}
return CallNextHookEx(keyHook, nCode, wParam, lParam);
} //鼠标钩子过程
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return ;
} //卸载钩子
void unHook()
{
UnhookWindowsHookEx(keyHook);
// UnhookWindowsHookEx(mouseHook);
} //安装钩子,调用该函数即安装钩子
void setHook()
{
//这两个底层钩子,不要DLL就可以全局
//底层键盘钩子
keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, GetModuleHandle(NULL), );
//底层鼠标钩子
// mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,GetModuleHandle(NULL),0);
} //提升权限
void EnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
CloseHandle(hToken);
return;
}
tkp.PrivilegeCount = ;
tkp.Privileges[].Luid = sedebugnameValue;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
CloseHandle(hToken);
return;
}
} char* ConvertLPWSTRToLPSTR(LPWSTR lpwszStrIn)
{
LPSTR pszOut = NULL;
if (lpwszStrIn != NULL)
{
int nInputStrLen = wcslen(lpwszStrIn); // Double NULL Termination
int nOutputStrLen = WideCharToMultiByte(CP_ACP, , lpwszStrIn, nInputStrLen, NULL, , , ) + ;
pszOut = new char[nOutputStrLen]; if (pszOut)
{
memset(pszOut, 0x00, nOutputStrLen);
WideCharToMultiByte(CP_ACP, , lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, , );
}
}
return pszOut;
} //冻结
void Freeze()
{
//枚举进程信息
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); int processPid;
//CString strTmp;
BOOL b = ::Process32First(hProcessSnap, &pe32);
while (b)
{
processPid = pe32.th32ProcessID;
char *exeFile = ConvertLPWSTRToLPSTR(pe32.szExeFile);
if (strcmp(exeFile, "winlogon.exe") == )
{
break;
} delete[] exeFile; b = ::Process32Next(hProcessSnap, &pe32);
}
::CloseHandle(hProcessSnap); THREADENTRY32 th32;
th32.dwSize = sizeof(th32);
HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, );
globlePid = processPid;
unsigned long Pid;
Pid = processPid;
b = ::Thread32First(hThreadSnap, &th32);
while (b)
{
if (th32.th32OwnerProcessID == Pid)
{
HANDLE oth = OpenThread(THREAD_ALL_ACCESS, FALSE, th32.th32ThreadID);
if (!(::SuspendThread(oth)))
{
qDebug() << "freeze successed";
}
else
{
qDebug() << "freeze failed";
}
CloseHandle(oth);
break;
}
::Thread32Next(hThreadSnap, &th32);
}
::CloseHandle(hThreadSnap);
} void unFreeze()
{
unsigned long Pid;
Pid = globlePid; THREADENTRY32 th32;
th32.dwSize = sizeof(th32); HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, );
BOOL b = ::Thread32First(hThreadSnap, &th32);
while (b)
{
if (th32.th32OwnerProcessID == Pid)
{
HANDLE oth = OpenThread(THREAD_ALL_ACCESS, FALSE, th32.th32ThreadID);
if (::ResumeThread(oth))
{
qDebug() << "unfreeze successed";
}
else
{
qDebug() << "unfreeze failed";
}
CloseHandle(oth);
break;
}
::Thread32Next(hThreadSnap, &th32);
}
::CloseHandle(hThreadSnap);
}
调用:
//屏蔽ctrl+alt+del
EnableDebugPriv();
Freeze();
//屏蔽其他快捷键
setHook();
c++屏蔽Win10系统快捷键的更多相关文章
- win10系统桌面快捷键图标异常解决方法
win10系统桌面快捷键图标异常解决方法 前言: 有一次我的一个图标变成白色,找到:https://jingyan.baidu.com/article/948f5924148e67d80ef5f947 ...
- Win10系统创建关机快捷方式和快捷键的方法,实现一键关机
想不想关机变得更加简单?在Win10中总有些朋友想要快速的操作体验,所以关机这个经常使用的功能也被设置的更简单,下面小编要分享的是“Win10系统创建关机快捷方式和快捷键的方法”. 1.在win10下 ...
- Win10系统中新增的快捷键,做个记录
Win10系统中新增的快捷键,做个记录 1.Win+Q或者Win+S 打开下面搜索框 2.Win+T 切换任务栏上程序: 3.Win+ ...
- win10系统的快捷键
1.win10特有的快捷键:任务视图和虚拟桌面相关 (1)Win + Tab:查看任务视图 (2)Win + Ctrl + D:在任务视图中新建虚拟桌面 (3)Win + Ctrl + F4:关闭当前 ...
- Win10系统出问题?简单一招即可修复win10!
时至今日,win10系统的普及率越来越高,在微软多种策略的强推下,10月份win10系统的市场份额已达22.59%,但win10系统也不是完美的,总有些还是会出现一些诸如打开应用程序出现闪退.乱码.总 ...
- win10快捷键大全 win10常用快捷键
win10快捷键大全大家可以来了解一下,今天小编带来了win10常用快捷键,很多朋友喜欢使用快捷键来操作电脑,那么Windows10系统有哪些新的快捷键呢• 贴靠窗口:Win +左/右> Win ...
- win10系统的“USB选择性暂停设置”怎么打开
Win10系统自带的“USB选择性暂停设置”功能开启后会帮助我们节省电源,这一项功能对于笔记本来说用处很大.那么怎样才能打开这一功能呢?下面小编就来告诉大家打开“USB选择性暂停设置”功能的方法. 1 ...
- Win10优化:这8个操作简单的小方法让你的Win10系统更加流畅
目前,市场上比较流行的主流电脑系统无非就是win7和win10这两个,这两个也是比较稳定的.但是自从微软发布将于2020年停止对win7支持后,很多小伙伴也表示无奈之下得升win10了啊. win10 ...
- win10总是2分钟就自动睡眠怎么办 win10系统自动休眠bug怎么解决(转)
解决方法如下: 1.右键点击开始图标,选择[运行],或者利用快捷键“win+R”打开运行窗口,win键是ctrl和alt键中间的徽标键:
随机推荐
- Buffer的工作方式
1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写 ...
- C# 锁系列目录
1.lock.Monitor lock(obj){} 编译之后是如下代码 Monitor.Enter(obj); try { // } finally { Monitor.Exit(obj); } 2 ...
- transform:scale()妙用——当下拉列表,图片无缝拉升 动画效果
遇到问题 昨天在做音乐播放器的时候,遇到了一个这样的界面: 当下拉scroll区域列表的时候,图片会按照比例无缝连接放大,就想下面的效果图一样 分析问题 从上图可一看到,页面主要由两个div组成, ...
- Jenkins入门之任务基本操作
首先先简单讲一下Jenkins构建任务各种图标的含义 我的主界面有以下构建任务,这里前两列都是图标,第一列为构建的状态,前面已经讲过蓝色代表成功,红色代表失败.当然那是针对一次构建,一个构建任务可能有 ...
- Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
应用场景 前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略: 自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成 ...
- zepto 事件分析3(add函数)
在上一篇的分析中,最后$.on方法返回了一个add方法函数的执行,在这里先看一下其代码: function add(element, events, fn, data, selector, deleg ...
- B树与B+详解
承接上篇SQLite采用B树结构使得SQLite内存占用资源较少,本篇将讲述B树的具体操作(建树,插入,删除等操作).在看博客时,建议拿支笔和纸,一点一点操作,毕竟知识是自己的,自己也要消化的.本篇通 ...
- [转]Ubuntu18.04下使用Docker Registry快速搭建私有镜像仓库
本文转自:https://blog.csdn.net/BigData_Mining/article/details/88233015 1.背景 在 Docker 中,当我们执行 docker pull ...
- Dapper批量更新
本次示例项目使用Dappe1.50.5和Dapper.Contrib1.50.5 数据库执行的脚本检测工具是SQL Server Prifiler 1.使用Where In 实现批量更新 1.1代码如 ...
- c# 服务
注:服务里的timer System.Timers.Timer time=new System.Timers.Timer(); time.Interval = 3000; //设置计时器事件间隔执 ...