全局键盘钩子函数的回调函数有时无效

DLL代码:
 myHooke.c
#include "myHooke.h"
#include <windows.h>
#include <winuser.h>
#include <stdlib.h>
#include <stdio.h>
int ndown = 0;
HHOOK hhkHook = NULL;           //定义钩子句柄
HINSTANCE hInstance = NULL;     //程序实例

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    hInstance = (HINSTANCE)hModule; //得到DLL实例

    return TRUE;
}
//回调函数
__declspec(dllexport) LRESULT CALLBACK myHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    LRESULT Result=CallNextHookEx(hhkHook, nCode, wParam, lParam);
    if(wParam == 'M' && (lParam & 0x40000000))
    {
        printf("M is downed ! %d\n", ndown++);
    }
    return Result;
}
//加载钩子
int load()
{
    if(!(hhkHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)myHookProc, hInstance, 0)))
    {
        return FALSE;
    }
    return TRUE;
}
//卸载钩子
int unload()
{
    return UnhookWindowsHookEx(hhkHook);
}

myHooke.h:
#ifndef MYHOOKD_H
#define MYHOOKD_H
#define EXPORT __declspec(dllexport)
#define _WIN32_WINNT 0x400 
EXPORT int load();
EXPORT int unload();
#endif

调用的函数:
#include <windows.h>
#include <winuser.h>
#include <stdio.h>
#include <stdlib.h>

typedef int (*FUNCTION)();

int main(int argc, char *argv[])
{
    HINSTANCE hDll;
    FUNCTION loadhook = NULL;
    FUNCTION unloadhook = NULL;
    hDll = LoadLibrary("..\\myHooke\\Debug\\myHooke.dll");

    if(hDll != NULL)
    {
        loadhook = (FUNCTION)GetProcAddress(hDll, "load");
        unloadhook = (FUNCTION)GetProcAddress(hDll, "unload");

        if(loadhook == NULL)
        {
            MessageBox(0, "loadhook failed", "MyHook", MB_OK);
            return 1;
        }

        if(unloadhook == NULL)
        {
            MessageBox(0, "unloadhook failed", "MyHook", MB_OK);
            return 1;
        }

        if(!loadhook())
        {
            return 1;
        }
    //  while(1)
        {
            printf("hook is load !");
            MessageBox(0, "Hold on box", "MyHook", MB_OK);
            //使用循环会使程序卡住,所以用了MessageBox是程序暂停

            Sleep(1000);
        }
        unloadhook();
        FreeLibrary(hDll);
    }

    return 0;
}

有些出口可以获取键盘消息,有些不能获取键盘消息,这是全局钩子,我是菜鸟,求大神帮助啊!!!

补充一下,程序运行时,切换到其他程序,有的可以获取键盘消息,printf有响应;有的没有任何响应,比如切换到网页等;
我想实现的功能是:无论在哪里,只要键盘按下,我的程序就会有响应 打印按键被按下的消息

补充一下,程序运行时,切换到其他程序,有的可以获取键盘消息,printf有响应;有的没有任何响应,比如切换到网页等;
我想实现的功能是:无论在哪里,只要键盘按下,我的程序就会有响应 打印按键被按下的消息。

你需要使用低级键盘钩子

WH_KEYBOARD_LL

WH_KEYBOARD_LL 会被杀毒软件阻止的啊,能告诉我为什么WH_KEYBOARD不可以吗?

WH_KEYBOARD 一般还是在系统处理后处理,注入式键盘挂钩(注入dll到目标进程估计没人会喜欢),所以像Ctrl+alt+del 系统会先处理掉,WH_KEYBOARD没法截获

WH_KEYBOARD_LL是在系统处理前处理的,所以很容易引起挂起之类的问题,不过操作系统通过LowLevelHooksTimeout控制超时,如果这个时间后HOOK函数还没返回,就直接被忽略了

所以要监视键盘,还是用WH_KEYBOARD_LL吧

http://blog.csdn.net/hgy413/article/details/8003249