DLL部分:
{$R *.res}
var
 hook:HHOOK;
////////////////////
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;stdcall;
begin
  if ((wParam=vk_lwin) or (wparam=vk_rwin)) then //如果按下'a'键
     result:=1
  else
     Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;
////////////////////
function sethook:boolean;stdcall
begin
   SetWindowsHookEx(WH_KEYBOARD,@KeyHook,HInstance,0);
   Result := hook <> 0
   end;
////////////////////
function delhook:boolean;stdcall
begin
   Result := UnhookWindowsHookEx(hook);
end;
////////////////////
exports
 sethook,delhook,keyhook;
我在主程序调用DLL,测试了一下   依然不能屏蔽win键 怎么回事?会不会和我是笔记本电脑有关?

解决方案 »

  1.   

    要勾win这些系统热键消息,得用WH_KEYBOARD_LL
      

  2.   

    type
      tagKBDLLHOOKSTRUCT = packed record
        vkCode: DWORD;
        scanCode: DWORD;
        flags: DWORD;
        time: DWORD;
        dwExtraInfo: DWORD;
      end;
      KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
      PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
    const WH_KEYBOARD_LL = 13;
    const LLKHF_ALTDOWN = $20;
    function LowLevelKeyboardProc(nCode: Integer;
      WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
    procedure hookstar;
    procedure hookend;
    var
      hhkLowLevelKybd: HHOOK;
    implementation{$R *.dfm}function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
    var
      fEatKeystroke: BOOL;
      p: PKBDLLHOOKSTRUCT;
    begin
      Result := 0;
      fEatKeystroke := FALSE;
      p := PKBDLLHOOKSTRUCT(lParam);
      if (nCode = HC_ACTION) then
      begin
        case wParam of
          WM_KEYDOWN,
            WM_SYSKEYDOWN,
            WM_KEYUP,
            WM_SYSKEYUP:
            fEatKeystroke :=
              ((p.vkCode = VK_Lwin) or
              (p.vkCode = VK_Rwin));
        end;
      end;
      if fEatKeystroke = True then
        Result := 1;
      if nCode <> 0 then
        Result := CallNextHookEx(0, nCode, wParam, lParam);
    end;procedure HookStar;
    begin
      if hhkLowLevelKybd = 0 then
        hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
    end;procedure HookEnd;
    begin
      if (hhkLowLevelKybd <> 0) and UnhookWindowsHookEx(hhkLowLevelKybd) then
        hhkLowLevelKybd := 0;
    end;