13/02/2014
Как реализовать Windows хук с использованием acedRegisterFilterWinMsg в .NET
Имеется возможность установить хук для сообщений Windows, который на низком уровне перехватывает события в системе, которые производят большинство действий, таких как движение мыши или открытие диалога.Внутри AutoCAD есть специальный метод для этой цели, который не пересекается со встроенными возможностями Windows, но имеет похожие возможности: acedRegisterFilterWinMsg
Этот метод есть только в C++, так что придется использовать DllImport атрибут, с которым вы уже возможно знакомы. В данном конкретном случае требуется знать декорированное имя этой функции, которое можно получить при помощи утилиты Dependency Walker.
Код - C#: [Выделить]
- // Для AutoCAD 2013 64 бит
- // Для предыдущих версий импортируем из acad.exe (вместо accore.dll)
- [DllImport("accore.dll",
- CharSet = CharSet.Unicode,
- CallingConvention = CallingConvention.Cdecl,
- EntryPoint = "?acedRegisterFilterWinMsg@@YAHQ6AHPEAUtagMSG@@@Z@Z")]
- private static extern int acedRegisterFilterWinMsg(
- WindowHookProc callBackFunc);
- // Функция обратного вызова для хука
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate int WindowHookProc(
- ref System.Windows.Forms.Message msg);
- private static int WindowsHook(
- ref System.Windows.Forms.Message msg)
- {
- // проверяем структуру msg на то, что нас интересует,
- // например, клавиши, движения мыши, и т.д.
- if (msg.Msg == ???)
- {
- // делаем что нужно
- }
- return 0;
- }
- private static WindowHookProc callBackFunc = null;
- [CommandMethod("registerHook")]
- public static void CmdRegisterHook()
- {
- callBackFunc = new WindowHookProc(WindowsHook);
- acedRegisterFilterWinMsg(callBackFunc);
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=527
Опубликовано 13.02.2014Отредактировано 13.02.2014 в 14:47:05