caozhy网友给我了以下答案:protected override void WndProc(ref Message m)
{
if (m.Msg != (int)WinMsg.WM_GETTEXT) base.WndProc(ref m);
}public enum WinMsg : int
{
...
WM_GETTEXT = 0x000D,
...
} 这一方法,可以阻止密码查看器获取密码,但也导致通过txtBox1.Text属性得不到值了,请问如何解决?

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                myTextBox1.CheckPass = myTextBox1.Handle.ToInt32() * 2;
                String strText = myTextBox1.Text;
                myTextBox1.CheckPass = 0;
                MessageBox.Show(strText);
            }
        }    public class MyTextBox : TextBox
        {
            private Int32 _CheckPass;        public Int32 CheckPass
            {
                get
                {
                    return _CheckPass;
                }
                set
                {
                    _CheckPass = value;
                }
            }        protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x000D)
                {
                    if (CheckPass != m.HWnd.ToInt32() * 2)
                    {
                        return;
                    }
                }            base.WndProc(ref m);
            }
        }
    }
      

  2.   

    在屏蔽WM_GETTEXT前加一个算法判断
    应该是可以的,不过获取前后都要更新设置,麻烦,应该还能优化点
    或者还有更好的方法
      

  3.   

    用WPF的密码框,非常安全,
    做好控件再导入到winform中用
      

  4.   

    SocketUp的方法可行,问题解决了!//主窗体代码Form1.cs
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {        
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                myTextBox1.CheckPass = myTextBox1.Handle.ToInt32() * 2;
                String strText = myTextBox1.Text;
                myTextBox1.CheckPass = 0;
                MessageBox.Show(strText);
            }        
        }
    }//创建的组件  MyTextBox 
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication1
    {
        public partial class MyTextBox : TextBox
        {
            public MyTextBox()
            {
                InitializeComponent();
            }        public MyTextBox(IContainer container)
            {
                container.Add(this);            InitializeComponent();
            }        private Int32 _CheckPass;        public Int32 CheckPass //也可以扩展增加一个是否允许获取密码的布尔值属性,这样写起来更方便
            {
                get
                {
                    return _CheckPass;
                }
                set
                {
                    _CheckPass = value;
                }
            }        protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x000D)
                {
                    if (CheckPass != m.HWnd.ToInt32() * 2)
                    {
                        return;
                    }
                }            base.WndProc(ref m);
            }
        }
    }