很久之前实现的功能,也是参考其他人的实现,时间太久,具体参考哪里已经记不得了。

这里不仅能屏蔽一般的快捷键,还可以屏蔽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系统快捷键的更多相关文章

  1. win10系统桌面快捷键图标异常解决方法

    win10系统桌面快捷键图标异常解决方法 前言: 有一次我的一个图标变成白色,找到:https://jingyan.baidu.com/article/948f5924148e67d80ef5f947 ...

  2. Win10系统创建关机快捷方式和快捷键的方法,实现一键关机

    想不想关机变得更加简单?在Win10中总有些朋友想要快速的操作体验,所以关机这个经常使用的功能也被设置的更简单,下面小编要分享的是“Win10系统创建关机快捷方式和快捷键的方法”. 1.在win10下 ...

  3. Win10系统中新增的快捷键,做个记录

    Win10系统中新增的快捷键,做个记录 1.Win+Q或者Win+S 打开下面搜索框                                2.Win+T 切换任务栏上程序:   3.Win+ ...

  4. win10系统的快捷键

    1.win10特有的快捷键:任务视图和虚拟桌面相关 (1)Win + Tab:查看任务视图 (2)Win + Ctrl + D:在任务视图中新建虚拟桌面 (3)Win + Ctrl + F4:关闭当前 ...

  5. Win10系统出问题?简单一招即可修复win10!

    时至今日,win10系统的普及率越来越高,在微软多种策略的强推下,10月份win10系统的市场份额已达22.59%,但win10系统也不是完美的,总有些还是会出现一些诸如打开应用程序出现闪退.乱码.总 ...

  6. win10快捷键大全 win10常用快捷键

    win10快捷键大全大家可以来了解一下,今天小编带来了win10常用快捷键,很多朋友喜欢使用快捷键来操作电脑,那么Windows10系统有哪些新的快捷键呢• 贴靠窗口:Win +左/右> Win ...

  7. win10系统的“USB选择性暂停设置”怎么打开

    Win10系统自带的“USB选择性暂停设置”功能开启后会帮助我们节省电源,这一项功能对于笔记本来说用处很大.那么怎样才能打开这一功能呢?下面小编就来告诉大家打开“USB选择性暂停设置”功能的方法. 1 ...

  8. Win10优化:这8个操作简单的小方法让你的Win10系统更加流畅

    目前,市场上比较流行的主流电脑系统无非就是win7和win10这两个,这两个也是比较稳定的.但是自从微软发布将于2020年停止对win7支持后,很多小伙伴也表示无奈之下得升win10了啊. win10 ...

  9. win10总是2分钟就自动睡眠怎么办 win10系统自动休眠bug怎么解决(转)

        解决方法如下: 1.右键点击开始图标,选择[运行],或者利用快捷键“win+R”打开运行窗口,win键是ctrl和alt键中间的徽标键:

随机推荐

  1. 课程五(Sequence Models),第二 周(Natural Language Processing & Word Embeddings) —— 2.Programming assignments:Emojify

    Emojify! Welcome to the second assignment of Week 2. You are going to use word vector representation ...

  2. Android--UI之Button

    前言 最近一直在讲androidUI控件的使用方式,这篇博客讲解一下基本上属于用处最广泛的控件之一的Button控件.如果有过其他平台开发经验的程序员,对按钮是不会陌生的.本篇博客首先讲解一下Andr ...

  3. JavaScript高级编程(1)——JavaScript初识

    一.javascript的简介 1.1 javascript的历史回顾. Javascript诞生于1995年.当时,它主要的目的是用来处理一些由服务器端处理的输入验证操作.在javascript没有 ...

  4. solr查询特殊字符的处理

    1. 使用solr的页面功能时,遇到语法错误 2. 确认原因 从lexical error分析时特殊字符的问题. 首先 solr查询有哪些特殊字符? 查找官方文档:http://lucene.apac ...

  5. mysql字符串查找(统计客源)

    如客源状态为1:2:3:5:6:9,其中6代表成交状态 如果要统计查询出有6这个状态的客源,可以用函数LOCATE(字符,搜索的字符串)来, 示例:统计每个分组下全部客源数total,成交客源数dea ...

  6. L1与L2损失函数和正则化的区别

    本文翻译自文章:Differences between L1 and L2 as Loss Function and Regularization,如有翻译不当之处,欢迎拍砖,谢谢~   在机器学习实 ...

  7. Python爬虫的N种姿势

    问题的由来   前几天,在微信公众号(Python爬虫及算法)上有个人问了笔者一个问题,如何利用爬虫来实现如下的需求,需要爬取的网页如下(网址为:https://www.wikidata.org/w/ ...

  8. C# 转换关键字 operator

    operator 使用 operator 关键字重载内置运算符,或在类或结构声明中提供用户定义的转换. 假设场景,一个Student类,有语文和数学两科成绩,Chinese Math,加减两科成绩,不 ...

  9. .NET页面导出Excel

    public static void CreateExcel(DataSet ds)        {            string filename = DateTime.Now.ToStri ...

  10. Base64字符保存图片,图片转换成Base64字符编码

    //文件转换成Base64编码 public static String getFileBase64Str(String filePath) throws IOException { String f ...