如题,谢谢

解决方案 »

  1.   

    哈哈,继续帖代码给你
    如果Hook在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。所以采用在DLL中实现Hook。新建一个导出两个函数的DLL文件,在HookUnit.pas中定义了钩子具体实现过程。代码如下:
    library Hook;
    uses
      HookUnit in 'HookUnit.pas';
    exports
      EnableHotKeyHook,
      DisableHotKeyHook;
    begin
     hNextHookProc := 0; 
     procSaveExit := ExitProc;
     ExitProc := @HotKeyHookExit;
    end.
    ②键盘钩子编程实现过程如下:
    unit HookUnit;
    interface
    uses
      Windows, Messages;
    var
      hNextHookProc: HHook;//保存SetWindowsHookEx的返回值
      procSaveExit: Pointer;
      function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;
      function EnableHotKeyHook: BOOL; export;//安装钩子
      function DisableHotKeyHook: BOOL; export;//卸载钩子
      procedure HotKeyHookExit; far;
    implementation
    function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;
    const
     _KeyPressMask=$80000000;//键盘掩码常量
    begin
     Result:=0;
     If iCode < 0 Then //根据SDK说明,若iCode小于0,调用CallNextHookEx并返回
      begin
       Result:=CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
       Exit;
      end;
     // 监测是否按下了Ctrl+X、Ctrl+V、Ctrl+C这三个组合键,若按下则退出,不响应事件
    //你把下面的健改成你的建旧可以了笆
     if ((lParam and _KeyPressMask) = 0) and(GetKeyState(vk_control) <0)
        and ((wParam = Ord('X'))or(wParam = Ord('V'))or(wParam = Ord('C')))then
      begin
       Result:=1;
       Exit;
      end;
    end;
    function EnableHotKeyHook: BOOL; export;
    begin
     Result := False;//初始化返回值
     if hNextHookProc<>0 then//如果已经注册,直接退出
       Exit; 
    //挂上键盘钩子,同时传回值必须保留下来,免得Hook呼叫链结断掉
     hNextHookProc:=SetWindowsHookEx(WH_KEYBOARD,KeyboardHookHandler,HInstance,0);
    //注册hook
     Result:=hNextHookProc <> 0;//通过返回值确定是否注册成功
    end;
    function DisableHotKeyHook: BOOL; export;
    begin
     if hNextHookProc<>0 then
      begin
       UnhookWindowshookEx(hNextHookProc);//解除Keyboard Hook
       hNextHookProc:=0;//恢复标志
      end;
     Result:=hNextHookProc=0;//返回是否注销成功 
    end;
    procedure HotKeyHookExit;
    begin
     if hNextHookProc<>0 then DisableHotKeyHook;//如果忘了解除HOOK,自动代理解除动作
     ExitProc:=procSaveExit;
    end;
    end.
    ③主程序
    unit HkUnit;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    type
      TForm1 = class(TForm)
    Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation
    {$R *.DFM}
    function EnableHotKeyHook: BOOL; external 'HookDll.DLL';//dll中注册hook的函数,传递参数为回调函数的指针
    function DisableHotKeyHook: BOOL; external 'HookDll.DLL';//dll中注销hook的函数
    procedure TForm1.Memo1ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);//屏蔽Memo1鼠标右键弹出的系统菜单
    begin
     Handled:=true;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     EnableHotKeyHook;
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     DisableHotKeyHook;
    end;
    end.
      

  2.   

    2000下可以用WH_KEYBOARD_LL“底层系统钩子”98下不知道
      

  3.   

    我只需要在2000/XP下实现在我的应用程序里屏蔽power,sleep,wake
      

  4.   

    我试了一下,power,sleep,wake三个家按下时好像不会进入KeyboardHookHandler函数
      

  5.   

    看看http://community.csdn.net/Expert/topic/3582/3582523.xml?temp=.4015467或者有帮组:)http://lysoft.7u7.net