Windows Media Player, WM_MOUSEMOVE e seu aplicativo

Hoje me deparei com um comportamento estranho num projeto Windows nativo: no começo não tinha percebido, mas o aplicativo estava processando o movimento do mouse constantemente (cerca de 1,5 vezes por segundo). Na Win32 API, isso significa que o loop do aplicativo estava obtendo (do sistema) e despachando a mensagem WM_MOUSEMOVE, que passaria pela WindowProc do aplicativo. O pior é que o mouse estava parado e as coordenadas do mouse sempre vinham iguais.

Verifiquei se o mouse estava com problema e também desconectei dispositivos USB da máquina. Nada. Verifiquei se poderia ser bug introduzido no código depois de algumas alterações recentes e certifiquei que o loop do aplicativo estava correto. Aparentemente, o código estava OK.

Resolvi ver quais aplicativos e serviços estavam rodando no sistema e fui encerrando um por um. Estava ouvindo música no Windows Media Player e, assim que fechei o Media Player, meu aplicativo parou de processar o WM_MOUSEMOVE. Hum, quem diria.

Já percebeu que quando o Windows Media Player está tocando algum arquivo de mídia, o screensaver nunca é executado? Porém, quando o Media Player está aberto mas não está tocando nada, o screensaver chega a ser executado. Aí está a explicação tanto do comportamento do Windows Media Player vs Screensaver como do “bug” do meu aplicativo: o Media Player fica gerando a mensagem WM_MOUSEMOVE a todo momento (simulando que o mouse se movimentou), enquanto algum arquivo de mídia estiver sendo executado.

Fica a dica caso o seu aplicativo/jogo realize muito processamento em resposta ao movimento do mouse ou tenha alguma operação que dependa do movimento do mouse. Dependendo do quão crítico esse tipo de interferência seja para o seu projeto, é melhor responder ao movimento do mouse somente quando o mesmo se deslocar acima de um threshold.

Esse comportamento também é interessante para evitar que o screensaver seja ativado no meio de uma partida do seu jogo, por exemplo. Entretanto, não recomendo essa abordagem, principalmente para mobile, pois isso consumirá mais bateria do aparelho (acho melhor lidar com as interrupções do aparelho e com o ciclo de vida do aplicativo).

PS: antes que alguém me diga para usar outro aplicativo como Winamp ou VLC, vale lembrar que os seus usuários podem estar usando o Windows Media Player junto com seu aplicativo/jogo ou mesmo ter outros aplicativos que interferem de maneira similar ao comentado aqui.

Be Sociable, Share!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>