ACC2000: How to Disable the Close Button (X) on the Access Application Window

ID: Q245746


The information in this article applies to:
  • Microsoft Access 2000

Advanced: Requires expert coding, interoperability, and multiuser skills.

This article applies to a Microsoft Access database (.mdb) and a Microsoft Access project (.adp).


SUMMARY

Microsoft Access has no built-in method for disabling the Close button (X) on the application window or the Close command on the System menu of the application window. This article describes how to programmatically disable both of these.


MORE INFORMATION

In order to disable the application Close button and the Close command on the System menu, you must call the GetSystemMenu and ModifyMenu functions from the Win32 API.

Microsoft provides programming examples for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability and/or fitness for a particular purpose. This article assumes that you are familiar with the programming language being demonstrated and the tools used to create and debug procedures. Microsoft support professionals can help explain the functionality of a particular procedure, but they will not modify these examples to provide added functionality or construct procedures to meet your specific needs. If you have limited programming experience, you may want to contact a Microsoft Certified Solution Provider or the Microsoft fee-based consulting line at (800) 936-5200. For more information about Microsoft Certified Solution Providers, please see the following page on the World Wide Web:

http://www.microsoft.com/mcsp/
For more information about the support options available from Microsoft, please see the following page on the World Wide Web:

http://www.microsoft.com/support/supportnet/overview/overview.asp

Step-by-Step Example


  1. Start Microsoft Access.


  2. Open the sample database Northwind.mdb.


  3. On the Insert menu, click Class Module.


  4. Type the following code into the Declarations section:


  5. 
    Option Compare Database
    Option Explicit
    
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, _
       ByVal bRevert As Long) As Long
    
    Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As _
       Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
    
    Private Declare Function GetMenuItemInfo Lib "user32" Alias _
       "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As _
       Long, lpMenuItemInfo As MENUITEMINFO) As Long
    
    Private Type MENUITEMINFO
        cbSize As Long
        fMask As Long
        fType As Long
        fState As Long
        wID As Long
        hSubMenu As Long
        hbmpChecked As Long
        hbmpUnchecked As Long
        dwItemData As Long
        dwTypeData As String
        cch As Long
    End Type
    
    Const MF_GRAYED = &H1&
    Const MF_BYCOMMAND = &H0&
    Const SC_CLOSE = &HF060& 
  6. Add the following procedures to the class module:


  7. 
    Public Property Get Enabled() As Boolean
        Dim hWnd As Long
        Dim hMenu As Long
        Dim result As Long
        Dim MI As MENUITEMINFO
        
        MI.cbSize = Len(MI)
        MI.dwTypeData = String(80, 0)
        MI.cch = Len(MI.dwTypeData)
        MI.fMask = MF_GRAYED
        MI.wID = SC_CLOSE
        hWnd = Application.hWndAccessApp
        hMenu = GetSystemMenu(hWnd, 0)
        result = GetMenuItemInfo(hMenu, MI.wID, 0, MI)
        Enabled = (MI.fState And MF_GRAYED) = 0
    End Property
    
    Public Property Let Enabled(boolClose As Boolean)
        Dim hWnd As Long
        Dim wFlags As Long
        Dim hMenu As Long
        Dim result As Long
        
        hWnd = Application.hWndAccessApp
        hMenu = GetSystemMenu(hWnd, 0)
        If Not boolClose Then
            wFlags = MF_BYCOMMAND Or MF_GRAYED
        Else
            wFlags = MF_BYCOMMAND And Not MF_GRAYED
        End If
        result = EnableMenuItem(hMenu, SC_CLOSE, wFlags)
    End Property 
  8. On the File menu, click Save Northwind (to save the project), and when prompted for the name of the class module, save it as CloseCommand.


  9. On the Insert menu, click Module to create a new, standard module.


  10. Add the following procedure to the module:


  11. 
    Function InitApplication()
       Dim c As CloseCommand
       Set c = New CloseCommand
       
       'Disable Close menu.
       c.Enabled = False
    End Function 
  12. On the Debug menu, click Compile Northwind. If the project is not compiled successfully, correct the compilation errors, and then compile the project again.


  13. On the File menu, click Save Northwind, and use the default name that appears in the Module Name box by clicking OK.


  14. Create a new macro with the following actions and action arguments:


  15. 
       Action
       -------
       RunCode
    
       Action Arguments
       -------------------------------
       Function Name: InitApplication() 
  16. Save the macro and name it Autoexec.


  17. Close the database.


  18. Reopen the database.


Note that the Close button and the Close command on the System menu of the application window are disabled.

Usage

The CloseCommand class module described in this article allows you to easily enable or disable the Close button and the Close command of the application window. The class module also allows you to check the state of these commands to determine if they are currently enabled or disabled. Before doing either of these, your code must first create an instance of the CloseCommand class, as demonstrated in the InitApplication function earlier in this article.

To check the state of the Close button, refer to the Enabled property of the CloseCommand instance that your code created. Likewise, to set the state of the Close button, assign True or False to the Enabled property of the CloseCommand instance that your code created.

Please note that this technique affects the Close button on the application window of Microsoft Access, not the Close button on the Database window. After disabling the Close button, the button is not automatically reenabled when your database closes. If the user closes the database and leaves Microsoft Access open, the user will not be able to quit Microsoft Access by using the Close button. In this case, your application should reenable the Close button before it terminates. Otherwise, the user will have to quit and restart Microsoft Access in order for the Close button to be enabled.

This technique does not disable the Exit command on the File menu. If your application needs to disable this command, you must customize the File menu to remove the Exit command.

Additional query words: inf gray grayed grey greyed out upper right unavailable

Keywords : kbdta MdlOthr PgmApi PgmHowto
Version : WINDOWS:2000
Platform : WINDOWS
Issue type :


Last Reviewed: December 9, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.