Ver Mensaje Individual
  #2  
Antiguo 02-02-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Reputación: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Supongo que no te costaría demasiado traducir a C++ el código que mostraré a continuación, porque además de lo que se trata es de utilizar básicamente funciones de la API de Windows. Tampoco es que sea una gran cosa el código de abajo, sino que espero que pueda darte alguna idea por lo menos:

Código Delphi [-]
program ClubDelphi;

{$APPTYPE CONSOLE}

uses Windows, SysUtils;

var
 dummy: dword;
 password: string;
 continuar: boolean;
 bufferInput: TInputRecord;

begin
  password := '';
  continuar := true;
  Write('Escribe tu password: ');

  while continuar do
  begin
    // Leemos del "input" de la consola
    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), bufferInput, 1, dummy);

    // Comprobamos el tipo de evento que tenemos entre manos
    case bufferInput.EventType of

      // Si se trata de un evento "del teclado"...
      KEY_EVENT:
      begin
        // Comprobamos si lo que ha ocurrido es que se presionó una tecla
        if bufferInput.Event.KeyEvent.bKeyDown then
        begin
          // Y pasamos a guardar los caracteres tecleados en la variable "password"
          password := password + bufferInput.Event.KeyEvent.UnicodeChar;
          Write('*');
        end;

        // Si la tecla pulsada resulta ser "RETURN"...
        if bufferInput.Event.KeyEvent.bKeyDown
         and (bufferInput.Event.KeyEvent.wVirtualKeyCode = VK_RETURN) then
        begin
          // Aprovechamos para comprobar si la contraseña resulta correcta
          Writeln('');
          if (Trim(password) = 'clubdelphi') then
          begin
            Writeln('El password es correcto.');
            Readln;
            continuar := false;
          end
          else
          begin
            Writeln('El password es incorrecto.');
            Readln;
            continuar := false;
          end;
        end;

        // Si se pulsa la tecla "ESCAPE" salimos del bucle
        if bufferInput.Event.KeyEvent.bKeyDown
         and (bufferInput.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE) then
        begin
          continuar := false;
        end;

      end;
    end;
  end;

end.

Me he basado principalmente en el artículo Console applications in Delphi de Alex G. Fedorov (tiene 10 años el artículo de marras). También puede que te interese echar un vistazo a este otro artículo publicado en The Code Project: .NET Console Password Input By Masking Keyed-In Characters.

Por otro lado, aunque no he terminado de probarlo, puede que otra posible solución fuera la de que la entrada del usuario (el texto) se escribiera "negro sobre negro" de tal modo que no se viera "nada", que puede ser otra forma de ocultar lo que se escriba, quiero decir sin necesidad de mostrar los típicos asteriscos. Si esto último te interesa no dejes de revisar el artículo sobre "Consolas en Delphi" que cito más arriba y echa un vistazo a cómo se hace uso de la función del API de Windows: "FillConsoleOutputAttribute", por ejemplo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 02-02-2007 a las 19:19:05.
Responder Con Cita