CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

请问怎样实现对power,sleep,wake键的屏蔽

楼主maize()2004-12-04 18:41:36 在 Delphi / Windows SDK/API 提问

如题,谢谢 问题点数:0、回复次数:7Top

1 楼rouqing(*冰雨&双子座奇缘*)回复于 2004-12-04 18:42:27 得分 0

这得编写系统hook,upTop

2 楼nyf1220(我是党员----不过听说最近风声紧,打算换名字)回复于 2004-12-04 22:20:43 得分 0

哈哈,继续帖代码给你  
  如果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.  
  Top

3 楼tabris17(四不象)回复于 2004-12-05 13:43:01 得分 0

98,2000实现的方法不一样啊Top

4 楼tabris17(四不象)回复于 2004-12-05 13:47:19 得分 0

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

5 楼maize()回复于 2004-12-05 16:30:41 得分 0

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

6 楼maize()回复于 2004-12-05 21:46:46 得分 0

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

7 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2004-12-06 00:09:39 得分 0

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

相关问题

  • 如何屏蔽键盘的Power键、Sleep键、Wake键
  • 怎样屏蔽Sleep键?
  • 屏蔽按键……
  • 热键屏蔽
  • 屏蔽SPACE,ENTER键?
  • 请高手支招:怎样屏蔽键盘上的Power/Sleep快捷键
  • 如何屏蔽键盘
  • 如何屏蔽ALT_F4键
  • 如何屏蔽esc键
  • 怎么屏蔽回车键

关键词

  • .net
  • 函数
  • dll
  • 键盘
  • 注册
  • hnexthookproc
  • disablehotkeyhook
  • enablehotkeyhook
  • hookunit
  • 钩子

得分解答快速导航

  • 帖主:maize

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo