unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
function KeyBoardHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult;stdcall;
var
  Form1: TForm1;implementation{$R *.dfm}
var
  gHook:HHOOK;procedure SetHook;
begin
  gHook:=SetWindowsHookEx(WH_KEYBOARD,KeyBoardHook,HInstance,0);
end;function KeyBoardHook(nCode:Integer; wParam: WPARAM; lParam: LPARAM): LResult;stdcall;
begin
  result:=0;
  if (ncode=0) then
   begin
    if wParam=65 then
     begin
     result:=1;
     end
   else
     Result:=CallNextHookEx(gHook,nCode,wParam,lParam)
   end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  SetHook;
end;end.WH_KEYBOARD 钩子的回调函数,wParam参数储存的是键盘虚拟码,当是字母或数字的时候 程序能屏蔽掉按键,但是当是 WIN键 ,CAPS ctrl 等却失去作用了,请解释下是为什么呢?谢谢

解决方案 »

  1.   

    需要WH_KEYBOARD_LL才能拦截这类按键
      

  2.   

    tagKBDLLHOOKSTRUCT   =   packed   record   
          vkCode:   DWORD;//虚拟键值   
          scanCode:   DWORD;//扫描码值(没有用过,我也不懂^_^)   
          {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是   
          根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}   
          flags:   DWORD;   
          time:   DWORD;//消息时间戳   
          dwExtraInfo:   DWORD;//和消息相关的扩展信息   
      end;   在这个记录结构里 vkCode 就可以屏蔽掉所有的按键,但是wParam里的虚拟键值就不可以!
      

  3.   

    http://download.csdn.net/source/2089993