安装键盘钩子的函数这么写对吗? SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardProc,hins,0); 用WH_KEYBOARD根本就进不了KeyboardProc函数。 我的系统是vista。还有KeyboardProc函数到底该怎么写?
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
TRACE("lParam=%d \n",lParam);
TRACE("wParam=%d \n",wParam);
TRACE("nCode=%d \n",nCode);
if(((DWORD)lParam & 0x40000000) && (HC_ACTION==nCode))
{
switch(wParam) //键盘按键标识
{
case '1':...........break;
case '2':...........break;
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
这么写得不到我要的结果啊。
调试时当随便按个键结果都一样的,是:
lParam=1244664
wParam=256 //256是WM_KEYDOWN,对应的都不是我按下的那个键
nCode=0
lParam=1244664
wParam=257 //257是WM_KEYUP
nCode=0
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
TRACE("lParam=%d \n",lParam);
TRACE("wParam=%d \n",wParam);
TRACE("nCode=%d \n",nCode);
if(((DWORD)lParam & 0x40000000) && (HC_ACTION==nCode))
{
switch(wParam) //键盘按键标识
{
case '1':...........break;
case '2':...........break;
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
这么写得不到我要的结果啊。
调试时当随便按个键结果都一样的,是:
lParam=1244664
wParam=256 //256是WM_KEYDOWN,对应的都不是我按下的那个键
nCode=0
lParam=1244664
wParam=257 //257是WM_KEYUP
nCode=0
解决方案 »
- generaldll.dll调用问题
- 关于三叉切分窗口的问题。
- 关于CoInitialize与CoUninitialize的疑问
- 急啊!!!!用vc来模拟实现鼠标右键点击IE,选属性中的“Internet 选项。。。”,然后再点击确定的过程!!
- 关于结构体
- 新手做ActiveX,碰到问题,请教。
- 初学数据库编程,有个问题请教
- VC里是否什么工具可以用来做加密软件????
- 如何在我的程序中运行其他的可执行文件?
- 请作过这样的项目或由此经验的高手给看一眼,说几句,谢谢,在线等.......
- 关于重叠IO的WriteFile调用返回 87错误的一个原因
- VC ADO不能调用Access里的Replace的问题
钩子函数必须放到单独的dll中
我是放到单独的dll中的啊。
我是将调用该dll的MFC应用程序和MFC dll放到了同一个解决方案中的。
如果用WH_KEYBOARD_LL,不能根据wParam来判断按键的,要用lParam所指向的 KBDLLHOOKSTRUCT 结构体中的scanCode和vkCode来进行判断。
WH_KEYBOARD才可以用您代码中的方法。
弱弱的问下,如何找到lParam所指向的 KBDLLHOOKSTRUCT 结构体中的scanCode和vkCode??
我用lParam-> 没反应啊...
还有安装钩子时用WH_KEYBOARD根本就运行不到KeyboardProc函数里面去,这是为什么呢?
望高手解答,谢谢啦!
//#include "stdafx.h"
#include <afxdllx.h>
#include "KeyHook.h"
#pragma data_seg("mydata")
HINSTANCE tHinstance=NULL;
const int KeyPressMask=0x80000000; //键盘掩码常量
HHOOK glhHook=NULL;
BOOL HookStates=FALSE;
HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄
#pragma data_seg()#ifdef _MANAGED
#error 请阅读 KeyHook.cpp 中的说明以使用 /clr 进行编译
// 如果要向您的项目中添加 /clr,必须执行下列操作:
// 1. 移除上述对 afxdllx.h 的包含
// 2. 向没有使用 /clr 且已禁用预编译头的
// 项目添加一个 .cpp 文件,其中含有下列文本:
// #include <afxwin.h>
// #include <afxdllx.h>
#endif#ifdef _DEBUG
#define new DEBUG_NEW
#endif
static AFX_EXTENSION_MODULE KeyHookDLL = { NULL, NULL };#ifdef _MANAGED
#pragma managed(push, off)
#endifextern "C" int APIENTRY
//LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,WPARAM lParam) ;DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("KeyHook.DLL 正在初始化!\n");
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(KeyHookDLL, hInstance))
return 0; // 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。 new CDynLinkLibrary(KeyHookDLL); }
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("KeyHook.DLL 正在终止!\n"); // 在调用析构函数之前终止该库
AfxTermExtensionModule(KeyHookDLL);
}
tHinstance=hInstance;
return 1; // 确定
}CKeyHook::CKeyHook()
{
}CKeyHook::~CKeyHook()
{
stophook();
}LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
WPARAM j;
FILE *fp;
if(lParam&0x80000000)
{
j = wParam;
// fp=fopen("c:\\logfile.txt","a+");
int vKey=j; // 取得虚拟键值
char ch;
char str[10]="\0";
//测试SHIFT,CAPTION,NUMLOCK等键是否按下
int iCtrl=GetKeyState(VK_CONTROL);
int iShift=GetKeyState(VK_SHIFT);
int iCapital=GetKeyState(0x14);
int iNumLock=GetKeyState(0x90);
bool bShift=(iShift & KeyPressMask)==KeyPressMask;
bool bCapital=(iCapital & 1)==1;
bool bNumLock=(iNumLock & 1)==1;
if (vKey >=48 && vKey<=57) // 数字0-9
{
if (!bShift)
SendMessage( glhDisplayWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)(_T("RichEdit20A") ) );
}
/*if (vKey>=65 && vKey<=90) // A-Z a-z
{
if (!bCapital)
{
if (bShift)
ch=vKey;
else
ch=vKey+32;
}
else if (bShift)
ch=vKey+32;
else
ch=vKey;
if(bShift)
wsprintf(str,"[SHIFT]+");
if (iCtrl)
wsprintf(str,"[CTRL]+");
fprintf(fp,"%s%c",str,ch);
}
if (vKey>=96 && vKey<=105) // 小键盘0-9
{
if (bNumLock)
fprintf(fp,"%c",vKey-96+48);
}
if (vKey>=112 && vKey<=123) // 功能键 [F1]-[F12]
{
switch (vKey)
{
case 112:
strcpy(str,"[F1]");
break;
case 113:
strcpy(str,"[F2]");
break;
case 114:
strcpy(str,"[F3]");
break;
case 115:
strcpy(str,"[F4]");
break;
case 116:
strcpy(str,"[F5]");
break;
case 117:
strcpy(str,"[F6]");
break;
case 118:
strcpy(str,"[F7]");
break;
case 119:
strcpy(str,"[F8]");
break;
case 120:
strcpy(str,"[F9]");
break;
case 121:
strcpy(str,"[F10]");
break;
case 122:
strcpy(str,"[F11]");
break;
case 123:
strcpy(str,"[F12]");
break;
}
fprintf(fp,"%s",str);
}
if (vKey>=8 && vKey<=46) //方向键
{
switch (vKey)
{
case 8:
strcpy(str,"[BK]");
break;
case 9:
strcpy(str,"[TAB]");
break;
case 13:
strcpy(str,"[EN]");
break;
case 32:
strcpy(str,"[SP]");
break;
case 33:
strcpy(str,"[PU]");
break;
case 34:
strcpy(str,"[PD]");
break;
case 35:
strcpy(str,"[END]");
break;
case 36:
strcpy(str,"[HOME]");
break;
case 37:
strcpy(str,"[LF]");
break;
case 38:
strcpy(str,"[UF]");
break;
case 39:
strcpy(str,"[RF]");
break;
case 40:
strcpy(str,"[DF]");
break;
case 45:
strcpy(str,"[INS]");
break;
case 46:
strcpy(str,"[DEL]");
break;
default:
ch='n' ;
break;
}
if (ch!='n' )
{
if (g_PrvChar!=vKey)
{
fprintf(fp,"%s",str);
g_PrvChar=vKey;
}
}
}
fclose(fp);*/
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);} BOOL CKeyHook::starthook(HWND hwnd)
{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,tHinstance,0);
if(NULL!=glhHook)
HookStates=bResult=TRUE;
glhDisplayWnd=hwnd;
return bResult;
}
BOOL CKeyHook::stophook() //卸载钩子
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhDisplayWnd=NULL;//清变量
glhHook=NULL;
}
}
HookStates=FALSE;
return bResult;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif参考一下这个