找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4520|回复: 14

[公告] [ARX程序]:鼠标钩子程序例子AcadHook

[复制链接]

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2006-5-14 11:09:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
鼠标钩子程序例子,我这个程序是在objectARX 2004的例子的框架下修改来的,目的是捕获鼠标滚轮和中键的消息,并设置相应的系统变量的值,程序中用到了USERI4和USERI5两个系统变量,lisp程序通过检查这两个变量的值来获得鼠标的状态。本来想利用函数AcedPutSym()设置修改一个lisp变量的值,但没能成功,不知道是为什么,所以改为修改系统变量的值。
程序如下:

代码:


  1.   [FONT=courier new]
  2. //////////////////////////////////////////////////////////////
  3. //
  4. // Includes
  5. //
  6. //////////////////////////////////////////////////////////////
  7. #define _AFX_NOFORCE_LIBS // we do not want to link to MFC DLLs or libs
  8. #ifdef _DEBUG
  9. #define WAS_DEBUG
  10. #undef _DEBUG
  11. #endif

  12. #include "afxwin.h"  // need this because rxmfcapi.h needs windows header.

  13. #ifdef WAS_DEBUG
  14. #undef WAS_DEBUG
  15. #define _DEBUG
  16. #endif

  17. #include "aced.h"
  18. #include "adslib.h"
  19. #include "rxmfcapi.h"


  20. //////////////////////////////////////////////////////////////
  21. //
  22. // Standard C Test function
  23. //
  24. //////////////////////////////////////////////////////////////

  25. void mouse();                 // ARX callbacks
  26. void unmouse();               // ARX callbacks

  27. BOOL filterMouse(MSG *pMsg);   // hook function for trace mouse wheel


  28. // preventing from inserting the same hook twice.
  29. static BOOL mouseDone = FALSE;

  30. //////////////////////////////////////////////////////////////
  31. //
  32. // Rx interface
  33. //
  34. //////////////////////////////////////////////////////////////


  35. void initApp()
  36. {

  37.   acedRegCmds->addCommand( "Mwheel",      // Group name
  38.                            "mwheel",      // Global function name
  39.                            "mwheel",          // Local function name
  40.                            ACRX_CMD_MODAL,    // Type
  41.                            &mouse );         // Function pointer
  42.   acedRegCmds->addCommand( "Mwheel",      // Group name
  43.                            "unmwheel",      // Global function name
  44.                            "unmwheel",          // Local function name
  45.                            ACRX_CMD_MODAL,    // Type
  46.                            &unmouse );         // Function pointer
  47.   
  48.   acutPrintf( ".OK!\n" );

  49. }

  50. void unloadApp()
  51. {
  52.   // Remove the command group because we are unloading
  53.   //  
  54.   acedRegCmds->removeGroup( "Mwheel" );

  55.   // Removing all hooks

  56.   if (mouseDone == TRUE)
  57.       acedRemoveFilterWinMsg(filterMouse);

  58. }


  59. //////////////////////////////////////////////////////////////
  60. //
  61. // Entry point
  62. //
  63. //////////////////////////////////////////////////////////////

  64. extern "C" AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void* pkt)
  65. {
  66.   switch( msg )
  67.   {
  68.     case AcRx::kInitAppMsg:
  69.       initApp();
  70.       acrxUnlockApplication(pkt);
  71.           acrxDynamicLinker->registerAppMDIAware(pkt);
  72.       break;
  73.     case AcRx::kUnloadAppMsg:
  74.       unloadApp();
  75.       break;
  76.     default:
  77.       break;
  78.   }
  79.   return AcRx::kRetOK;
  80. }



  81. BOOL filterMouse(MSG *pMsg)
  82. {
  83.     static long ptx=0;
  84.     static long pty=0;
  85.     static short zdt=0;
  86.         struct resbuf rb;


  87.     if (pMsg->message == WM_MOUSEWHEEL)  //鼠标滚轮消息
  88.     {
  89.         if (LOWORD(pMsg->wParam) == MK_CONTROL)
  90.         {
  91.                         return FALSE; // continue
  92.                 }
  93.                 else
  94.                 {
  95. //                acutPrintf("Mouse Wheel!");
  96.                 zdt=(short)HIWORD(pMsg->wParam);
  97. //                acutPrintf("%d\n",zdt);
  98.                 rb.restype = RTSHORT;
  99.                 rb.resval.rint = zdt;
  100.                 acedSetVar("USERI5", &rb);
  101.         ptx = LOWORD(pMsg->lParam);
  102.                 if (zdt == 120)
  103.            pty = HIWORD(pMsg->lParam)-1;
  104.                 if (zdt == -120)
  105.            pty = HIWORD(pMsg->lParam)+1;
  106.                 SetCursorPos(ptx,pty);
  107.                 return TRUE; // continue
  108.                 }
  109.     }

  110.     if (pMsg->message == WM_MBUTTONDOWN)  //鼠标中键按下消息
  111.     {
  112.                 rb.restype = RTSHORT;
  113.                 rb.resval.rint = 100;
  114.                 acedSetVar("USERI4", &rb);
  115.                 return FALSE; // continue
  116.     }

  117.     if (pMsg->message == WM_MBUTTONUP)  //鼠标中键抬起消息
  118.     {
  119.                 rb.restype = RTSHORT;
  120.                 rb.resval.rint = 0;
  121.                 acedSetVar("USERI4", &rb);
  122.                 return FALSE; // continue
  123.     }

  124.         return FALSE; // continue
  125. }


  126. ///////////////////////

  127. void mouse()
  128. {
  129.     if (mouseDone == TRUE)     // already has the hook?
  130.       return ;
  131.   
  132.     acutPrintf( "mouseing...\n" );

  133.     if (acedRegisterFilterWinMsg(filterMouse) == FALSE)   //添加acadhook
  134.         {
  135.         acutPrintf("Can't register Windows Msg hook - VH - mouse\n");
  136.         return ;
  137.         }
  138.     else
  139.         {
  140.         mouseDone = TRUE;
  141.                 return ;
  142.         }
  143. }


  144. void unmouse()
  145. {

  146.     if (mouseDone == TRUE)
  147.     {
  148.         acedRemoveFilterWinMsg(filterMouse);   //卸载acadhook
  149.         mouseDone = FALSE;
  150.     }
  151.     if (mouseDone2 == TRUE)
  152.     {
  153.         acedRemoveFilterWinMsg(filterMouse2);
  154.         mouseDone2 = FALSE;
  155.     }
  156. }
  157.   [/FONT]

评分

参与人数 1D豆 +1 收起 理由
ScmTools + 1 很给力!经验;技术要点

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-5-16 08:43:38 | 显示全部楼层
鼠标钩子程序例子AcadHook !!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-20 13:20:33 | 显示全部楼层
学习雷锋好榜样   谢谢啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-31 12:16:09 | 显示全部楼层
学习学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-11 03:31:17 | 显示全部楼层
虽然下不了,但还是顶一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-16 14:16:15 | 显示全部楼层
能下啊!顶
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-2-5 11:03:20 | 显示全部楼层
我这里也下不了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-3-14 08:58:14 | 显示全部楼层
谢谢,学习中
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-9-1 16:30:43 | 显示全部楼层
谢谢,学习中
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-25 15:43:56 | 显示全部楼层
谢谢楼主,学习学习,但是好像怎么下载不了呢,郁闷呢……
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-3-14 14:42:32 | 显示全部楼层
非常适用  谢谢楼主分项了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-3-25 09:16:07 | 显示全部楼层

没积分啊 郁闷

没有积分下载不了 :(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2010-1-22 10:27:11 | 显示全部楼层
好人呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-5-1 12:22:31 | 显示全部楼层
很好的开发例子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-8-5 14:16:58 | 显示全部楼层
版主能发一下你那个ctrl实时控制osnap状态开关的源码么?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-24 11:27 , Processed in 0.693847 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表