Por favor, não roube meu foco

Isso já aconteceu com o senhor? O senhor está digitando alegremente em algum aplicativo, cuidando da sua vida, quando… de repente… uma caixa de diálogo aparece e rouba o foco do senhor.

Exemplo de uma caixa de diálogo que rouba o foco de um aplicativo

Na melhor das hipóteses, seu fluxo é interrompido. O senhor terá que voltar para a janela que estava usando, descobrir onde estava e retomar o trabalho.

Mas pode ser pior. Muito, muito pior. Se por acaso o senhor estiver digitando algo que possa ser interpretado como uma ação por essa caixa de diálogo – e lembre-se, pressionar a barra de espaço é o mesmo que clicar em um botão quando ele estiver com o foco – o senhor pode, de repente e muito acidentalmente, estar em um mundo de dor. Como esta pobre e infeliz alma, que recentemente postou um comentário queixoso na minha postagem sobre o incômodo da atualização automática do XP.

Ótima notícia! A Microsoft desenvolveu uma solução para esse problema! O programador mais talentoso da Microsoft descobriu como fazer com que “Reiniciar mais tarde” signifique “Reiniciar quando o usuário disser reiniciar”. Foram necessários apenas alguns ajustes em uma linha de código, 180 dias para a aprovação de 80 gerentes, 80 arquivos de recursos para diferentes idiomas e 18 dias para testes em um dos idiomas. Funcionou.

A programadora abriu uma janela do SourceSafe^H^H^H^H^H^H^H^H^H^H^H^H^H^H Team Foundation para verificar a correção. Como programadora experiente, ela estava acostumada a usar o teclado. Ela não clicou com o mouse no botão “OK”, apenas pressionou a tecla Enter.

O prompt “Reboot now” / “Reboot later” piscou tão brevemente que ela nem percebeu. Ela pensou que não havia pressionado a tecla Enter com força suficiente. Ao ver o botão “OK” do Team Foundation ainda esperando que ela pressionasse a tecla Enter para verificar seu trabalho, ela pressionou a tecla Enter novamente.

O check-in foi iniciado. O check-in foi interrompido durante a reinicialização da estação de trabalho da senhora. E assim permanecemos até hoje, com o check-in metade dentro e metade fora, inutilizável, sem uma boa cópia do código. Então, é por isso que a correção nunca foi lançada.

Esse é um exemplo perfeito de como o roubar o foco do usuário pode levar a resultados catastróficos se o usuário for particularmente azarado. Infelizmente, esse fardo recai mais pesadamente sobre nós, tecladistas.

Outro exemplo clássico é a janela de notificação de download do IE, que adora aparecer, roubar o foco e lhe dar a ótima notícia: o download foi concluído! Ah, e o arquivo recém-baixado está sendo copiado para seu destino! Viva! Infelizmente, essa mesma caixa de diálogo de notificação de download também contém um botão “Cancelar”. Adivinhe qual é o botão que está em foco quando ele aparece? O motivo pelo qual o senhor deseja cancelar um download depois de concluído é um mistério para mim, mas já pressionei inadvertidamente a barra de espaço nessa caixa de diálogo mais de uma vez.

Roubar o foco do usuário nunca é aceitável. Não consigo imaginar nenhuma circunstância em que esse comportamento seja desejável ou mesmo defensável. Diálogos modais já são ruins o suficientemas essa é ainda pior – é quase uma caixa de diálogo modal do sistema, tão importante que todo o trabalho deve ser interrompido, pois o usuário é forçado a prestar atenção em qualquer mensagem perturbadora que ela tenha que transmitir com urgência. É uma forma extrema de interromper o processo com idiotice. Não sou a primeira pessoa a reclamar disso, é claro. Outros membros do clube “Não roube meu foco” escreveram sobre isso em 2002, novamente em 2005e há alguns meses. Não se trata exatamente de um problema desconhecido ou novo. Então, por que temos de continuar falando sobre ele e lidando com ele? O que acontece?

O mais estranho é que existem disposições incorporadas ao sistema operacional para nos proteger de aplicativos mal escritos e que roubam o foco. O Configuração de registro ForegroundLockTimeout é expressamente projetado para evitar que os aplicativos roubem o foco do usuário. O sistema operacional converte silenciosamente esse comportamento inadequado de roubo de foco em um botão da barra de tarefas mais amigável e menos invasivo, que é o assunto do configuração de registro ForegroundFlashCount.

Já vi isso funcionar. Na maioria das vezes, ele faz funcione. Essa configuração é ativada por padrão no Windows XP e no Vista. Ainda assim, os aplicativos ocasionalmente conseguem roubar o foco de mim e atrapalhar meu fluxo. Eu diria que isso acontece algumas vezes por semana, em média. É desconcertante. Fico imaginando se isso ocorre porque programadores mal comportados abusam do sinalizador de janela “Always on Top” em um tentativa equivocada de chamar a atenção do usuário. Suponho que, enquanto houver programadores ruins, haverá alguma maneira pouco ortodoxa que eles possam inventar para roubar o foco do usuário. Em algum nível, a incompetência suficientemente avançada é indistinguível da malícia. Talvez fosse melhor educar os programadores sobre os males do roubo de foco e, de modo mais geral, sobre a futilidade do notificações desnecessárias que o usuário não vai ler de qualquer forma.

Mas, enquanto isso, por favor, não roube meu foco. Estou usando-o agora mesmo. De verdade. Estou mesmo.