Как реализовать универсальную форму ввода пароля? - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д