一个关于键盘钩子的简单问题

stephenland74 2005-04-22 10:08:30
我在使用WH_KEYBOARD类型的钩子时候,为什么在回调函数中需要判断(lParam & 0x80000000)这个呢,还有就是如果我捕捉notepad.exe的键盘消息的时候,总是回有两次调用这个回调函数,我捕捉了这两次调用发现这样的一个问题就是这两次捕捉的进程窗口是不同的,一个是notepad.exe,另一个是ee.txt--记事本 这个标题,但是他们的进程id是相同的,请高手不胜指教
 if(nCode==HC_ACTION)
 {
  if(lParam & 0x80000000)
  {
   char c[1];
   c[0]=wParam;
   SaveLog(c);
  }
 }
...全文
131 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2005-04-23
  • 打赏
  • 举报
回复
if (!(lParam & 0xA0000000))//相应一次
这样以后就只有一次反应了~~
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=190021
brainholmes 2005-04-23
  • 打赏
  • 举报
回复
补充 所有的全局变量都要放入共享段
brainholmes 2005-04-23
  • 打赏
  • 举报
回复
给楼主参考一下:

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//
if(nCode==HC_ACTION)
{
if(lParam & 0xc0000000)//键盘按下 0x80000000
{
//MessageBox(NULL,"","",MB_OK);
//窗口判定
hCurWin=::GetActiveWindow();
::GetWindowText(hCurWin,CurWin,100);
if(strcmp(CurWin,PriWin)!=0)
{
::GetWindowText(hCurWin,PriWin,100);
strcat(Content,"\n<");
strcat(CurWin,">\n");
strcat(Content,CurWin);
}
int nIsVK=0;
char ch[2];
//这里定义了一个VK的映射表 有需要的话给你
for(int m=0; m < MAX_VK_NUM ; m++)
{
if(wParam==(WPARAM)VKMap[m].VKNum)
{
strcat(Content,VKMap[m].VKText);
nIsVK = 1;
}
}

if(nIsVK==0)
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan;
scan=0;
ToAscii(wParam,scan,ks,&w,0);
ch[0]=char(w);
ch[1]='\0';
if(strcmp(ch,"&")==0)
strcpy(ch,"&");
strcat(Content,ch);
}
..........
}
}
}
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
return Result;
}
xhzxlqt 2005-04-22
  • 打赏
  • 举报
回复
if(lParam & 0x80000000)//如果是按键抬起

同一个进程但是窗口句柄不同,就如同所有的消息系统都最先知道然后由系统决定该消息应该发往何处,在一个程序中的所有按键消息都应该是父窗口最先知道然后决定如何处理

一个程序都是由若干个窗口组成的
RockHwnd 2005-04-22
  • 打赏
  • 举报
回复
应该会调用两次,因为按下(press)与松开(release)按键都会激发,不知道你说的进程窗口是怎么获得的,怎么会不同呢,应该都相同

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧