在一个按钮的点击方法中,我想多次开启和关闭全局的键盘钩子,如下:EnableHook;
   //我的代码do something
DisableHook;
   //我的代码do something
EnableHook;
   //我的代码do something
DisableHook;
   //我的代码do something
EnableHook;但是实际代码中却不可行,似乎只有最后一行的EnableHook会起效果。请问各位,如果我想在一个方法中多次开启和关闭全局的键盘钩子该怎么办呢。

解决方案 »

  1.   

    没有发现你说的问题,以下是我的代码,看看你是不是这样做的。
    DLL Code
    var
      HookHwnd: longint;function MyMsg(nCode: longint; Msg: longint; wParam: longint; lParam: longint): longint; stdcall;
    var
      DC: HDC;
    begin
      DC := GetDC(0);  TextOut(DC, 0, 0, Pchar(DateTimeToStr(Now)), 20);//在桌面显示时间
      Exit;//屏蔽键盘输入
      Result := CallNextHookEx(HookHwnd, nCode, wParam, lParam);
    end;function EHook: boolean; stdcall;export;
    begin
      HookHwnd := SetWindowsHookEx(WH_KEYBOARD, @MyMsg, Hinstance, 0);
    end;function DHook: boolean; stdcall;export;
    begin
      UnhookWindowsHookEx(HookHwnd);
    end;exports EHook, DHook;
    begin
    end.Exe Code
      function EHook: boolean; stdcall;external 'Hook.dll';
      function DHook: boolean; stdcall;external 'Hook.dll';
      
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      EHook;
      Sleep(5000);
      DHook;
      Sleep(5000);  EHook;
      Sleep(5000);
      DHook;
      Sleep(5000);  EHook;
      Sleep(5000);
      DHook;
      Sleep(5000);  EHook;
      Sleep(5000);
      DHook;
      Sleep(5000);end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      DHook;
    end;
    每5秒钟启动一次Hook,当Hook启动的时候,任何窗口均不能接受键盘输入(可以用记事本打字来测试),过5秒钟以后,Hook停止,可以显示输入的文字了,如此反复4次,没有发现任何问题。