How to implement a Windows Hook using acedRegisterFilterWinMsg in .NET

By Augusto Goncalves

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

}


Comments

6 responses to “How to implement a Windows Hook using acedRegisterFilterWinMsg in .NET”

  1. The link to Windows Messages is broken.

  2. Not any more :-).

  3. Augusto
    As you know in Civil3d alot of the functions are not exposed in the API. I am currently looking for a way to create a catchment object programmically following on from my forum request here
    http://forums.autodesk.com/t5/AutoCAD-Civil-3D-Customization/Can-you-create-Catchment-Objects-from-the-API/td-p/3619810
    I was thinking that I could use the sendcommand to launch the CreateCatchmentObject which is fine and pass it an object but then the create catchment object grabs the focus and I can not use sendkeys to tab thru the dialog
    Would it be possible to hook this window in Civil3d and return focus to my code and step thru the dialog box with sendkey commands. or are some of the functions exposed but not managed if so can you rap them and use them?
    Justin Ralston

  4. BJHuffine Avatar
    BJHuffine

    curious… if WindowsHook is set to return 0 at the end, what happens if 1 or -1 is returned?

  5. Hi,
    Actually this can return the next hook, like suggested at http://support.microsoft.com/kb/318804
    Also, there is some more information at http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
    Regards,
    Augusto Goncalves

  6. Can’t Find acedRegisterFilterWinMsg Function When In AutoCAD2021?

Leave a Reply to Augusto GoncalvesCancel reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading