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

一个关于钩子的问题

楼主zenithweng()2004-05-03 15:41:44 在 VC/MFC / 基础类 提问

我在设计一个全屏的DLL。需要做一个钩子监视WM_GETMINMAXINFO消息,下面就是这个函数,在Win98下可以用,可是在Win2000下就不行了。为什么????  
   
   
  void   AddMsgWatch()  
  {  
  MsgHook=SetWindowsHookEx(WH_CALLWNDPROCRET,(HOOKPROC)Watch,_hdllInstance,GetCurrentThreadId());  
  }  
  LRESULT   CALLBACK   Watch(int   nCode,WPARAM   wparam,LPARAM   lparam)  
  {  
  if(nCode>=HC_ACTION)  
  {  
  tagCWPRETSTRUCT*   Lp=(tagCWPRETSTRUCT   FAR*)lparam;  
  if(Lp->message==WM_GETMINMAXINFO)  
  {  
  MINMAXINFO*   lpmmi=(MINMAXINFO   FAR*)Lp->lParam;  
  int   width,height;  
  width=m_FullScrRect.right-m_FullScrRect.left;  
  height=m_FullScrRect.bottom-m_FullScrRect.top;  
  if(width>100   &&   height>100)  
  {  
  lpmmi->ptMaxTrackSize.x=width;  
  lpmmi->ptMaxTrackSize.y=height;  
  }  
  }  
  }  
  return   CallNextHookEx(MsgHook,nCode,wparam,lparam);  
  }  
  问题点数:20、回复次数:11Top

1 楼zxs0001(盛)回复于 2004-05-03 15:48:27 得分 0

upTop

2 楼zenithweng()回复于 2004-05-03 16:16:07 得分 0

????Top

3 楼zenithweng()回复于 2004-05-03 19:57:14 得分 0

没人回答吗?拜托了Top

4 楼zhouqingyuan(浪帆)回复于 2004-05-03 21:06:10 得分 10

2000下面怎么不行了呢?编译不过还是运行不过,还是没有起到钩子的作用?Top

5 楼zenithweng()回复于 2004-05-03 23:31:04 得分 0

没起到钩子的作用。我也写了测试的代码,证明有执行到钩子,就是实现不了全屏。具体说是,AutoCad的全屏。Top

6 楼zenithweng()回复于 2004-05-04 12:58:41 得分 0

我知道问题在哪里了可是不会改。我用SPY++监视发现GETMINMAXINFO的指针不一样了。MINMAXINFO*   lpmmi=(MINMAXINFO   FAR*)Lp->lParam这句中,lpmmi指向的位置和原来的消息不同。有没有高手知道是怎么回事。Top

7 楼cdcjk(攀辉)回复于 2004-05-04 20:02:16 得分 0

upTop

8 楼zenithweng()回复于 2004-05-05 01:44:28 得分 0

没办法了。把全部程序发上来,高手帮看看吧  
  #include   "stdafx.h"  
  #include   <aced.h>  
   
  HWND   m_MainWnd,m_DocWnd;  
  WINDOWPLACEMENT   m_OldMainPl,m_FullScrPl;  
  RECT   m_MainRect,m_DeskTopRect,m_DocRect,m_FullScrRect;  
  BOOL   m_FullScreen=FALSE,m_WatchDone=FALSE;  
  LONG   oldWndProc;  
  HHOOK   MsgHook;  
   
  void   InitApp();  
  void   unloadApp();  
  void   FullScreen();  
  void   AddMsgWatch();  
  void   UnMsgWatch();  
  LRESULT   CALLBACK   Watch(int   nCode,WPARAM   wparam,LPARAM   lparam);  
  extern   "C"   AcRx::AppRetCode   acrxEntryPoint(AcRx::AppMsgCode,   void*   pkt);  
   
  void   InitApp()  
  {  
  acedRegCmds->addCommand("ZENITH_TOOLS",  
  "FullScreen",  
  "Fullscreen",  
  ACRX_CMD_MODAL,  
  &FullScreen);  
  AddMsgWatch();  
  }  
   
  void   unloadApp()  
  {  
  acedRegCmds->removeGroup("ZENITH_TOOLS");  
  }  
   
  void   AddMsgWatch()  
  {  
  MsgHook=SetWindowsHookEx(WH_CALLWNDPROCRET,(HOOKPROC)Watch,NULL,GetCurrentThreadId());  
  }  
   
  LRESULT   CALLBACK   Watch(int   nCode,WPARAM   wparam,LPARAM   lparam)  
  {  
  if(nCode>=HC_ACTION)  
  {  
  tagCWPRETSTRUCT   FAR*   Lp=(tagCWPRETSTRUCT   FAR*)lparam;  
  if(Lp->message==WM_GETMINMAXINFO)  
  {  
  MINMAXINFO   FAR*   lpmmi=(MINMAXINFO   FAR*)Lp->lParam;  
  int   width,height;  
  width=m_FullScrRect.right-m_FullScrRect.left;  
  height=m_FullScrRect.bottom-m_FullScrRect.top;  
   
  if(width>100   &&   height>100)  
  {  
  ads_printf("\nok");  
  lpmmi->ptMaxTrackSize.x=width;  
  lpmmi->ptMaxTrackSize.y=height;  
  }  
  }  
  }  
  return   CallNextHookEx(MsgHook,nCode,wparam,lparam);  
  }  
   
  void   FullScreen(void)  
  {  
  m_MainWnd=adsw_acadMainWnd();  
  m_DocWnd=adsw_acadDocWnd();  
   
  if(MsgHook!=0)  
  {  
  if(m_FullScreen==FALSE)  
  {  
  m_FullScreen=TRUE;  
   
  m_OldMainPl.length=sizeof(WINDOWPLACEMENT);  
  GetWindowPlacement(m_MainWnd,&m_OldMainPl);  
  GetWindowRect(::GetDesktopWindow(),&m_DeskTopRect);  
   
  GetWindowRect(m_MainWnd,&m_MainRect);  
  GetWindowRect(m_DocWnd,&m_DocRect);  
   
  m_FullScrRect.left=m_MainRect.left-m_DocRect.left;  
  m_FullScrRect.top=m_MainRect.top-m_DocRect.top;  
  m_FullScrRect.right=m_MainRect.right-m_DocRect.right+m_DeskTopRect.right;  
  m_FullScrRect.bottom=m_MainRect.bottom-m_DocRect.bottom+m_DeskTopRect.bottom;  
   
  m_FullScrPl.length=sizeof(WINDOWPLACEMENT);  
  m_FullScrPl.flags=0;  
  m_FullScrPl.rcNormalPosition=m_FullScrRect;  
  m_FullScrPl.showCmd=SW_SHOWNORMAL;  
   
  SetWindowPlacement(m_MainWnd,&m_FullScrPl);  
  }  
  else  
  {  
  m_FullScreen=FALSE;  
  SetWindowPlacement(m_MainWnd,&m_OldMainPl);  
  }  
  }  
  else  
  {  
  ads_printf("\nCan   Not   Init   The   Hook!!\n");  
  }  
  }  
   
  extern   "C"   AcRx::AppRetCode   acrxEntryPoint(AcRx::AppMsgCode   msg,   void*   pkt)  
  {  
        switch   (msg)   {  
                  case   AcRx::kInitAppMsg:  
  acrxDynamicLinker->unlockApplication(pkt);  
  InitApp();  
  break;  
                  case   AcRx::kUnloadAppMsg:  
  if   (MsgHook!=0) {UnhookWindowsHookEx(MsgHook);}  
  unloadApp();  
  break;  
        }  
  return   AcRx::kRetOK;  
  }  
  Top

9 楼longlong1129(珑玲)回复于 2004-05-05 01:52:32 得分 10

朋友你是不是想做成全局钩子,你想动态注入啊?  
   
  是的话你就需要把你所定义的变量用都变成共享数据.  
   
  你可以参考<<windows核心编程>>,里面说的很详细!没记错的化是540几页.Top

10 楼zenithweng()回复于 2004-05-05 11:23:05 得分 0

不是啊。我是在autocad环境下作arx,也就是dll了。在cad中调用,想实现cad的全屏,这个程序在win98、me下都通过了。就是2000下不行。用spy++看一切都正常,就是不工作。  
  <00047>000800F8   S       WM_WINDOWPOSCHANGING   lpwp:039AFF20  
  //x:-4   y:-42   cx:808   cy:697  
  <00048>000800F8   S   WM_GETMINMAXINFO   lpmmi:039AFCC0  
  //ptReserved:160:24  
  //ptMaxSize:808,608  
  //ptMaxPosition:-4,-4  
  //ptMinTrackSize:112,27  
  //ptMaxTrackSize:812,612  
  <00049>000800F8   R   WM_GETMINMAXINFO   lpmmi:039AFB98  
  //ptReserved:160:24  
  //ptMaxSize:808,608  
  //ptMaxPosition:-4,-4  
  //ptMinTrackSize:200,100  
  //ptMaxTrackSize:808,697  
  <00050>000800F8   R     WM_WINDOWPOSCHANGING  
  //x:-4   y:-42   cx:808   cy:612  
  //就是这里了。正确的cy应该是697,WM_GETMINMAXINFO的消息也改过来了。  
  //就是不对,我看了没装钩子时的消息,lpmmi的地址是一样的。不知道  
  //问题是不是这个原因。Top

11 楼zenithweng()回复于 2004-05-07 13:24:42 得分 0

有没有人肯回答我啊Top

相关问题

  • 钩子!钩子!
  • 钩子?
  • 钩子!
  • 钩子
  • 钩子阿钩子
  • 钩子钩子我爱你
  • 反钩子,钩子链表!!!!
  • 系统‘钩子’
  • 钩子函数????
  • 关于钩子

关键词

  • win98
  • watch
  • 消息
  • 钩子
  • lpmmi
  • fullscrrect
  • getminmaxinfo
  • f8
  • msghook
  • addmsgwatch

得分解答快速导航

  • 帖主:zenithweng
  • zhouqingyuan
  • longlong1129

相关链接

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

广告也精彩

反馈

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