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

2023-10-27

转载: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();//取消钩子

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将日期时间舍入到最后一小时

    我试图寻找这个 但我找不到我想做的事情的好例子 我在 MySQL 数据库中得到了日期时间值 当使用该值时必须向下舍入 例如 所有这些值 2013 04 20 07 14 422013 04 20 07 19 512013 04 20 07
  • php laravel Blade 模板不渲染

    我正在尝试使用 Laravel 和 twitter bootstrap 设置一个基本页面 我安装了 Laravel 并获得了通用的 你在这里 或 w e 图像 这样看起来很闪亮 对于 twitter bootstrap 我在 public
  • 获取给定日期时间集的每月第一个星期一

    我需要什么 我有一个特定的日期时间列表 我想获取每个日期时间的第一个星期一 例如 假设给定的日期时间是 2013 07 05 2013 08 05 2013 09 13 etc 我想获得所有这些日期时间的第一个星期一 以便输出结果 2013
  • PHP 下载脚本输出损坏的文件

    我正在用 PHP 为我的 CMS 构建一个文件下载类 当时我注意到它以不同的编码格式输出文件 我尝试使用 readfile file get contents fread 但似乎都在做同样的事情 这就像与输出缓冲有关的东西 我使用脚本下载的
  • PHP 的password_verify() 是否可以抵御极长的密码(DoS 攻击)?

    一般攻击场景 2013 年 Django 存在一个普遍漏洞 攻击者可以通过非常大的密码创建极其密集的 CPU 计算 请参阅此处的安全通知 https www djangoproject com weblog 2013 sep 15 secu
  • PHP 异常处理与 C#

    这是一个非常基本的问题 我希望如此 我所做的大部分异常处理都是使用 C 进行的 在 C 中 任何在 try catch 块中出错的代码都会由 catch 代码处理 例如 try int divByZero 45 0 catch Except
  • Facebook“赞”按钮回调帮助

    我正在使用此代码进行类似 facebook 的回调 问题是 如果我调用 php 脚本 例如 有人可以看到我的 javascript 并运行此页面 甚至可以向其发送垃圾邮件或在没有先点赞的情况下使用它 我的想法是 我想为每个喜欢该页面的用户提
  • Symfony2,如何向表单添加隐藏的日期类型字段?

    我正在尝试以下场景 In myclassType public function buildForm FormBuilder builder array options builder gt add day hidden gt add da
  • CakePHP Auth 组件使用 $this->Auth->login() 时未登录;

    我是 cakePHP 的新手 我已经阅读了他们的文档 并且正在遵循他们的简单身份验证示例 我还广泛搜索 包括本网站上的答案 来寻找我的问题的答案 我正在使用 cakePHP 2 0 我的 UsersController 的登录功能如下所示
  • 在php中获取大于2GB的文件大小的最佳方法?

    我想检查本地驱动器上的文件大小windows OS 但是PHP原生函数filesize 仅当文件大小小于时才有效2GB 大于的文件2GB将返回错误的数字 那么 是否有其他方法来获取大于的文件大小2GB 非常感谢 您始终可以使用系统的文件大小
  • 查明具有特定 ID 的会话是否已过期

    我正在创建一个上传功能 将用户上传的文件存储在服务器上 并以用户的会话 ID 作为名称 现在 我只想将此文件保留在服务器上 直到该会话处于活动状态 所以 我的问题是 如何根据会话 ID 确定会话是活动的还是过期的 以便在后一种情况下我可以安
  • PHP Github Pull 脚本错误“权限被拒绝(公钥)”

    我已经设置了一个 PHP 脚本来执行 GitHub 拉取 这包含在我的 Github 文件夹中 home mysite public html github github pull php 我的服务器已经有 SSH 公钥 就像我执行git
  • 使用第三方库记录来自 PHP 应用程序的所有 cURL 请求

    好吧 我的 PHP Yii2 应用程序遇到了困难 我需要记录来自应用程序的每个传入和传出请求 传入的请求可以轻松地记录在 PHP 本身中 在引导阶段添加一些处理程序 这很容易 但真正的问题是我正在使用许多第三方库 即 Amazon MWS
  • 在 mysqli 准备好的语句程序风格中获取最后插入的 id 的正确方法是什么?

    我正在使用 mysqli 准备好的语句在表中插入记录 如下所示 link mysqli connect localhost my user my password world check connection if link printf
  • 彩色 var_dump() 和错误

    我怎样才能将样式设置为var dump 功能和PHP错误样式 如下图所示 目前我有下一个观点var dump with pre var dump pre 没有它将全部在一行中 并且只是纯文本的错误 我搜索了一些 PHP 颜色错误 var d
  • 从检查元素隐藏 ''

    我有这个 HTML 和 PHP 联系表
  • Laravel,控制器中的 Auth::user()

    Laravel 框架 为什么我无法在 laravel 项目的控制器中使用 Auth user 查看用户是否已登录 Session 是否未连接到控制器 HomeController php public function isauthoriz
  • 2 使用我的代码在数组中查询

    我使用滑块来显示我的 WordPress 精选文章 它选择一个自定义类别并返回一定数量的帖子 如何将显示的第一篇帖子设为自定义帖子 我可以直接在滑块代码中添加特定帖子的 ID吗使该帖子首先出现 然后是原始查询返回的其他内容 例如 在页面上
  • PHP-如何根据条件配对数组中的项目

    如何将数组中的项目配对 假设我有一个数组Fighters 我想根据他们的情况将他们配对Weights 体重最接近的拳手应作为配对最佳匹配 但如果他们是在同一个团队中 他们不应该配对 团队 1 战斗机A体重为60 战斗机B体重为65 2队 战
  • 使用 Swift 邮件程序发送邮件时出现错误 501

随机推荐

  • C++算法之快速排序

    C 算法之快速排序 文章目录 C 算法之快速排序 一 快速排序引出 二 快排步骤 三 代码实现 四 复杂度分析 一 快速排序引出 我们知道 给一个长度为n的序列排序 有三种很简单的算法 选择排序 冒泡排序 插入排序 这三种算法的复杂度均为O
  • SpingBoot集成Swagger和Knife4j

    1 项目开发中编写接口文档实在是痛苦 于是打算引入swagger 之后发现swagger不够舒服 便又引入knife4j springboot的相关依赖不再贴 下面是swagger和knife4j的相关依赖 版本有需求的可以上maven中央
  • 百度群组链接分享 - 铁人圈子

    百度网盘群组链接分享 铁人圈子 铁人圈子 tierenpan com 是一个分享百度网盘群组的发布平台 可以在铁人圈子上实时分享你的群组链接 并且和其他网友互动交流分享资源 群组分享 百度群组链接分享 地址 https www tieren
  • shape文件格式简单说明

    一 简介 ShapeFile是Esri开发的一种空间数据格式 她是一种矢量数据存储格式 通常用于描述几何体形状 点 线 面 及相关属性 二 组成说明 2 1 必须文件 shp 图形格式 用于描述几何体形状 shx 图形索引格式 记录每一个几
  • 一文带你彻底搞懂二叉树(Python实现)——真香

    文章目录 前言 树 树中的一些术语 树的分类 树的存储表示 二叉树 二叉树的性质 二叉树的实现 二叉树结点的实现 二叉树的创建 广度优先遍历 先序 中序 后序遍历 后记 前言 终于到了数据结构中的关键部分了 二叉树 说起二叉树啊 简直是我当
  • PTA 浙大版《C语言程序设计(第4版)》题目集 习题4-6 水仙花数

    原题链接 问题描述 水仙花数是指一个N位正整数 N 3 它的每个位上的数字的N次幂之和等于它本身 例如 153 13 53 33 本题要求编写程序 计算所有N位水仙花数 输入格式 输入在一行中给出一个正整数N 3 N 7 输出格式 按递增顺
  • abp Application层获取请求的Header内容

    abp 如何在应用层返回header自定义的内容 参考 https blog csdn net u012659600 article details 99579369 首先在AppService中注入HttpContextAccessor
  • Ubuntu 更新 CMake 版本

    项目中有时候会出现CMake版本小于最低要求的情况 实际上没有有必要这么高的要求 但是在不能改对方代码的情况下 只能去升级自身的版本了 尝试了网上说的直接update之后再次安装的方式 结果版本号没有改变 sudo apt get upda
  • css文字超出隐藏显示...

    单行 overflow hidden white space nowrap text overflow ellipsis 多行 display webkit box webkit box orient vertical webkit lin
  • Windows10开启Hyper-v并安装Linux CentOS虚拟机

    Windows10开启Hyper v虚拟机配置静态网络 1 Windows10 开启Hyper v 右键单击 Windows 按钮并选择 应用和功能 选择相关设置下右侧的 程序和功能 选择 打开或关闭 Windows 功能 选择 Hyper
  • Element 标签页样式修改

    deep el tabs nav wrap after height 1px deep el tabs item height 50px font size 16px font family PingFang SC font weight
  • Java编程实现Softmax函数功能

    Java编程实现Softmax函数功能 Softmax函数是一种常用的数学函数 广泛应用于机器学习和深度学习领域 尤其在分类问题中起到重要作用 本文将介绍如何使用Java编程实现Softmax函数 并提供相应的源代码 首先 我们来了解一下S
  • centos7启动docker: dial tcp 104.18.123.25:443: i/o timeout.

    在centos7上安装好了docker之后 测试docker是否安装成功 使用官方给出的sudo docker run hello world 解决 再运行一遍命令即可
  • 自定义 scrollview 标头部分的滑动速度慢(scrollview 子控件滑动速度不一致)

    scrollview 子控件滑动速度不一致 先来个布局图 向上滑动时 图片向上划出的速度较下面的蓝色view慢 现在我们先来看布局文件
  • 基于tensorflow的手势检测和手势识别分类

    项目目的 在手机端实现用户手势的检测并且识别用户所做的手势 遇到的问题 首先在手部检测的解决办法中 我尝试过用opencv进行手部识别 但存在的问题是背景对手的识别的影响太大 如果采用颜色进行手和背景的区分的话 又会受到光照等影响 总体而言
  • 【机器学习实战】决策树 python代码实现

    typora copy images to upload 第三章 决策树 3 1决策树的构造 优点 计算复杂度不高 输出结果易于理解 对中间值的缺失不敏感 可以处理不相关的特征数据 缺点 可能会产生过度匹配的问题 适用数据类型 数据型和标称
  • 弱网的概念以及弱网测试

    什么是弱网测试 在当今移动互联网盛行的时代 网络的形态除了有线连接 还有2G 3G Edge 4G Wifi等多种手机网络连接方式 不同的协议 不同的制式 不同的速率 使移动应用运行的场景更加丰富 从测试角度来说 需要额外关注的场景就远不止
  • SpringBoot日志配置【详解】

    文章目录 前言 1 为什么使用Logback 2 Logback使用 2 1 添加依赖 2 2 默认配置 3 logback spring xml详解 3 1 configuration元素 3 2 logger 元素 3 3 root 元
  • 购物商城---页面缓存oscached

    流程图 web xml
  • VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏

    转载 http blog csdn net easysec article details 8833457 转载 http www vckbase com module articleContent php id 567 title 用VS