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

相关推荐
吴声子夜歌14 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
这儿有一堆花17 小时前
用原生脚本编写无害恶作剧
windows
因我你好久不见17 小时前
Windows部署springboot jar支持开机自启动
windows·spring boot·jar
夜流冰18 小时前
Excel - MS Support for Excel: 2 Collaborate
数据库·windows·excel
林瞅瞅18 小时前
PowerShell 启动卡顿?内存飙升?原来是 800MB 的历史记录在作祟!
windows
Shepherd061919 小时前
【Windows Server 实战】WAC 反向代理配置
windows
云小逸19 小时前
【windows系统编程】第一章 Windows 系统核心架构与基础概念
windows·架构
怣疯knight21 小时前
Docker Desktop 4.55.0版本安装成功教程
windows·docker
liulilittle1 天前
VEthernet 框架实现 tun2socks 的技术原理
网络·windows·c#·信息与通信·通信
独钓寒江雨1 天前
win11在安全模式下删除360tray.exe
windows·电脑