Windows模拟电脑假死之键盘鼠标无响应

news2024/12/23 16:10:42

Windows模拟电脑假死之键盘鼠标无响应

1. 场景需求

模拟Windows电脑假死,失去键盘鼠标响应。

2. 解决方案

采用Windows系统提供的钩子(Hook) API 拦截系统鼠标键盘消息。

3. 示例程序

【1】. 创建MFC对话框项目

新建一个MFC应用程序项目,项目名称取名为 "FakeDeath" ,如下图所示:

在这里插入图片描述

应用程序类型,选择【基于对话框】项目。

在这里插入图片描述

其余配置选项,默认即可。

创建完成。

在这里插入图片描述

【2】. 编译并运行程序

右键项目名称,选择【生成】。

在这里插入图片描述

运行程序。

在这里插入图片描述

【3】. 编辑对话框

调取《资源视图》界面,编辑对话框控件。

在这里插入图片描述

在这里插入图片描述

双击【键盘鼠标假死】按钮,向导会自动进入到对应按钮的处理函数上。

在这里插入图片描述

【4】. 添加键盘鼠标系统钩子

键盘鼠标系统钩子代码如下:

/*------------------------------------开始添加键盘鼠标系统钩子代码--------------------------------*/

//鼠标钩子句柄;
HHOOK g_hMouseHook = nullptr;
//键盘钩子句柄;
HHOOK g_hKeyboardHook = nullptr;

//安装钩子;
void InstallSysHook();
//卸载钩子;
void UninstallSysHook();

//键盘钩子处理函数;
static LRESULT CALLBACK OnKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
//鼠标钩子处理函数;
static LRESULT CALLBACK OnMouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);



/
/
/
void InstallSysHook()
{
	g_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, OnMouseHookProc, GetModuleHandleA(0), 0);
	g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, OnKeyboardHookProc, GetModuleHandleA(0), 0);
}

void UninstallSysHook()
{
	if (g_hKeyboardHook)
	{
		UnhookWindowsHookEx(g_hKeyboardHook);
	}
	if (g_hMouseHook)
	{
		UnhookWindowsHookEx(g_hMouseHook);
	}
}

LRESULT CALLBACK OnKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		// 【A】键盘按下时程序结束
		KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
		if (ks->vkCode == 'A')
		{
			UninstallSysHook();

			exit(0);
		}
	}
	// return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
	return 1;
}

LRESULT CALLBACK OnMouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		// 处理鼠标消息;
		// ...
	}
	// return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
	return 1;
}

/*-----------------------------------键盘鼠标系统钩子添加结束--------------------------------*/

FakeDeathDlg.cpp源文件修改如下

// FakeDeathDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "FakeDeath.h"
#include "FakeDeathDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CFakeDeathDlg 对话框



CFakeDeathDlg::CFakeDeathDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CFakeDeathDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFakeDeathDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CFakeDeathDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_INSTALL, &CFakeDeathDlg::OnBnClickedBtnInstall)
END_MESSAGE_MAP()


// CFakeDeathDlg 消息处理程序


BOOL CFakeDeathDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标


	// TODO:  在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CFakeDeathDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CFakeDeathDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFakeDeathDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


/*---------------------------------开始添加键盘鼠标系统钩子代码-----------------------------------*/

//鼠标钩子句柄;
HHOOK g_hMouseHook = nullptr;
//键盘钩子句柄;
HHOOK g_hKeyboardHook = nullptr;

//安装钩子;
void InstallSysHook();
//卸载钩子;
void UninstallSysHook();

//键盘钩子处理函数;
static LRESULT CALLBACK OnKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
//鼠标钩子处理函数;
static LRESULT CALLBACK OnMouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);


/
/
/
void InstallSysHook()
{
	g_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, OnMouseHookProc, GetModuleHandleA(0), 0);
	g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, OnKeyboardHookProc, GetModuleHandleA(0), 0);
}

void UninstallSysHook()
{
	if (g_hKeyboardHook)
	{
		UnhookWindowsHookEx(g_hKeyboardHook);
	}
	if (g_hMouseHook)
	{
		UnhookWindowsHookEx(g_hMouseHook);
	}
}

LRESULT CALLBACK OnKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		// 【A】键盘按下时程序结束
		KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
		if (ks->vkCode == 'A')
		{
			UninstallSysHook();

			exit(0);
		}
	}
	// return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
	return 1;
}

LRESULT CALLBACK OnMouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		// 处理鼠标消息;
		// ...
	}
	// return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
	return 1;
}

/*--------------------------------------键盘鼠标系统钩子添加结束--------------------------------*/


// 键盘鼠标假死按钮处理函数
void CFakeDeathDlg::OnBnClickedBtnInstall()
{
	// 安装系统钩子;
	InstallSysHook();
}

【5】. 运行效果

点击【鼠标键盘假死】按钮后,桌面进入假死状态,除了【Ctrl+Alt+Delete】和【A】键外,其他键盘和鼠标输入均不响应。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.3 Thymeleaf语法

文章目录 引言Thymeleaf标签显示标签链接地址标签条件判断标签元素遍历标签 Thymeleaf表达式变量表达式选择变量表达式消息表达式链接表达式 Thymeleaf内置对象上下文对象上下文变量上下文区域请求对象响应对象会话对象日期对象 实战演练创建控制器创建模板页面 结语 引言 Thy…

Spring AI Java程序员的AI之Spring AI(一)

SpringAI 基础使用 前言Spring AIChatClientImageClientOpenAiAudioTranscriptionClientEmbeddingClient 总结 前言 Spring AI&#xff0c;听着名字就感觉很好使用&#xff0c;快速上手&#xff0c;虽然功能没有太完善&#xff0c;但是社区活跃度很高&#xff0c;可以看看源码…

【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)

零.前置篇章 本篇前置文章为【LVGL快速入门(一)】LVGL开源框架入门教程之框架移植 一.UI设计 介绍使用之前&#xff0c;我们要学习一款LVGL官方的UI设计工具SquareLine Studio&#xff0c;使用图形化设计方式设计出我们想要的界面&#xff0c;然后生成对应源文件导入工程使用…

C++初阶学习第七弹——string的模拟实现

C初阶学习第六弹------标准库中的string类_c语言返回string-CSDN博客 通过上篇我们已经学习到了string类的基本使用&#xff0c;这里我们就试着模拟实现一些&#xff0c;我们主要实现一些常用到的函数。 目录 一、string类的构造 二、string类的拷贝构造 三、string类的析构函…

基于SpringBoot的智能餐厅点餐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

每日一练:不同的二叉搜索树

96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a…

PAT甲级-1003 Emergency

题目 题目大意 给出n个城市的连通图&#xff0c;其中共有m条边&#xff0c;起点为C1&#xff0c;终点为C2。每个城市都有一定数目的救援队&#xff0c;现从C1出发&#xff0c;每经过一个城市&#xff0c;都可以加上这个城市的救援队。要求从C1到C2最短路径的个数&#xff0c;并…

AIGC技术的学习 系列一

文章目录 前言一、AIGC技术演进1.1 图像视频生成1.2. 文本生成1.3. 多模态生成1.4. 小结二、CAD&CAE软件介绍2.1. CAD软件2.2. CAE软件2.3. 小结三、AIGC技术与CAD&CAE软件的集成案例3.1. 土建设计领域3.2. 机械设计领域四、结语五、参考文献总结前言 在全球智能制造的…

FreeRTOS - 信号量

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 队列用于传输数据&#xff1a;在任务之间、任务…

冻干咖啡市场洞察:销售额占比背后的消费密码

冻干咖啡销售额前十占比分析 一、概述 本报告基于从淘宝商品搜索接口和淘宝精确月销量接口中提取的数据&#xff0c;分析了前十个品牌在销售额上的占比情况。分析涵盖了销售额和占比的数据&#xff0c;为决策提供了依据。&#xff08;数据获取时间&#xff1a;2024.09.20&…

音乐播放器项目专栏介绍​

1.简介 本专栏使用Qt QWidget作为显示界面&#xff0c;你将会学习到以下内容&#xff1a; 1.大量ui美化的实例。 2.各种复杂ui布局。 3.常见显示效果实现。 4.大量QSS实例。 5.Qt音频播放&#xff0c;音乐歌词文件加载&#xff0c;展示。 6.播放器界面换肤。 相信学习了本专栏…

C++【内存管理】(超详细讲解C++内存管理以及new与delete的使用和原理)

文章目录 1.C/C内存分布2.C语言中动态内存管理方式3.C内存管理方式3.1 new/delete操作内置类型3. 2new/delete操作自定义类型 4. operator new与operator delete函数&#xff08;重点&#xff09;5. new和delete的实现原理5.1 内置类型5.2 自定义类型5.2.1 自定义类型调用new[]…

【机器学习】特征降维|低方差过滤|主成分分析PCA|相关系数法|皮尔逊相关系数|斯皮尔曼相关系数

特征降维 特征降维 为什么要进行特征降维? 特征对训练模型非常重要,当用于训练的数据集包涵一些不重要的特征时,可能会导致模型泛化性能不加 eg&#xff1a;某些特征的取值较为接近&#xff0c;其包含的信息较少eg&#xff1a;希望特征独立存在对预测产生影响&#xff0c;两…

Unity使用TriangleNet参考

TriangleNet下载如下&#xff1a; TriangleNet 效果如下&#xff1a; 代码参考如下&#xff1a; using System.Collections.Generic; using UnityEngine; using TriangleNet.Geometry;public class TestTriangleNet : MonoBehaviour {[SerializeField]Material material;voi…

2024下半年,国内大模型六小虎最新发展情况怎么样了?

最近大模型圈有点冷,ChatGPT访问量下降,英伟达的股价都跟着跌,更是有人开始唱衰大模型。这感觉就像经历了一场盛夏酷暑后的骤然降温,资本市场也开始理性回归。但与此同时,国内的"六小虎"却展现出另一番景象——热火朝天!这真是冰火两重天啊! 在这看似矛盾的局…

CNStream流处理多路并发Pipeline框架相关问题整理:Pipeline整体流程、数据传输、多路并发

目录 1 CNStream之前博客汇总 1.1 Pipeline中的EventBus 1.2 Pipeline中的内存池 1.3 Pipeline中的视频解码流程分析 1.4 Pipeline中的视频编码流程分析 1.5 Pipeline中的反射机制 1.6 Pipeline中的单例模式代码 1.7 怎么将CNStream适配到NVIDIA Jetson Orin 2 构建Pi…

EI收录检索报告是什么样的?怎么出具?一文了解!

一、EI检索报告是什么 EI(Engineering Village)数据库是全球最全面的工程检索二次文献数据库&#xff0c;它收录了7,000,000多篇论文的参考文献和摘要。这些论文出自5,000多种工程类期刊、会议论文集和技术报告。EI收录的文献涵盖了所有的工程领域&#xff0c;其中大约22%为会…

聊聊零基础如何开始学习鸿蒙开发技术

鸿蒙系统是一款分布式操作系统&#xff0c;其适用范围非常广泛&#xff0c;从智能手机到家用电器&#xff0c;再到工业设备&#xff0c;都能找到应用场景。特别是在智能家居领域&#xff0c;鸿蒙系统可以实现不同设备之间的无缝连接和协同工作&#xff0c;提供更加智能和便利的…

建筑工程管理软件推荐,2024年最佳选择

建筑工程管理软件助力项目全周期管理&#xff0c;包括规划、监控、资源成本控制等。类型多样&#xff0c;选购需考虑需求匹配、便捷性、集成能力、灵活性和安全性。软件优化流程、提高效率、监控进展、优化资源配置、提升协作水平。 一、建筑工程管理软件到底是什么&#xff1f…

浮点数二进制制科学计数法理解

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 1. 引言 对于浮点数&#xff0c;主要是单精度-float、双精度-double两种类型。 对于浮点类型&#xff0c;我们知道其采用科学计数法&#xff0c;准确来说应该是二进制科学计数法。 为什么准确说是是二进制科学计数法&…