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

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

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

Подскажите чайнику как спецы решают такую задачу. В стандартном InputBox не нашел возможности замены вводимого на символы типа * (как в TextBox passwordchar) . 1. Естесссно, создать свою форму, тем более, что она проста, как нигерйский валенок. Как шаблон можно сохранить. Однако в некоторых проектах, где эта форма может понадобиться один раз на тысячу запусков, вроде как-то нерационально автоматически ее включать. Затеял обсуждение здесь:Динамическое создание формы Идеальным выглядит написать свою универсальную функцию вместо InputBox, которая программно создает форму и возвращает введенный пароль. Но, как я понял, стандартными средствами VB, программно создать форму "с нуля" низзя, можно только копию уже имеющейся, потом очистить и добавить все, что надо. Видимо, так и сделаю. Однако, если исходная форма громоздкая, то ее "клонирование" может тормозить прогу. А если проект ваще без форм?.. 2. Можно научить InputBox звездочки показывать? Нашел в сети заковыристый способ через API. Код переписал. Этот код вешает прогу, выдавая сразу четыре разных сообщения об ошибках
Листинг программы
  1. Option Explicit
  2. 'код модуля. А в форме кнопка и метка.
  3. 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
  4. Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  5. Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
  6. Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
  7. Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  8. 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
  9. 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
  10. Private Const WH_CBT = 5
  11. Private Const HCBT_ACTIVATE = 5
  12. Private m_lMsgHandle As Long
  13. Private m_lhHook As Long
  14. Private Const ES_CENTER = &H1&
  15. Private Function GetMessageBoxHandle(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  16. If lMsg = HCBT_ACTIVATE Then
  17. m_lMsgHandle = wParam
  18. UnhookWindowsHookEx m_lhHook
  19. m_lhHook = 0
  20. End If
  21. GetMessageBoxHandle = False
  22. End Function
  23. Private Sub InputBoxTimerUpdateEvent(hWnd As Long, uiMsg As Long, idEvent As Long, dwTime As Long)
  24. Dim res As Long
  25. If m_lMsgHandle = 0 Then Exit Sub
  26. res = FindWindowEx(m_lMsgHandle, 0, Edit, "")
  27. SendMessage res, 1052, 42, ByVal 0&
  28. SendMessage res, &H441, ES_CENTER, ByVal 0&
  29. End Sub
  30. Public Function InputBoxEx(sMsgText As String, Optional sTitle As String = "D.G.Secured InputBox") As String
  31. Dim lTimerUpdate As Long
  32. m_lhHook = SetWindowsHookEx(WH_CBT, AddressOf GetMessageBoxHandle, App.hInstance, GetCurrentThreadId())
  33. lTimerUpdate = SetTimer(0, 0, 0, AddressOf InputBoxTimerUpdateEvent)
  34. InputBoxEx = InputBox(sMsgText, sTitle)
  35. KillTimer 0, lTimerUpdate
  36. End Function
3. Может, как-то еще?

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

textual
Листинг программы
  1. Option Explicit
  2.  
  3. 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
  4. Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  5. 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
  6. 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
  7.  
  8. Private Const WH_CBT As Long = 5
  9. Private Const EM_SETPASSWORDCHAR As Long = &HCC
  10. Private Const HCBT_ACTIVATE As Long = 5
  11.  
  12. Dim hHook As Long
  13.  
  14. Public Function ExInputBox(Prompt As String, Optional Title, Optional Default, _
  15.                            Optional Xpos, Optional ypos, Optional HelpFile, Optional Context) As String
  16.     hHook = SetWindowsHookEx(WH_CBT, AddressOf InputBoxProc, App.hInstance, App.ThreadID())                 ' Установка CBT хука
  17.    ExInputBox = InputBox(Prompt, Title, Default, Xpos, ypos, HelpFile, Context)                            ' Вызов InputBox
  18. End Function
  19.  
  20. Private Function InputBoxProc(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long       ' Процедура хука
  21.    If lMsg = HCBT_ACTIVATE Then                                                                            ' При активации окна
  22.        Dim hEdit As Long                                                                                   ' Хендл текстбокса
  23.        hEdit = FindWindowEx(wParam, 0, "Edit", vbNullString)                                               ' Ищем текстбокс
  24.        SendMessage hEdit, EM_SETPASSWORDCHAR, Asc("*"), ByVal 0                                            ' Устанавливаем текстбоксу стиль ввода пароля
  25.        UnhookWindowsHookEx hHook                                                                           ' Отключаем хук
  26.    End If
  27. End Function
  28.    
  29. Sub Main()
  30.     Debug.Print ExInputBox("Password")                                                                      ' Проверка
  31. End Sub

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


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

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

14   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы