var
  Form1: TForm1;  hHook:integer;
  EventArray:array[0..300] of EVENTMSG;
  EventLog:integer;implementationfunction HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
var
 recOK:integer;
begin
  recOK:=1;
  Result:=0;  if iCode < 0 then
    Result := CallNextHookEx(hHook,iCode,wParam,lParam)
  else if iCode = HC_SYSMODALON then
    recOK:=0
  else if iCode = HC_SYSMODALOFF then
    recOK:=1
  else if ((recOK>0) and (iCode = HC_ACTION)) then begin
    EventArray[EventLog]:=pEventMSG(lParam)^;
    EventLog:=EventLog+1;
  end;  if EventLog>=1000 then begin
   UnHookWindowsHookEx(hHook);
  end;
end;
//........
procedure TForm1.Button1Click(Sender: TObject);
begin
 EventLog:=0;
 hHook:=SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
end;
我想用SetwindowsHookEx()截获键盘消息.....但其中:
EventArray[EventLog]:=pEventMSG(lParam)^; 这是什么意思啊?我查帮助,根本没有 pEeventMSG() 这个函数,这里又怎么填充 EVENTMSG 这个结构呢?我看不懂,请大家指教.
另外又如何从 EVENTMSG 或 HookProc()的参数 中提取键盘消息,而不理会鼠标消息呢?
谢谢....

解决方案 »

  1.   

    type  PEventMsg=^TEventMsg;
      TEventMsg=packed record
        message:UINT;
        paramL:UINT;
        paramH:UINT;
        time:DWORD;
        hwnd:HWND
      end;
    paramL:如果是一个键盘消息,这个域就是击键的虚拟代码。如果是一个鼠标消息,wParam就是鼠标的x坐标;
    paramH:如果是一个键盘消息,这个域就是击键的扫描码。如果是一个鼠标消息,lParam就是鼠标的y坐标。
    hwnd:对于wh_JournalPlayback类型的挂钩来说,这个域用不着
      

  2.   

    pEventMSG是一个结构类型,不是函数。这里是强类型转换。