Hook键盘解决方法
Hook键盘
我做了一个全局键盘钩子,一个全局钩子DLL和一个应用程序test.exe,当前测试一个简单的功能,屏蔽Alt+F4,现在的现象是这样的:
启动Test.exe,按下Alt+F4,程序不会关闭;打开一个记事本,按下Alt+F4,记事本也不会关闭;不关闭Test.exe,打开资源管理器,按下Alt+F4,资源管理器关掉了!!!这时在对记事本操作,也关闭了,更郁闷的是Test.exe也能关闭。
请大侠们指点一下,我这里贴点代码:
------解决方案--------------------
我做了一个全局键盘钩子,一个全局钩子DLL和一个应用程序test.exe,当前测试一个简单的功能,屏蔽Alt+F4,现在的现象是这样的:
启动Test.exe,按下Alt+F4,程序不会关闭;打开一个记事本,按下Alt+F4,记事本也不会关闭;不关闭Test.exe,打开资源管理器,按下Alt+F4,资源管理器关掉了!!!这时在对记事本操作,也关闭了,更郁闷的是Test.exe也能关闭。
请大侠们指点一下,我这里贴点代码:
- C/C++ code
// HookKeyboard.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "HookKeyboard.h" #include <assert.h> #include <stdio.h> #include "MapKey.h" #define KEYMAP_SIZE 512 #pragma data_seg(".shared") FILE * glpFile = NULL; HHOOK glHook = NULL; //!钩子句柄 HINSTANCE glhModule = NULL; //!DLL实例 BYTE glKeyMap[KEYMAP_SIZE] = {0}; //!存放键盘映射表,全局共享 #pragma data_seg() #pragma comment(linker, " /SECTION:.shared,RWS") BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { glhModule = (HINSTANCE)hModule; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { } break; case DLL_THREAD_ATTACH: { } break; case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: { } break ; } return TRUE; } HKB_API LRESULT CALLBACK KeyBoardProc(int code, WPARAM wParam, LPARAM lParam) { if (code < 0) { return CallNextHookEx(glHook, code, wParam, lParam); } DWORD dwAsist = 0; if (HIBYTE(GetKeyState(VK_CONTROL))) { dwAsist |= KEY_CTRL; } if (HIBYTE(GetKeyState(VK_MENU))) { dwAsist |= KEY_ALT; } if (HIBYTE(GetKeyState(VK_SHIFT))) { dwAsist |= KEY_SHIFT; } fprintf(glpFile, "WPARAM|FLAG[%x|%x]\r\n", wParam, dwAsist); fflush(glpFile); int nRet = 0; nRet = MapKey(glKeyMap, sizeof(glKeyMap), &wParam, &lParam, dwAsist); fprintf(glpFile, "2-WPARAM|FLAG[%x|%x]\r\n", wParam, dwAsist); fflush(glpFile); if (-1 == nRet) { return -1; } return CallNextHookEx(glHook, code, wParam, lParam); } HKB_API BOOL SetKeyboardHook() //Test.exe启动时调用这个函数 { glpFile = fopen("debug.txt", "wb"); InitKeyMap(glKeyMap, sizeof(glKeyMap)); AddKeyMap(glKeyMap, sizeof(glKeyMap), KEY_ALT, VK_F4, KEY_NULL, KEY_NULL); glHook = SetWindowsHookEx(WH_KEYBOARD, HOOKPROC(KeyBoardProc), glhModule, 0); return NULL != glHook; } HKB_API BOOL UnsetKeyboardHook() //Test.exe退出时调用这个函数 { UnhookWindowsHookEx(glHook); return TRUE; }
------解决方案--------------------
- C/C++ code
#include <Windows.h> HHOOK g_hOldHook = NULL; LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if(HC_ACTION == nCode) { if((GetKeyState(VK_MENU) < 0) && (GetKeyState(VK_F4) < 0)) { return 1; } } return CallNextHookEx(g_hOldHook, nCode, wParam, lParam); } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { g_hOldHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0); if(NULL == g_hOldHook) { _tprintf(_T("Error: %d\n"), GetLastError()); return 1; } MessageBox(NULL, _T("HOOK"), _T("HOOK"), MB_ICONINFORMATION | MB_OK); UnhookWindowsHookEx(g_hOldHook); return 0; }
------解决方案--------------------
键盘钩子应该处理不了Alt+F4这些键,用低级键盘钩子试试
------解决方案--------------------
我这个可以
------解决方案--------------------