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