2014-01-14 75 views
1

这里是我的函数的原型:JOURNALRECORDPROC确定键按下

LRESULT CALLBACK JournalRecoProc(int code, WPARAM wParam, LPARAM lParam) {

}

如何,我可以检查中,如果有ENTER或鼠标左键点击? 我想应该使用lParam,但我找不到。

+0

根据MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644982% 28v = vs.85%29.aspx EVENTMSG ::从WM_KEYFIRST到WM_KEYLAST的消息 - 键盘,否则是其他内容。 –

+0

这些日子的日志钩子非常难以实现,在尝试设置钩子时,几乎总会遇到访问被拒绝的错误。键盘记录器不是很受用户欢迎。需要绕过UIPI,这需要清单,证书和正确的安装位置。不要认为你在XP上看到的东西会在其他机器上很好地重现。 –

回答

0

作为MSDN says

如果挂钩过程在范围返回消息WM_KEYFIRSTWM_KEYLAST中,以下条件适用:

  • 的的paramL构件EVENTMSG结构指定了p键的虚拟键码ressed。
  • paramH成员EVENTMSG结构指定扫描码。
  • 没有办法指定重复次数。这个事件总是被用来代表一个关键事件。

那么您就可以访问它是这样的:

LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam) 
{ 
    // ... blah blah ... 

    if (code == HC_GETNEXT) 
    { 
     // examine eventmsg 
     EVENTMSG *pEvent = (EVENTMSG*)lParam; 

     // keypress 
     if (pEvent->message >= WM_KEYFIRST && 
      pEvent->message <= WM_KEYLAST) 
     { 
      // decode key press 
      unsigned int uVirtualKeyCode = pEvent->paramL; 
      unsigned int uScanCode = pEvent->paramH; 

      // do your conditional checks here 
      if (uVirtualKeyCode == VK_ENTER) 
      { 
       // Enter key was pressed 
      } 
     } 
     else if (pEvent->message == WM_LBUTTONDOWN) 
     { 
      // left mouse click 
     } 
     else // ... add checks for other messages .... 
    } 

    // ... blah blah ... 
} 
+0

谢谢,这是我需要的。 – Damian

+0

@edit,事情错在这里是'uVirtualKeyCode == VK_ENTER'我们需要'LOBYTE(uVirtualKeyCode == VK_ENTER)' – Damian