Статьи > Опубликованные статьи

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

<< < (2/7) > >>

Константин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);    }  }}
Так должно реагировать и на плюс на цифровой клавиатуре.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии