小弟刚学windows hook,想用全局键盘钩子做一个改键程序,不知道哪里出了问题,帖出代码请教一下大家。dllmain代码extern HHOOK CuhHook;
extern HINSTANCE g_hModule;
extern BOOL StopHook();BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HINSTANCE)hModule;
break; case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
StopHook();
break;
}
return TRUE;
}
头文件#pragma once#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllimport)
#else
#define KEYHOOKLIB_API __declspec(dllexport)
#endif HHOOK CuhHook = NULL;
HINSTANCE g_hModule;EXTERN_C KEYHOOKLIB_API BOOL StartHook();
BOOL StopHook();
cpp文件LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(CuhHook, nCode, wParam, lParam);
}EXTERN_C KEYHOOKLIB_API BOOL StartHook()
{
CuhHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0); if (CuhHook != NULL)
return 1;
else
return 0;
}BOOL StopHook()
{
if (UnhookWindowsHookEx(CuhHook))
return 1;
else
return 0;
}
生成dll之后,再创建一个win32 console程序,加载dll并调用StartHook函数,调用后发现钩子安装成功了。但是一旦按下任何毽子,windows直接卡死了,请问大家问题出在哪儿呢?
extern HINSTANCE g_hModule;
extern BOOL StopHook();BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HINSTANCE)hModule;
break; case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
StopHook();
break;
}
return TRUE;
}
头文件#pragma once#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllimport)
#else
#define KEYHOOKLIB_API __declspec(dllexport)
#endif HHOOK CuhHook = NULL;
HINSTANCE g_hModule;EXTERN_C KEYHOOKLIB_API BOOL StartHook();
BOOL StopHook();
cpp文件LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(CuhHook, nCode, wParam, lParam);
}EXTERN_C KEYHOOKLIB_API BOOL StartHook()
{
CuhHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0); if (CuhHook != NULL)
return 1;
else
return 0;
}BOOL StopHook()
{
if (UnhookWindowsHookEx(CuhHook))
return 1;
else
return 0;
}
生成dll之后,再创建一个win32 console程序,加载dll并调用StartHook函数,调用后发现钩子安装成功了。但是一旦按下任何毽子,windows直接卡死了,请问大家问题出在哪儿呢?
{
if(CuhHook == NULL)
CuhHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0); if (CuhHook != NULL)
return 1;
else
{
DWORD dwErr = GetLastError();
ASSERT(0);
return 0;
}
}BOOL StopHook()
{
if(CuhHook)
{
if (UnhookWindowsHookEx(CuhHook))
{
CuhHook = NULL;
return 1;
}
else
{
DWORD dwErr = GetLastError();
ASSERT(0);
}
}
return 0;
}
控制台程序没有消息循环,无法使用全局钩子, 下面是我以前曾遇到过的和你相同的问题:
http://topic.csdn.net/u/20081023/22/1a0984ca-3bba-4f72-b9b4-67a769899555.html
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include "KeyHook.h"#pragma data_seg ("shared")
static HHOOK g_hHook = NULL;
#pragma data_seg ()HINSTANCE g_hModule = NULL;LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}EXTERN_C KEYHOOKLIB_API BOOL StartHook()
{
if (g_hHook == NULL)
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0); if (g_hHook != NULL)
return 1;
else
return 0;
}EXTERN_C KEYHOOKLIB_API BOOL StopHook()
{
if (UnhookWindowsHookEx(g_hHook))
return 1;
else
return 0;
}BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HINSTANCE)hModule;
break; case DLL_THREAD_ATTACH:
break; case DLL_THREAD_DETACH:
break; case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
还是下载我的源码吧
我的群110337996
也就是安装一次 卸载了 再也安装不起来了
给你的代码你怎么都不改呢 造成多次安装卸载的与你的调用程序有关,从这里看不出问题
虽然我也是新手,但帮你调个钩子,应该还凑合
不过我使用的工具是VS2008,楼主应该使用的是VC6.0,可能无法打开。
反正,你试着把WH_KEYBOARD_LL修改为WH_KEYBOARD应该能解决问题。