Как реализовать универсальную форму ввода пароля? - VB
Формулировка задачи:
Подскажите чайнику как спецы решают такую задачу.
В стандартном InputBox не нашел возможности замены вводимого на символы типа * (как в TextBox passwordchar) .
1. Естесссно, создать свою форму, тем более, что она проста, как нигерйский валенок. Как шаблон можно сохранить.
Однако в некоторых проектах, где эта форма может понадобиться один раз на тысячу запусков, вроде как-то нерационально автоматически ее включать.
Затеял обсуждение здесь:Динамическое создание формы
Идеальным выглядит написать свою универсальную функцию вместо InputBox, которая программно создает форму и возвращает введенный пароль. Но, как я понял, стандартными средствами VB, программно создать форму "с нуля" низзя, можно только копию уже имеющейся, потом очистить и добавить все, что надо. Видимо, так и сделаю. Однако, если исходная форма громоздкая, то ее "клонирование" может тормозить прогу. А если проект ваще без форм?..
2. Можно научить InputBox звездочки показывать?
Нашел в сети заковыристый способ через API. Код переписал.
Этот код вешает прогу, выдавая сразу четыре разных сообщения об ошибках
3. Может, как-то еще?
Листинг программы
- Option Explicit
- 'код модуля. А в форме кнопка и метка.
- 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 Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
- Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
- Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
- 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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- Private Const WH_CBT = 5
- Private Const HCBT_ACTIVATE = 5
- Private m_lMsgHandle As Long
- Private m_lhHook As Long
- Private Const ES_CENTER = &H1&
- Private Function GetMessageBoxHandle(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- If lMsg = HCBT_ACTIVATE Then
- m_lMsgHandle = wParam
- UnhookWindowsHookEx m_lhHook
- m_lhHook = 0
- End If
- GetMessageBoxHandle = False
- End Function
- Private Sub InputBoxTimerUpdateEvent(hWnd As Long, uiMsg As Long, idEvent As Long, dwTime As Long)
- Dim res As Long
- If m_lMsgHandle = 0 Then Exit Sub
- res = FindWindowEx(m_lMsgHandle, 0, Edit, "")
- SendMessage res, 1052, 42, ByVal 0&
- SendMessage res, &H441, ES_CENTER, ByVal 0&
- End Sub
- Public Function InputBoxEx(sMsgText As String, Optional sTitle As String = "D.G.Secured InputBox") As String
- Dim lTimerUpdate As Long
- m_lhHook = SetWindowsHookEx(WH_CBT, AddressOf GetMessageBoxHandle, App.hInstance, GetCurrentThreadId())
- lTimerUpdate = SetTimer(0, 0, 0, AddressOf InputBoxTimerUpdateEvent)
- InputBoxEx = InputBox(sMsgText, sTitle)
- KillTimer 0, lTimerUpdate
- End Function
Решение задачи: «Как реализовать универсальную форму ввода пароля?»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д