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
' 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")
' 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:
Hola muchas gracias por el artículo sobre Inputbox. Qusiera agregar algo:
ResponderBorrarYo 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.
Excelente Rogelio, interesante implementacion, esto es a lo que llamo creacion de objetos en tiempo de ejecucion, felicidades!
BorrarMuchas gracias, tuve que actualizarlo a 64 bits, pero funcionó como necesitaba.
ResponderBorrarBill Broo como lo acualizastes a 64 bits
ResponderBorrar