6

UseSystemPasswordChar を使用するテキスト ボックスがあるため、ユーザーが入力したパスワードは表示されません。問題は、パスワードが Spy++ などによって読み取られることです。Services.msc > [ログオン] タブのパスワード フィールドのように、これを非表示にする方法を探しています。

4

3 に答える 3

2

これが私がこれまでに得たものです。

押されたキーが受け入れられたかどうか、InputFilterまたはRealTextが変更されたかどうかなどを示すいくつかの固有のイベントを設定することで、これを改善できます。

改善すべきもう1つの優れた点は、InputFilterのデフォルトの使用法です。これは、charとKeysの操作は、多くの特殊なキーでは実際には機能しないためです。たとえば、現時点では、PasswordBoxにフォーカスがあるときにAlt + F4を押すと、「s」と入力されます...したがって、修正すべきバグがたくさんあります。

そして最後に、大文字と大文字以外の文字の入力を処理するためのよりエレガントな方法は、私がそこで行った方法よりもおそらくあります。

だからここにあります:

public class PasswordBox : TextBox
{
    private string _realText;

    public string RealText
    {
        get { return this._realText; }
        set
        {
            var i = this.SelectionStart;

            this._realText = value ?? "";

            this.Text = "";
            this.Text = new string('*', this._realText.Length);

            this.SelectionStart = i > this.Text.Length ? this.Text.Length : i;
        }
    }

    private Func<KeyEventArgs, bool> _inputFilter;

    public Func<KeyEventArgs, bool> InputFilter
    {
        get { return this._inputFilter; }
        set { this._inputFilter = value ?? (e => true); }
    }

    public PasswordBox()
    {
        this.RealText = "";
        this.InputFilter = e => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".Any(c => c == e.KeyValue);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        e.SuppressKeyPress = true;

        switch (e.KeyCode)
        {
            case Keys.Back:
                if (this.SelectionStart > 0 || this.SelectionLength > 0)
                {
                    this.RealText = this.SelectionLength == 0
                                        ? this.RealText.Remove(--this.SelectionStart, 1)
                                        : this.RealText.Remove(this.SelectionStart, this.SelectionLength);
                }
                break;
            case Keys.Delete:
                if (this.SelectionStart == this.TextLength)
                {
                    return;
                }

                this.RealText = this.RealText.Remove(this.SelectionStart, this.SelectionLength == 0 ? 1 : this.SelectionLength);
                break;
            case Keys.X:
            case Keys.C:
            case Keys.V:
                if (e.Control)
                {
                    return;
                }
                goto default;
            case Keys.Right:
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
            case Keys.Shift:
            case Keys.Home:
            case Keys.End:
                e.SuppressKeyPress = false;
                base.OnKeyDown(e);
                break;
            default:
                if (e.Control)
                {
                    e.SuppressKeyPress = false;
                    base.OnKeyDown(e);
                    break;
                }

                if (this.InputFilter(e))
                {
                    var c = (char)e.KeyValue;

                    if (e.Shift == IsKeyLocked(Keys.CapsLock))
                    {
                        c = char.ToLower(c);
                    }

                    this.RealText = this.RealText.Remove(this.SelectionStart, this.SelectionLength)
                        .Insert(this.SelectionStart, c.ToString());

                    this.SelectionStart++;
                }
                break;
        }
    }
}
于 2012-05-02T08:43:30.383 に答える
1

だから、このようなことを試してください

        private string realpass = "";
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (Char) Keys.Back)
                realpass += realpass.Substring(0, realpass.Length - 2);
            realpass += e.KeyChar.ToString();
            textBox1.Text = "";
            for (int i = 0; i < realpass.Length; i++)
                textBox1.Text += "*";
        }
于 2012-05-02T07:04:08.860 に答える
1

Windows/ドメイン ユーザー資格情報を収集する場合は、独自のダイアログを使用しないでください。PInvoke を介して Windows が提供するものを使用するか、単にこのようなラッパーを使用する必要があります。

http://weblogs.asp.net/hernandl/archive/2005/11/21/usercredentialsdialog.aspx

この、

http://credentials.codeplex.com/

于 2012-05-02T07:14:14.507 に答える