VC写的全局键盘钩子没反应啊??高手帮忙解决一下啊。

我的想法是:写了一个钩子函数,hook按键,主要一旦按键后,就弹出一个MesssageBox来,告诉用户,是按了哪个键。

具体看代码:

dll提供的接口是void WINAPI SetHook(); void WINAPI UnHook();

// MyHook.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "MyHook.h"
#include "stdlib.h"

#pragma data_seg("YCIShared")

HHOOK g_hhook=NULL; //保存钩子的句柄

#pragma data_seg()

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;
}
return TRUE;
}

// 一个通过内存地址取得模块句柄的帮助函数
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}

LRESULT CALLBACK HookFunc(int nCode,WPARAM wParam,LPARAM lParam)
{
// 让其它全局钩子获得消息.
LRESULT Result=CallNextHookEx(g_hhook,nCode,wParam,lParam);

if(nCode==HC_ACTION)
{
if(lParam & 0x80000000)
{
// 保存按键消息.

char ch[10];

itoa(wParam,ch,10);

::MessageBox(NULL,ch,NULL,MB_OK);

}
}
return Result;

}

//安装钩子函数,接口

MYHOOK_API void WINAPI SetHook()
{

if(g_hhook!=NULL)
{

g_hhook=::SetWindowsHookEx(WH_KEYBOARD,HookFunc,ModuleFromAddress(HookFunc),0); //安装钩子

}

return;

}

//接口
MYHOOK_API void WINAPI UnHook()
{
if(g_hhook!=NULL)
{
::UnhookWindowsHookEx(g_hhook);
}
}
我写了一个基于对话框的mfc程序,在这个程序的OnInitDialog里面加了一句:

SetHook();

发现钩子无效啊。。。

你安装钩子之前判断应该是g_hhook==NULL。
温馨提示:内容为网友见解,仅供参考
无其他回答

vc++如何锁定键盘?求教高手
用全局键盘钩子来过滤按键。我不知道这是不是个好方法。要这样子来实现,你还是先去看看DLL(动态链接库),和钩子的相关知识。到时自然就知道怎么做了。以上两样都内容有点多,我一句两句说不清。

vc++如何锁定键盘?求教高手
同学,具体是监控键盘输入的事件接口,程序你不会要我给你搞定吧,我只能说做到搞定你监控键盘输入,然后sleep是怎么搞你自己弄好吗 我等等发给你,注意要在.net2.0坏境下运行,你确保你有.net2.0运行时 我发给你了,代码可以用txt打开,不过建议还是用vs2005打开,另外你需要注意的是可以运行测试例...

vb 如何禁用键盘的组合键 ,如Win+D,显示桌面键!我是新手,分不多,请高...
看你那两个API就应该有个MaskKey.dll的文件,我都没见过这个dll,是你自己写的?这个MaskKey.dll有没有在你的电脑里注册?另外要屏蔽键盘上的按键可以写个键盘钩子去实现

相似回答