又一个有关全局钩子的问题,请大家帮帮忙(目前系统只让我给这么多分,抱歉) WH_KEYBOARD_LL is Global only! ghKeyHook = ::SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardProc, ::AfxGetApp()->m_hInstance, 0 ); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 试试::SetWindowsHookEx( WH_KEYBOARD, KeyboardProc, AfxGetInstanceHandle(), 0 );to zhq2000: 没有搞错吧,WH_KEYBOARD_LL是只能在NT下用的 顺便将我写的一个键盘钩子贴出来吧://头文件#ifndef _LHOOK_H_#define _LHOOK_H_///////////////////////////////////////////////////////////////////////////////#ifndef HOOKLIBAPI#define HOOKLIBAPI __declspec(dllimport)#endif//-----------------------------------------------------------------LRESULT HOOKLIBAPI KbdHookProc (int nCode, WPARAM wParam, LPARAM lParam) ;BOOL HOOKLIBAPI InstallKeyboardHook (HWND hWnd);BOOL HOOKLIBAPI DeInstallKeyboardHook();///////////////////////////////// End of File /////////////////////////////////#endif // LHOOKDLL_H//实现文件#include <windows.h>#define HOOKLIBAPI __declspec(dllexport)#include "lHook.h"#pragma data_seg("Shared")//----------------------------------键盘HOOKHHOOK ghKeyHook = NULL ;HOOKPROC glpfnHookProc = 0;#pragma data_seg()// 用Shared的方式来编译,并加上rws属性,表示以上变量可以读、写和共享#pragma comment(linker, "/section:Shared,rws")///////////////////////////////////////////////////////////////////////////////HINSTANCE g_hinstDll = NULL; // instance handle//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: g_hinstDll = hinstDll; break; } return(TRUE);}BOOL InstallKeyboardHook (HWND hWnd) { BOOL bSuccess = FALSE; if (!ghKeyHook) { glpfnHookProc = (HOOKPROC) KbdHookProc; bSuccess = (NULL != (ghKeyHook = ::SetWindowsHookEx(WH_KEYBOARD, glpfnHookProc, g_hinstDll, NULL))); } return bSuccess;}BOOL DeInstallKeyboardHook(){ if (ghKeyHook) { if (TRUE == (0 != ::UnhookWindowsHookEx(ghKeyHook))) { ghKeyHook = NULL; } } return (NULL == ghKeyHook);}LRESULT KbdHookProc (int nCode, WPARAM wParam, LPARAM lParam) { //your code here return ::CallNextHookEx (ghKeyHook, nCode, wParam, lParam);} 随风的回答正确!关键是把SetWindowsHookEx放到动态连接库中去。Windows NT和2000必须采用WH_KEYBOARD_LL才能在系统处理前钩到键盘输入。 一定要把SetWindowsHookEx的第三个参数设置成该动态连接库的HANDLE且第四个参数为NULL。 VC++问题,经典link2001:囧!!! 能否在对话框里绘制栅格,并能得到栅格中的交点? 高手帮忙!关于CFile写文件问题 对话框中函数OnEraseBkgnd()如何添加? SetDiBitsToDevice 高手请进,哪位解释一下以面程序的意思。200分 请问我在状态栏显示一个按钮,怎么样才能使它响应按键动作。 送分题 我想把CByteArray类型的转换成CString,我该怎么转?最好别告诉我用循环转换。。 谁看了《STL之父访谈录〉? CEvent的问题? 我的dcom在本地调用没问题,用客户端(vb)调用时,老是提示无权限,该怎样设置
AfxGetInstanceHandle(), 0 );
to zhq2000: 没有搞错吧,WH_KEYBOARD_LL是只能在NT下用的
//头文件
#ifndef _LHOOK_H_
#define _LHOOK_H_
///////////////////////////////////////////////////////////////////////////////
#ifndef HOOKLIBAPI
#define HOOKLIBAPI __declspec(dllimport)
#endif
//-----------------------------------------------------------------
LRESULT HOOKLIBAPI KbdHookProc (int nCode, WPARAM wParam, LPARAM lParam) ;
BOOL HOOKLIBAPI InstallKeyboardHook (HWND hWnd);
BOOL HOOKLIBAPI DeInstallKeyboardHook();
///////////////////////////////// End of File /////////////////////////////////#endif // LHOOKDLL_H
//实现文件
#include <windows.h>
#define HOOKLIBAPI __declspec(dllexport)
#include "lHook.h"#pragma data_seg("Shared")
//----------------------------------键盘HOOK
HHOOK ghKeyHook = NULL ;
HOOKPROC glpfnHookProc = 0;#pragma data_seg()
// 用Shared的方式来编译,并加上rws属性,表示以上变量可以读、写和共享
#pragma comment(linker, "/section:Shared,rws")///////////////////////////////////////////////////////////////////////////////HINSTANCE g_hinstDll = NULL; // instance handle//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = hinstDll;
break;
}
return(TRUE);
}BOOL InstallKeyboardHook (HWND hWnd)
{
BOOL bSuccess = FALSE;
if (!ghKeyHook)
{
glpfnHookProc = (HOOKPROC) KbdHookProc;
bSuccess = (NULL != (ghKeyHook = ::SetWindowsHookEx(WH_KEYBOARD, glpfnHookProc, g_hinstDll, NULL)));
}
return bSuccess;
}BOOL DeInstallKeyboardHook()
{
if (ghKeyHook)
{
if (TRUE == (0 != ::UnhookWindowsHookEx(ghKeyHook)))
{
ghKeyHook = NULL;
}
} return (NULL == ghKeyHook);
}
LRESULT KbdHookProc (int nCode, WPARAM wParam, LPARAM lParam)
{
//your code here
return ::CallNextHookEx (ghKeyHook, nCode, wParam, lParam);
}
关键是把SetWindowsHookEx放到动态连接库中去。Windows NT和2000必须采用WH_KEYBOARD_LL才能在系统处理前钩到键盘输入。