domingo, janeiro 25, 2009

Screen Savers: Anatomia

Neste post vamos ver como é um Screen Saver por dentro; nesta descrição assumimos que o leitor possui um bom conhecimento das APIs e do funcionamento do Windows.

O que é um Screen Saver

Um screen saver é um programa .EXE. O Windows reconhece um screen saver por duas características:
  • Extensão .SCR
  • O primeiro resource (ID 1) é um string resource (este string é usado como o nome apresentado para seleção)
Para funcionar como um screen saver, o programa deve ter alguns comportamentos adicionais:
  • Tratar alguns parâmetros na linha de comando
  • Cria a sua janela principal com um determina estilo
  • Tratar algumas mensagens
  • Encerar quando o operador pressionar uma tecla ou movimentar o mouse
Recursos de um Screen Saver

Um screen saver completo fornece os seguintes recursos:
  • O screen saver em si, que executa a apresentação na tela quando o sistema está inativo;
  • Uma tela de configuração, onde o usuário pode alterar o funcionamento do screen saver;
  • Uma modo preview, no qual o screen saver opera dentro da imagem de um monitor na tela de seleção de screen saver do Display Properties.
  • Configuração de senha (para Windows 95/98/Me)
Implementação da Senha do Screen Saver

O objetivo da senha do screen saver é impedir que uma pessoa não autorizada encerre o screen saver e consiga visualizar o conteúdo da tela e operar o computador.

No Windows NT, 2000 e XP a senha do screen saver é tratada diretamente pelo sistema operacional, não exigindo nenhum tratamento especial no screen saver.

No Windows 9x, cabe ao screen saver:
  • Apresentar o diálogo de mudança da senha
  • Salvar a senha
  • Apresentar o diálogo de solicitação da senha
  • Conferir a senha
  • Desabilitar Alt Esc e Ctrl Alt Del
Quando um Screen Saver é Executado

O Windows pode disparar um Screen Saver de várias maneiras:
  • Ativação por inatividade – este é o funcionamento normal do screen saver. Quando o Windows detecta que o sistema está inativo pelo tempo configurado para o screen saver, ele envia para a janela em foreground uma mensagem WM_SYSCOMMAND com o parâmetro SC_SCREENSAVE. Se esta mensagem é passada para DefWindowProc, o screen saver configurado é disparado com o parâmetro /s na linha de comando.
  • Configuração – quando o botão Settings é clicado na tela de seleção de screen saver do Display Properties, o screen saver é disparado com o parâmetro /c na linha de comando.
  • Preview full-screen - quando o botão Preview é clicado na tela de seleção de screen saver do Display Properties, o screen saver é disparado com o parâmetro /s na linha de comando.
  • Preview em Display Properties – Quando a tela de seleção de screen saver do Display Properties recebe o foco, ou quando um novo screen saver é selecionado nesta tela, o screen saver é disparado com o parâmetro /p #### na linha de comando. #### corresponde ao valor (em decimal) do handle da janela onde o screen saver deverá ser apresentado (ou seja, a área correspondente à tela do desenho de um monitor).
  • Mudança de senha – No Windows 9x o screen saver é o responsável pela senha (no NT, 2000 e XP, o próprio sistema gerencia a senha). Quando o botão Change Password é clicado na tela de seleção de screen saver do Display Properties, o screen saver é disparado com o parâmetro /a #### na linha de comando. #### corresponde ao valor (em decimal) do handle da janela de seleção de screen saver.
  • Test no Windows Explorer – clicando duas vezes no ícone de um screen saver, ou clicando com o botão direito e escolhendo Test, o screen saver é executado com o parâmetro /s na linha de comando.
  • Config no Windows Explorer – com o botão direito no ícone de um screen saver, e escolhendo Config, o screen saver é executado sem parâmetros.
Obviamente, outras aplicações podem simular estas situações, executando o screen saver com o correspondente parâmetro na linha de comando.

Parâmetros na Linha de Comando de um Screen Saver

A lista abaixo resume os parâmetros passados para um screen saver na linha de comando e a ação a ser executada pelo screen saver:
  • (nenhum) Apresentar a tela de configuração
  • /c Apresentar o diálogo de configuração, como filho da janela em foreground
  • /c #### Apresentar o diálogo de configuração, tendo como pai a janela cujo handle corresponde a ####
  • /a #### Apresentar o diálogo de alteração da senha, tendo como pai a janela cujo handle corresponde a ####
  • /s Executar o screen saver propriamente dito
  • /p #### ou /l #### Executar o preview do screen saver dentro da janela cujo handle corresponde a ####
A definição correta do pai dos diálogos apresentados é importante para garantir que o usuário não possa interagir com a tela de seleção de screen saver enquanto não tiver fechado o diálogo do screen saver.

Na análise dos parâmetros deve-se aceitar ‘-‘ no lugar de ‘/’ e letras tanto maiúsculas como minúsculas.

Tratamento de Mensagens no Screen Saver

A lista a seguir mostra as principais mensagens que devem ser tratadas por um screen saver:
  • WM_ACTIVATE, WM_ACTIVATEAPP, WM_NCACTIVATE Se LOWORD(wParam) for WA_INACTIVE, indicando que outra aplicação está sendo ativada, o screen saver deve terminar
  • WM_SETCURSOR Desligar o cursor, através de SetCursor(NULL)
  • WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_KEYDOWN Encerrar o screen saver
  • WM_MOUSEMOVE Se as coordenadas do mouse mudaram mais que um certo mínimo, encerrar o screen saver
Na próxima parte vamos ver como construir um screen saver em C.

Nenhum comentário: