Статьи > Опубликованные статьи
Как реализовать Windows хук с использованием acedRegisterFilterWinMsg в .NET
Константин75:
Нет. Не работает.
Почистил от мусора, вставил только этот код. Компилируется без ошибок. В Автокаде ничего не происходит. Нажимаю +, он отображается в командной строке и всплывают подсказки. Пробовал и другие символы - никакой реакции.
По идее всё должно работать. Может на рабочем компьютере не позволяет система безопасности, может уже установлены какие перехватчики?
Александр Ривилис:
--- Цитата: Константин75 от 23-04-2019, 09:24:48 ---Нажимаю +, он отображается в командной строке и всплывают подсказки. Пробовал и другие символы - никакой реакции.
--- Конец цитаты ---
У меня работает. У тебя был совсем неправильный проект, который я очистил. В связи с тем, что пути к acad.exe и к ObjectARX SDK не совпадают я правил проект, удалял лишнее. Можешь попробовать с этим проектом.
Александр Ривилис:
Константин75,
Надеюсь команду registerHook ты не забываешь запустить?
Константин75:
--- Цитата: Александр Ривилис от 23-04-2019, 09:47:54 ---Константин75,
Надеюсь команду registerHook ты не забываешь запустить?
--- Конец цитаты ---
Конечно не запускал(. Прошу меня извинить. Всё заработало!
Реагирует на + который на основной клавиатуре, на дополнительной надеюсь разберусь.
Спасибо огромное за помощь!!!
Александр Ривилис:
--- Цитата: Константин75 от 23-04-2019, 10:15:09 ---
--- Цитата: Александр Ривилис от 23-04-2019, 09:47:54 ---Константин75,
Надеюсь команду registerHook ты не забываешь запустить?
--- Конец цитаты ---
Конечно не запускал(. Прошу меня извинить. Всё заработало!
Реагирует на + который на основной клавиатуре, на дополнительной надеюсь разберусь.
Спасибо огромное за помощь!!!
--- Конец цитаты ---
--- Код - C# [Выбрать] ---using System;using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.EditorInput;using System.Runtime.InteropServices;using System.Windows; // This line is not mandatory, but improves loading performances[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in1.MyCommands))] namespace AutoCAD_CSharp_plug_in1{ public class MyCommands { // Для AutoCAD 2013 64 бит // Для предыдущих версий импортируем из acad.exe (вместо accore.dll) [DllImport("acad.exe", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acedRegisterFilterWinMsg@@YAHQ6AHPEAUtagMSG@@@Z@Z")] private static extern int acedRegisterFilterWinMsg( WindowHookProc callBackFunc); const int WM_KEYDOWN = 0x100; // Нажатие клавиши const int WM_KEYUP = 0x101; // Отжатие клавиши const int VK_ADD = 0x6B; // Клавиша + const int VK_OEM_PLUS = 0xBB; // Клавиша + на цифровой клавиатуре // Функция обратного вызова для хука [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 == WM_KEYDOWN) { if (msg.WParam == (IntPtr)VK_ADD || msg.WParam == (IntPtr)VK_OEM_PLUS) // делаем что нужно MessageBox.Show("Нажата клавиша +"); } return 0; } private static WindowHookProc callBackFunc = null; [CommandMethod("registerHook")] public static void CmdRegisterHook() { callBackFunc = new WindowHookProc(WindowsHook); acedRegisterFilterWinMsg(callBackFunc); } }}
Так должно реагировать и на плюс на цифровой клавиатуре.
Навигация
Перейти к полной версии