我要做个DLL来HOOK键盘消息,大部分已经做出来了思路大概就是这样的比如用户对记事本输入字符"abcd",必须全截下来,并且保证字符不会输入到记事本里.(Result:=0)if code = HC_ACTION then begin
   //if GetKeyState(VK_LCONTROL)>0 then begin
   if (AllowHook = 'Yes') then begin
     FileMapHandle:=OpenFileMapping(FILE_MAP_READ,False,'KeyLib');
       if FileMapHandle<>0 then begin
         Pint:=MapViewOfFile(FileMapHandle,FILE_MAP_READ,0,0,0);
         PostMessage(pint^,WM_HOOKKEY,wParam,lParam);
         UnmapViewOfFile(Pint);
         CloseHandle(FileMapHandle);
       end; //end filemaphande<>0
   end;//end getkeystate if
  end 
  else
  begin
    //Result:=CallNextHookEx(0, Code, wParam, lParam);
    Result:=0;
  end;我希望不截取任何关于系统的消息,只是截取全部字母和标点符号",./\[]';",如何实现?写了个
 if wParam = WM_SYSKEYDOWN 也不管用..请高手指点.

解决方案 »

  1.   

    没看明白你的这个dll,连KBDLLHOOKSTRUCT这个结构都没用到,怎么截取key消息呢?
    vkCode就是键盘按下的键值。
    如果需要,给个邮箱,我给你发个我写的hook.dll你看看。
      

  2.   

    xixuemao(吸血猫) ,MAIL一份给我,行吗?[email protected]
      

  3.   

    一开始没有用KBDLLHOOKSTRUCT现在用了type
       KBDLLHOOKSTRUCT=record
        vkCode:DWORD;
        scanCode:DWORD;
        flags:DWORD;
        time:DWORD;
        dwExtraInfo:ulong;
      end;
      LPKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;function CallBackKeyLib( code:Integer;
                             wParam:WPARAM;
                             lParam:LPARAM):LRESULT;stdcall;
    var KyCode:LPKBDLLHOOKSTRUCT;
    begin
     
     KyCode:=lpkbdllhookstruct(lParam);  if code = HC_ACTION then begin
       case wParam of
         WM_SYSKEYDOWN,WM_SYSKEYUP :
          Result:=CallNextHookEx(0,code,wParam,lParam);
       end;
       if (AllowHook = 'Yes') then begin
         FileMapHandle:=OpenFileMapping(FILE_MAP_READ,False,'KeyLib');
           if FileMapHandle<>0 then begin
             Pint:=MapViewOfFile(FileMapHandle,FILE_MAP_READ,0,0,0);
             PostMessage(pint^,WM_HOOKKEY,wParam,lParam);
             UnmapViewOfFile(Pint);
             CloseHandle(FileMapHandle);
           end; //end filemaphande<>0
       end;//end getkeystate if
      end //end first if
      else
      begin
        //Result:=CallNextHookEx(0, Code, wParam, lParam);
        Result:=0;
      end;
    end;
    但是现在,基本上单按系统键不截取了...只是不知道为什么HOOK第一个字符的时候不返回0,而是直接输出第一个字符了..以后的字母都HOOK了,奇怪...第一次写HOOK.不懂...我的信箱:[email protected]
      

  4.   

    我做的是低级键盘钩子,可以勾住很多系统键,你们需要在windows.pas里加上这个WH_KEYBOARD_LL常量=13,再重新编译一下。或者你们不做低级键盘钩子,用WH_KEYBOARD。代码已经发了,请查收。