实现全局hook必须要将hook代码封装在dll里,所以此程序有两个文件:noShiftDeleteHook.dll和noShiftDelete.exe

noShiftDeleteHook.dll

//noShiftDeleteHook.h

#ifdef NOSHIFTDELETEHOOK_EXPORTS
#define NOSHIFTDELETEHOOKDLL_API __declspec(dllexport)
#else
#define NOSHIFTDELETEHOOKDLL_API __declspec(dllimport)
#endif NOSHIFTDELETEHOOKDLL_API void InstallHook(HINSTANCE);
NOSHIFTDELETEHOOKDLL_API void UnInstallHook();
// noShiftDeleteHook.cpp : 定义 DLL 应用程序的导出函数。
// #include "stdafx.h"
#include "noShiftDeleteHook.h" HHOOK hook=NULL; LRESULT CALLBACK keyHookCallback (int nCode,WPARAM wParam,LPARAM lParam)
{
char ch;
LRESULT result=::CallNextHookEx(hook,nCode,wParam,lParam);
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
BOOL bShiftKeyDown = ;
if (wParam==WM_KEYDOWN && nCode == HC_ACTION)
{
bShiftKeyDown=GetAsyncKeyState (VK_SHIFT) >> ((sizeof(SHORT) * ) - );
if (pkbhs->vkCode == VK_DELETE && bShiftKeyDown)
{
MessageBox(,L"拒绝手贱,养成良好习惯,从你做起!",L"不准使用Shift+Delete",MB_OK|MB_SETFOREGROUND|MB_TOPMOST);
return TRUE;
}
}
return result;
}
NOSHIFTDELETEHOOKDLL_API void InstallHook(HINSTANCE _hinstance)
{
hook=(HHOOK)::SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)keyHookCallback,_hinstance,NULL);
if(hook==NULL)
{
MessageBox(,L"安装全局系统钩子失败!",L"提示",MB_OK);
}
} NOSHIFTDELETEHOOKDLL_API void UnInstallHook()
{
BOOL result=UnhookWindowsHookEx(hook);
}

noShiftDelete.exe

// noShiftDelete.cpp : 定义应用程序的入口点。
// #include "stdafx.h"
#include "noShiftDelete.h"
#include <shellapi.h>
#include "../noShiftDeleteHook/noShiftDeleteHook.h"
#pragma comment(lib,"../Release/noShiftDeleteHook.lib") #define MAX_LOADSTRING 100
#define WM_TRAY (WM_USER + 100)
#define WM_TASKBAR_CREATED RegisterWindowMessage(TEXT("TaskbarCreated")) // 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 HMENU hMenu;
NOTIFYICONDATA nid; // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //实例化托盘
void InitTray(HINSTANCE hInstance, HWND hWnd)
{
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = WM_TRAY;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
nid.uCallbackMessage = WM_TRAY;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMALL));
lstrcpy(nid.szTip, L"noShiftDelete v1.0"); hMenu = CreatePopupMenu();//生成托盘菜单
//为托盘菜单添加两个选项
AppendMenu(hMenu, MF_STRING,ID_ABOUT, TEXT("关于..."));
AppendMenu(hMenu, MF_SEPARATOR,ID_TITLE , TEXT("分割线"));
AppendMenu(hMenu, MF_STRING, ID_EXIT, TEXT("退出")); Shell_NotifyIcon(NIM_ADD, &nid);
} int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine); //互斥量阻止程序多次运行
HANDLE m_hMutex = CreateMutex(NULL,FALSE, L"noShiftDelete");
if (GetLastError() ==ERROR_ALREADY_EXISTS)
{
// 如果已有互斥量存在则释放句柄并复位互斥量
CloseHandle(m_hMutex);
m_hMutex=NULL;
return FALSE;
}
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable; // 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_NOSHIFTDELETE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_NOSHIFTDELETE)); // 主消息循环:
while (GetMessage(&msg, NULL, , ))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
} //
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NOSHIFTDELETE));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_NOSHIFTDELETE);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex);
} //
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX,
CW_USEDEFAULT, , , , NULL, NULL, hInstance, NULL);
//安装钩子
HINSTANCE hinstance=GetModuleHandle(L"noShiftDeleteHook.dll");
InstallHook(hinstance); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, SW_HIDE);
UpdateWindow(hWnd);
//实例化托盘
InitTray(hInstance, hWnd);
return TRUE;
} //
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc; switch (message)
{
case WM_TRAY:
switch(lParam)
{
case WM_RBUTTONDOWN:
{
//获取鼠标坐标
POINT pt; GetCursorPos(&pt); //解决在菜单外单击左键菜单不消失的问题
SetForegroundWindow(hWnd); //使菜单某项变灰
//EnableMenuItem(hMenu, ID_SHOW, MF_GRAYED); //显示并获取选中的菜单
int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, hWnd,
NULL);
if(cmd == ID_EXIT)
PostMessage(hWnd, WM_DESTROY, NULL, NULL);
if(cmd == ID_ABOUT)
MessageBox(,L"Email: rophie123@foxmail.com",L"noShiftDelete v1.0",MB_OK);
}
break; }
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
UnInstallHook();
Shell_NotifyIcon(NIM_DELETE, &nid);
PostQuitMessage();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
if (message == WM_TASKBAR_CREATED)
{
//系统Explorer崩溃重启时,重新加载托盘
Shell_NotifyIcon(NIM_ADD, &nid);
}
return ;
}

启动后窗体隐藏最小化到托盘,使用shift+delete时会提示并阻止

编译后文件:点击下载

通过hook实现禁止shift+delete快捷键的更多相关文章

  1. windows 7文件误删shift+delete后找回

    昨天要还电脑了,结果脑子一抽,某个目录还没拷贝,shift+delete了整个目录,删除到一半,完了...我的源码都在里面还没出来啊...这TMD要命啊... 赶紧搜了一把,windows文件误删恢复 ...

  2. HOOK NTFS 禁止格式化

    if(bHooked == FALSE) { RtlInitUnicodeString (&HookDriverName, L"\\FileSystem\\Ntfs"); ...

  3. shift + 空格 快捷键 使输入法 在全角和半角直接切换。。 但是全角输入一个 空格 ,会造成jsp页面 无法正常解析。。比如 无法获得参数。。

    shift + 空格 快捷键 使输入法 在全角和半角直接切换.. 但是全角输入一个 空格 ,会造成jsp页面 无法正常解析....比如 无法获得参数.. 如 <form action=" ...

  4. MyEclipse中Ctrl+Shift+F快捷键格式化代码时不换行

    摘自: http://iteye.blog.163.com/blog/static/18630809620121166622410/ MyEclipse中Ctrl+Shift+F快捷键格式化代码时不换 ...

  5. 手贱使用shift+delete删除文件之后

    昨天整理文件夹,重新整理和命名所有项目文件,几个很久的项目代码使用shift+delete删除了. 今天早上过来说是要发版本,然后发现居然有个工程是在昨天删除的文件夹里,额,~ 然后各种百度,各种go ...

  6. object hook实现禁止创建文件

    object hook实现禁止创建文件 原理不说了,大伙都懂得.. 要解决的问题: ,FILE_NON_DIRECTORY_FILE); if (!NT_SUCCESS(status)) { dpri ...

  7. pycharm中全局搜索ctrl+shift+F快捷键无反应原因和解决

    全局搜索快捷键无反应原因:搜狗输入法占用的ctrl+shift+F快捷键,简繁切换的快捷键.在搜狗输入法中将此项取消.

  8. Sublime Text 全局搜索Ctrl+Shift+F快捷键不能用

      Sublime Text 全局搜索Ctrl+Shift+F快捷键不能用   和微软输入法的简繁体切换冲突了,关闭输入法的简繁体切换快捷键就好了! 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢 ...

  9. 利用FinalData恢复shift+delete误删的文件

    当前位置 : 首页 » 文章分类 :  生活  »  利用FinalData恢复shift+delete误删的文件 上一篇 有关可变形部件模型(Deformable Part Model)的一些说明 ...

随机推荐

  1. codeforces#1139F. Dish Shopping (离散化数组数组+ 扫描线)

    膜拜大佬:https://blog.csdn.net/xyz32768/article/details/88831233 题目链接: http://codeforces.com/contest/113 ...

  2. jQuery手机端点击弹出分享按钮代码

    一.HTML代码如下: <span onClick="toshare()" style="border:dotted 1px #ddd;display:block; ...

  3. ABP实践(2)-ASP.NET Core 2.x版本EntityFrameworkCore(EF)使用mysql数据库

    上一篇中EntityFrameworkCore默认使用的是微软的sql server,本篇改为mysql步骤如下: 1,在基础层xxx.EntityFrameworkCore依赖项添加Pomelo.E ...

  4. CentOS7 64位下MySQL5.7安装与配置(YUM)

    1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ # 下载mysql源安装包 shell> wget ...

  5. IIC时序操作24C02芯片

    1.心血来潮看自己能不能参考时序图重新写一个IIC驱动,加强一下时序图的理解.记录下来,以后遇到此类的IIC时序的芯片可以直接操作. 先说说自己参照手册来写AT24c02的IIC低层驱动,从写完到最后 ...

  6. win10 nginx

    下载后运行报错 nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in ...

  7. Xilinx FPGA 移位寄存器IP延时问题

    软件版本:Vivado2016.1 在使用移位寄存器IP时,对于不同延时拍数的使能延时可能会有问题. (1)32深度的可变长度移位寄存器,IP生成界面如下图所示. (2)128深度的可变长度移位寄存器 ...

  8. python学习日记(继承和多态)

    继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...

  9. Linux内核模块编程——Hello World模块

    Linux内核模块编程 编程环境 Ubuntu 16.04 LTS 什么是模块 内核模块的全称是动态可加载内核模块(Loadable Kernel Modul,KLM),可以动态载入内核,让它成为内核 ...

  10. .Net Core实践4 web 反向代理

    目标 将控制台程序改成web程序,通过IIS反向代理,处理请求 环境 win10 / .net core 2.1 / centos7 变成web程序 1.在新建的asp.net core控制台程序中添 ...