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

📄 keyhooklib.cpp

📁 《windows程序设计》王艳平版的书籍源代码
💻 CPP
字号:
////////////////////////////////////////////////
// KeyHookLib.cpp文件

#include <windows.h>

#define KEYHOOKLIB_EXPORTS
#include "KeyHookLib.h"


// 共享数据段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL;	// 保存主窗口句柄
HHOOK g_hHook = NULL;		// 保存钩子句柄
#pragma data_seg()

// 一个通过内存地址取得模块句柄的帮助函数
HMODULE WINAPI ModuleFromAddress(PVOID pv) 
{
	MEMORY_BASIC_INFORMATION mbi;
	if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
	{
		return (HMODULE)mbi.AllocationBase;
	}
	else
	{
		return NULL;
	}
}

// 键盘钩子函数
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
        if(nCode < 0 || nCode == HC_NOREMOVE)
		return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
	
        if(lParam & 0x40000000)	// 消息重复就交给下一个hook链
	{
		return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
	}
	
	// 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息
        ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);
	
        return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// 安装、卸载钩子的函数
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
	BOOL bOk;
	g_hWndCaller = hWndCaller;
	
	if(bInstall)
	{
		g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, 
					ModuleFromAddress(KeyHookProc), dwThreadId);
		bOk = (g_hHook != NULL);
	} 
	else 
	{
		bOk = ::UnhookWindowsHookEx(g_hHook);
		g_hHook = NULL;
	}
	
	return bOk;
}

⌨️ 快捷键说明

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