Compartilhar via


Visão geral da entrada do mouse

O mouse é um dispositivo de entrada do usuário importante, mas opcional, para aplicativos. Um aplicativo bem escrito deve incluir uma interface de mouse, mas não deve depender apenas do mouse para adquirir a entrada do usuário. O aplicativo também deve fornecer suporte completo ao teclado.

Um aplicativo recebe entradas do mouse na forma de mensagens que são enviadas ou publicadas em suas janelas.

Esta seção contém os seguintes tópicos:

Cursor do mouse

Quando o usuário move o mouse, o sistema move um bitmap na tela chamado cursor do mouse. O cursor do mouse contém um ponto de pixel único chamado hot spot, um ponto que o sistema rastreia e reconhece como a posição do cursor. Quando ocorre um evento de mouse, a janela que contém o hot spot normalmente recebe a mensagem do mouse resultante do evento. A janela não precisa estar ativa ou ter o foco do teclado para receber uma mensagem do mouse.

O sistema mantém uma variável que controla a velocidade do mouse, ou seja, a distância que o cursor se move quando o usuário move o mouse. Você pode usar a função SystemParametersInfo com o sinalizador SPI_GETMOUSE ou SPI_SETMOUSE para recuperar ou definir a velocidade do mouse. Para obter mais informações sobre cursores do mouse, consulte Cursores.

Captura do mouse

O sistema normalmente publica uma mensagem do mouse na janela que contém o hot spot do cursor quando ocorre um evento do mouse. Um aplicativo pode alterar esse comportamento usando a função SetCapture para rotear mensagens do mouse para uma janela específica. A janela recebe todas as mensagens do mouse até que o aplicativo chame a função ReleaseCapture ou especifique outra janela de captura ou até que o usuário clique em uma janela criada por outro thread.

Quando a captura do mouse é alterada, o sistema envia uma mensagem WM_CAPTURECHANGED para a janela que está perdendo a captura do mouse. O parâmetro lParam da mensagem especifica um identificador para a janela que está obtendo a captura do mouse.

Somente a janela em primeiro plano pode capturar a entrada do mouse. Quando uma janela de fundo tenta capturar a entrada do mouse, ela recebe mensagens apenas para eventos do mouse que ocorrem quando o hot spot do cursor está dentro da parte visível da janela.

Capturar a entrada do mouse é útil se uma janela precisar receber todas as entradas do mouse, mesmo quando o cursor se move para fora da janela. Por exemplo, um aplicativo normalmente rastreia a posição do cursor após um evento de botão do mouse para baixo, seguindo o cursor até que ocorra um evento de botão do mouse para cima. Se um aplicativo não tiver capturado a entrada do mouse e o usuário soltar o botão do mouse fora da janela, a janela não receberá a mensagem de botão.

Um thread pode usar a função GetCapture para determinar se uma de suas janelas capturou o mouse. Se uma das janelas do thread tiver capturado o mouse, GetCapture recuperará um identificador para a janela.

ClickLock do mouse

O recurso de acessibilidade Mouse ClickLock permite que um usuário bloqueie o botão principal do mouse após um único clique. Para um aplicativo, o botão ainda parece estar pressionado. Para desbloquear o botão, um aplicativo pode enviar qualquer mensagem do mouse ou o usuário pode clicar em qualquer botão do mouse. Esse recurso permite que um usuário faça combinações complexas de mouse de forma mais simples. Por exemplo, aqueles com certas limitações físicas podem destacar texto, arrastar objetos ou abrir menus com mais facilidade. Para obter mais informações, consulte os seguintes sinalizadores e os comentários em SystemParametersInfo:

  • SPI_GETMOUSECLICKLOCK
  • SPI_SETMOUSECLICKLOCK
  • SPI_GETMOUSECLICKLOCKTIME
  • SPI_SETMOUSECLICKLOCKTIME

Configuração do mouse

Embora o mouse seja um dispositivo de entrada importante para aplicativos, nem todo usuário necessariamente possui um mouse. Um aplicativo pode determinar se o sistema inclui um mouse passando o valor SM_MOUSEPRESENT para a função GetSystemMetrics.

O Windows suporta um mouse com até três botões. Em um mouse de três botões, os botões são designados como os botões esquerdo, central e direito. Mensagens e constantes nomeadas relacionadas aos botões do mouse usam as letras L, M e R para identificar os botões. O botão em um mouse de botão único é considerado o botão esquerdo. Embora o Windows suporte um mouse com vários botões, a maioria dos aplicativos usa principalmente o botão esquerdo e os outros minimamente, se é que usa.

Os aplicativos também podem suportar uma roda do mouse. A roda do mouse pode ser pressionada ou girada. Quando a roda do mouse é pressionada, ela atua como o botão do meio (terceiro), enviando mensagens normais do botão do meio para seu aplicativo. Quando ele é girado, uma mensagem de roda é enviada para seu aplicativo. Para obter mais informações, consulte a seção A roda do mouse.

Os aplicativos podem dar suporte a botões de comando de aplicativo. Esses botões, chamados de botões X, são projetados para permitir um acesso mais fácil a um navegador da Internet, correio eletrônico e serviços de mídia. Quando um botão X é pressionado, uma mensagem WM_APPCOMMAND é enviada ao seu aplicativo. Para obter mais informações, consulte a descrição na mensagem WM_APPCOMMAND.

Um aplicativo pode determinar o número de botões no mouse passando o valor SM_CMOUSEBUTTONS para a função GetSystemMetrics. Para configurar o mouse para um usuário canhoto, o aplicativo pode usar a função SwapMouseButton para inverter o significado dos botões esquerdo e direito do mouse. Passar o valor SPI_SETMOUSEBUTTONSWAP para a função SystemParametersInfo é outra maneira de inverter o significado dos botões. Observe, no entanto, que o mouse é um recurso compartilhado, portanto, inverter o significado dos botões afeta todos os aplicativos.

XBUTTONs

O Windows suporta um mouse com cinco botões. Além dos botões esquerdo, central e direito, existem XBUTTON1 e XBUTTON2, que fornecem navegação para trás e para frente ao usar o navegador.

O gerenciador de janelas suporta XBUTTON1 e XBUTTON2 por meio das mensagens WM_XBUTTON* e WM_NCXBUTTON*. O HIWORD do WPARAM nessas mensagens contém um sinalizador indicando qual botão X foi pressionado. Como essas mensagens do mouse também se ajustam entre as constantes WM_MOUSEFIRST e WM_MOUSELAST, um aplicativo pode filtrar todas as mensagens do mouse com GetMessage ou PeekMessage.

Os seguintes XBUTTON1 e XBUTTON2 de suporte:

As seguintes APIs foram modificadas para dar suporte a esses botões:

É improvável que uma janela filha em um aplicativo componente consiga implementar diretamente comandos para XBUTTON1 e XBUTTON2. Portanto DefWindowProc envia uma mensagem WM_APPCOMMAND para uma janela quando um botão X é clicado. DefWindowProc também envia a mensagem WM_APPCOMMAND para a janela pai. Isso é semelhante à maneira como os menus de contexto são invocados com o botão direito do mouse,DefWindowProc envia uma mensagem WM_CONTEXTMENU para o menu e também a envia para seu pai. Além disso, se DefWindowProc receber uma mensagem WM_APPCOMMAND para uma janela de nível superior, ele chamará um gancho de shell com o código HSHELL_APPCOMMAND.

Há suporte para teclados que possuem teclas extras para funções do navegador, funções de mídia, inicialização de aplicativos e gerenciamento de energia. Para obter mais informações, consulte Teclas do teclado para navegação e outras funções.

Mensagens do mouse

O mouse gera um evento de entrada quando o usuário move o mouse ou pressiona ou solta um botão do mouse. O sistema converte eventos de entrada do mouse em mensagens e os publica na fila de mensagens do thread apropriado. Quando as mensagens do mouse são postadas mais rápido do que um thread pode processá-las, o sistema descarta todas, exceto a mensagem mais recente do mouse.

Uma janela recebe uma mensagem do mouse quando ocorre um evento de mouse enquanto o cursor está dentro das bordas da janela ou quando a janela capturou o mouse. As mensagens do mouse são divididas em dois grupos: mensagens da área do cliente e mensagens da área não cliente. Normalmente, um aplicativo processa mensagens da área do cliente e ignora mensagens da área não cliente.

Esta seção contém os seguintes tópicos:

Mensagens do mouse da área do cliente

Uma janela recebe uma mensagem de mouse da área do cliente quando um evento de mouse ocorre na área do cliente da janela. O sistema publica a mensagem WM_MOUSEMOVE na janela quando o usuário move o cursor dentro da área do cliente. Ele posta uma das seguintes mensagens quando o usuário pressiona ou solta um botão do mouse enquanto o cursor está dentro da área do cliente.

Mensagem Significado
WM_LBUTTONDBLCLK O botão esquerdo do mouse foi clicado duas vezes.
WM_LBUTTONDOWN O botão esquerdo do mouse foi pressionado.
WM_LBUTTONUP O botão esquerdo do mouse foi liberado.
WM_MBUTTONDBLCLK O botão do meio do mouse foi clicado duas vezes.
WM_MBUTTONDOWN O botão do meio do mouse foi pressionado.
WM_MBUTTONUP O botão do meio do mouse foi liberado.
WM_RBUTTONDBLCLK O botão direito do mouse foi clicado duas vezes.
WM_RBUTTONDOWN O botão direito do mouse foi pressionado.
WM_RBUTTONUP O botão direito do mouse foi liberado.
WM_XBUTTONDBLCLK Um botão X do mouse foi clicado duas vezes.
WM_XBUTTONDOWN Um botão X do mouse foi pressionado.
WM_XBUTTONUP Um botão X do mouse foi liberado.

 

Além disso, um aplicativo pode chamar a função TrackMouseEvent para que o sistema envie duas outras mensagens. Ele publica a mensagem WM_MOUSEHOVER quando o cursor passa sobre a área do cliente por um determinado período de tempo. Ele publica a mensagem WM_MOUSELEAVE quando o cursor sai da área do cliente.

Parâmetros da mensagem

O parâmetro lParam de uma mensagem do mouse da área do cliente indica a posição do hot spot do cursor. A palavra de ordem baixa indica a coordenada x do hot spot e a palavra de ordem alta indica a coordenada y. As coordenadas são especificadas nas coordenadas do cliente. No sistema de coordenadas do cliente, todos os pontos na tela são especificados em relação às coordenadas (0,0) do canto superior esquerdo da área do cliente.

O parâmetro wParam contém sinalizadores que indicam o status dos outros botões do mouse e as teclas CTRL e SHIFT no momento do evento do mouse. Você pode verificar esses sinalizadores quando o processamento de mensagens do mouse depende do estado de outro botão do mouse ou da tecla CTRL ou SHIFT. O parâmetro wParam pode ser uma combinação dos seguintes valores.

Valor Descrição
MK_CONTROL A tecla CTRL está pressionada.
MK_LBUTTON O botão esquerdo do mouse está pressionado.
MK_MBUTTON O botão do meio do mouse está pressionado.
MK_RBUTTON O botão direito do mouse está pressionado.
MK_SHIFT A tecla SHIFT está pressionada.
MK_XBUTTON1 O primeiro botão X está pressionado.
MK_XBUTTON2 O segundo botão X está pressionado.

 

Mensagens de clique duplo

O sistema gera uma mensagem de clique duplo quando o usuário clica em um botão do mouse duas vezes em rápida sucessão. Quando o usuário clica em um botão, o sistema estabelece um retângulo centralizado em torno do hot spot do cursor. Ele também marca a hora em que o clique ocorreu. Quando o usuário clica no mesmo botão uma segunda vez, o sistema determina se o hot spot ainda está dentro do retângulo e calcula o tempo decorrido desde o primeiro clique. Se o hot spot ainda estiver dentro do retângulo e o tempo decorrido não exceder o valor de tempo limite de clique duplo, o sistema gerará uma mensagem de clique duplo.

Um aplicativo pode obter e definir valores de tempo limite de clique duplo usando as funções GetDoubleClickTime e SetDoubleClickTime, respectivamente. Como alternativa, o aplicativo pode definir o valor de tempo limite de clique duplo usando o sinalizador SPI_SETDOUBLECLICKTIME com a função SystemParametersInfo. Ele também pode definir o tamanho do retângulo que o sistema usa para detectar cliques duplos passando os sinalizadores SPI_SETDOUBLECLKWIDTH e SPI_SETDOUBLECLKHEIGHT para SystemParametersInfo. Observe, no entanto, que a configuração do valor de clique duplo – tempo limite e retângulo afeta todos os aplicativos.

Uma janela definida pelo aplicativo não recebe, por padrão, mensagens de clique duplo. Devido à sobrecarga do sistema envolvida na geração de mensagens de clique duplo, essas mensagens são geradas apenas para janelas pertencentes a classes que têm o estilo de classe CS_DBLCLKS. Seu aplicativo deve definir esse estilo ao registrar a classe de janela. Para obter mais informações, confira Classes de janela.

Uma mensagem de clique duplo é sempre a terceira mensagem em uma série de quatro mensagens. As duas primeiras mensagens são as mensagens de botão para baixo e botão para cima geradas pelo primeiro clique. O segundo clique gera a mensagem de clique duplo seguida por outra mensagem de botão para cima. Por exemplo, clicar duas vezes com o botão esquerdo do mouse gera a seguinte sequência de mensagens:

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

Como uma janela sempre recebe uma mensagem de botão para baixo antes de receber uma mensagem de clique duplo, um aplicativo normalmente usa uma mensagem de clique duplo para estender uma tarefa iniciada durante uma mensagem de botão para baixo. Por exemplo, quando o usuário clica em uma cor na paleta de cores do Microsoft Paint, o Paint exibe a cor selecionada ao lado da paleta. Quando o usuário clica duas vezes em uma cor, o Paint exibe a cor e abre a caixa de diálogo Editar cores.

Mensagens do mouse da área não cliente

Uma janela recebe uma mensagem de mouse de área que não é cliente quando um evento de mouse ocorre em qualquer parte de uma janela, exceto na área do cliente. A área não cliente de uma janela consiste em sua borda, barra de menus, barra de título, barra de rolagem, menu de janela, botão minimizar e botão maximizar.

O sistema gera mensagens de área não cliente principalmente para seu próprio uso. Por exemplo, o sistema usa mensagens de área não cliente para alterar o cursor para uma seta de duas pontas quando o hot spot do cursor se move para a borda de uma janela. Uma janela deve passar mensagens de mouse de área não cliente para a função DefWindowProc para aproveitar a interface interna do mouse.

Há uma mensagem de mouse de área não cliente correspondente para cada mensagem de mouse de área de cliente. Os nomes dessas mensagens são semelhantes, exceto que as constantes nomeadas para as mensagens de área não cliente incluem as letras NC. Por exemplo, mover o cursor na área não cliente gera uma mensagem WM_NCMOUSEMOVE e pressionar o botão esquerdo do mouse enquanto o cursor está na área não cliente gera uma mensagem WM_NCLBUTTONDOWN.

O parâmetro lParam de uma mensagem de mouse de área não cliente é uma estrutura que contém as coordenadas x e y do hot spot do cursor. Ao contrário das coordenadas das mensagens do mouse da área do cliente, as coordenadas são especificadas nas coordenadas da tela em vez das coordenadas do cliente. No sistema de coordenadas da tela, todos os pontos na tela são relativos às coordenadas (0,0) do canto superior esquerdo da tela.

O parâmetro wParam contém um valor de teste de ocorrência, um valor que indica onde ocorreu o evento do mouse na área não cliente. A seção a seguir explica a finalidade dos valores de teste de clique.

A Mensagem WM_NCHITTEST

Sempre que ocorre um evento de mouse, o sistema envia uma mensagem WM_NCHITTEST para a janela que contém o hot spot do cursor ou para a janela que capturou o mouse. O sistema usa essa mensagem para determinar se deve enviar uma mensagem de mouse de área de cliente ou de área de não cliente. Um aplicativo que deve receber mensagens de movimento e botão do mouse deve passar a mensagem WM_NCHITTEST para a função DefWindowProc.

O parâmetro lParam da mensagem WM_NCHITTEST contém as coordenadas de tela do hot spot do cursor. A função DefWindowProc examina as coordenadas e retorna um valor de teste de clique que indica o local do hot spot. O valor do teste de ocorrência pode ser um dos seguintes valores.

Valor Localização do hot spot
HTBORDER Na borda de uma janela que não tem uma borda de dimensionamento.
HTBOTTOM Na borda horizontal inferior de uma janela.
HTBOTTOMLEFT No canto inferior esquerdo da borda de uma janela.
HTBOTTOMRIGHT No canto inferior direito da borda de uma janela.
HTCAPTION Em uma barra de título.
HTCLIENT Em uma área do cliente.
HTCLOSE Em um botão Fechar.
HTERROR Na tela de fundo ou em uma linha divisória entre janelas (o mesmo que HTNOWHERE, com a exceção de que a função DefWindowProc produz um som do sistema para indicar um erro).
HTGROWBOX Em uma caixa de tamanho (o mesmo que HTSIZE).
HTHELP Em um botão Ajuda.
HTHSCROLL Em uma barra de rolagem horizontal.
HTLEFT Na borda esquerda de uma janela.
HTMENU Em um menu.
HTMAXBUTTON Em um botão Maximizar.
HTMINBUTTON Em um botão Minimizar.
HTNOWHERE Na tela de fundo ou em uma linha divisória entre as janelas.
HTREDUCE Em um botão Minimizar.
HTRIGHT Na borda direita de uma janela.
HTSIZE Em uma caixa de tamanho (o mesmo que HTGROWBOX).
HTSYSMENU No menu de um Sistema ou em um botão Fechar em uma janela filha.
HTTOP Na borda horizontal superior de uma janela.
HTTOPLEFT No canto superior esquerdo de uma borda da janela.
HTTOPRIGHT No canto superior direito de uma borda da janela.
HTTRANSPARENT Em uma janela atualmente coberta por outra janela no mesmo thread.
HTVSCROLL Na barra de rolagem vertical.
HTZOOM Em um botão Maximizar.

 

Se o cursor estiver na área do cliente de uma janela, DefWindowProc retornará o valor de teste de ocorrência HTCLIENT para o procedimento de janela. Quando o procedimento de janela retorna esse código ao sistema, o sistema converte as coordenadas de tela do hot spot do cursor em coordenadas do cliente e, em seguida, posta a mensagem apropriada do mouse da área do cliente.

A função DefWindowProc retorna um dos outros valores de teste de clique quando o hot spot do cursor está na área não cliente de uma janela. Quando o procedimento de janela retorna um desses valores de teste de ocorrência, o sistema posta uma mensagem de mouse de área que não é do cliente, colocando o valor de teste de ocorrência no parâmetro wParam da mensagem e as coordenadas do cursor no parâmetro lParam.

Mouse Sonar

O recurso de acessibilidade do Sonar do Mouse mostra brevemente vários círculos concêntricos ao redor do ponteiro quando o usuário pressiona e solta a tecla CTRL. Esse recurso ajuda o usuário a localizar o ponteiro do mouse em uma tela desordenada ou com resolução definida como alta, em um monitor de baixa qualidade ou para usuários com deficiência visual. Para obter mais informações, consulte os seguintes sinalizadores em SystemParametersInfo:

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

Mouse Vanish

O recurso de acessibilidade Mouse Vanish oculta o ponteiro quando o usuário está digitando. O ponteiro do mouse reaparece quando o usuário move o mouse. Esse recurso impede que o ponteiro obscureça o texto que está sendo digitado, por exemplo, em um email ou outro documento. Para obter mais informações, consulte os seguintes sinalizadores em SystemParametersInfo:

SPI_GETMOUSEVANISH

SPI_SETMOUSEVANISH

A roda do mouse

A roda do mouse combina os recursos de uma roda e um botão do mouse. A roda tem entalhes discretos e uniformemente espaçados. Quando você gira a roda, uma mensagem de roda é enviada para sua aplicação à medida que cada entalhe é encontrado. O botão de roda também pode operar como um botão central (terceiro) normal do Windows. Pressionar e soltar a roda do mouse envia mensagens WM_MBUTTONUP e WM_MBUTTONDOWN padrão. Clicar duas vezes no terceiro botão envia a mensagem WM_MBUTTONDBLCLK.

A roda do mouse é suportada pela mensagem WM_MOUSEWHEEL.

Girar o mouse envia a mensagem WM_MOUSEWHEEL para a janela de foco. A função DefWindowProc propaga a mensagem para o pai da janela. Não deve haver encaminhamento interno da mensagem, pois DefWindowProc a propaga até encontrar uma janela que a processe.

Determinando o número de linhas de rolagem

Os aplicativos devem usar a função SystemParametersInfo para recuperar o número de linhas que um documento rola para cada operação de rolagem (entalhe da roda). Para recuperar o número de linhas, um aplicativo faz a seguinte chamada:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

A variável "pulScrollLines" aponta para um valor inteiro sem sinal que recebe o número sugerido de linhas para rolar quando a roda do mouse é girada sem teclas modificadoras:

  • Se esse número for 0, nenhuma rolagem deverá ocorrer.
  • Se esse número for WHEEL_PAGESCROLL, uma rolagem de roda deve ser interpretada como clicar uma vez nas regiões de página para baixo ou para cima da barra de rolagem.
  • Se o número de linhas a serem roladas for maior que o número de linhas visíveis, a operação de rolagem também deverá ser interpretada como uma operação de página para baixo ou para cima.

O valor padrão para o número de linhas de rolagem será 3. Se um usuário alterar o número de linhas de rolagem, usando a folha Propriedades do Mouse no Painel de Controle, o sistema operacional transmitirá uma mensagem WM_SETTINGCHANGE para todas as janelas de nível superior com SPI_SETWHEELSCROLLLINES especificado. Quando um aplicativo recebe a mensagem WM_SETTINGCHANGE, ele pode obter o novo número de linhas de rolagem chamando:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Controles que rolam

A tabela abaixo lista os controles com funcionalidade de rolagem (incluindo linhas de rolagem definidas pelo usuário).

Control Rolagem
Controle de edição Horizontal e vertical.
Controle de caixa de listagem Horizontal e vertical.
Caixa de combinação Quando não estiver solto, cada pergaminho recupera o item seguinte ou anterior. Quando descartada, cada rolagem encaminha a mensagem para a caixa de listagem, que rola de acordo.
CMD (Linha de comando) Vertical.
Modo de exibição de árvore Horizontal e vertical.
Exibição de Lista Horizontal e vertical.
Rolagens para cima/para baixo Um item por vez.
Rolagens da barra de controle Um item por vez.
Microsoft Rich Edit 1.0 Vertical. Observe que o cliente do Exchange tem suas próprias versões dos controles de exibição de lista e exibição de árvore que não têm suporte a roda.
Microsoft Rich Edit 2.0 Vertical.

 

Detectando um mouse com uma roda

Para determinar se um mouse com uma roda está conectado, chame GetSystemMetrics com SM_MOUSEWHEELPRESENT. Um valor retornado de TRUE indica que o mouse está conectado.

O exemplo a seguir é do procedimento de janela para um controle de edição de várias linhas:

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;

Ativação de janela

Quando o usuário clica em uma janela de nível superior inativa ou na janela filha de uma janela de nível superior inativa, o sistema envia a mensagem WM_MOUSEACTIVATE (entre outras) para a janela de nível superior ou filha. O sistema envia essa mensagem depois de publicar a mensagem WM_NCHITTEST na janela, mas antes de publicar a mensagem de botão. Quando WM_MOUSEACTIVATE é passado para a função DefWindowProc, o sistema ativa a janela de nível superior e publica a mensagem de botão na janela de nível superior ou filha.

Ao processar WM_MOUSEACTIVATE, uma janela pode controlar se a janela de nível superior se torna a janela ativa como resultado de um clique do mouse e se a janela que foi clicada recebe a mensagem de botão subsequente. Ele faz isso retornando um dos seguintes valores após o processamento de WM_MOUSEACTIVATE.

Valor Significado
MA_ACTIVATE Ativa a janela e não descarta a mensagem do mouse.
MA_NOACTIVATE Não ativa a janela e não descarta a mensagem do mouse.
MA_ACTIVATEANDEAT Ativa a janela e descarta a mensagem do mouse.
MA_NOACTIVATEANDEAT Não ativa a janela, mas descarta a mensagem do mouse.

Confira também

Como tirar proveito do movimento do mouse de alta definição