折翅的飞蛾 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 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误