ADN Open CIS
Сообщество программистов Autodesk в СНГ

13/02/2014

Как реализовать Windows хук с использованием acedRegisterFilterWinMsg в .NET

Имеется возможность установить хук для сообщений Windows, который на низком уровне перехватывает события в системе, которые производят большинство действий, таких как движение мыши или открытие диалога.

Внутри AutoCAD есть специальный метод для этой цели, который не пересекается со встроенными возможностями Windows, но имеет похожие возможности: acedRegisterFilterWinMsg

Этот метод есть только в C++, так что придется использовать DllImport атрибут, с которым вы уже возможно знакомы. В данном конкретном случае требуется знать декорированное имя этой функции, которое можно получить при помощи утилиты Dependency Walker.

Код - C#: [Выделить]
  1. // Для AutoCAD 2013 64 бит
  2. // Для предыдущих версий импортируем из acad.exe (вместо accore.dll)
  3. [DllImport("accore.dll",
  4.   CharSet = CharSet.Unicode,
  5.   CallingConvention = CallingConvention.Cdecl,
  6.   EntryPoint = "?acedRegisterFilterWinMsg@@YAHQ6AHPEAUtagMSG@@@Z@Z")]
  7. private static extern int acedRegisterFilterWinMsg(
  8.   WindowHookProc callBackFunc);
  9.  
  10. // Функция обратного вызова для хука
  11. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  12. public delegate int WindowHookProc(
  13.   ref System.Windows.Forms.Message msg);
  14.  
  15. private static int WindowsHook(
  16.   ref System.Windows.Forms.Message msg)
  17. {
  18.   // проверяем структуру msg на то, что нас интересует,
  19.   // например, клавиши, движения мыши, и т.д.
  20.   if (msg.Msg == ???)
  21.   {
  22.     // делаем что нужно
  23.   }
  24.   return 0;
  25. }
  26.  
  27. private static WindowHookProc callBackFunc = null;
  28.  
  29. [CommandMethod("registerHook")]
  30. public static void CmdRegisterHook()
  31. {
  32.   callBackFunc = new WindowHookProc(WindowsHook);
  33.   acedRegisterFilterWinMsg(callBackFunc);
  34. }

Источник: http://adndevblog.typepad.com/autocad/2012/07/how-to-implement-a-windows-hook-using-acedregisterfilterwinmsg-in-net.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=527

Опубликовано 13.02.2014
Отредактировано 13.02.2014 в 14:47:05