CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

csdn大讨论, 关于win32 hook, 程序员都要来看!

楼主rfa20()2001-03-05 20:49:00 在 VC/MFC / 基础类 提问

请把你们的hook资料帖上来,如果在网上有下载,请注明地址。  
   
  请共享出你所知道的hook资料!  
   
  讨论:  
   
  hook都用在那些地方?作什么程序会用到hook。  
   
  问题点数:120、回复次数:32Top

1 楼NowCan(城市浪人)回复于 2001-03-05 20:54:00 得分 10

SPY++就用了HookTop

2 楼NowCan(城市浪人)回复于 2001-03-05 20:59:00 得分 10

还有金山词霸,屏幕取词。Top

3 楼NowCan(城市浪人)回复于 2001-03-05 21:01:00 得分 10

还有,如果你想改变其他窗口的窗口过程。。。。Top

4 楼rfa20()回复于 2001-03-05 21:02:00 得分 0

有什么好的文章可以贴出来Top

5 楼yemagxy(把酒言欢)回复于 2001-03-05 21:04:00 得分 0

关注Top

6 楼micrack(道歉中。。。)回复于 2001-03-05 21:12:00 得分 0

关注,极度地Top

7 楼youyou()回复于 2001-03-05 21:26:00 得分 0

太及时了,这几天正想学HOOK,找不到资料,  
  MSDN的那篇文章怎么也读不明白。  
  请有经验的大虾多多赐教,  
  如果需要,我出100分,谢谢。Top

8 楼micrack(道歉中。。。)回复于 2001-03-05 21:30:00 得分 0

等我有时间,写篇文章贴在这Top

9 楼colossus(^_^)回复于 2001-03-05 22:10:00 得分 0

其实Hook有很多种,我做了鼠标和键盘的Hook,可以截获鼠标和键盘消息.Top

10 楼wyzegg(蛋)回复于 2001-03-05 22:19:00 得分 0

Hook   很有意思吗Top

11 楼piaoyun()回复于 2001-03-05 22:55:00 得分 10

凡是要改变或要截取消息大都需要用到HOOK,是我们修改和完善WINDOWS的好东东。Top

12 楼feiyunge(飞奔的蜗牛)回复于 2001-03-05 23:07:00 得分 0

我也想知道  
  哪位大侠知道贴出来瞧瞧  
  :(_Top

13 楼rfa20()回复于 2001-03-06 18:06:00 得分 0

关注Top

14 楼zzzling(zzzling)回复于 2001-03-06 21:12:00 得分 0

键盘HOOK怎么做的?  
  我同学作了一个,破了我的密码,气死我了  
  快教教我Top

15 楼tzp(tangzhupeng)回复于 2001-03-06 21:58:00 得分 20

我这里有两个函数  
  function   KeyboardHookHandler(iCode:   Integer;  
      wParam:   WPARAM;  
      lParam:   LPARAM):   LRESULT;   stdcall;   export;  
  const  
      _KeyPressMask   =   $80000000;  
  begin  
      Result   :=   0;  
      If   iCode   <   0   Then  
      begin  
          Result   :=   CallNextHookEx(hNextHookProc,   iCode,   wParam,   lParam);  
          Exit;  
      end;  
          //侦测CTRL+B组合键  
      if   ((lParam   and   _KeyPressMask)   =   0)   and  
          (GetKeyState(vk_Control)   <   0)   and   (wParam   =   Ord('B'))   then  
      begin  
          Result   :=   1;  
          WinExec('Notepad.exe',   sw_Normal);     //   癘ㄆセ  
      end;  
  end;  
   
   
  function   EnableHotKeyHook:   BOOL;   export;  
  begin  
      Result   :=   False;  
      if   hNextHookProc   <>   0   then   Exit;  
      //持上键盘类型的HOOK,同时传回值必须保锱下来  
      //防止呼叫中断  
      hNextHookProc   :=   SetWindowsHookEx(WH_KEYBOARD,  
          KeyboardHookHandler,  
          HInstance,  
          0);  
      Result   :=   hNextHookProc   <>   0;  
  end;  
  Top

16 楼rfa20()回复于 2001-03-07 01:06:00 得分 0

有好的资料吗Top

17 楼vcbear(http://vcbear.mblogger.cn)回复于 2001-03-07 09:05:00 得分 30

这种问题?  
  到cn.yahoo.net用关键字   “Hook编程”查询  
  或者在vc版用   ‘Hook’   或'钩子'   查询,  
  绝对可以更快的获得资料。  
   
  Hook只不过是一种很平常的技术,是Ms用来打破进程边界,  
  监视User模块消息的一种勾当。犯不着“大讨论”。Top

18 楼AntGhazi(蚂蚁勇士)回复于 2001-03-07 09:24:00 得分 0

呵呵,试试手又有何妨,顺便也可学学DLL。“大讨论”却有点犯不着。  
   
  vcbear兄,你们那防火枪做得如何。请多多指教!Top

19 楼sxbyl(sxbyl)回复于 2001-03-07 09:35:00 得分 0

http://sxbyl.home.chinaren.comTop

20 楼realsweat(汗水)回复于 2001-03-07 09:49:00 得分 0

关注Top

21 楼cycsharp(cycsharp)回复于 2001-03-07 09:58:00 得分 0

attentionTop

22 楼wbc_58(将进酒)回复于 2001-03-07 11:33:00 得分 0

这些东西,属于小技巧。还是看看Top

23 楼misterliwei()回复于 2001-03-07 11:37:00 得分 0

是hook   api   还是hook   mouse   等。  
  我用delphi   编了一个keyboard   hook   结果有时会出现   run   error   216   at   XXXX.  
  大虾们,知道什么原因吗?Top

24 楼flyheart(飞扬的心)回复于 2001-03-07 12:31:00 得分 0

        我想知道可不可用hook修改消息,比如,我用键盘钩子截获到用户按了字母键'a'  
  可不可以在钩子函数中改成字母'b'。  
          Top

25 楼cindy2000()回复于 2001-03-07 12:40:00 得分 0

to   flyheart:   sure!Top

26 楼vcbear(http://vcbear.mblogger.cn)回复于 2001-03-07 12:59:00 得分 0

to   FlyHeart:  
      WH_GETMESSAGE  
  handle   the   WM_KEYDOWN   message  
  not   KeyboardHookTop

27 楼angwan(mofu)回复于 2001-03-07 13:21:00 得分 10

hook好似dos下的TSR,拦截系统的中断调用,比如jBuilder中按鼠标右键出来的菜单中没有COPY等选项,我用hook,作了一个,很简单。  
  井底之蛙,csdn大讨论,我最讨厌用词不当,大家谦虚一点好不好。Top

28 楼angwan(mofu)回复于 2001-03-07 17:41:00 得分 0

to   flyheart(飞扬的心):可以,你此时可以用如下:  
  SendMessage(hwnd,WM_CHAR     ,(TCHAR)'b'   ,(LPARAM)1);  
  或者:  
  keybd_event('B',0,KEYEVENTF_EXTENDEDKEY,0);  
  keybd_event('B',0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);  
  //有的情况下不可以如此。  
  这帮厮菜鸟一群,还大言不惭csdn大讨论,真是井底之蛙,钩子这种初级话题....哎。  
   
  Top

29 楼angwan(mofu)回复于 2001-03-07 17:44:00 得分 0

对不起,我言词激烈了些,我也菜,今天心情不好。对不起。Top

30 楼NowCan(城市浪人)回复于 2001-03-07 20:02:00 得分 20

键盘钩子  
  //hook.c  
   
  #include   <windows.h>  
  #include   <windowsx.h>  
  #include   <tchar.h>  
   
  HINSTANCE   g_hinstDll   =   NULL;  
   
  #pragma   data_seg(".drectve")  
          static   char   szLinkDirectiveShared[]   =   "-section:Shared,rws";  
  #pragma   data_seg()  
  #pragma   data_seg("Shared")  
   
  HHOOK   g_hhook             =   NULL;  
  HWND     g_hwndPost       =   NULL;  
  UINT     g_uMsgNotify   =   WM_USER;  
   
  #pragma   data_seg()  
   
  static   LRESULT   WINAPI   KeyboardHook_HookProc   (  
        int   nCode,  
        WPARAM   wParam,    
        LPARAM   lParam)    
  {  
   
        LRESULT   lResult   =   CallNextHookEx(g_hhook,   nCode,   wParam,   lParam);  
   
        if   (nCode   ==   HC_ACTION)    
        {  
              PostMessage(g_hwndPost,   g_uMsgNotify,   wParam,   lParam);  
        }  
        return(lResult);  
  }  
   
  BOOL   WINAPI   SetKeyboardHook   (HWND   hWndPost,   UINT   Msg)    
  {  
        HHOOK   hhook;  
   
        if   (g_hhook   !=   NULL)   return(FALSE);  
   
        g_hwndPost       =   hWndPost;  
        g_uMsgNotify   =   Msg;  
        Sleep(0);  
   
        hhook   =   SetWindowsHookEx(WH_KEYBOARD,   KeyboardHook_HookProc,   g_hinstDll,   0);  
        InterlockedExchange((PLONG)   &g_hhook,   (LONG)   hhook);  
        return(g_hhook   !=   NULL);  
  }  
   
  BOOL   WINAPI   ReleaseKeyboardHook()    
  {  
        BOOL   fOK   =   TRUE;  
   
        if   (g_hhook   !=   NULL)    
        {  
              fOK   =   UnhookWindowsHookEx(g_hhook);  
              g_hhook   =   NULL;  
        }  
        return(fOK);  
  }  
   
  BOOL   WINAPI   DllMain   (HINSTANCE   hinstDll,   DWORD   fdwReason,   LPVOID   lpvReserved)    
  {  
        switch   (fdwReason)    
        {  
              case   DLL_PROCESS_ATTACH:  
                    g_hinstDll   =   hinstDll;  
                    break;  
        }  
        return(TRUE);  
  }  
   
   
  //hook.bas  
  Attribute   VB_Name   =   "Module1"  
  Option   Explicit  
   
  Public   Const   GWL_WNDPROC   =   (-4)  
  Public   Const   WM_USER   =   &H400  
   
  Declare   Function   CallWindowProc   Lib   "user32"   Alias   "CallWindowProcA"   (ByVal   lpPrevWndFunc   As   Long,   ByVal   hWnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
  Declare   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   (ByVal   hWnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
  Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hWnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
   
  Declare   Function   SetKeyboardHook   Lib   "KeybHook"   (ByVal   hwndPost   As   Long,   ByVal   Msg   As   Long)   As   Long  
  Declare   Function   ReleaseKeyboardHook   Lib   "KeybHook"   ()   As   Long  
   
  Public   prevWndProc   As   Long  
   
  Function   WndProc(ByVal   hWnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
          If   Msg   =   WM_USER   Then  
                  Form1.List1.AddItem   "wParam="   &   wParam   &   ",   lParam="   &   Hex(lParam)  
                  Form1.List1.ListIndex   =   Form1.List1.NewIndex  
          End   If  
          WndProc   =   CallWindowProc(prevWndProc,   hWnd,   Msg,   wParam,   lParam)  
  End   Function  
   
  //kbtrace.frm  
   
   
  Private   Sub   Form_Load()  
          On   Error   Resume   Next  
   
          SetKeyboardHook   Me.hWnd,   WM_USER  
   
          If   Err.Number   <>   0   Then  
                  MsgBox   "请先将   KeybHook.dll   复制到   Windows   的所在路径!",   vbCritical  
                  End  
          End   If  
          On   Error   GoTo   0  
           
          prevWndProc   =   GetWindowLong(Me.hWnd,   GWL_WNDPROC)  
          SetWindowLong   Me.hWnd,   GWL_WNDPROC,   AddressOf   WndProc  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
          ReleaseKeyboardHook  
           
          SetWindowLong   Me.hWnd,   GWL_WNDPROC,   prevWndProc  
  End   Sub  
   
   
   
  Top

31 楼NowCan(城市浪人)回复于 2001-03-07 20:03:00 得分 0

键盘钩子  
  //hook.c  
   
  #include   <windows.h>  
  #include   <windowsx.h>  
  #include   <tchar.h>  
   
  HINSTANCE   g_hinstDll   =   NULL;  
   
  #pragma   data_seg(".drectve")  
          static   char   szLinkDirectiveShared[]   =   "-section:Shared,rws";  
  #pragma   data_seg()  
  #pragma   data_seg("Shared")  
   
  HHOOK   g_hhook             =   NULL;  
  HWND     g_hwndPost       =   NULL;  
  UINT     g_uMsgNotify   =   WM_USER;  
   
  #pragma   data_seg()  
   
  static   LRESULT   WINAPI   KeyboardHook_HookProc   (  
        int   nCode,  
        WPARAM   wParam,    
        LPARAM   lParam)    
  {  
   
        LRESULT   lResult   =   CallNextHookEx(g_hhook,   nCode,   wParam,   lParam);  
   
        if   (nCode   ==   HC_ACTION)    
        {  
              PostMessage(g_hwndPost,   g_uMsgNotify,   wParam,   lParam);  
        }  
        return(lResult);  
  }  
   
  BOOL   WINAPI   SetKeyboardHook   (HWND   hWndPost,   UINT   Msg)    
  {  
        HHOOK   hhook;  
   
        if   (g_hhook   !=   NULL)   return(FALSE);  
   
        g_hwndPost       =   hWndPost;  
        g_uMsgNotify   =   Msg;  
        Sleep(0);  
   
        hhook   =   SetWindowsHookEx(WH_KEYBOARD,   KeyboardHook_HookProc,   g_hinstDll,   0);  
        InterlockedExchange((PLONG)   &g_hhook,   (LONG)   hhook);  
        return(g_hhook   !=   NULL);  
  }  
   
  BOOL   WINAPI   ReleaseKeyboardHook()    
  {  
        BOOL   fOK   =   TRUE;  
   
        if   (g_hhook   !=   NULL)    
        {  
              fOK   =   UnhookWindowsHookEx(g_hhook);  
              g_hhook   =   NULL;  
        }  
        return(fOK);  
  }  
   
  BOOL   WINAPI   DllMain   (HINSTANCE   hinstDll,   DWORD   fdwReason,   LPVOID   lpvReserved)    
  {  
        switch   (fdwReason)    
        {  
              case   DLL_PROCESS_ATTACH:  
                    g_hinstDll   =   hinstDll;  
                    break;  
        }  
        return(TRUE);  
  }  
   
   
  //hook.bas  
  Attribute   VB_Name   =   "Module1"  
  Option   Explicit  
   
  Public   Const   GWL_WNDPROC   =   (-4)  
  Public   Const   WM_USER   =   &H400  
   
  Declare   Function   CallWindowProc   Lib   "user32"   Alias   "CallWindowProcA"   (ByVal   lpPrevWndFunc   As   Long,   ByVal   hWnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
  Declare   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   (ByVal   hWnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
  Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hWnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
   
  Declare   Function   SetKeyboardHook   Lib   "KeybHook"   (ByVal   hwndPost   As   Long,   ByVal   Msg   As   Long)   As   Long  
  Declare   Function   ReleaseKeyboardHook   Lib   "KeybHook"   ()   As   Long  
   
  Public   prevWndProc   As   Long  
   
  Function   WndProc(ByVal   hWnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
          If   Msg   =   WM_USER   Then  
                  Form1.List1.AddItem   "wParam="   &   wParam   &   ",   lParam="   &   Hex(lParam)  
                  Form1.List1.ListIndex   =   Form1.List1.NewIndex  
          End   If  
          WndProc   =   CallWindowProc(prevWndProc,   hWnd,   Msg,   wParam,   lParam)  
  End   Function  
   
  //kbtrace.frm  
   
   
  Private   Sub   Form_Load()  
          On   Error   Resume   Next  
   
          SetKeyboardHook   Me.hWnd,   WM_USER  
   
          If   Err.Number   <>   0   Then  
                  MsgBox   "请先将   KeybHook.dll   复制到   Windows   的所在路径!",   vbCritical  
                  End  
          End   If  
          On   Error   GoTo   0  
           
          prevWndProc   =   GetWindowLong(Me.hWnd,   GWL_WNDPROC)  
          SetWindowLong   Me.hWnd,   GWL_WNDPROC,   AddressOf   WndProc  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
          ReleaseKeyboardHook  
           
          SetWindowLong   Me.hWnd,   GWL_WNDPROC,   prevWndProc  
  End   Sub  
   
   
   
  Top

32 楼magicwizard(巫师)回复于 2001-06-05 19:29:00 得分 0

太好了,谢谢大家.Top

相关问题

  • 讨论程序员、企业家(摘自:《程序员》杂志)
  • !!!!!!!!!!!讨论一下中国的程序员
  • 讨论!程序员的最高境界!:)
  • 讨论下程序员的学历!
  • 程序员@@眼里的CSDN
  • CSDN程序员简历!(HOT)
  • 有国外的类CSDN网站地址吗,看外国程序员怎么讨论
  • 请问:程序员用什么途径找工作好呢,报纸,51job,chinahr,csdn?欢迎讨论!
  • 求一个英文的类似CSDN的程序员论坛,能够讨论.net技术。
  • 是程序员的进来讨论讨论

关键词

  • 键盘
  • 鼠标
  • 资料
  • 消息
  • hhook
  • hwndpost
  • umsgnotify
  • hook
  • 钩子
  • lresult

得分解答快速导航

  • 帖主:rfa20
  • NowCan
  • NowCan
  • NowCan
  • piaoyun
  • tzp
  • vcbear
  • angwan
  • NowCan

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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