Páginas

crear un inputbox con formato de password

En ocaciones es necesario colocar un inputbox para solicitar alguna clave, pero que es lo que sucede que cuando escribimos el dato dentro de un inputbox,  la clave es totalmente visible!!


Para solucionar este problema haremos los siguiente:


Paso 1: Agregamos un Nuevo Modulo a la Aplicacion con el nombre de InputboxPass
Paso 2: Le agregamos el siguiento codigo:

Option Explicit
  
' Declaraciones del Api
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, _
                                        ByVal nIDEvent As Long) As Long
 
Private Declare Function SendMessageLongRef Lib "user32" _
        Alias "SendMessageA" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        ByRef lParam As Long) As Long
 
Private Declare Function FindWindow Lib "user32" _
        Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
                           
Private Declare Function FindWindowEx Lib "user32" _
        Alias "FindWindowExA" ( _
        ByVal hWnd1 As Long, _
        ByVal hWnd2 As Long, _
        ByVal lpsz1 As String, _
        ByVal lpsz2 As String) As Long
                           
Private Declare Function SetTimer Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal nIDEvent As Long, _
        ByVal uElapse As Long, _
        ByVal lpTimerFunc As Long) As Long
                           
                           
Private m_ASC As Long
 
 
Sub inputbox_Password(El_Form As Form, Caracter As String)
      
    m_ASC = Asc(Caracter)
      
    Call SetTimer(El_Form.hwnd, &H5000&, 100, AddressOf TimerProc)
 
End Sub
 
 
Private Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, _
                                                                ByVal dwTime As Long)
           
    Dim Handle_InputBox As Long
      
    'Captura el handle del textBox del InputBox
    Handle_InputBox = FindWindowEx(FindWindow("#32770", "Administrador"), 0, "Edit", "")
                  
    'Le establece el PasswordChar
    Call SendMessageLongRef(Handle_InputBox, &HCC&, m_ASC, 0)
    'Finaliza el Timer
    Call KillTimer(hwnd, idEvent)
 
End Sub

Paso 3: En el formuladio donde nos encontremos y queramos establece este inputbox, escribimos los siguiente:

Dim PASSWORD As String
      
    ' Se le pasa el Hwnd del formulario y el caracter a usar _
     como contraseña
    Call inputbox_Password(Form_Switchboard, "*")
      
    'Abre el InputBox
    PASSWORD = InputBox(" Ingrese el Password ", "Administrador")

Listo!! ahora nuestro inputbox lucira asi:


4 comentarios:

  1. Hola muchas gracias por el artículo sobre Inputbox. Qusiera agregar algo:
    Yo estoy solicitando el password desde un módulo, no desde un formulario, esto me confundió un poco, pero al final lo resolví así:
    Generé un nuevo formulario en blanco, con cualquier etiqueta. El formulario se llamó frmPassword.
    En el evento load del formulario frmPassword le puse al caption de la etiqueta un valor: me.lblEtiqueta.caption = "Hola"
    Esto fue porque si no hay código VB en el formulario, cuando tratas de usarlo como instancia en algún código no aparece en la lista de formularios.
    Ahora si ya tengo un formulario que aparece en las listas de formularios en VBA.
    En el código mostrado en este artículo añadí la creación de una instancia de este formulario:
    Dim formPassword as Forms_frmPassword. (Después del as te aparece la lista de opciones, en los formularios ya aparece tu nuevo formulario).
    Esta nueva instancia de formulario es la que usé en la llamada al procedimiento Inputbox_Password.
    Como nota adicional es que cuando instancias un formulario, este aparece oculto, de tal forma que cuando usas este procedimiento no se nota el formulario instanciado, solo el del inputbox.
    Al final borré la instancia: Set formPassword = Nothing.

    ResponderBorrar
    Respuestas
    1. Excelente Rogelio, interesante implementacion, esto es a lo que llamo creacion de objetos en tiempo de ejecucion, felicidades!

      Borrar
  2. Muchas gracias, tuve que actualizarlo a 64 bits, pero funcionó como necesitaba.

    ResponderBorrar
  3. Bill Broo como lo acualizastes a 64 bits

    ResponderBorrar