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

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

1. 场景需求

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

2. 解决方案

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

3. 示例程序

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

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

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

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

创建完成。

【2】. 编译并运行程序

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

运行程序。

【3】. 编辑对话框

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

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

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

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

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

//鼠标钩子句柄;
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源文件修改如下

c 复制代码
// 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】键外,其他键盘和鼠标输入均不响应。

相关推荐
cpsvps_net11 小时前
美国服务器环境下Windows容器工作负载智能弹性伸缩
windows
甄超锋12 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cpsvps14 小时前
美国服务器环境下Windows容器工作负载基于指标的自动扩缩
windows
网硕互联的小客服17 小时前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
etcix17 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
许泽宇的技术分享18 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
非凡ghost19 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
mortimer20 小时前
一次与“顽固”外部程序的艰难交锋:subprocess 调用exe踩坑实录
windows·python·ai编程
gameatp1 天前
从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)
linux·服务器·windows
穷人小水滴1 天前
在 windows 运行 flatpak 应用 (WSL)
linux·windows·ubuntu