ACC2000: Cómo detectar e impedir que la rueda del mouse cambie el registro que se muestra en un formulario

Id. de artículo: 278379 - Ver los productos a los que se aplica este artículo
Avanzado: requiere conocimientos avanzados de código, interoperabilidad y multiusuario.

Este artículo hace referencia a una base de datos de Microsoft Access (.mdb) y a un proyecto de Microsoft Access (.adp).

Expandir todo | Contraer todo

Resumen

Microsoft Access no proporciona un método que impida a los usuarios utilizar la rueda del mouse (ratón) para desplazarse entre los registros de un formulario. En este artículo se muestra cómo impedir mediante programación a los usuarios el uso de la rueda del mouse (ratón) para desplazarse entre los registros de un formulario.

NOTA
Si el código de este artículo no funciona como se esperaba, puede tener que instalar la versión más reciente del software Microsoft IntelliPoint o del software de mouse de otro fabricante. Para descargar el software IntelliPoint, visite el siguiente sitio Web de Microsoft:
http://www.microsoft.com/spain/hardware/mouseandkeyboard/Download.mspx

Más información

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. En este artículo se da por supuesto que ya conoce el lenguaje de programación que se muestra, así como las herramientas empleadas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas. De manera predeterminada, los usuarios pueden girar la rueda del mouse para desplazarse entre una serie de registros en un formulario de Microsoft Access. Si desea impedirlo, puede utilizar la API de Win32 para convertir en subclases los formularios e ignorar los mensajes que la rueda del mouse envió al formulario. Hay dos formas de hacerlo. El primer enfoque consiste en utilizar Microsoft Visual Basic o Microsoft Visual C++ para crear una DLL de ActiveX DLL que subclasifique los formularios de Microsoft Access y, a continuación, hacer referencia a esa DLL desde la aplicación Microsoft Access. Un segundo método consiste en escribir todo el código que hay en Microsoft Access sin utilizar una DLL de ActiveX. Debido a los problemas con las ventanas de subclases después de cargar el Editor de Visual Basic en Microsoft, Microsoft recomienda que utilice Microsoft Visual Basic o Microsoft Visual C++ para crear una DLL de ActiveX y después hacer referencia a la DLL desde la aplicación Microsoft Access.

Crear la actividad MouseWheel utilizando una DLL de ActiveX en Visual Basic

  1. Inicie Microsoft Visual Basic 6.0.
  2. Cree un nuevo proyecto DLL de ActiveX y, a continuación, ábralo.
  3. Agregue el código siguiente a la ventana de módulo de clase que aparece:
    Option Compare Text
    Option Explicit
    
    Private frm As Object
    Private intCancel As Integer
    Public Event MouseWheel(Cancel As Integer)
    
    Public Property Set Form(frmIn As Object)
        Set frm = frmIn
    End Property
    
    Public Property Get MouseWheelCancel() As Integer
        MouseWheelCancel = intCancel
    End Property
    
    Public Sub SubClassHookForm()
        lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, _
                                        AddressOf WindowProc)
          Set CMouse = Me
       End Sub
    
    Public Sub SubClassUnHookForm()
        Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
    End Sub
    
    Public Sub FireMouseWheel()
        RaiseEvent MouseWheel(intCancel)
    End Sub
    					
  4. Establezca las propiedades de módulo de clase como sigue:
       Módulo de clase: CMouseWheel
       -------------------------
       Nombre: CMouseWheel
       Instancia: 5 - MultiUse
    					
  5. Agregue un módulo estándar al proyecto y, a continuación, agregue el código siguiente:
    Option Compare Text
    Option Explicit
    
    Public CMouse As CMouseWheel
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hwnd As Long, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As Long) As Long
    
    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
        (ByVal lpPrevWndFunc As Long, _
         ByVal hwnd As Long, _
         ByVal msg As Long, _
         ByVal wParam As Long, _
         ByVal lParam As Long) As Long
         
    Public Const GWL_WNDPROC = -4
    Public Const WM_MouseWheel = &H20A
    Public lpPrevWndProc As Long
    Public Function WindowProc(ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long
        Select Case uMsg
            Case WM_MouseWheel
                CMouse.FireMouseWheel
                If CMouse.MouseWheelCancel = False Then
                    WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
                End If
                
            Case Else
               WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
        End Select
    End Function
    					
  6. En el menú Ver, haga clic en Explorador de proyectos.
  7. Seleccione el nodo del proyecto en la parte superior del Explorador de proyectos.
  8. En el menú Ver, haga clic en Propiedades para ver la hoja de propiedades correspondiente al proyecto.
  9. Establezca la propiedad Nombre del proyecto en MouseWheel.
  10. En el menú Archivo, haga clic en Guardar proyecto.
  11. Guarde los archivos del proyecto como basSubClassWindow.bas, CMouseWheel.cls y MouseWheel.vbp, respectivamente.
  12. En el menú Archivo, haga clic en Crear MouseWheel.dll y, después, haga clic en Aceptar para crear la DLL.
  13. Cierre Microsoft Visual Basic.
  14. Inicie Microsoft Access y abra la base de datos de ejemplo Neptuno.mdb.
  15. Abra el formulario Clientes en la vista Diseño.
  16. En el menú Ver, haga clic en Código para mostrar el módulo del formulario en el Editor de Visual Basic.
  17. En el menú Herramientas, haga clic en Referencias.
  18. Haga clic para activar la casilla de verificación situada junto a MouseWheel para seleccionar la referencia. Si no ve esta referencia en la lista, haga clic en el botón Examinar, haga clic en MouseWheel.DLL en la carpeta que guardó en el paso 12 y, a continuación, haga clic en Abrir.
  19. Haga clic en Aceptar para cerrar el cuadro de diálogo Referencias.
  20. Agregue el código siguiente al módulo del formulario:
    Option Compare Database
    Option Explicit
    
    Private WithEvents clsMouseWheel As MouseWheel.CMouseWheel
    
    Private Sub Form_Load()
        Set clsMouseWheel = New MouseWheel.CMouseWheel
        Set clsMouseWheel.Form = Me
        clsMouseWheel.SubClassHookForm
    End Sub
    
    Private Sub Form_Close()
       clsMouseWheel.SubClassUnHookForm
       Set clsMouseWheel.Form = Nothing
       Set clsMouseWheel = Nothing
    End Sub
    
    Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
        MsgBox "You cannot use the mouse wheel to scroll records."
        Cancel = True
    End Sub
    					
  21. En el menú Archivo, haga clic en Cerrar y volver a Microsoft Access.
  22. Guarde el formulario y ciérrelo.
  23. Abra el formulario Clientes en la vista Formulario.
  24. Gire la rueda del mouse.
Debe recibir el mensaje:
No puede utilizar la rueda del mouse para desplazarse entre los registros.
Compruebe también que el registro actual no ha cambiado, lo que indicaría que el mensaje de la rueda del mouse no fue procesado por Microsoft Access.

Creación del evento MouseWheel totalmente desde Microsoft Access

ADVERTENCIA
Si es posible, utilice el método descrito anteriormente en este artículo en la sección "Creación del evento MouseWheel utilizando una DLL de ActiveX en Visual Basic". Puede utilizar el método de la presente sección sólo en una situación en la que los usuarios de su aplicación no cargarán el Editor de Visual Basic dentro de Microsoft Access, como en una aplicación en tiempo de ejecución de Microsoft Access. Si implementa esta solución y los usuarios abren el Editor de Visual Basic, el código de esta sección hará que Microsoft Access deje de responder. Además, si cargó el Editor de Visual Basic al menos una vez durante la sesión de Microsoft Access, debe cerrar y reiniciar Microsoft Access. Si utiliza este método, Microsoft le recomienda que guarde a menudo el trabajo y que mantenga copias de seguridad actualizadas de la base de datos.

El enfoque demostrado en esta sección muestra cómo utilizar un módulo de clase personalizado para crear un evento personalizado denominado MouseWheel, que puede utilizar en sus formularios para detectar cuándo ha girado el usuario la rueda del mouse. Este evento personalizado expone un argumento Cancel que puede utilizar para impedir que el mensaje de giro de la rueda del mouse sea interceptado por Microsoft Access, evitando con ello el desplazamiento por los registros en el formulario.

Para crear los procedimientos personalizados, siga estos pasos:
  1. PRECAUCIÓN
    Si sigue los pasos de este ejemplo, modificará la base de datos de ejemplo Neptuno.mdb. Quizás desee hacer copia de seguridad del archivo Neptuno.mdb y seguir estos pasos en una copia de la base de datos.

  2. Inicie Microsoft Access.
  3. Abra la base de datos de ejemplo Neptuno.mdb.
  4. En el menú Insertar, haga clic en Módulo para crear un módulo nuevo en el Editor de Visual Basic.
  5. Agregue el siguiente código al módulo:
    Option Compare Database
    Option Explicit
    
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hwnd As Long, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As Long) As Long
    
    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
        (ByVal lpPrevWndFunc As Long, _
         ByVal hwnd As Long, _
         ByVal msg As Long, _
         ByVal wParam As Long, _
         ByVal lParam As Long) As Long
         
         
    Public Const GWL_WNDPROC = -4
    Public Const WM_MouseWheel = &H20A
    Public lpPrevWndProc As Long
    Public CMouse As CMouseWheel
    
    Public Function WindowProc(ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long
    
        'Look at the message passed to the window. If it is
        'a mouse wheel message, call the FireMouseWheel procedure
        'in the CMouseWheel class, which in turn raises the MouseWheel
        'event. If the Cancel argument in the form event procedure is
        'set to False, then we process the message normally, otherwise
        'we ignore it.  If the message is something other than the mouse
        'wheel, then process it normally
        Select Case uMsg
            Case WM_MouseWheel
                CMouse.FireMouseWheel
                If CMouse.MouseWheelCancel = False Then
                    WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
                End If
               
                
            Case Else
               WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
        End Select
    End Function
    					
  6. En el menú Archivo, haga clic en Guardar <nombreDeProyecto>. Guarde el módulo como basSubClassWindow.
  7. En el menú Insertar, haga clic en Módulo de clase.
  8. Agregue el siguiente código al módulo de clase:
    Option Compare Database
    Option Explicit
    
    Private frm As Access.Form
    Private intCancel As Integer
    Public Event MouseWheel(Cancel As Integer)
    
    Public Property Set Form(frmIn As Access.Form)
        'Define Property procedure for the class which
        'allows us to set the Form object we are
        'using with it. This property is set from the
        'form class module.
        Set frm = frmIn
    End Property
    
    Public Property Get MouseWheelCancel() As Integer
        'Define Property procedure for the class which
        'allows us to retrieve whether or not the Form
        'event procedure canceled the MouseWheel event.
        'This property is retrieved by the WindowProc
        'function in the standard basSubClassWindow
        'module.
    
        MouseWheelCancel = intCancel
    End Property
    
    Public Sub SubClassHookForm()
        'Called from the form's OnOpen or OnLoad
        'event. This procedure is what "hooks" or
        'subclasses the form window. If you hook the
        'the form window, you must unhook it when completed
        'or Access will crash.
        
        lpPrevWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, _
                                        AddressOf WindowProc)
          Set CMouse = Me
       End Sub
    
    Public Sub SubClassUnHookForm()
        'Called from the form's OnClose event.
        'This procedure must be called to unhook the
        'form window if the SubClassHookForm procedure
        'has previously been called. Otherwise, Access will
        'crash.
    
        Call SetWindowLong(frm.hwnd, GWL_WNDPROC, lpPrevWndProc)
    End Sub
    
    Public Sub FireMouseWheel()
    
        'Called from the WindowProc function in the
        'basSubClassWindow module. Used to raise the 
        'MouseWheel event when the WindowProc function
        'intercepts a mouse wheel message.
        RaiseEvent MouseWheel(intCancel)
    End Sub
    					
  9. En el menú Archivo, haga clic en Guardar <nombreDeProyecto>. Guarde el módulo de clase como CMouseWheel.
  10. Abra el formulario Clientes en la vista Diseño.
  11. En el menú Ver, haga clic en Código para ver el módulo de clase del formulario.
  12. Agregue el código siguiente al módulo de clase del formulario:
    Option Compare Database
    Option Explicit
    
    'Declare a module level variable as the custom class
    'and give us access to the class's events
    Private WithEvents clsMouseWheel As CMouseWheel
    
    Private Sub Form_Load()
        'Create a new instance of the class,
        'and set the class's Form property to
        'the current form  
        Set clsMouseWheel = New CMouseWheel
        Set clsMouseWheel.Form = Me
    
        'Subclass the current form by calling
        'the SubClassHookForm method in the class
        clsMouseWheel.SubClassHookForm
    End Sub
    
    Private Sub Form_Close()
        'Unhook the form by calling the 
        'SubClassUnhook form method in the 
        'class, and then destroy the object
        'variable
      
        clsMouseWheel.SubClassUnHookForm
        Set clsMouseWheel.Form = Nothing
        Set clsMouseWheel = Nothing
    End Sub
    
    Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
         'This is the event procedure where you can
         'decide what to do when the user rolls the mouse.
         'If setting Cancel = True, we disable the mouse wheel
         'in this form.
    
         MsgBox "You cannot use the mouse wheel to scroll through records."
         Cancel = True
    End Sub
  13. En el menú Archivo, haga clic en Cerrar y volver a Microsoft Access.
  14. Guarde el formulario y ciérrelo.

    NOTA
    Esta vez no abra el formulario en la vista Formulario. Si lo hace, Microsoft Access dejará de responder porque se ha cargado el Editor de Visual Basic.
  15. Cierre Microsoft Access.
  16. Reinicie Microsoft Access y abra la base de datos de ejemplo Neptuno.mdb.
  17. Abra el formulario Clientes en la vista Formulario.
  18. Gire la rueda del mouse.
Debe recibir el mensaje:
No puede utilizar la rueda del mouse para desplazarse entre los registros.
Compruebe también que el registro actual no ha cambiado, lo que indicaría que el mensaje de la rueda del mouse no fue procesado por Microsoft Access.

Propiedades

Id. de artículo: 278379 - Última revisión: lunes, 25 de septiembre de 2006 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Access 2000 Standard Edition
Palabras clave: 
kbhowto KB278379

Enviar comentarios