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

embedded/2024/10/24 8:24:03/

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.ppmy.cn/embedded/130031.html

相关文章

perl统一修改文件前缀并排序

perl统一修改文件前缀并排序 如题&#xff0c;perl统一修改文件前缀并排序。 举例说明&#xff0c;修改*.txt文件&#xff0c;并排序。 当前目录下&#xff0c;有如下文件 a.txt b.txt fsjkd.txt ffsjk_tst.txt运行rename_prefix脚本后&#xff0c;输入的第一个参数为txt&…

【ROS2】Qt和ROS混合编程:多继承QObject和rclcpp::Node

1、说明 如果想在一个类中,即使用Qt的信号和槽(程序内部通信),同时也使用ROS2的发布、订阅消息机制(程序之间通信),如何操作? 可以尝试多重继承:QObject 和 rclcpp::Node 2、示例 1)头文件 class laoer_object_node : public QObject, public rclcpp::Node {Q_O…

5G NR:UE初始接入信令流程浅介

UE初始接入信令流程 流程说明 用户设备&#xff08;UE&#xff09;向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU。IN…

数据结构:线性结构

线性结构 1. 线性表1.1 定义1.2 线性表的存储结构顺序存储链式存储 2. 栈和队列2.1 栈定义存储结构栈的应用 2.2 队列定义存储结构队列应用 3. 串3.1 串的定义和运算3.2 串的存储结构 数据结构描述数据元素的集合及元素间的关系和运算。在数据结构中&#xff0c;元素之间的相互…

揭开网络安全的面纱:深入了解常见漏洞攻击类型

内容预览 ≧∀≦ゞ 漏洞攻击学习总结导语一、Web 开发中的常见漏洞二、代码框架中的漏洞三、服务器相关漏洞结语 漏洞攻击学习总结 导语 根据自己的一些经验&#xff0c;我将在这篇文章中梳理常见的漏洞及其利用方式&#xff0c;主要涵盖 Web 开发、代码框架和服务器相关的漏洞…

MySQL笔试面试题之AI答(3)

文章目录 11. MYSQL支持事务吗&#xff1f;12. MYSQL相比于其他数据库有哪些特点&#xff1f;一、开源免费二、高性能三、易于使用四、安全性五、可扩展性六、跨平台性七、支持多种存储引擎八、社区活跃 13. 请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称&#xff0c…

线性可分支持向量机的原理推导【补充知识部分】9-10最大化函数max α,β L(x,α,β)关于x的函数 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。在主文章中&#xff0c;有一个部分是关于补充拉格朗日对偶性的相关知识&#xff0c;此公式即为这部分里的内容。 公式 9-10 是基于公式 9-9 的进一步引申&a…

排序算法 —— 计数排序

目录 1.计数排序的思想 2.计数排序的实现 3.计数排序的分析 时间复杂度 空间复杂度 稳定性 优点 缺点 1.计数排序的思想 顾名思义&#xff0c;计数排序就是通过计数的方式来排序&#xff0c;其基本思想为&#xff1a; 开辟一个计数数组&#xff0c;统计每个数出现的次…