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);
}
}
}