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

📄 keyboardhook.cpp

📁 visual c++ 软件项目开发实例的第二个例子
💻 CPP
字号:
// KeyboardHook.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "Mmsystem.h"
#include <afxdllx.h>
#include "KeyboardHook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#define TOTAL_KEYS 40
CString cskey[TOTAL_KEYS]=
{
	//"BACKSPACE",//VK_BACK 08 BACKSPACE key  
	//"TAB",//VK_TAB 09 TAB key  
	//"ENTER",//VK_RETURN 0D ENTER key  
	//"SHIFT",//VK_SHIFT 10 SHIFT key  
	//"CTRL",//VK_CONTROL 11 CTRL key  
	//"ALT",//VK_MENU 12 ALT key  
	//"PAUSE",//VK_PAUSE 13 PAUSE key  
	//"ESC",//VK_ESCAPE 1B ESC key  
	//"PAGE UP",//VK_PRIOR 21 PAGE UP key  
	//"PAGE DOWN",//VK_NEXT 22 PAGE DOWN key  
	//"END",//VK_END 23 END key  
	//"HOME",//VK_HOME 24 HOME key  
	"LEFT ARROW",//VK_LEFT 25 LEFT ARROW key  
	"UP ARROW",//VK_UP 26 UP ARROW key  
	"RIGHT ARROW",//VK_RIGHT 27 RIGHT ARROW key  
	"DOWN ARROW",//VK_DOWN 28 DOWN ARROW key  
	//"PRINT SCREEN",//VK_SNAPSHOT 2C PRINT SCREEN key  
	//"INSERT",//VK_INSERT 2D INS key  
	//"DELETE",//VK_DELETE 2E DEL key  
	"0",//30 0 key  
	"1",//31 1 key  
	"2",//32 2 key  
	"3",//33 3 key  
	"4",// 34 4 key  
	"5",// 35 5 key  
	"6",// 36 6 key  
	"7",// 37 7 key  
	"8",// 38 8 key  
	"9",// 39 9 key  
	"A",//41 A key  
	"B",//42 B key  
	"C",//43 C key  
	"D",//44 D key  
	"E",//45 E key  
	"F",//46 F key  
	"G",//47 G key  
	"H",//48 H key  
	"I",//49 I key  
	"J",//4A J key  
	"K",//4B K key  
	"L",//4C L key  
	"M",//4D M key  
	"N",//4E N key  
	"O",//4F O key  
	"P",//50 P key  
	"Q",//51 Q key  
	"R",//52 R key  
	"S",//53 S key  
	"T",//54 T key  
	"U",//55 U key  
	"V",//56 V key  
	"W",//57 W key  
	"X",//58 X key  
	"Y",//59 Y key  
	"Z",//5A Z key  
	//"Windows key",//VK_LWIN 5B Left Windows key (Microsoft? Natural? keyboard)  
	//"NUMPAD0",//VK_NUMPAD0 60 Numeric keypad 0 key  
	//"NUMPAD1",//VK_NUMPAD1 61 Numeric keypad 1 key  
	//"NUMPAD2",//VK_NUMPAD2 62 Numeric keypad 2 key  
	//"NUMPAD3",//VK_NUMPAD3 63 Numeric keypad 3 key  
	//"NUMPAD4",//VK_NUMPAD4 64 Numeric keypad 4 key  
	//"NUMPAD5",//VK_NUMPAD5 65 Numeric keypad 5 key  
	//"NUMPAD6",//VK_NUMPAD6 66 Numeric keypad 6 key  
	//"NUMPAD7",//VK_NUMPAD7 67 Numeric keypad 7 key  
	//"NUMPAD8",//VK_NUMPAD8 68 Numeric keypad 8 key  
	//"NUMPAD9",//VK_NUMPAD9 69 Numeric keypad 9 key  
	//"F1",//VK_F1 70 F1 key  
	//"F2",//VK_F2 71 F2 key  
	//"F3",//VK_F3 72 F3 key  
	//"F4",//VK_F4 73 F4 key  
	//"F5",//VK_F5 74 F5 key  
	//"F6",//VK_F6 75 F6 key  
	//"F7",//VK_F7 76 F7 key  
	//"F8",//VK_F8 77 F8 key  
	//"F9",//VK_F9 78 F9 key  
	//"F10",//VK_F10 79 F10 key  
	//"F11",//VK_F11 7A F11 key  
	//"F12",//VK_F12 7B F12 key  
};

int nkey[TOTAL_KEYS]=
{
	//0x08,//BACKSPACE",//VK_BACK 08 BACKSPACE key  
	//0x09,//"TAB",//VK_TAB 09 TAB key  
	//0x0d,//"ENTER",//VK_RETURN 0D ENTER key  
	//0x10,//"SHIFT",//VK_SHIFT 10 SHIFT key  
	//0x11,//"CTRL",//VK_CONTROL 11 CTRL key  
	//0x12,//"ALT",//VK_MENU 12 ALT key  
	//0x13,//"PAUSE",//VK_PAUSE 13 PAUSE key  
	//0x1b,//"ESC",//VK_ESCAPE 1B ESC key  
	//0x21,//"PAGE UP",//VK_PRIOR 21 PAGE UP key  
	//0x22,//"PAGE DOWN",//VK_NEXT 22 PAGE DOWN key  
	//0x23,//"NULL",//VK_END 23 END key  
	//0x24,//"HOME",//VK_HOME 24 HOME key  
	0x25,//"LEFT ARROW",//VK_LEFT 25 LEFT ARROW key  
	0x26,//"UP ARROW",//VK_UP 26 UP ARROW key  
	0x27,//"RIGHT ARROW",//VK_RIGHT 27 RIGHT ARROW key  
	0x28,//"DOWN ARROW",//VK_DOWN 28 DOWN ARROW key  
	//0x2c,//"PRINT SCREEN",//VK_SNAPSHOT 2C PRINT SCREEN key  
	//0x2d,//"INSERT",//VK_INSERT 2D INS key  
	//0x2e,//"DELETE",//VK_DELETE 2E DEL key  
	0x30,//"0",//30 0 key  
	0x31,//"1",//31 1 key  
	0x32,//"2",//32 2 key  
	0x33,//"3",//33 3 key  
	0x34,//"4",// 34 4 key  
	0x35,//"5",// 35 5 key  
	0x36,//"6",// 36 6 key  
	0x37,//"7",// 37 7 key  
	0x38,//"8",// 38 8 key  
	0x39,//"9",// 39 9 key  
	0x41,//"A",//41 A key  
	0x42,//"B",//42 B key  
	0x43,//"C",//43 C key  
	0x44,//"D",//44 D key  
	0x45,//"E",//45 E key  
	0x46,//"F",//46 F key  
	0x47,//"G",//47 G key  
	0x48,//"H",//48 H key  
	0x49,//"I",//49 I key  
	0x4a,//"J",//4A J key  
	0x4b,//"K",//4B K key  
	0x4c,//"L",//4C L key  
	0x4d,//"M",//4D M key  
	0x4e,//"N",//4E N key  
	0x4f,//"O",//4F O key  
	0x50,//"P",//50 P key  
	0x51,//"Q",//51 Q key  
	0x52,//"R",//52 R key  
	0x53,//"S",//53 S key  
	0x54,//"T",//54 T key  
	0x55,//"U",//55 U key  
	0x56,//"V",//56 V key  
	0x57,//"W",//57 W key  
	0x58,//"X",//58 X key  
	0x59,//"Y",//59 Y key  
	0x5a,//"Z",//5A Z key  
	//0x5b,//"Windows key",//VK_LWIN 5B Left Windows key (Microsoft? Natural? keyboard)  
	//0x60,//"NUMPAD0",//VK_NUMPAD0 60 Numeric keypad 0 key  
	//0x61,//"NUMPAD1",//VK_NUMPAD1 61 Numeric keypad 1 key  
	//0x62,//"NUMPAD2",//VK_NUMPAD2 62 Numeric keypad 2 key  
	//0x63,//"NUMPAD3",//VK_NUMPAD3 63 Numeric keypad 3 key  
	//0x64,//"NUMPAD4",//VK_NUMPAD4 64 Numeric keypad 4 key  
	//0x65,//"NUMPAD5",//VK_NUMPAD5 65 Numeric keypad 5 key  
	//0x66,//"NUMPAD6",//VK_NUMPAD6 66 Numeric keypad 6 key  
	//0x67,//"NUMPAD7",//VK_NUMPAD7 67 Numeric keypad 7 key  
	//0x68,//"NUMPAD8",//VK_NUMPAD8 68 Numeric keypad 8 key  
	//0x69,//"NUMPAD9",//VK_NUMPAD9 69 Numeric keypad 9 key  
	//0x70,//"F1",//VK_F1 70 F1 key  
	//0x71,//"F2",//VK_F2 71 F2 key  
	//0x72,//"F3",//VK_F3 72 F3 key  
	//0x73,//"F4",//VK_F4 73 F4 key  
	//0x74,//"F5",//VK_F5 74 F5 key  
	//0x75,//"F6",//VK_F6 75 F6 key  
	//0x76,//"F7",//VK_F7 76 F7 key  
	//0x77,//"F8",//VK_F8 77 F8 key  
	//0x78,//"F9",//VK_F9 78 F9 key  
	//0x79,//"F10",//VK_F10 79 F10 key  
	//0x7a,//"F11",//VK_F11 7A F11 key  
	//0x7b//"F12",//VK_F12 7B F12 key  
};

#pragma data_seg("mydata") 
//安装的键盘勾子句柄
HHOOK glhKeyboradHook=NULL;
//DLL实例句柄 
HINSTANCE glhkInstance=NULL;
#pragma data_seg() 

//#pragma comment(linker,"/SECTION:mydata,RWS")

static AFX_EXTENSION_MODULE KeyboardHookDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	//如果使用lpReserved参数则删除下面这行 
	UNREFERENCED_PARAMETER(lpReserved);
	
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("KEYBOARDHOOK.DLL Initializing!\n");
	
		//扩展DLL仅初始化一次 
		if (!AfxInitExtensionModule(KeyboardHookDLL, hInstance))
			return 0;
		
		// Insert this DLL into the resource chain
		// NOTE: If this Extension DLL is being implicitly linked to by
		//  an MFC Regular DLL (such as an ActiveX Control)
		//  instead of an MFC application, then you will want to
		//  remove this line from DllMain and put it in a separate
		//  function exported from this Extension DLL.  The Regular DLL
		//  that uses this Extension DLL should then explicitly call that
		//  function to initialize this Extension DLL.  Otherwise,
		//  the CDynLinkLibrary object will not be attached to the
		//  Regular DLL's resource chain, and serious problems will
		//  result.
		
		//把DLL加入动态MFC类库中 
		new CDynLinkLibrary(KeyboardHookDLL);
		//保存DLL实例句柄 
		glhkInstance=hInstance; 
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("KEYBOARDHOOK.DLL Terminating!\n");
		//终止这个链接库前调用它 
		AfxTermExtensionModule(KeyboardHookDLL);
	}
	return 1;   // ok
}

//类构造函数 
CKeyboradHook::CKeyboradHook()
{
}

//类析构函数
CKeyboradHook::~CKeyboradHook()
{
	StopHook();
}

//键盘钩子
//钩子函数的实现: 
LRESULT WINAPI KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	for(int i =0;i<TOTAL_KEYS;i++)
	{
		if(nkey[i]==(int)wParam)
		{
			//if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode)) 
			int nKeyStatus=lParam & 0x80000000;
			switch(nKeyStatus)
			case 0://WM_KEYDOWN
			//case 0x80000000://WM_KEYUP
			{
				CString strFileName;
				
				char szBuf[256]; 
				char *pPath; 
				CString strPath; 
				
				GetModuleFileName(glhkInstance,szBuf,sizeof(szBuf)); 
				pPath = szBuf; 
				while(strchr(pPath,'\\')) 
				{ 
					pPath = strchr(pPath,'\\'); 
					pPath++; 
				} 
				*pPath = '\0'; 
				strPath=szBuf; 
				
				strFileName.Format("%sres\\%s.wav",strPath,cskey[i]); 
				sndPlaySound(strFileName,SND_ASYNC);
				break;
			}
		}
	}
	return CallNextHookEx(glhKeyboradHook, nCode, wParam, lParam);	 
}

//安装钩子
BOOL CKeyboradHook::StartHook() 
{ 
	glhKeyboradHook=SetWindowsHookEx(WH_KEYBOARD,KeyboradProc,
		                             glhkInstance,0); 
	
	if(glhKeyboradHook!=NULL) 
		return TRUE; 
	return FALSE; 
} 

//卸载钩子

BOOL CKeyboradHook::StopHook() 
{ 
	BOOL bResult=FALSE; 
	if(glhKeyboradHook) 
	{ 
		bResult= UnhookWindowsHookEx(glhKeyboradHook); 
		if(bResult) 
		{ 
			glhKeyboradHook=NULL; 
		} 
	} 
	return bResult; 
} 

⌨️ 快捷键说明

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