EnableWindow function enables or disables the mouse and keyboard input to the specified control. You can use this function from user32.dll as the follows;

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool EnableWindow(HandleRef hWnd, bool enable);
  
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool EnableWindow(IntPtr hWnd, boolenable);

But .NET Framework’s Control Class , it is the base class to create a custom control in .NET, manages its Enable property a little bit different from the unmanaged Controls and Windows. Normally we can understand a control’s enable status from its Window Styles. If it contains WS_DISABLED flag this means that the given control is disabled otherwise it is enabled. But .NET Framework’s Control class does not use this WS_DISABLED flag. Instead it uses its own mechanism to understand that it is Enabled or not? So when we use EnableWindow function on a .NET Control it just enables the window and set its flags. But .NET still uses its own state flag which we can only change it by using Enabled property of that class. So .NET Framework Control still things that it is not enabled.
Therefore it is painted as disabled and does not accept mouse inputs. Actually default window procedure of this control started to accept mouse messages but again Control class’s own mechanism checks that is this control Enabled property before processing the mouse message.
Although Control which is enabled by EnableWindow function does not accept mouse messages, it begins to accept keyboard messages. Because there is no limitation in .NET Control class for the keyboard messages like mouse messages.

Here is the .NET’s codes;

private void WmMouseDown(ref Message m, MouseButtons button, int clicks)
{
   MouseButtons buttons1 = Control.MouseButtons;
   SetState(0x8000000, true);
   if (!GetStyle(ControlStyles.UserMouse))
   {
      DefWndProc(ref m);
   }
   else
   {
       if ((button == MouseButtons.Left) && GetStyle(ControlStyles.Selectable))
      {
         FocusInternal();
      }
   }
   if (buttons1 == Control.MouseButtons)
   {
      if (!GetState2(0x10))
      {
         CaptureInternal = true;
      }
      // Here checks Enabled property to  process mouse events
      if ((buttons1 == Control.MouseButtons) && Enabled)
     {
        OnMouseDown(new MouseEventArgs(button, clicks, NativeMethods.Util.SignedLOWORD(m.LParam),
	NativeMethods.Util.SignedHIWORD(m.LParam), 0));
      }
   }
}
public bool Enabled
{
   get
   {
       // uses 3rd bit  of the state flag to indicate the Enabled value
      if (!GetState(4))
      {
         return false;
      }
      if (ParentInternal == null)
      {
         return true;
      }
      return ParentInternal.Enabled;
   }
   set
   {
       bool value = Enabled;
      // sets the 3rd  bit of the state flag
      SetState(4, value);
      if (value != value)
      {
          if (!value)
          {
             SelectNextIfFocused();
          }
          OnEnabledChanged(EventArgs.Empty);
      }
   }
}
internal bool GetState(int flag)
{
   // state is a field
   return (state & flag) != 0; 
}

Code extracted by Xenocode Fox .NET Decompiler 

Share: