Статьи > Опубликованные статьи
Как реализовать Windows хук с использованием acedRegisterFilterWinMsg в .NET
Александр Ривилис:
Как реализовать Windows хук с использованием acedRegisterFilterWinMsg в .NET
Константин75:
Добрый день!
У меня есть вопрос по данному коду, заранее прошу меня извинить за незнание матчасти.
Пытаюсь применить данный код, для того чтобы отследить нажатие пользователем определённой клавиши, но никаких событий не происходит.
Создал AutoCAD .NET Wizard для VS 2015 (2013, 2012) шаблон и поместил в раздел MyCommands.cs внутрь процедуры (функции) данный код - получил ошибку. Вставил код после объявления пространства имён и имя класса, то всё компилируется без ошибок, но в AutoCade срабатывания не происходит.
AutoCad 2012x64
Александр Ривилис:
Выложи проект полностью - проверю.
Константин75:
Приложил архив
Александр Ривилис:
--- Цитата: Константин75 от 22-04-2019, 14:50:51 ---Приложил архив
--- Конец цитаты ---
Проверь этот код:
--- Код - 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; // Клавиша + // Функция обратного вызова для хука [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) // делаем что нужно MessageBox.Show("Нажата клавиша +"); } return 0; } private static WindowHookProc callBackFunc = null; [CommandMethod("registerHook")] public static void CmdRegisterHook() { callBackFunc = new WindowHookProc(WindowsHook); acedRegisterFilterWinMsg(callBackFunc); } }}
Навигация
Перейти к полной версии