2010-12-15 81 views
1

J'utilise un contrôle personnalisé transparent basé sur RichTextBox. Est-il possible d'avoir un support de char de mot de passe comme dans le contrôle TextBox normal.Mot de passe char pour RichTextBox

+4

* Pourquoi * voudriez-vous entrer un mot de passe dans un 'RichTextBox'? Il semble que vous utilisiez le mauvais contrôle pour le travail. Il n'est explicitement pas * conçu * pour entrer des mots de passe, et pourrait présenter un risque de sécurité. –

+0

Cela faisait partie des exigences de conception de l'interface utilisateur pour que l'application dispose d'un contrôle d'édition de texte avec un arrière-plan dégradé. La sécurité n'est pas un problème, cette application a des exigences de sécurité très limitées. – user976535

+1

S'agit-il d'une application WinForms ou WPF? Chaque fois que vous dites que "les exigences de conception d'interface utilisateur" l'emportent sur tout type de fonctionnalité réelle, qui crie juste pour l'application à écrire dans WPF ... –

Répondre

5

C'est simple, RTB implémente la prise en charge de la saisie de mot de passe. Il n'est tout simplement pas exposé dans l'encapsuleur .NET. Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Compiler. Déposez le nouveau contrôle du haut de la boîte à outils sur votre formulaire.

using System; 
using System.Windows.Forms; 

class RichPassword : RichTextBox { 
    protected override CreateParams CreateParams { 
     get { 
      // Turn on ES_PASSWORD 
      var cp = base.CreateParams; 
      cp.Style |= 0x20; 
      return cp; 
     } 
    } 
} 
0

Oui, il y a un moyen. Vous devez intercepter les touches avant de les dessiner (recherchez PreviewKeyDown ou des événements similaires) et remplacez-les par des astérisques (*). Mais vous devez également implémenter une logique pour gérer la chaîne de caractères réels.

Remarque Je suis d'accord avec le commentaire de Cody Gray.

+1

Il est également intéressant de noter que la norme Le contrôle Win32 'TextBox' fait un * lot * de plus lorsqu'il est configuré pour stocker les mots de passe plutôt que d'afficher simplement des caractères sous forme d'astérisques/de puces. Par exemple, cela désactive également la copie d'un mot de passe hors de la zone de texte. Vous êtes sur le point de commencer à faire rouler une pierre en essayant de faire tout cela vous-même, même si vos exigences en matière de sécurité sont «limitées». –

+0

@Cody - google "révélateur de mot de passe". –

+0

@Hans: J'ai des choses indicibles dans mon sac de trucs. La plupart des choses sont craquables au * niveau * si vous êtes prêt à essayer assez dur. Je dis juste, il est beaucoup plus probable que l'utilisateur moyen pense à copier et coller un mot de passe d'une zone de texte que d'avoir un révélateur de mot de passe. Le demandeur a mentionné que les problèmes de sécurité sont «limités», donc je pense que cela laisse de côté ceux qui ont recours à ce type de logiciel, mais pas ceux qui connaissent le raccourci clavier Ctrl + C. –

-1

Cela a fonctionné pour moi et a résolu le but.

Public Class RichPassword 
    Inherits RichTextBox 
    Private Const ES_PASSWORD = 32 
    Protected Overrides ReadOnly Property CreateParams As CreateParams 
     Get 
      Dim CP = MyBase.CreateParams 
      CP.Style = CP.Style Or 32 
      Return CP 
     End Get 
    End Property 
End Class