【问题标题】:Render text as password using system password char in Windows Forms.NET在 Windows Forms.NET 中使用系统密码字符将文本呈现为密码
【发布时间】:2012-03-07 09:47:04
【问题描述】:

Windows 窗体TextBox 控件有两个属性,PasswordCharUseSystemPasswordChar,它们控制输入TextBox 的密码是否模糊。我需要以相同的方式将指定的文本渲染到非 TextBox 图形表面上。

如果我们使用 PasswordChar 属性中的字符,我可以计算指定字符串的长度并创建等效的文本表示,但是 UseSystemPasswordChar 呢?我们如何找回有效的系统密码char?

或者也许有一个标志或一个现成的 .NET 方法或类,我们可以使用它来将指定的文本呈现为密码,而无需手动完成所有这些工作?

【问题讨论】:

  • “渲染指定文本”在这种情况下听起来很奇怪。

标签: winforms textbox render passwordbox


【解决方案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 消息发送到 Windows api。

【讨论】:

  • 如果在未来的操作系统版本中更改此设置怎么办?我们需要一个好的方法来检索当前的系统密码字符。
  • 本身没有“系统密码字符”,它基于 Windows API 中的底层控制(不确定 Mono 上的行为)。我已经用动态检索角色的方式更新了我的答案。
  • 我也尝试过这样做:TextBox myTextBox = new TextBox(); myTextBox.UseSystemPasswordChar = true; fPasswordCharEffective = (char)iGNativeMethods.SendMessage(myTextBox.Handle, NativeMethods.EM_GETPASSWORDCHAR, IntPtr.Zero, IntPtr.Zero); myTextBox.Dispose();但是非常有趣的是,当 UseSystemPasswordChar 为 True 时 PasswordChar 属性返回有效的密码字符,即使它在设计时设置为其他值!我将它设置为“*”,但是当 UseSystemPasswordChar 为 True 时,PasswordChar 返回我的 Win7 中的黑盘!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多