zoukankan      html  css  js  c++  java
  • VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏

    转载:http://blog.csdn.net/easysec/article/details/8833457

    转载:http://www.vckbase.com/module/articleContent.php?id=567&title=

    用VS创建一个空的动态库(dll)工程ShieldScreen

    ShieldScreen.h文件

     1 #ifndef _SHIELDSCREEN_H_
     2 #define _SHIELDSCREEN_H_
     3 #include <windows.h>
     4 
     5 #ifdef _cplusplus
     6 extern "C"
     7 {
     8 #endif
     9     void WINAPI UnInstallLaunchEv();//安装钩子
    10     void WINAPI InstallLaunchEv();//去掉钩子
    11 #ifdef _cplusplus
    12 };
    13 #endif
    14 
    15 #endif

    ShieldScreen.cpp文件

      1 // ShieldScreen.cpp : Defines the exported functions for the DLL application.
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <stdio.h>
      6 
      7 HHOOK Hook;
      8 
      9 LRESULT CALLBACK LauncherHook(int nCode, WPARAM wParam, LPARAM lParam);
     10 void strerror(DWORD errno);
     11 void savelog(const char* s);
     12 extern HMODULE hHookDll;
     13 
     14 
     15 _declspec(dllexport) void WINAPI UnInstallLaunchEv()//dll的导出函数
     16 {
     17     UnhookWindowsHookEx(Hook);
     18 }
     19 
     20 _declspec(dllexport)void WINAPI InstallLaunchEv()//dll的导出函数
     21 {
     22     Hook = SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LauncherHook,hHookDll,0);
     23 
     24     if (Hook == NULL)
     25     {
     26         strerror(GetLastError());
     27     }
     28 }
     29 
     30 LRESULT CALLBACK LauncherHook(int nCode, WPARAM wParam, LPARAM lParam)
     31 {
     32     KBDLLHOOKSTRUCT *Key_Info = (KBDLLHOOKSTRUCT*)lParam;
     33 
     34     if (nCode == HC_ACTION)
     35     {
     36         if ( WM_KEYDOWN == wParam || WM_SYSKEYDOWN == wParam )
     37         {
     38             BOOL b_lctrl = ::GetAsyncKeyState(VK_LCONTROL) ;//如果左边Ctrl按下
     39             BOOL b_rctrl = ::GetAsyncKeyState(VK_RCONTROL) ;//如果右边Ctrl按下
     40             BOOL b_lAlt = ::GetAsyncKeyState(VK_LMENU) ;//如果左边Alt按下
     41             BOOL b_rAlt = ::GetAsyncKeyState(VK_RMENU) ;//如果右边Alt按下
     42 
     43             if ( Key_Info->vkCode == VK_SNAPSHOT )
     44             {
     45                 return TRUE;
     46             }
     47             else if (b_lctrl && b_lAlt)
     48             {
     49                 switch (wParam)
     50                 {
     51                 case 41: //('A')
     52                     break;
     53                 default:
     54                     break;
     55                 }
     56                 return TRUE;
     57             }
     58             else if (b_rctrl && b_rAlt)
     59             {
     60                 switch (wParam)
     61                 {
     62                 case 41://('A')
     63                     break;
     64                 default:
     65                     break;
     66                 }
     67                 return TRUE;
     68             }
     69             else if (b_lAlt)
     70             {
     71                 switch (wParam)
     72                 {
     73                 case 41://('A')
     74                     break;
     75                 default:
     76                     break;
     77                 }
     78                 return TRUE;
     79             }
     80             else if (b_rAlt)
     81             {
     82                 switch (wParam)
     83                 {
     84                 case 41://('A')
     85                     break;
     86                 default:
     87                     break;
     88                 }
     89                 return TRUE;
     90             }
     91         }
     92     }
     93 
     94     return CallNextHookEx(Hook,nCode,wParam,lParam);
     95 }
     96 
     97 
     98 void savelog(const char* s)//向D盘根目录下的my.log文件写log信息
     99 {
    100     FILE* p;
    101     errno_t err= fopen_s(&p,"D:\my.log", "a+");//在d盘根目录下生成my.log文件
    102     fputs(s,p);//fputs是一种函数,具有的功能是向指定的文件写入一个字符串(不自动写入字符串结束标记符‘’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数
    103     fclose(p);
    104 }
    105 
    106 void strerror(DWORD errno)//根据GetLastError()返回值,将错误信息转化为中文,写入my.log文件
    107 {
    108     void *lpMsgBuf;
    109     FormatMessageA( 
    110         FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    111         FORMAT_MESSAGE_FROM_SYSTEM | 
    112         FORMAT_MESSAGE_IGNORE_INSERTS,
    113         NULL,
    114         errno,
    115         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    116         (char *) &lpMsgBuf,
    117         0,
    118         NULL 
    119         );
    120 
    121     savelog((const char *)lpMsgBuf);
    122     // Free the buffer.
    123     LocalFree( lpMsgBuf );
    124 }

    在dllmain文件中加入红色字体代码

    // dllmain.cpp : Defines the entry point for the DLL application.
    #include "stdafx.h"
    
    HMODULE hHookDll;//定义一个全局的HMODULE供SetWindowsHookEx函数使用
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        hHookDll = hModule;
    
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }

    使用拦截dll,在你的程序中导入ShieldScreen.h文件,把ShieldScreen.dll放到 exe目录下,把ShieldScreen.lib放到工程目录下,同时加上导入库pragma comment(lib, "ShieldScreen.lib");

    在初始化函数处 

          InstallLaunchEv();//安装钩子

    在程序退出处

         UnInstallLaunchEv();//取消钩子

  • 相关阅读:
    Go-闭包
    GO-数组与切片
    Go-包
    Go-for循环
    GO-逻辑判断(if,else if,else,switch)
    前后端分离的思考与实践(六)
    前后端分离的思考与实践(五)
    前后端分离的思考与实践(三)
    前后端分离的思考与实践(二)
    前后端分离的思考与实践(一)
  • 原文地址:https://www.cnblogs.com/chechen/p/6555526.html
Copyright © 2011-2022 走看看