ГлавнаяVB Отключаем показ PasswordChar во всех элементах TextBox
Отключаем показ PasswordChar во всех элементах TextBox
Автор Бельбаков Александр
15.10.2001 г.
В статье объясняется, как отключить показ звёздочек или других символов во всех элементах TextBox.
В этой статье речь пойдёт от том, как отключить показ звёздочек или других символов, установленных в свойстве PasswordChar всех элементов TextBox.
Прежде всего создадим новый проект и добавим модуль, в котором будет находится нужный нам код. Для того, чтобы отключить показ звёздочек нам надо сначала узнать описатели всхех открытых окон, где могут находится элементы TextBox. Для этого воспользуемся API функцией EnumWindows. Аргументу lpEnumFunc необходимо передать адрес области памяти, в которой находится ссылка на функцию, обрабатывающую перечисление описателей окон, вторй аргумент нам не нужен, указываем 0. Поместим обращение к ней в специальной подпрограмме DisblePasswordChar, к которой будем обращаться для отключения свойства PasswordChar:
Public Sub DisablePasswordChar() EnumWindows AddressOf EnumAllWindows, 0 End Sub
Аргументу lpEnumFunc мы указали функцию EnumAllWindows. Теперь создадим и её:
Private Function EnumAllWindows(ByVal hwnd As Long, ByVal lParam As Long) As Long EnumChildWindows hwnd, AddressOf EnumAllChilds, 0 EnumAllWindows = True End Function
Каждый раз при перечислении окон API функция EnumWindows будет вызывать нашу функцию EnumAllWindows, а в аргументе hwnd мы будем получать описатель каждого окна. Теперь надо повторить тоже самое для дочерних окон, в нашем случаее - элементов управления (строка EnumAllWindows = True указывает на то, что надо продолжать перечисление оставшихся окон):
Private Function EnumAllChilds(ByVal hwnd As Long, ByVal lParam As Long) As Long If SendMessage(hwnd, EM_GETPASSWORDCHAR, 0, 0) Then RefreshTextBox hwnd End If EnumAllChilds = True End Function
Функция EnumAllChilds аналогична предыдущей функции. Здесь мы получаем описатели дочерних окон и проверяем, является ли дочернее окно элементом TextBox со скрытым паролем. Для этого используем API функцию SendMessage, указав полученный описатель окна и тип сообщения(EM_GETPASSWORDCHAR), остальные два аргумента в данном случае не используются. Если свойство PasswordChar устанолено, то функция возвратит код символа и мы обратимся к функции, которая отключит показ звёздочек (RefreshTextBox), если же функция возвратит 0, значит это элемент TextBox у которого пароль не скрыт или это вовсе не TextBox. Рассмотрим следующую (последнюю) функцию:
Private Sub RefreshTextBox(hwnd As Long) SendMessage hwnd, EM_SETPASSWORDCHAR, 0, 0 ShowWindow hwnd, SW_HIDE ShowWindow hwnd, SW_SHOW End Sub
Здесь мы получаем описатель элемента TextBox со скрытым паролем. Затем ещё раз отправляем одно сообщение этому элементу, котрое убирает символ для скрытия пароля (используйте сообщение EM_SETPASSWORDCHAR и новое значение 0). Для того, чтобы результат нашей работы сразу было видно надо обновить элемент (скроем и покажем его заново). Теперь всё готово! Для активизации нашего кода вызовите подпрограмму DisablePasswordChar (но существует один недостаток: звёздочки не откроются в защищённых программах, в том числе и в документе Internet Exploler'а). Исходный модуль можно скачать здесь.