Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Simular password char en Consola (https://www.clubdelphi.com/foros/showthread.php?t=39945)

aeff 02-02-2007 16:39:10

Simular password char en Consola
 
hola colegas, resulta que se me ha presentado una curiosidad, y es que como logro que en C, cuando trabajo con las famosas consolas, como hago la entrada de los datos de forma parecida a las que los Edites visuales permiten hacer con su propiedad PasswordChar, ?me entienden amigos? salu2!!! y gracias de antemano, aeff!!

dec 02-02-2007 19:15:40

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.

aeff 02-02-2007 20:27:05

ok man, muchas gracias, ahora veré que puedo hacer con los códigos que me mostraste, trateré de llevarlos a C, saludos y muchas gracias, espero que si me surge alguna duda pueda contar contigo y con los otros colegas del club verdad?? gracias, salu2!!

aeff 02-02-2007 20:28:46

ok man, muchas gracias, ahora veré que puedo hacer con los códigos que me mostraste, trateré de llevarlos a C,

saludos y muchas gracias, espero que si me surge alguna duda pueda contar contigo y con los otros colegas del club verdad??

gracias, salu2!!


La franja horaria es GMT +2. Ahora son las 04:22:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi