Problem wziął się stąd, że tradycyjny InputBox nie nadaje się do wprowadzania wszelkiego rodzaju haseł, bo nie można ukryć wprowadzanego tekstu pod postacią znaków maskujących np. gwiazdek ****. Poniżej przedstawiam sposób na zmodyfikowany InputBox, który umożliwia wprowadzanie tekstów z maską Password.
'--- Dowolny moduł standardowy ---'Na początek deklaracje dla funkcji APIPrivate Declare Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Private Declare Function SendMessageA Lib "user32" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetFocus Lib "user32" () As Long Private Declare Sub Sleep Lib "kernel32" (ByVal dwMillisec As Long) Private Const TimerINTERVAL = 10 Private Const SleepINTERVAL = 20'SleepINTERVAL > TimerINTERVALPrivate TimerID As Long'Funkcja zwrotna wywołana przez TimerPublic Sub TimerCallback() Const EM_SETPASSWORDCHAR = &HCC Call SendMessageA(GetFocus(), EM_SETPASSWORDCHAR, Asc("*"), 0) KillTimer 0, TimerID'Wystarczy nam jedno tiknięcie TimeraEnd Sub'Funkcję InputPassw(...) należy wywołać zamiast InoputBox(...)Function InputPassw(Prompt, Optional Title, Optional Default, _ Optional XPos, Optional YPos, _ Optional HelpFile, Optional Context) Dim s As String TimerID = SetTimer(0, 0, TimerINTERVAL, AddressOf TimerCallback) Sleep SleepINTERVAL s = InputBox$(Prompt, Title, Default, XPos, YPos, HelpFile, Context) If StrPtr(s) Then InputPassw = s' OKElse InputPassw = Null' CancelEnd If End Function'--- Koniec modułu ---
Wystarczy do swojej aplikacji przekopiowac ten moduł i używać funkcji InputPassw(...) gdzie się chce.
Ten kod jest efektem rozwiązań prezentowanych przez Zbigniewa Bratko, Krzysztofa Naworytę i Krzysztofa Pozorka na grupie dyskusyjnej pl.comp.bazy-danych.msaccess.
Dyskusja na powyższy temat oraz alternatywne rozwiązania dostępne są tutaj, w archiwum grupy dyskusyjnej.
K. P.