Отображать текст как пароль, используя символ системного пароля в Windows Forms.NET

Элемент управления Windows Forms TextBox имеет два свойства, PasswordChar и UseSystemPasswordChar, которые управляют сокрытием паролей, введенных в поле TextBox. Мне нужно таким же образом отобразить указанный текст на графической поверхности, отличной от TextBox.

Я могу вычислить длину указанной строки и создать эквивалентное текстовое представление, если мы используем char из свойства PasswordChar, но как насчет UseSystemPasswordChar? Как нам получить эффективный системный пароль char?

Или, может быть, есть флаг или готовый к использованию метод или класс .NET, который мы можем использовать для отображения указанного текста в качестве пароля, не выполняя всю эту работу вручную?


person 10Tec    schedule 07.03.2012    source источник
comment
визуализировать указанный текст звучит довольно странно в этом контексте.   -  person Hans Passant    schedule 08.03.2012


Ответы (1)


Символ пароля по умолчанию в Windows — это звездочка, если не включены визуальные стили, и в этом случае это черный кружок.

Вы можете проверить, включены ли визуальные стили через Application.RenderWithVisualStyles

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761594(v=vs.85).aspx

В качестве альтернативы вы можете создать текстовое поле и просто прочитать значение PasswordChar, хотя это кажется немного грязным.

 char passwordChar = (new TextBox(){UseSystemPasswordChar = true}).PasswordChar;

Под капотом этот вызов отправляет сообщение EM_GETPASSWORDCHAR API Windows.

person roken    schedule 07.03.2012
comment
что, если этот параметр будет изменен в будущих версиях ОС? Нам нужен хороший метод для получения символа текущего системного пароля. - person 10Tec; 08.03.2012
comment
Сам по себе символ системного пароля не существует, он основан на базовом элементе управления в Windows API (не уверен в поведении в Mono). Я обновил свой ответ динамическим способом получения персонажа. - person roken; 08.03.2012
comment
Я также пытался сделать то же самое: TextBox myTextBox = new TextBox(); myTextBox.UseSystemPasswordChar = true; fPasswordCharEffective = (char)iGNativeMethods.SendMessage(myTextBox.Handle, NativeMethods.EM_GETPASSWORDCHAR, IntPtr.Zero, IntPtr.Zero); myTextBox.Dispose(); Но очень забавно, что свойство PasswordChar возвращает действующий символ пароля, когда UseSystemPasswordChar имеет значение True, даже если оно было установлено на что-то другое во время разработки! Я установил *, но когда UseSystemPasswordChar имеет значение True, PasswordChar возвращает черный диск в моей Win7! - person 10Tec; 12.03.2012