vc++6 0-全局键盘钩子函数的回调函数有时无效

问题描述

全局键盘钩子函数的回调函数有时无效
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 ! %dn", 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

时间: 2024-12-30 12:34:13

vc++6 0-全局键盘钩子函数的回调函数有时无效的相关文章

C# 全局键盘钩子 与sendkey

问题描述 C#全局键盘钩子的问题,本人刚接触,很多问题不太清楚,最好指出怎么修改谢谢.程序功能:按ctrl组合键输出一个值,按F9时也输出一个值但是F9的时候Sendkeys.send(变量)可以正常输出,而ctrl组合键输出不正常(启动程序第一次按ctrl组合键输出正常,之后就不行了),这里的变量是数组的其中一个元素键盘钩子代码可以参考http://jingyan.baidu.com/article/ceb9fb10ebd9f68cad2ba03c.html或http://pan.baidu.

怎么实现类的成员函数作为回调函数_C 语言

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败.要解决这一问题的关键就

利用Thunk让C++成员函数变回调函数

Windows API经常需要回调函数,而在C++开发中面向对象当行其道,若能让C++类的成员函数成为回调函数,简直就是大善!但是C++成员函数都隐含了一个this指针用于指向当前的对象.要实现回调确实不容易. 我大约一年前就接触到Thunk技术,甚至也看过利用Thunk实现将成员函数变成回调函数的例子.但是我实在没了解过C++汇编后的样子,很容易钻了牛角尖,看都看不懂,直接用他们的程序又不敢,毕竟出错后不好处理.前端时间偶尔想起Thunk技术,对未懂技术老这样悬着很可能影响自己的程序员生涯的,

vb.net 全局键盘钩子?

问题描述 这段键盘钩子,在窗口里怎么调用啊?ImportsSystem.Reflection,System.Threading,System.ComponentModel,System.Runtime.InteropServices'''<summary>本类可以在.NET环境下使用系统键盘与鼠标钩子</summary>PublicClassSystemHook定义结构API声明导入常量声明事件委托处理PrivatehMouseHookAsIntegerPrivatehKeyboa

关于C#调用C++函数绑定回调函数后发生CrossThreadMessagingException异常的问题

问题描述 代码如下://事件函数原型//typedefBRIINT32(CALLBACK*PCallBack_EventEx)(PBRI_EVENTpEvent,BRIUINT32dwUserData);//事件函数代理publicdelegateInt32CallbackDelegate(BriSDKLib.TBriEvent_DataeventData,Int32dwUserData);//代理对象publicstaticCallbackDelegatecallback;//事件回调函数pr

windows api学习笔记-键盘钩子

DLL项目的头文件 #ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义 #define KEYHOOKLIB_API __declspec(dllexport) #else #define KEYHOOKLIB_API __declspec(dllimport) #endif #define HM_KEY WM_USER+101 BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId =

C#全局键盘监听(Hook)的使用

一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下快捷键使用此功能... 这个时候在程序中添加键盘监听肯定不能满足需求了,当用户焦点不在App上时(如最小化,或者用户在处理其它事物等等)键盘监听就失效了 二.怎样才能实现全局键盘监听? 这里需要用到Windows API,源码如下:(可以作为一个工具类[KeyboardHook.cs]收藏起来) u

hook-C# 全局键盘监听Hook监听不到

问题描述 C# 全局键盘监听Hook监听不到 使用的是网上的Hook轮子,如下 using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Reflection;namespace HookTest { /// <summary> /// 键盘钩子 /// [以下代码来自某网

使用回调函数(VC &amp;amp; Delphi)

回调函数是一个很有用,也很重要的概念.当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数.回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程.本文不准备介绍这些函数和过程,而是谈谈实现自己的回调函数的一些经验. 之所以产生使用回调函数这个想法,是因为现在使用VC和Delphi混合编程,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成