Introducción a la entrada del mouse

El mouse es un dispositivo importante, pero opcional, de entrada de usuario para aplicaciones. Una aplicación bien escrita debe incluir una interfaz del mouse, pero no debe depender únicamente del mouse para adquirir la entrada del usuario. La aplicación también debe proporcionar compatibilidad completa con el teclado.

Una aplicación recibe la entrada del mouse en forma de mensajes enviados o publicados en sus ventanas.

En esta sección se describen los temas siguientes:

Cursor del mouse

Cuando el usuario mueve el mouse, el sistema mueve un mapa de bits en la pantalla denominado cursor del mouse. El cursor del mouse contiene un punto de un solo píxel denominado punto activo, un punto que el sistema realiza el seguimiento y reconoce como la posición del cursor. Cuando se produce un evento del mouse, la ventana que contiene el punto activo normalmente recibe el mensaje del mouse resultante del evento. La ventana no debe estar activa o tener el foco del teclado para recibir un mensaje del mouse.

El sistema mantiene una variable que controla la velocidad del mouse, es decir, la distancia a la que se mueve el cursor cuando el usuario mueve el mouse. Puede usar la función SystemParametersInfo con la marca SPI_GETMOUSE o SPI_SETMOUSE para recuperar o establecer la velocidad del mouse. Para obtener más información sobre cursores de mouse, consulte Cursores.

Captura del mouse

Normalmente, el sistema envía un mensaje del mouse a la ventana que contiene el punto activo del cursor cuando se produce un evento del mouse. Una aplicación puede cambiar este comportamiento mediante la función SetCapture para enrutar los mensajes del mouse a una ventana específica. La ventana recibe todos los mensajes del mouse hasta que la aplicación llama a la función ReleaseCapture o especifica otra ventana de captura, o hasta que el usuario hace clic en una ventana creada por otro subproceso.

Cuando cambia la captura del mouse, el sistema envía un mensaje WM_CAPTURECHANGED a la ventana que pierde la captura del mouse. El parámetro lParam del mensaje especifica un identificador para la ventana que obtiene la captura del mouse.

Solo la ventana en primer plano puede capturar la entrada del mouse. Cuando una ventana en segundo plano intenta capturar el mouse, recibe mensajes solo relativos a los eventos del mouse que se produzcan cuando el puntero del mouse esté dentro de la parte visible de esa ventana.

La captura de la entrada del mouse es útil si una ventana debe recibir toda la entrada del mouse, incluso cuando el cursor se mueve fuera de la ventana. Por ejemplo, una aplicación normalmente realiza un seguimiento de la posición del cursor después de un evento de botón del mouse hacia abajo, siguiendo el cursor hasta que se produce un evento de botón del mouse hacia arriba. Si una aplicación no ha capturado la entrada del mouse y el usuario suelta el botón del mouse fuera de la ventana, la ventana no recibe el mensaje de botón hacia arriba.

Un subproceso puede usar la función GetCapture para determinar si una de sus ventanas ha capturado el mouse. Si una de las ventanas del subproceso ha capturado el mouse, GetCapture recupera un identificador de la ventana.

Mouse ClickLock

La característica accesibilidad ClickLock del mouse permite que un usuario bloquee el botón primario del mouse después de un solo clic. En una aplicación, el botón sigue apareciendo presionado. Para desbloquear el botón, una aplicación puede enviar cualquier mensaje del mouse o el usuario puede hacer clic en cualquier botón del mouse. Esta característica permite al usuario realizar combinaciones complejas de mouse de forma más sencilla. Por ejemplo, aquellos con ciertas limitaciones físicas pueden resaltar texto, arrastrar objetos o abrir menús más fácilmente. Para obtener más información, vea las marcas siguientes y los comentarios en SystemParametersInfo:

  • SPI_GETMOUSECLICKLOCK
  • SPI_SETMOUSECLICKLOCK
  • SPI_GETMOUSECLICKLOCKTIME
  • SPI_SETMOUSECLICKLOCKTIME

Configuración del mouse

Aunque el mouse es un dispositivo de entrada importante para las aplicaciones, no todos los usuarios necesariamente tienen un mouse. Una aplicación puede determinar si el sistema incluye un mouse pasando el valor de SM_MOUSEPRESENT a la función GetSystemMetrics.

Windows admite un mouse con hasta tres botones. En un mouse de tres botones, los botones se designan como botones izquierdo, central y derecho. Los mensajes y las constantes con nombre relacionadas con los botones del mouse usan las letras L, M y R para identificar los botones. El botón de un mouse de un solo botón se considera el botón izquierdo. Aunque Windows admite un mouse con varios botones, la mayoría de las aplicaciones usan el botón izquierdo principalmente y los demás mínimamente, si es así.

Las aplicaciones también pueden admitir una rueda del mouse. La rueda del mouse se puede presionar o girar. Cuando se presiona la rueda del mouse, actúa como el botón central (tercero), enviando mensajes normales de botón central a la aplicación. Cuando se gira, se envía un mensaje de rueda a la aplicación. Para obtener más información, véase la sección Rueda del mouse.

Las aplicaciones pueden admitir botones de comando de aplicación. Estos botones, denominados botones X, están diseñados para permitir un acceso más fácil a un navegador de Internet, correo electrónico y servicios multimedia. Cuando se presiona un botón X, se envía un mensaje WM_APPCOMMAND a la aplicación. Para obtener más información, vea la descripción del mensaje WM_APPCOMMAND.

Una aplicación puede determinar el número de botones del mouse pasando el valor de SM_CMOUSEBUTTONS a la función GetSystemMetrics. Para configurar el mouse para un usuario izquierdo, la aplicación puede usar la función SwapMouseButton para invertir el significado de los botones del mouse izquierdo y derecho. Pasar el valor de SPI_SETMOUSEBUTTONSWAP a la función SystemParametersInfo es otra manera de invertir el significado de los botones. Sin embargo, tenga en cuenta que el mouse es un recurso compartido, por lo que revertir el significado de los botones afecta a todas las aplicaciones.

XBUTTONs

Windows admite un mouse con cinco botones. Además de los botones izquierdo, central y derecho hay XBUTTON1 y XBUTTON2, que proporcionan navegación hacia atrás y hacia delante al usar el explorador.

El administrador de ventanas admite XBUTTON1 y XBUTTON2 a través de los mensajes WM_XBUTTON* y WM_NCXBUTTON*. El HIWORD del WPARAM de estos mensajes contiene una marca que indica qué botón X se ha presionado. Dado que estos mensajes del mouse también caben entre las constantes WM_MOUSEFIRST y WM_MOUSELAST, una aplicación puede filtrar todos los mensajes del mouse con GetMessage o PeekMessage.

Los siguientes admiten XBUTTON1 y XBUTTON2:

Se modificaron las siguientes API para admitir estos botones:

Es poco probable que una ventana secundaria de una aplicación de componente pueda implementar directamente comandos para XBUTTON1 y XBUTTON2. Por lo tanto , DefWindowProc envía un mensaje de WM_APPCOMMAND a una ventana cuando se hace clic en un botón X. DefWindowProc también envía el mensaje WM_APPCOMMAND a su ventana primaria. Esto es similar a la forma en que se invocan los menús contextuales con un clic derecho: DefWindowProc envía un mensaje de WM_CONTEXTMENU al menú y también lo envía a su elemento primario. Además, si DefWindowProc recibe un mensaje de WM_APPCOMMAND para una ventana de nivel superior, llama a un enlace de shell con código HSHELL_APPCOMMAND.

Hay compatibilidad con los teclados que tienen teclas adicionales para funciones del explorador, funciones multimedia, inicio de aplicaciones y administración de energía. Para obtener más información, vea Teclas de teclado para examinar y otras funciones.

Mensajes del mouse

El mouse genera un evento de entrada cuando el usuario mueve el mouse o presiona o suelta un botón del mouse. El sistema convierte los eventos de entrada del mouse en mensajes y los publica en la cola de mensajes del subproceso adecuado. Cuando los mensajes del mouse se publican más rápido que un subproceso puede procesarlos, el sistema descarta todo menos el mensaje del mouse más reciente.

Una ventana recibe un mensaje del mouse cuando se produce un evento del mouse mientras el cursor está dentro de los bordes de la ventana o cuando la ventana ha capturado el mouse. Los mensajes del mouse se dividen en dos grupos: mensajes de área de cliente y mensajes de área no cliente. Normalmente, una aplicación procesa los mensajes del área cliente y omite los mensajes de área no cliente.

En esta sección se describen los temas siguientes:

Mensajes del mouse del área cliente

Una ventana recibe un mensaje del mouse de área cliente cuando se produce un evento del mouse dentro del área cliente de la ventana. El sistema envía el mensaje WM_MOUSEMOVE a la ventana cuando el usuario mueve el cursor dentro del área de cliente. Publica uno de los siguientes mensajes cuando el usuario presiona o suelta un botón del mouse mientras el cursor está dentro del área de cliente.

Mensaje Significado
WM_LBUTTONDBLCLK Se hizo doble clic en el botón izquierdo del mouse.
WM_LBUTTONDOWN Se presionó el botón primario del mouse.
WM_LBUTTONUP Se liberó el botón izquierdo del mouse.
WM_MBUTTONDBLCLK Se hizo doble clic en el botón central del mouse.
WM_MBUTTONDOWN Se presionó el botón central del mouse.
WM_MBUTTONUP Se liberó el botón central del mouse.
WM_RBUTTONDBLCLK Se hizo doble clic en el botón derecho del mouse.
WM_RBUTTONDOWN Se presionó el botón secundario del mouse.
WM_RBUTTONUP Se liberó el botón derecho del mouse.
WM_XBUTTONDBLCLK Se hizo doble clic en el botón X del mouse.
WM_XBUTTONDOWN Se presionó el botón X del mouse.
WM_XBUTTONUP Se liberó un botón X del mouse.

 

Además, una aplicación puede llamar a la función TrackMouseEvent para que el sistema envíe otros dos mensajes. Envía el mensaje WM_MOUSEHOVER cuando el cursor mantiene el puntero sobre el área de cliente durante un período de tiempo determinado. Envía el mensaje WM_MOUSELEAVE cuando el cursor sale del área de cliente.

Parámetros de mensajes de error

El parámetro lParam de un mensaje del mouse del área cliente indica la posición de la zona activa del cursor. La palabra de orden bajo indica la coordenada x de la zona activa y la palabra de orden superior indica la coordenada y. Las coordenadas se especifican en coordenadas de cliente. En el sistema de coordenadas de cliente, todos los puntos de la pantalla se especifican en relación con las coordenadas (0,0) de la esquina superior izquierda del área cliente.

El parámetro wParam contiene marcas que indican el estado de los otros botones del mouse y las teclas CTRL y MAYÚS en el momento del evento del mouse. Puede comprobar estas marcas cuando el procesamiento de mensajes del mouse depende del estado de otro botón del mouse o de la tecla CTRL o MAYÚS. El parámetro wParam puede ser una combinación de los valores siguientes.

Valor Descripción
MK_CONTROL La tecla CTRL está presionada.
MK_LBUTTON El botón izquierdo del mouse está presionado.
MK_MBUTTON El botón central del mouse está presionado.
MK_RBUTTON El botón derecho del mouse está presionado.
MK_SHIFT La tecla MAYÚS está presionada.
MK_XBUTTON1 El primer botón X está presionado.
MK_XBUTTON2 El segundo botón X está presionado.

 

Mensajes de doble clic

El sistema genera un mensaje de doble clic cuando el usuario hace clic en un botón del mouse dos veces en sucesión rápida. Cuando el usuario hace clic en un botón, el sistema establece un rectángulo centrado alrededor del punto activo del cursor. También marca la hora en la que se produjo el clic. Cuando el usuario hace clic en el mismo botón una segunda vez, el sistema determina si la zona activa sigue dentro del rectángulo y calcula el tiempo transcurrido desde el primer clic. Si el punto activo sigue dentro del rectángulo y el tiempo transcurrido no supera el valor de tiempo de espera de doble clic, el sistema genera un mensaje de doble clic.

Una aplicación puede obtener y establecer valores de tiempo de espera de doble clic mediante las funciones GetDoubleClickTime y SetDoubleClickTime, respectivamente. Como alternativa, la aplicación puede establecer el valor de tiempo de espera de doble clic mediante la marca SPI_SETDOUBLECLICKTIME con la función SystemParametersInfo. También puede establecer el tamaño del rectángulo que usa el sistema para detectar doble clics pasando las marcas de SPI_SETDOUBLECLKWIDTH y SPI_SETDOUBLECLKHEIGHT a SystemParametersInfo. Tenga en cuenta, sin embargo, que establecer el valor de tiempo de espera doble clic y el rectángulo afecta a todas las aplicaciones.

Una ventana definida por la aplicación no recibe, de forma predeterminada, mensajes de doble clic. Debido a la sobrecarga del sistema implicada en la generación de mensajes de doble clic, estos mensajes solo se generan para ventanas que pertenecen a clases que tienen el estilo de clase CS_DBLCLKS. La aplicación debe establecer este estilo al registrar la clase de ventana. Para más información, consulte Winnt.

Un mensaje de doble clic es siempre el tercer mensaje de una serie de cuatro mensajes. Los dos primeros mensajes son los mensajes de botón hacia abajo y de botón hacia arriba generados por el primer clic. El segundo clic genera el mensaje de doble clic seguido de otro mensaje de botón hacia arriba. Por ejemplo, al hacer doble clic en el botón izquierdo del mouse, se genera la siguiente secuencia de mensajes:

  1. WM_LBUTTONDOWN
  2. WM_LBUTTONUP
  3. WM_LBUTTONDBLCLK
  4. WM_LBUTTONUP

Dado que una ventana siempre recibe un mensaje de botón hacia abajo antes de recibir un mensaje de doble clic, una aplicación normalmente usa un mensaje de doble clic para extender una tarea que comenzó durante un mensaje de botón hacia abajo. Por ejemplo, cuando el usuario hace clic en un color en la paleta de colores de Microsoft Paint, Paint muestra el color seleccionado junto a la paleta. Cuando el usuario hace doble clic en un color, Paint muestra el color y abre el cuadro de diálogo Editar colores.

Mensajes de mouse de área no cliente

Una ventana recibe un mensaje de mouse de área no cliente cuando se produce un evento del mouse en cualquier parte de una ventana excepto el área de cliente. El área no cliente de una ventana consta de su borde, barra de menús, barra de título, barra de desplazamiento, menú de ventana, minimizar botón y maximizar botón.

El sistema genera mensajes de área no cliente principalmente para su propio uso. Por ejemplo, el sistema usa mensajes de área no cliente para cambiar el cursor a una flecha de dos puntas cuando el punto activo del cursor se mueve al borde de una ventana. Una ventana debe pasar mensajes de mouse de área no cliente a la función DefWindowProc para aprovechar las ventajas de la interfaz del mouse integrada.

Hay un mensaje de mouse de área no cliente correspondiente para cada mensaje del mouse del área cliente. Los nombres de estos mensajes son similares, salvo que las constantes con nombre para los mensajes de área no cliente incluyen las letras NC. Por ejemplo, mover el cursor en el área no cliente genera un mensaje de WM_NCMOUSEMOVE y presionar el botón izquierdo del mouse mientras el cursor está en el área no cliente genera un mensaje de WM_NCLBUTTONDOWN.

El parámetro lParam de un mensaje del mouse de área no cliente es una estructura que contiene las coordenadas x e y del punto activo del cursor. A diferencia de las coordenadas de los mensajes del mouse del área cliente, las coordenadas se especifican en coordenadas de pantalla en lugar de en coordenadas de cliente. En el sistema de coordenadas de cliente, todos los puntos de la pantalla se especifican en relación con las coordenadas (0,0) de la esquina superior izquierda del área cliente.

El parámetro wParam contiene un valor de prueba de posicionamiento, un valor que indica dónde se produjo el evento del mouse en el área no cliente. En la sección siguiente se explica el propósito de los valores de prueba de posicionamiento.

Mensaje de WM_NCHITTEST

Cada vez que se produce un evento del mouse, el sistema envía un mensaje de WM_NCHITTEST a la ventana que contiene el punto activo del cursor o a la ventana que ha capturado el mouse. El sistema usa este mensaje para determinar si se envía un área cliente o un mensaje de mouse de área no cliente. Una aplicación que debe recibir mensajes de movimiento del mouse y botón del mouse debe pasar el mensaje WM_NCHITTEST a la función DefWindowProc.

El parámetro lParam del mensaje de WM_NCHITTEST contiene las coordenadas de pantalla de la zona activa del cursor. La función DefWindowProc examina las coordenadas y devuelve un valor de prueba de posicionamiento que indica la ubicación de la zona activa. El valor de la prueba de posicionamiento puede ser uno de los valores siguientes.

Valor Ubicación del punto de acceso frecuente
HTBORDER En el borde de una ventana que no tiene un borde de dimensionamiento de tamaño.
HTBOTTOM En el borde inferior horizontal de una ventana.
HTBOTTOMLEFT En la esquina inferior izquierda de un borde de ventana.
HTBOTTOMRIGHT En la esquina inferior derecha de un borde de ventana.
HTCAPTION En una barra de título.
HTCLIENT En un área de cliente
HTCLOSE En un botón Cerrar.
HTERROR En el fondo de la pantalla o en una línea divisoria entre ventanas (igual que HTNOWHERE, excepto que la función DefWindowProc genere un pitido del sistema para indicar un error).
HTGROWBOX En un cuadro de tamaño (igual que HTSIZE).
HTHELP En un botón Ayuda.
HTHSCROLL Barra de desplazamiento horizontal.
HTLEFT En el borde izquierda de una ventana
HTMENU En un menú.
HTMAXBUTTON En un botón Maximizar.
HTMINBUTTON En un botón Minimizar.
HTNOWHERE En el fondo de la pantalla o en una línea divisoria entre ventanas.
HTREDUCE En un botón Minimizar.
HTRIGHT En el borde derecho de una ventana.
HTSIZE En un cuadro de tamaño (igual que HTGROWBOX).
HTSYSMENU En un menú Sistemao en un botón Cerrar en una ventana secundaria.
HTTOP En el borde superior horizontal de una ventana.
HTTOPLEFT En la esquina superior izquierda de un borde de ventana.
HTTOPRIGHT En la esquina superior derecha de un borde de ventana.
HTTRANSPARENT En una ventana cubierta actualmente por otra ventana en el mismo subproceso.
HTVSCROLL En la barra de desplazamiento vertical.
HTZOOM En un botón Maximizar.

 

Si el cursor está en el área cliente de una ventana, DefWindowProc devuelve el valor de prueba de posicionamiento HTCLIENT al procedimiento de ventana. Cuando el procedimiento de ventana devuelve este código al sistema, el sistema convierte las coordenadas de pantalla de la zona activa del cursor en coordenadas de cliente y, a continuación, publica el mensaje de mouse del área de cliente correspondiente.

La función DefWindowProc devuelve uno de los otros valores de prueba de posicionamiento cuando el punto activo del cursor está en el área no cliente de una ventana. Cuando el procedimiento de ventana devuelve uno de estos valores de prueba de posicionamiento, el sistema publica un mensaje del mouse de área no cliente, colocando el valor de prueba de posicionamiento en el parámetro wParam del mensaje y las coordenadas del cursor en el parámetro lParam.

Mouse Sonar

La característica de accesibilidad sonar del mouse muestra brevemente varios círculos concéntricos alrededor del puntero cuando el usuario presiona y suelta la tecla CTRL. Esta característica ayuda a un usuario a localizar el puntero del mouse en una pantalla que está desordenada o con una resolución establecida en alta, en un monitor de mala calidad o para los usuarios con discapacidad visual. Para obtener más información, vea las marcas siguientes en SystemParametersInfo:

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

Desvanecimiento del mouse

La característica de accesibilidad Desvanecimiento del mouse oculta el puntero cuando el usuario escribe. El puntero del mouse vuelve a aparecer cuando el usuario mueve el mouse. Esta característica evita que el puntero oscurece el texto que se escribe, por ejemplo, en un correo electrónico u otro documento. Para obtener más información, vea las marcas siguientes en SystemParametersInfo:

SPI_GETMOUSEVANISH

SPI_SETMOUSEVANISH

La rueda del mouse

La rueda del mouse combina las características de una rueda y un botón del mouse. La rueda tiene muescas discretas, uniformemente espaciadas. Al girar la rueda, se envía un mensaje de rueda a la aplicación a medida que se encuentra cada muesca. El botón de rueda también puede funcionar como un botón central normal de Windows (tercero). Al presionar y soltar la rueda del mouse, se envían mensajes estándar WM_MBUTTONUP y WM_MBUTTONDOWN. Al hacer doble clic en el tercer botón, se envía el mensaje estándar WM_MBUTTONDBLCLK.

La rueda del mouse se admite a través del mensaje WM_MOUSEWHEEL.

Al girar el mouse, se envía el mensaje WM_MOUSEWHEEL a la ventana de enfoque. La función DefWindowProc propaga el mensaje al elemento primario de la ventana. No debe haber ningún reenvío interno del mensaje, ya que DefWindowProc lo propaga hasta la cadena primaria hasta que se encuentra una ventana que lo procesa.

Determinar el número de líneas de desplazamiento

Las aplicaciones deben usar la función SystemParametersInfo para recuperar el número de líneas que se desplaza un documento para cada operación de desplazamiento (muesca de rueda). Para recuperar el número de líneas, una aplicación realiza la siguiente llamada:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

La variable "pulScrollLines" apunta a un valor entero sin signo que recibe el número sugerido de líneas para desplazarse cuando se gira la rueda del mouse sin teclas modificadoras:

  • Si este número es 0, no debe producirse ningún desplazamiento.
  • Si este número es WHEEL_PAGESCROLL, se debe interpretar un rollo de rueda como hacer clic una vez en las regiones de la página hacia abajo o hacia arriba de la barra de desplazamiento.
  • Si el número de líneas que se van a desplazar es mayor que el número de líneas visibles, la operación de desplazamiento también debe interpretarse como una operación de página hacia abajo o hacia arriba de página.

El valor predeterminado para el número de líneas de desplazamiento será 3. Si un usuario cambia el número de líneas de desplazamiento, mediante la hoja Propiedades del mouse en Panel de control, el sistema operativo difunde un mensaje de WM_SETTINGCHANGE a todas las ventanas de nivel superior con SPI_SETWHEELSCROLLLINES especificado. Cuando una aplicación recibe el mensaje WM_SETTINGCHANGE, puede obtener el nuevo número de líneas de desplazamiento llamando a:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Controles que se desplazan

En la tabla siguiente se enumeran los controles con la funcionalidad de desplazamiento (incluidas las líneas de desplazamiento establecidas por el usuario).

Control Desplazarse
Control de edición Horizontal y vertical.
Control List Box Horizontal y vertical.
Cuadro combinado Cuando no se coloca, cada desplazamiento recupera el elemento siguiente o anterior. Cuando se quita, cada desplazamiento reenvía el mensaje al cuadro de lista, que se desplaza según corresponda.
CMD (línea de comandos) Vertical.
Vista de árbol Horizontal y vertical.
Vista de lista Horizontal y vertical.
Desplazamientos hacia arriba y hacia abajo Un elemento a la vez.
Desplazamientos de la barra de seguimiento Un elemento a la vez.
Microsoft Rich Edit 1.0 Vertical. Tenga en cuenta que el cliente de Exchange tiene sus propias versiones de los controles de vista de lista y vista de árbol que no admiten ruedas.
Microsoft Rich Edit 2.0 Vertical.

 

Detección de un mouse con una rueda

Para determinar si un mouse con una rueda está conectado, llame a GetSystemMetrics con SM_MOUSEWHEELPRESENT. Un valor devuelto de TRUE indica que el mouse está conectado.

El ejemplo siguiente procede del procedimiento de ventana para un control de edición de varias líneas:

BOOL ScrollLines(
     PWNDDATA pwndData,   //scrolls the window indicated
     int cLinesToScroll); //number of times

short gcWheelDelta; //wheel delta from roll
PWNDDATA pWndData; //pointer to structure containing info about the window
UINT gucWheelScrollLines=0;//number of lines to scroll on a wheel rotation

gucWheelScrollLines = SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 
                             0, 
                             pulScrollLines, 
                             0);

case WM_MOUSEWHEEL:
    /*
     * Do not handle zoom and datazoom.
     */
    if (wParam & (MK_SHIFT | MK_CONTROL)) {
        goto PassToDefaultWindowProc;
    }

    gcWheelDelta -= (short) HIWORD(wParam);
    if (abs(gcWheelDelta) >= WHEEL_DELTA && gucWheelScrollLines > 0) 
    {
        int cLineScroll;

        /*
         * Limit a roll of one (1) WHEEL_DELTA to
         * scroll one (1) page.
         */
        cLineScroll = (int) min(
                (UINT) pWndData->ichLinesOnScreen - 1,
                gucWheelScrollLines);

        if (cLineScroll == 0) {
            cLineScroll++;
        }

        cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
        assert(cLineScroll != 0);

        gcWheelDelta = gcWheelDelta % WHEEL_DELTA;
        return ScrollLines(pWndData, cLineScroll);
    }

    break;

Activación de ventanas

Cuando el usuario hace clic en una ventana de nivel superior inactiva o en la ventana secundaria de una ventana de nivel superior inactiva, el sistema envía el mensaje de WM_MOUSEACTIVATE (entre otros) a la ventana de nivel superior o secundario. El sistema envía este mensaje después de publicar el mensaje WM_NCHITTEST en la ventana, pero antes de publicar el mensaje de botón hacia abajo. Cuando se pasa WM_MOUSEACTIVATE a la función DefWindowProc, el sistema activa la ventana de nivel superior y, a continuación, publica el mensaje de botón hacia abajo en la ventana de nivel superior o secundario.

Al procesar WM_MOUSEACTIVATE, una ventana puede controlar si la ventana de nivel superior se convierte en la ventana activa como resultado de un clic del mouse y si la ventana en la que se hizo clic recibe el mensaje posterior de botón hacia abajo. Para ello, devuelve uno de los siguientes valores después de procesar WM_MOUSEACTIVATE.

Valor Significado
MA_ACTIVATE Activa la ventana y no descarta el mensaje del mouse.
MA_NOACTIVATE No activa la ventana y no descarta el mensaje del mouse.
MA_ACTIVATEANDEAT Activa la ventana y descarta el mensaje del mouse.
MA_NOACTIVATEANDEAT No activa la ventana, pero descarta el mensaje del mouse.

Consulte también

Aprovechar movimiento del mouse de alta definición