通过继承TextBox扩展了一个文本框,加入一些新的功能,比如如下代码中用来防止被“星号密码查看器”等工具窥探星号密码的处理:/// <summary>
        /// 是否允许以程序方式读取文本
        /// </summary>
        private bool _allowProgramReadText = false;
        private const int WM_GETTEXT = 0x000D;
        private const int EM_GETLINE = 0x00C4;        /// <summary>
        /// 获得操作系统消息
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            // 根据允许读取文本标记控制是否继续发送系统消息从而达到防止星号密码查看器窥探密码文本的目的
            if ((m.Msg == WM_GETTEXT || m.Msg == EM_GETLINE) && !_allowProgramReadText)
                return;            // 调用基类系统消息处理程序
            base.WndProc(ref m);// 其它代码片段
......
}
按如上方式重写WndProc后,奇怪的现象发生了:
调用 this.txtUserPwd.Text = "password"; (即赋值的字串长度大于0时可成功)可以成功,
但调用 this.txtUserPwd.Text = ""; 或 this.txtUserPwd.Text = string.empty; 或 this.txtUserPwd.Clear(); 却总是不成功。这个到底是什么原因?只学习过 Java / C#,对于 Windows 消息机制不是很熟悉,请高手解答,谢谢!

解决方案 »

  1.   

    注:
    同时重写了Text属性:
    /// <summary>
            /// 与控件关联的文本
            /// </summary>
            public override string Text
            {
                // 重写文本设定/获取属性以配合 _allowProgramReadText 字段的标记功能
                get
                {
                    try
                    {
                        // 开启文本读取
                        this._allowProgramReadText = true;
                        // 返回文本值
                        return base.Text;
                    }
                    finally
                    {
                        // 关闭文本读取
                        this._allowProgramReadText = false;
                    }
                }
                set
                {
                    // 保存文本值
                    base.Text = value;
                }
            }
      

  2.   

     _allowProgramReadText 还有用于其它地方吗?没看出它的作用其实你直接:
    if (m.Msg == 0x000D || m.Msg == 0x00C4)
      return;
    不可以吗???