In this entry we will look at how to disable the close button (The x in the upper right hand corner of the application) of an application in C#. This can come in handy when you need to do some processing when an application is being closed, and you need to control how/when it’s being closed. If you read around on the internet you will undoubtedly find many solutions, the problem is most dont account for more than one way to closing an application.


If you were to just simply disable the close button (The x in the upper right hand corner of the application), that leaves several other ways for the user to close the application. When you right-click on the title bar of an application they all have a System Menu that also has a close option, so we need to remove that option as well.

Doing all this still leaves one option available for closing the application, and that is if the user presses Alt + F4, this will close the application immediately. This is probably the easiest thing to account for, simply using the Forms FormClosing event to capture this.

To disable the close button, and remove the close option from the applications System Menu, we will have to use P/Invoke, a low level access to a Windows system, to capture several events. When using P/Invoke, I prefer to keep all of that code in a separate class file, I usually name this class Base (Since we are dealing with base level events). We will be using 4 Win32 API’s:

  • RemoveMenuItem: RemoveMenu is used to remove an item from a menu. If the item being removed is a sub-menu, the sub-menu is not actually destroyed by this function, instead, the close option is simply removed from the menu.
  • GetSystemMenu: GetSystemMenu is used to obtains a handle to a window’s system menu. This menu is what appears when the application icon on the title bar is clicked, or when the title bar itself is right-clicked.
  • GetMenuItemCount: GetMenuItemCount counts the number of items in a menu. Remember, the position indexes of menu items are zero based. This means that if there are n items in the menu, their position indexes go from 0 to n – 1.
  • DrawMenuBar: DrawMenuBar is used to redraw the system menu so the user can see & use it.

 


Now that we have our Base class defined with the API Calls we need, we can concentrate on the methods for removing the Close option from the system menu. This method, we’ll name it DisableClose, will use the 4 API methods we declared in the Base class to retrieve the system menu, get a count of all the items in the system menu, remove the items we specify, then redraw the menu. Remember, Close is always the last item in the system menu, and thats the one we want to remove.


To remove only the “Close” option we get the count of all items in the menu, then we go to the last one, back up one (the count is zero based, so its always n-1 for the one you want) then we call the RemoveMenu API method to remove that specific item. Now when your application runs, if you right-click on the title bar to bring up the system menu, the Close option is now gone.

We have no tackled 2 of the 3 ways to close an application, the last way is if the user presses Alt + F4. To do this we will capture this in the FormClosing event of the form. We will also give them an option to either let the application close or keep it open in case they have changes they wish to save before exiting.


We then call DisableClose in the form’s Load Event, passing it the Handle of the form like so:


That’s it, that’s how you can disable the close button (the X) and remove the close option from the applications system menu.

What Do You Think on This ? Say Here