通过hook实现禁止shift+delete快捷键

实现全局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 = 0;
    if (wParam==WM_KEYDOWN && nCode == HC_ACTION)
    {
        bShiftKeyDown=GetAsyncKeyState (VK_SHIFT) >> ((sizeof(SHORT) * 8) - 1);
        if (pkbhs->vkCode == VK_DELETE && bShiftKeyDown)
        {
            MessageBox(0,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(0,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, 0, 0))
    {
        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        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_NOSHIFTDELETE));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    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, 0, 400, 200, 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(0,L"Email: [email protected]",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(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    if (message == WM_TASKBAR_CREATED)
    {
        //系统Explorer崩溃重启时,重新加载托盘
        Shell_NotifyIcon(NIM_ADD, &nid);
    }
    return 0;
}

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

编译后文件:点击下载

时间: 2024-08-07 04:12:17

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

HOOK NTFS 禁止格式化

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 if(bHooked == FALSE) { RtlInitUnicodeString (&HookDriverName, L"\\FileSys

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

shift + 空格 快捷键 使输入法 在全角和半角直接切换.. 但是全角输入一个 空格 ,会造成jsp页面 无法正常解析....比如 无法获得参数.. 如 <form action="/mycenter/topicRelated" name="pageForm" method="post"> <input type="hidden" value="${pageBean.currentPage }&

eclipse中的Ctrl+Shift+F快捷键和Ctrl+D快捷键失灵

Ctrl+Shift+F快捷键失灵: 有可能是因为你的搜狗输入法那里的快捷键也有一个Ctrl+Shift+F,造成冲突了,这时你可以把搜狗输入法里面的快捷键改一下就可以了. 在"开始"那里找到"搜狗拼音输入法"-->"设置" 在这里换一个快捷键就可以了,或者取消此快捷键,就可以了. Ctrl+D快捷键失灵: 这时候可能是和eclipse的workspace中的 ".metadata" 文件有关,我那时候是先把eclips

object hook实现禁止创建文件

原理不说了,大伙都懂得.. 要解决的问题: 1. 怎么在windbg中看到_OBJECT_TYPE和_OBJECT_TYPE_INITIALIZER结构的内容. 2. 如何得到pOldParseProcedure的地址 3. 如何改写((POBJECT_TYPE)*IoDeviceObjectType)->TypeInfo.ParseProcedure=pNewProcedure 对于第一个问题: nt!_OBJECT_HEADER +0x000 PointerCount     : Int4B

分区恢复和NTFS文件恢复试验

一.实验室名称:主楼实验室A2-412                  二.实验项目名称:分区恢复和NTFS文件恢复试验 三.实验学时:6学时 四.实验原理: 借助fdisk.diskgen软件对磁盘分区进行删除和恢复,使用工具软件WINHEX对指定的文件进行定位.分析,以及恢复. 五.实验目的: 1)掌握使用软件进行磁盘的分区恢复技术 2)了解NTFS文件系统在磁盘上的存储映像和它在系统安全中的地位和作用. 3)初步掌握NTFS的文件恢复技术 六.实验内容: n  磁盘分区恢复实验 1)在V

浏览器缓存的作用,如何使用,如何清除。

浏览器缓存就是你看网页的网页里的图片.音乐.视频文件,存在系统里,在你下次访问的时候若网页没有变化,则直接从缓存调用,来加快浏览速度. 一.作用: 浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览. 主要目的:节约宽带资源.节约了网络的资源,提高了网络的效率. 二.使用 浏览器缓存主要有两类 缓存协商:Last-modified ,Etag

WPF 创建桌面快捷方式

#region 创建桌面快捷方式 string deskTop = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop); string dirPath = System.Environment.CurrentDirectory; string exePath = Assembly.GetExecutingAssembly().Location; System.Diagnostics.FileVers

访问网站时,出现400错误

400 Bad RequestRequest header or cookie too large. Sorry for the inconvenience.Please report this message and include the following information to us.Thank you very much! URL: http://www.cnblogs.com/Server: lb-130304ay41d-1Date: 2013/03/22 13:48:48 清

【editplus经常用的快捷键】Editplus 选中一行ctrl+r,Edit 合并行 Ctrl+Shift+J 合并选定行 删除当前行

Editplus 选中一行: ctrl+rEditplus 复制一行: ctrl+r选择行,然后ctrl+c复制.复制一行到下一行中:Editplus有:Ctrl+j 复制上一行的一个字符到当前行Editplus 删除一行: Shift+Alt+Delete 直接删除当前行, 或:shift+Delete也成.移动一行到上一行/下一行: alt+shift+向上键(向下键)--------------------------------------------------------------