Как реализовать универсальную форму ввода пароля? - VB

Узнай цену своей работы

Формулировка задачи:

Подскажите чайнику как спецы решают такую задачу. В стандартном InputBox не нашел возможности замены вводимого на символы типа * (как в TextBox passwordchar) . 1. Естесссно, создать свою форму, тем более, что она проста, как нигерйский валенок. Как шаблон можно сохранить. Однако в некоторых проектах, где эта форма может понадобиться один раз на тысячу запусков, вроде как-то нерационально автоматически ее включать. Затеял обсуждение здесь:Динамическое создание формы Идеальным выглядит написать свою универсальную функцию вместо InputBox, которая программно создает форму и возвращает введенный пароль. Но, как я понял, стандартными средствами VB, программно создать форму "с нуля" низзя, можно только копию уже имеющейся, потом очистить и добавить все, что надо. Видимо, так и сделаю. Однако, если исходная форма громоздкая, то ее "клонирование" может тормозить прогу. А если проект ваще без форм?.. 2. Можно научить InputBox звездочки показывать? Нашел в сети заковыристый способ через API. Код переписал. Этот код вешает прогу, выдавая сразу четыре разных сообщения об ошибках
3. Может, как-то еще?

Решение задачи: «Как реализовать универсальную форму ввода пароля?»

textual
Листинг программы
Option Explicit
 
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Private Const WH_CBT As Long = 5
Private Const EM_SETPASSWORDCHAR As Long = &HCC
Private Const HCBT_ACTIVATE As Long = 5
 
Dim hHook As Long
 
Public Function ExInputBox(Prompt As String, Optional Title, Optional Default, _
                           Optional Xpos, Optional ypos, Optional HelpFile, Optional Context) As String
    hHook = SetWindowsHookEx(WH_CBT, AddressOf InputBoxProc, App.hInstance, App.ThreadID())                 ' Установка CBT хука
    ExInputBox = InputBox(Prompt, Title, Default, Xpos, ypos, HelpFile, Context)                            ' Вызов InputBox'а
End Function
 
Private Function InputBoxProc(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long       ' Процедура хука
    If lMsg = HCBT_ACTIVATE Then                                                                            ' При активации окна
        Dim hEdit As Long                                                                                   ' Хендл текстбокса
        hEdit = FindWindowEx(wParam, 0, "Edit", vbNullString)                                               ' Ищем текстбокс
        SendMessage hEdit, EM_SETPASSWORDCHAR, Asc("*"), ByVal 0                                            ' Устанавливаем текстбоксу стиль ввода пароля
        UnhookWindowsHookEx hHook                                                                           ' Отключаем хук
    End If
End Function
    
Sub Main()
    Debug.Print ExInputBox("Password")                                                                      ' Проверка
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы