⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maskkey.cpp

📁 VisualC高级编程技术精粹.rar
💻 CPP
字号:
// MaskKey.cpp: Source file
//

#define _WIN32_WINNT  0x0500 // 设置系统版本, 确保可以使用底层键盘钩子
#include "windows.h"

// 全局变量
LPDWORD		g_lpdwVirtualKey = NULL; // Keycode 数组的指针
int			g_nLength = 0;	// Keycode 数组的大小
BOOL		g_bDisableKeyboard = FALSE;	// 是否屏蔽整个键盘
HINSTANCE	g_hInstance = NULL;	// 模块实例句柄
HHOOK		g_hHook = NULL;	// 钩子句柄

// DLL 入口函数
BOOL APIENTRY DllMain(HANDLE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved)
{
	// 保存模块实例句柄
	g_hInstance = (HINSTANCE)hModule;
	
	// 在进程结束或线程结束时卸载钩子
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_PROCESS_DETACH:
	case DLL_THREAD_DETACH:
		delete g_lpdwVirtualKey;
		if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);
		break;
	}

    return TRUE;
}

// 底层键盘钩子函数
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, 
									  WPARAM wParam, 
									  LPARAM lParam)
{
	// 禁用键盘的某个按键, 若g_bDisableKeyboard 为TRUE, 则禁用整个键盘
	if (nCode == HC_ACTION)
	{
		if (g_bDisableKeyboard) 
		{
			return TRUE;
		}

		KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
		LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
		for (int i = 0; i < g_nLength; i++)
		{
			if (pStruct->vkCode == *tmpVirtualKey++)
			{
				return TRUE;
			}
		}
		
	}
	
	// 传给系统中的下一个钩子
	return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// 屏蔽键盘按键
BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, 
						 int nLength, 
						 BOOL bDisableKeyboard = FALSE)
{
	// 若已经安装键盘钩子,则返回 FALSE
	if (g_hHook != NULL) return FALSE;
	
	// 将用户传来的 keycode 数组保存在全局变量中
	g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);
	LPDWORD tmpVirtualKey = g_lpdwVirtualKey;
	for (int i = 0; i < nLength; i++)
	{
		*tmpVirtualKey++ = *lpdwVirtualKey++;
	}
	g_nLength = nLength;
	g_bDisableKeyboard = bDisableKeyboard;
	
	// 安装底层键盘钩子
	g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
		                       LowLevelKeyboardProc, 
							   g_hInstance, 
							   NULL);
	if (g_hHook == NULL)
	{
		return FALSE;
	}

	return TRUE;
	
}

// 停止屏蔽键盘按键
BOOL WINAPI StopMaskKey()
{
	// 卸载钩子
	if (UnhookWindowsHookEx(g_hHook) == 0)
	{
		return FALSE;
	}

	g_hHook = NULL;

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -