Compartir a través de


Información general sobre la entrada del mouse

El mouse es un dispositivo de entrada de usuario importante, pero opcional para las 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 que se envían o publican 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 zona activa, un punto que del que el sistema operativo realiza un seguimiento y al que reconoce como la posición del cursor. Cuando se produce un evento del mouse, la ventana que contiene la zona activa 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 que 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 los cursores del mouse, consulte Cursores.

Captura del mouse

Normalmente, el sistema envía un mensaje del mouse a la ventana que contiene la zona activa 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 la entrada del mouse, recibe mensajes solo relativos a los eventos del mouse que se produzcan cuando la zona activa del cursor esté dentro de la parte visible de esa ventana.

Capturar 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 produzca un evento de botón del mouse. 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 a la ventana.

Bloqueo de clic del mouse

La característica de accesibilidad de bloqueo de clic del mouse permite al usuario bloquear el botón primario del mouse después de un solo clic. En una aplicación, el botón sigue apareciendo pulsado. 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 con el mouse de forma más sencilla. Por ejemplo, aquellas con ciertas limitaciones físicas pueden resaltar texto, arrastrar objetos o abrir menús más fácilmente. Para obtener más información, consulte las marcas siguientes y las observaciones 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 que tiene 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 utilizan principalmente el botón izquierdo y los demás mínimamente, si es que lo hacen.

Las aplicaciones también pueden admitir una rueda del mouse. La rueda del mouse se puede pulsar o girar. Cuando se pulsa la rueda del mouse, actúa como el botón central (tercero), que envía mensajes normales del 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, consulte la sección La rueda del mouse.

Las aplicaciones pueden admitir botones de comando de aplicación. Estos botones, denominados botones X, están diseñados para permitir el acceso más fácil a un explorador de Internet, correo electrónico y servicios multimedia. Cuando se pulsa un botón X, se envía un mensaje WM_APPCOMMAND a la aplicación. Para obtener más información, consulte 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 zurdo, la aplicación puede usar la función SwapMouseButton para invertir el significado de los botones del mouse izquierdo y derecho. Pasar el valor 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 invertir 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, está el XBUTTON1 e 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 de WPARAM de estos mensajes contiene una marca que indica qué botón X se ha pulsado. Dado que estos mensajes de mouse también se encuentran entre las constantes WM_MOUSEFIRST y WM_MOUSELAST, una aplicación puede filtrar todos los mensajes de mouse con GetMessage o PeekMessage.

Los siguientes son compatibles con XBUTTON1 y XBUTTON2:

Se han modificado las API siguientes para admitir estos botones:

Es poco probable que una ventana secundaria de una aplicación de componente pueda implementar directamente comandos para XBUTTON1 e XBUTTON2. Por lo tanto, DefWindowProc envía un mensaje 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 con el botón derecho, DefWindowProc envía un mensaje WM_CONTEXTMENU al menú y también lo envía a su elemento primario. Además, si DefWindowProc recibe un mensaje 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, consulte 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 pulsa o suelta un botón del mouse. El sistema convierte los eventos de entrada del mouse en mensajes y los envía a la cola de mensajes del subproceso adecuado. Cuando los mensajes del mouse se publican más rápido de lo que un subproceso puede procesar, el sistema lo descarta todos los mensajes del mouse, menos el 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 de cliente. Normalmente, una aplicación procesa mensajes de área cliente y omite los mensajes de área no de cliente.

En esta sección se describen los temas siguientes:

Mensajes del mouse del área de cliente

Una ventana recibe un mensaje del mouse del área de cliente cuando se produce un evento del mouse dentro del área de 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. Envía uno de los siguientes mensajes cuando el usuario pulsa 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 pulsó el botón izquierdo del mouse.
WM_LBUTTONUP Se soltó el botón izquierdo del mouse.
WM_MBUTTONDBLCLK Se hizo doble clic en el botón central del mouse.
WM_MBUTTONDOWN Se pulsó el botón central del mouse.
WM_MBUTTONUP Se soltó el botón central del mouse.
WM_RBUTTONDBLCLK Se hizo doble clic en el botón derecho del mouse.
WM_RBUTTONDOWN Se pulsó el botón derecho del mouse.
WM_RBUTTONUP Se soltó el botón derecho del mouse.
WM_XBUTTONDBLCLK Se hizo doble clic en un botón X del mouse.
WM_XBUTTONDOWN Se pulsó un botón X del mouse.
WM_XBUTTONUP Se soltó 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. Publica el mensaje WM_MOUSEHOVER cuando el cursor mantiene el puntero sobre el área de cliente durante un período de tiempo determinado. Publica el mensaje WM_MOUSELEAVE cuando el cursor sale del área de cliente.

Parámetros de mensaje

El parámetro lParam de un mensaje del mouse del área de cliente indica la posición de la zona activa del cursor. La palabra de orden inferior 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 de 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 siguientes valores.

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á pulsado.

 

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 de la zona activa 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 todavía está dentro del rectángulo y calcula el tiempo transcurrido desde el primer clic. Si la zona activa 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 SPI_SETDOUBLECLKWIDTH y SPI_SETDOUBLECLKHEIGHT a SystemParametersInfo. Tenga en cuenta, sin embargo, que establecer el valor de tiempo de espera de doble clic y el rectángulo afecta a todas las aplicaciones.

Una ventana definida por la aplicación no recibe mensajes de doble clic de forma predeterminada. 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 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, hacer doble clic en el botón izquierdo del mouse 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 del mouse del área no de cliente

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

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

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

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

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

Mensaje WM_NCHITTEST

Cada vez que se produce un evento del mouse, el sistema envía un mensaje WM_NCHITTEST a la ventana que contiene la zona activa del cursor o a la ventana que ha capturado el mouse. El sistema usa este mensaje para determinar si se debe enviar un mensaje del mouse de área de cliente o de área no de 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 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 prueba de posicionamiento puede ser uno de los siguientes.

Valor Ubicación de la zona activa
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 genera 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 izquierdo 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ú de Sistema o en un botón Cerrar de 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 del mismo subproceso.
HTVSCROLL En la barra de desplazamiento vertical.
HTZOOM En un botón Maximizar.

 

Si el cursor está en el área de 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 del mouse del área de cliente correspondiente.

La función DefWindowProc devuelve uno de los otros valores de prueba de posicionamiento cuando la zona activa del cursor está en el área no de 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 de 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.

Sonar del mouse

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

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

Desaparición del mouse

La característica de accesibilidad de desaparición 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 oculte el texto que se está escribiendo, por ejemplo, en un correo electrónico u otro documento. Para obtener más información, consulte 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 y espaciadas uniformemente. 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 la rueda también puede funcionar como un botón normal central de Windows (tercero). Pulsar y soltar la rueda del mouse envía los 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 foco. 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 a la cadena primaria hasta que encuentra una ventana que lo procesa.

Determinación del número de líneas de desplazamiento

Las aplicaciones deben usar la función SystemParametersInfo para recuperar el número de líneas que desplaza un documento para cada operación de desplazamiento (muesca de la 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, girar la rueda se debe interpretar como hacer clic una vez en las regiones de avanzar página o retroceder página 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 avanzar página o retroceder página.

El valor predeterminado del 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 del Panel de control, el sistema operativo difunde un mensaje 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 permiten el desplazamiento

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 Vertical y horizontal.
Control de cuadro de lista Vertical y horizontal.
Cuadro combinado Cuando no está desplegado, cada desplazamiento recupera el elemento siguiente o anterior. Cuando está desplegado, cada desplazamiento reenvía el mensaje al cuadro de lista, que se desplaza en consecuencia.
CMD (línea de comandos) Vertical.
Vista de árbol Vertical y horizontal.
Vista de lista Vertical y horizontal.
Desplazamientos hacia arriba/abajo Un elemento cada vez.
Desplazamientos de la barra de seguimiento Un elemento cada 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 de vista de árbol, que no tienen compatibilidad con la rueda.
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 de devolución 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 WM_MOUSEACTIVATE (entre otros) a la ventana de nivel superior o secundaria. El sistema envía este mensaje después de publicar el mensaje WM_NCHITTEST en la ventana, pero antes de publicar el mensaje del 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 secundaria.

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 ha hecho clic recibe el mensaje posterior del 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 ni 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