It is possible setup a hook for Windows Messages, which is a low level event to capture when the system is performing almost any task, such as mouse movement or opening a dialog.
Inside AutoCAD there is a special method to do so, which do not interfere with its built-in behavior, but have the same features: acedRegisterFilterWinMsg
This method still implemented only on C++, so we need to use the DllImport attribute, which you might be familiar. For this specific case, it is also required the decorated name of this aced method, which can be obtained using the Dependency Walker tool.
// For AutoCAD 2013 64 bit
// On previous versions, import from acad.exe (instead accore.dll)
[DllImport(“accore.dll”,
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.Cdecl,
EntryPoint = “?acedRegisterFilterWinMsg@@YAHQ6AHPEAUtagMSG@@@Z@Z”)]
private static extern int acedRegisterFilterWinMsg(
WindowHookProc callBackFunc);
// hook message filter callback function
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int WindowHookProc(
ref System.Windows.Forms.Message msg);
private static int WindowsHook(
ref System.Windows.Forms.Message msg)
{
// check the msg struct for whatever we want,
// like keys, paint messages etc
if (msg.Msg == ???)
{
// do something
}
return 0;
}
private static WindowHookProc callBackFunc = null;
[CommandMethod(“registerHook”)]
public static void CmdRegisterHook()
{
callBackFunc = new WindowHookProc(WindowsHook);
acedRegisterFilterWinMsg(callBackFunc);
}

Leave a Reply