Hook键盘解决方法

Hook键盘
我做了一个全局键盘钩子,一个全局钩子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这些键,用低级键盘钩子试试
------解决方案--------------------
我这个可以
------解决方案--------------------