用VS2010建立一个基于对话框的应用程序HOOKDLG,添加修改以下函数可以使程序屏蔽掉鼠标和键盘消息,按Alt+F4键退出程序:
1 HWND hWnd = NULL; //定义成全局变量 2 HHOOK hKeyboard; 3 HHOOK hMouse; 4 5 LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lparam ) // 鼠标钩子函数 6 { 7 return 1; // 返回非零值表示已经对当前消息进行了处理,这样系统就不会再将这个消息传递给目标窗口过程 8 } 9 10 LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lparam ) 11 { 12 if( VK_F4 == wParam && (1 == (lparam>>29&1)) ) // 系统后门:Alt+F4键退出程序 13 { 14 ::SendMessageA( hWnd, WM_CLOSE, 0, 0 ); 15 // 卸载钩子函数 16 UnhookWindowsHookEx( hKeyboard ); 17 UnhookWindowsHookEx( hMouse ); 18 } 19 return 1; 20 } 21 22 23 // CHookDlg 消息处理程序 24 25 BOOL CHookDlg::OnInitDialog() 26 { 27 CDialogEx::OnInitDialog(); 28 29 // 将“关于...”菜单项添加到系统菜单中。 30 31 // IDM_ABOUTBOX 必须在系统命令范围内。 32 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 33 ASSERT(IDM_ABOUTBOX < 0xF000); 34 35 CMenu* pSysMenu = GetSystemMenu(FALSE); 36 if (pSysMenu != NULL) 37 { 38 BOOL bNameValid; 39 CString strAboutMenu; 40 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 41 ASSERT(bNameValid); 42 if (!strAboutMenu.IsEmpty()) 43 { 44 pSysMenu->AppendMenu(MF_SEPARATOR); 45 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 46 } 47 } 48 49 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 50 // 执行此操作 51 SetIcon(m_hIcon, TRUE); // 设置大图标 52 SetIcon(m_hIcon, FALSE); // 设置小图标 53 54 // TODO: 在此添加额外的初始化代码 55 hWnd = m_hWnd; 56 57 // 安装钩子函数 58 hMouse = SetWindowsHookEx( WH_MOUSE, MouseProc, NULL, GetCurrentThreadId() ); 59 hKeyboard = SetWindowsHookEx( WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId() ); 60 61 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE 62 }