当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 怎么不能切换到‘代码视图’和‘代码和设计视图’,只能在设计视图里了,昨天还好好的,谢谢了!!!4.03中文的 ......
 ·小问题,关于对话框    »显示摘要«
    摘要: 建立一个没有标题栏的对话框工程 1,怎样最小化,最小化后怎样在任务栏显示图标 2,怎样怎样让鼠标拖动它 ......


我对消息钩子了解不多,希望各位能详细讲解

有没有好书推荐,   最好给我一个例程。本来想多给分,但好象级别不够。

NO.1   作者: kingzai

//example:in   SpyHook.dll  
  #pragma   data_seg(".SHARDAT")  
  static   HHOOK   callwndHook=NULL;  
  #pragma   data_seg()  
  //安装钩子  
  BOOL   __declspec(dllexport)__stdcall   installhook(UINT   hooktype)  
  {  
  if(hooktype==1)  
  callwndHook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,0);  
  return   TRUE;  
  }  
  //卸载钩子  
  BOOL   __declspec(dllexport)__stdcall     UnHook(UINT   hooktype)  
  {  
        if(hooktype==1)  
  UnhookWindowsHookEx(callwndHook);  
  return   TRUE;  
  }    
   
  LRESULT   __declspec(dllexport)__stdcall     CALLBACK   CallWndProc(int   nCode,WPARAM   wParam,LPARAM   lParam)  
  {  
  AFX_MANAGE_STATE(AfxGetStaticModuleState());  
  PCWPSTRUCT   pcw=(PCWPSTRUCT)   lParam;  
   
  if(nCode>=0   &&   pcw   &&   pcw->hwnd)  
  {  
  // if(pcw->message==WM_LBUTTONDOWN)  
  // return   0;  
  if(pcw->message==WM_SHOWWINDOW)  
  {  
  ...  
                                                        }  
                    }  
  }  
  //in   exe  
  void   CSecuryDlg::init()  
  {  
  CreateMutex(NULL,   FALSE,   _T("SpyHook"));  
  if(GetLastError()==ERROR_ALREADY_EXISTS)  
  OnOK();  
  VERIFY(m_hInstance=::LoadLibrary((LPCTSTR)"SpyHook.dll"));  
  FUNC_INSHOOK   pFuncsethook;  
  //install   shell   hook   in   process  
  VERIFY(pFuncsethook=(FUNC_INSHOOK)::GetProcAddress(m_hInstance,"installhook"));        
  pFuncsethook(1);//install   callwndHook  
  }  
 

NO.2   作者: pursuer

Hook简介  
     
  Hook这个东西有时令人又爱又怕,Hook是用来拦截系统某些讯息之用,例如说,我们想让系统不管在什麽  
  地方只要按个Ctl-B便执行NotePad,或许您会使用Form的KeyPreview,设定为True,但在其他Process  
  中按Ctl-B呢?那就没有用,这是就得设一个Keyboard   Hook来拦截所有Key   in的键;再如:MouseMove  
  的Event只在该Form或Control上有效,如果希望在Form的外面也能得知Mouse   Move的讯息,那只好使  
  用Mouse   Hook来栏截Mouse的讯息。再如:您想记录方才使用者的所有键盘动作或Mosue动作,以便录  
  巨集,那就使用JournalRecordHook,如果想停止所有Mosue键盘的动作,而放(执行)巨集,那就使用  
  JournalPlayBack   Hook;Hook呢,可以是整个系统为范围(Remote   Hook),即其他Process的动作您也  
  可以拦截,也可以是LocalHook,它的拦截范围只有Process本身。Remote   Hook的Hook   Function要  
  在.Dll之中,Local   Hook则在.Bas中。在VB如何设定Hook呢?使用SetWindowsHookEx()  
     
  Declare   Function   SetWindowsHookEx   Lib   "user32"   Alias   "SetWindowsHookExA"   _  
              (ByVal   idHook   As   Long,   _  
                  ByVal   lpfn   As   Long,     _  
                  ByVal   hmod   As   Long,     _  
                  ByVal   dwThreadId   As   Long)   As   Long  
     
  idHook代表是何种Hook,有以下几种  
          Public   Const   WH_CALLWNDPROC   =   4  
          Public   Const   WH_CALLWNDPROCRET   =   12  
          Public   Const   WH_CBT   =   5  
          Public   Const   WH_DEBUG   =   9  
          Public   Const   WH_FOREGROUNDIDLE   =   11  
          Public   Const   WH_GETMESSAGE   =   3  
          Public   Const   WH_HARDWARE   =   8  
          Public   Const   WH_JOURNALPLAYBACK   =   1  
          Public   Const   WH_JOURNALRECORD   =   0  
          Public   Const   WH_KEYBOARD   =   2  
          Public   Const   WH_MOUSE   =   7  
          Public   Const   WH_MSGFILTER   =   (-1)  
          Public   Const   WH_SHELL   =   10  
          Public   Const   WH_SYSMSGFILTER   =   6  
     
  lpfn代表Hook   Function所在的Address,这是一个CallBack   Fucnction,当挂上某个Hook时,我们便得定义  
  一个Function来当作某个讯息产生时,来处理它的Function,这个Hook   Function有一定的叁数格式  
     
          Private   Function   HookFunc(ByVal   nCode   As   Long,   _  
                                                          ByVal   wParam   As   Long,   _  
                                                          ByVal   lParam   As   Long   )   As   Long  
     
                  nCode   代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。  
                  wParam   lParam   传回值则随Hook的种类和nCode的值之不同而不同。  
          因这个叁数是一个   Function的Address所以我们固定将Hook   Function放在.Bas中,并以AddressOf  
    HookFunc传入。至於Hook   Function的名称我们可以任意给定,不一定叫   HookFunc  
     
  hmod   代表.DLL的hInstance,如果是Local   Hook,该值可以是Null(VB中可传0进去),而如果是Remote    
  Hook,则可以使用GetModuleHandle(".dll名称")来传入。  
     
  dwThreadId   代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,  
  Remote   Hook传0进去),而VB的Local   Hook一般可传App.ThreadId进去。  
     
  值回值   如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。  
     
  因为A程式可以有一个System   Hook(Remote   Hook),如KeyBoard   Hook,而B程式也来设一个Remote的  
  KeyBoard   Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最後的那一个所拦截,也就是说A先做  
  keyboard   Hook,而後B才做,那讯息被B拦截,那A呢?就看B的Hook   Function如何做。如果B想让A的  
  Hook   Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一  
  个连线。如果B中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。  
     
  Declare   Function   CallNextHookEx   Lib   "user32"   Alias   "CallNextHookEx"   _  
                  (ByVal   hHook   As   Long,   _  
                  ByVal   ncode   As   Long,   _  
                  ByVal   wParam   As   Long,   _  
                  lParam   As   Any)   As   Long  
     
  hHook值是SetWindowsHookEx()的传回值,nCode,   wParam,   lParam则是Hook   Procedure中的三个叁数。  
     
  最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()  
     
  Declare   Function   UnhookWindowsHookEx   Lib   "user32"   Alias   "UnhookWindowsHookEx"     _  
                  (ByVal   hHook   As   Long)   As   Long  
     
  hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。  
     
     
  KeyBoard   Hook的范例  
     
  Hook   Function的三个叁数  
     
  nCode                 wParam                                           lParam                         传回值  
  ===========     ==========================   ==============         ================  
  HC_ACTION         表按键Virtual   Key                     与WM_KEYDOWN同     若讯息要被处理传0  
  或                                                                                                                 反之传1  
  HC_NOREMOVE  
     
     
  Public   hHook   as   Long  
     
  Public   Sub   UnHookKBD()  
  If   hnexthookproc   <>   0   Then  
          UnhookWindowsHookEx   hHook  
          hHook   =   0  
  End   If  
  End   Sub  
     
  Public   Function   EnableKBDHook()  
  If   hHook   <>   0   Then  
          Exit   Function  
  End   If  
  hhook   =   SetWindowsHookEx(WH_KEYBOARD,   AddressOf   _  
                          MyKBHFunc,   App.hInstance,   App.ThreadId)  
  End   Function  
     
  Public   Function   MyKBHFunc(ByVal   iCode   As   Long,   _  
          ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
      MyKBHfunc   =   0   表示要处理这个讯息  
     
      If   wParam   =   vbKeySnapshot   Then     侦测   有没有按到PrintScreen键  
          MyKBHFunc   =   1   在这个Hook便吃掉这个讯息  
      End   If  
      Call   CallNextHookEx(hHook,   iCode,   wParam,   lParam)   传给下一个Hook  
  End   Function  
     
  至于其他的   Hook的详细资料与nCode,wParam,   lParam的意义,请查Win32   Help或Windows   95:    
  A   Developers   Guide   (Jeffrey   Richter著)(中译本:基峰   李书良译   侯俊杰总监   Windows95程式设计指南)  
   
 


    摘要: 在按钮里有如下代码: frame1 f1 = new frame1(); f1.show() 我的这个窗体不能为模式,但这样每次点击按钮时就会实例化一个窗体,怎么样判断如果已经显示了这个窗体后,再点击按钮时不再实例化窗体而只是把已经显示的那个窗体放到最前面? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE