VC++中鍵盤鈎子和鼠標鈎子


該例的鈎子都是寫在一個DLL中的,和應用程序獨立開來的全局鈎子。

一般情況下,如果要截獲鼠標和普通按鍵,剛可以用下邊的方法

鼠標:

LRESULT CALLBACK MouseProc(
			int nCode,      // hook code
			WPARAM wParam, // message identifier
			LPARAM lParam   // mouse coordinates
			)
{
	return TRUE;
}

鍵盤:

LRESULT CALLBACK KeyboardProc(
			  int code,       // hook code
			  WPARAM wParam, // virtual-key code
			  LPARAM lParam   // keystroke-message information
			  )
{
	return TRUE;
}

上邊這個鍵盤鈎子只能截獲普通鍵,像WIN鍵、CTRL+ESC什么的是截獲不了的,如果要截獲這些比較牛的功能鍵及組合鍵,那就要用低級鍵盤鈎子了

低級鍵盤鈎子:

LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
				WPARAM wParam,
				LPARAM lParam
				)
{
	if(nCode==HC_ACTION)
	{
		KBDLLHOOKSTRUCT *kblp=(KBDLLHOOKSTRUCT*)lParam;
		BOOL bCtrlKeyDown = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);
		if ((kblp->vkCode==VK_ESCAPE && bCtrlKeyDown) || // Ctrl+Esc
			// Alt+TAB
			(kblp->vkCode==VK_TAB && kblp->flags & LLKHF_ALTDOWN) ||   
			// Alt+Esc
			(kblp->vkCode==VK_ESCAPE && kblp->flags & LLKHF_ALTDOWN)|| 
			(kblp->vkCode==VK_LWIN || kblp->vkCode==VK_RWIN))
		{
				
				return TRUE; // 不再往CallNextHookEx傳遞,直接返回
		}
	}
	return CallNextHookEx(g_KeyBoardHook, nCode, wParam, lParam);
}

然后通過下邊的方法安裝和卸載鈎子:

VOID __stdcall InstallHookEv()
{
	//g_KeyBoardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, 0);
	g_LowKeyBoardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, theApp.m_hInstance, 0);
	g_MouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, theApp.m_hInstance, 0);
}

VOID __stdcall UninstallHookEv()
{
	//UnhookWindowsHookEx(g_KeyBoardHook);
	UnhookWindowsHookEx(g_LowKeyBoardHook);
	UnhookWindowsHookEx(g_MouseHook);
}

這些方法中帶"g_"的變量都是定義在DLL中這些方法所在的.cpp文件最上邊的

HHOOK g_KeyBoardHook = NULL;
HHOOK g_LowKeyBoardHook = NULL;
HHOOK g_MouseHook = NULL;

要包含頭文件

#include <Windows.h>

這些方法我自己在多台機子上測試時有時候會出些問題,我這個DEMO運行后是托盤圖標形式的,鈎子是可以按情況安裝和卸載的,在有的機子上安裝卸載一次后,托盤圖標右鍵菜單點擊沒反應,其他一切正常;在另一台機子上安裝鈎子后好像無法卸載鈎子。這些問題的出現我想可能和這些機子上的安全軟件有關。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM