首页 > 代码库 > VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏

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是一种函数,具有的功能是向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数
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();//取消钩子

VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏