Keyboard Hook

.h
class CFullWindowDlg : public CDialogEx
{
...
void SetHook();
}


.cpp
///全局变量
HWND g_hWnd = NULL;             //窗口句柄
HHOOK g_hlowKeyHook = NULL;     //低级键盘钩子句柄
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
///


//安装钩子  
void CFullWindowDlg::SetHook()  //为了操作窗体,我们将主窗体的句柄传进去  
{
	g_hWnd = this->m_hWnd;
	g_hlowKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, AfxGetApp()->m_hInstance, NULL);
}

//低级键盘钩子  
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	bool isClick = false;
	PKBDLLHOOKSTRUCT LowKey = NULL;   //该结构体包含底层键盘输入事件的信息  

	if (nCode == HC_ACTION)      //HC_ACTION  表示有消息  
	{
		LowKey = (PKBDLLHOOKSTRUCT)lParam;
		switch (wParam)
		{
		case WM_KEYDOWN:
		{
			isClick = 1;
			if (LowKey->vkCode == VK_F8) // 后门  
			{
				//  ::MessageBox(NULL,"触发钩子后门程序,正在卸载钩子~~关闭程序","提示",MB_OK);  
				SendMessage(g_hWnd, WM_CLOSE, 0, 0);   //发送关闭主窗体消息  
				UnhookWindowsHookEx(g_hlowKeyHook);    //卸载低级键盘钩子  
			}
			break;
		}
		case WM_SYSKEYDOWN:
		case WM_KEYUP:
		case WM_SYSKEYUP:
		{              // 屏蔽Win  
			isClick = (LowKey->vkCode == VK_LWIN) || (LowKey->vkCode == VK_RWIN) ||
				//屏蔽Alt+F4  
				((LowKey->vkCode == VK_F4) && ((LowKey->flags & LLKHF_ALTDOWN) != 0)) ||
				// 屏蔽Alt+Tab  
				((LowKey->vkCode == VK_TAB) && ((LowKey->flags & LLKHF_ALTDOWN) != 0)) ||
				// 屏蔽Alt+Esc  
				((LowKey->vkCode == VK_ESCAPE) && ((LowKey->flags & LLKHF_ALTDOWN) != 0)) ||
				// 屏蔽Ctrl+Esc  
				((LowKey->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
			break;
		}
		default:
			break;
		}
	}
	if (isClick)
	{
		return 1;
	}
	return CallNextHookEx(g_hlowKeyHook, nCode, wParam, lParam);  //传给下一个钩子  
}