Dismissing popup dialogs in AutoCAD

<?xml encoding=”UTF-8″>By Balaji Ramamoorthy

Most AutoCAD dialogs that get displayed can be suppressed if needed using certain system variables or when the command is preceded with a “-” to invoke the commandline version of it. You can read about such usage in this post :

Switch Between Dialog Boxes and the Command Line

Also, for batch processing of drawings AccoreConsole or AutoCAD.IO is much more suited and does not have the limitation of dialogs popping up during processing. To know about these options, please refer to the following blog posts :

Getting started with AccoreConsole

Getting started with AutoCAD.IO

If you still find yourself needing a way to dismiss the dialog inside AutoCAD, you can try using Windows hooks to dismiss the dialog. Please note that this method is not recommended, but since it is a commonly asked query I have posted a sample code here.
This sample code uses CBT hooks in C# and is based on this MSDN article:

How to set a Windows hook in Visual C# .NET

To use it, you will need to call the “SetupHook” and “RemoveHook” around the code which might result in the dialog and ensure that the hook closes the right dialog.

 <span>//For example :     </span><span> </span>
 <span>//    SetupHook();</span><span> </span>
 <span>//    ...Some processing that might result in a dialog </span><span> </span>
 <span>//    ...that you want to close.</span><span> </span>
 <span>//    RemoveHook();</span><span> </span>
 
 <span>public</span><span>  <span>delegate</span><span>  <span>int</span><span>  HookProc(</span></span></span>
 			<span>int</span><span>  nCode, </span>
 			IntPtr wParam, 
 			IntPtr lParam);
 
 <span>//Declare the hook handle as an int.</span><span> </span>
 <span>static</span><span>  <span>int</span><span>  hHook = 0;</span></span>
 
 <span>//Declare the mouse hook constant.</span><span> </span>
 <span>//For other hook types, you can obtain these values</span><span> </span>
 <span>// from Winuser.h in the Microsoft SDK.</span><span> </span>
 <span>public</span><span>  <span>const</span><span>  <span>int</span><span>  WH_CBT = 5;</span></span></span>
 
 <span>public</span><span>  <span>const</span><span>  uint WM_CLOSE = 0x0010;</span></span>
 
 <span>private</span><span>  <span>static</span><span>  <span>long</span><span>  HCBT_ACTIVATE = 5;</span></span></span>
 <span>private</span><span>  <span>static</span><span>  <span>long</span><span>  HCBT_CREATEWND = 3;</span></span></span>
 
 <span>//Declare MouseHookProcedure as a HookProc type.</span><span> </span>
 HookProc CBTHookProcedure_;
 
 <span>// This is the Import for the SetWindowsHookEx function.</span><span> </span>
 <span>// Use this function to install a thread-specific hook.</span><span> </span>
 [DllImport(<span>"user32.dll"</span><span> , CharSet = CharSet.Auto, </span>
 	CallingConvention = CallingConvention.StdCall)]
 <span>public</span><span>  <span>static</span><span>  <span>extern</span><span>  <span>int</span><span>  SetWindowsHookEx(<span>int</span><span>  idHook, </span></span></span></span></span>
 	HookProc lpfn, IntPtr hInstance, <span>int</span><span>  threadId);</span>
 
 <span>// This is the Import for the UnhookWindowsHookEx function.</span><span> </span>
 <span>// Call this function to uninstall the hook.</span><span> </span>
 [DllImport(<span>"user32.dll"</span><span> , CharSet = CharSet.Auto, </span>
 	CallingConvention = CallingConvention.StdCall)]
 <span>public</span><span>  <span>static</span><span>  <span>extern</span><span>  <span>bool</span><span>  UnhookWindowsHookEx(<span>int</span><span>  idHook);</span></span></span></span></span>
 
 <span>// This is the Import for the CallNextHookEx function.</span><span> </span>
 <span>// Use this function to pass the hook information </span><span> </span>
 <span>// to the next hook procedure in chain.</span><span> </span>
 [DllImport(<span>"user32.dll"</span><span> , CharSet = CharSet.Auto, </span>
 	CallingConvention = CallingConvention.StdCall)]
 <span>public</span><span>  <span>static</span><span>  <span>extern</span><span>  <span>int</span><span>  CallNextHookEx(<span>int</span><span>  idHook, </span></span></span></span></span>
 	<span>int</span><span>  nCode, IntPtr wParam, IntPtr lParam);</span>
 
 [DllImport(<span>"user32.dll"</span><span> , CharSet = CharSet.Auto, </span>
 	SetLastError = <span>true</span><span> )]</span>
 <span>static</span><span>  <span>extern</span><span>  <span>int</span><span>  GetWindowText(IntPtr hWnd, </span></span></span>
 	System.Text.StringBuilder lpString, <span>int</span><span>  nMaxCount);</span>
 
 [DllImport(<span>"user32.dll"</span><span> )]</span>
 <span>static</span><span>  <span>extern</span><span>  IntPtr GetActiveWindow();</span></span>
 
 [DllImport(<span>"user32.dll"</span><span> , CharSet = CharSet.Auto)]</span>
 <span>static</span><span>  <span>extern</span><span>  IntPtr SendMessage(IntPtr hWnd,</span></span>
 	UInt32 Msg, IntPtr wParam, IntPtr lParam);
 
 <span>public</span><span>  <span>static</span><span>  <span>int</span><span>  CBTHookProcedure(<span>int</span><span>  nCode, </span></span></span></span>
 	IntPtr wParam, IntPtr lParam)
 <span>{</span>
     <span>if</span><span>  (nCode < 0)</span>
     <span>{</span>
 		<span>return</span><span>  CallNextHookEx(</span>
 			hHook, nCode, wParam, lParam);
     <span>}</span>
     <span>else</span><span> </span>
     <span>{</span>
         System.Text.StringBuilder wndName 
 			= <span>new</span><span>  System.Text.StringBuilder(300);</span>
         GetWindowText(GetActiveWindow(), wndName, 300);
         <span>if</span><span>  (! wndName.ToString().Contains(</span>
 			<span>"AutoCAD Civil 3D"</span><span> ))</span>
         <span>{</span>
             SendMessage(GetActiveWindow(), 
 				WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
         <span>}</span>
     <span>}</span>
     <span>return</span><span>  CallNextHookEx(hHook, nCode, wParam, lParam);</span>
 <span>}</span>
 
 <span>void</span><span>  SetupHook()</span>
 <span>{</span>
 	<span>if</span><span>  (hHook == 0)</span>
 	<span>{</span>
 		<span>// Create an instance of HookProc.</span><span> </span>
 		CBTHookProcedure_ = <span>new</span><span>  HookProc(CBTHookProcedure);</span>
 
 		hHook = SetWindowsHookEx(
 		WH_CBT,
 		CBTHookProcedure_,
 		(IntPtr)0,
 		AppDomain.GetCurrentThreadId());
 
 		<span>//If the SetWindowsHookEx function fails.</span><span> </span>
 		<span>if</span><span>  (hHook == 0)</span>
 		<span>{</span>
 			System.Windows.Forms.MessageBox.Show(
 				<span>"SetWindowsHookEx Failed"</span><span> );</span>
 			<span>return</span><span> ;</span>
 		<span>}</span>
 	<span>}</span>
 <span>}</span>
 
 <span>void</span><span>  RemoveHook()</span>
 <span>{</span>
     <span>if</span><span>  (hHook != 0)</span>
     <span>{</span>
 		<span>bool</span><span>  ret = UnhookWindowsHookEx(hHook);</span>
 		<span>//If the UnhookWindowsHookEx function fails.</span><span> </span>
 		<span>if</span><span>  (ret)</span>
 		<span>{</span>
 			hHook = 0;
 		<span>}</span>
     <span>}</span>
 <span>}</span>
 


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

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

Continue reading