折翅的飞蛾 2015-04-21 04:05 采纳率: 100%
浏览 3412
已结题

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

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有响应;有的没有任何响应,比如切换到网页等;
我想实现的功能是:无论在哪里,只要键盘按下,我的程序就会有响应 打印按键被按下的消息

  • 写回答

4条回答

  • 折翅的飞蛾 2015-04-21 04:13
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100