Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.
A face oculta das APIs
Revele senhas usando a API do Windows
Recentemente me senti desafiado por programas não gratuitos que encontrei na internet cuja única finalidade era revelar senhas ocultas por asteriscos ou outro caractere. Apesar destes aplicativos serem largamente difundidos e conhecidos na internet, o mesmo não acontece com suas rotinas e códigos fontes. Sendo assim, decidi implementar meu próprio aplicativo com a mesma finalidade.
Após um pouco de pesquisa e algumas horas de programação, cheguei finalmente a uma solução: utilizando a API do Windows, geramos um programa pequeno e fácil de se transportar, tal qual aqueles vendidos por aí!
Implementação
A implementação do programa em si é simples. O único problema é saber qual função da API do Windows utilizar para executar nossa tarefa. De forma geral, espera-se que o aplicativo final funcione da seguinte maneira: ao mover o cursor, o componente TTimer deve detectar que o mouse está sobre uma caixa de diálogo contendo uma senha oculta, extraí-la e enviá-la para o componente TEdit, que torna a senha visível ao usuário.
Comece adicionando a um novo projeto do Delphi, um componente TTimer e um TEdit. Altere a propriedade Interval do TTimer para 1, indicando que o evento OnTimer será disparado a cada milissegundo; altere a propriedade Enabled para False. No evento OnShow do formulário principal, adicione:
procedure Tform1.Form1OnShow (Sender: Tobject);
begin
Timer1.enabled := True;
end;
E no evento OnTimer do TTimer:
// Identifica e mostrar a senha oculta
procedure TForm1.Timer1Timer (Sender: TObject);
var
// Recebe a posição do cursor do mouse
Pos: TPoint;
// Recebe a senha oculta
Paswd: array[0..63] of char;
Hwin: Thandle;
begin
//Obtém a posição do cursor
GetCursorPos(Pos);
//Pega o Handle da janela sobre
// a qual o cursor está localizado
HWin := WindowFromPoint(Pos);
//Verifica se há senha oculta
if SendMessage(HWin, EM_GETPASSWORDCHAR, 0, 0) <> 0 then
...