C# WinForm TextBox 作为密码输入框时,如何禁止密码查看器获取密码 ?

hiwcn 2012-06-08 08:36:54
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属性得不到值了,请问如何解决?
...全文
691 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
言多必失 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
SocketUp的方法可行,问题解决了!//主窗体代码Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
……
[/Quote]
可是密码的样式太难看了。
hiwcn 2012-06-08
  • 打赏
  • 举报
回复
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);
}
}
}


ohkuy 2012-06-08
  • 打赏
  • 举报
回复
用WPF的密码框,非常安全,
做好控件再导入到winform中用
SocketUp 2012-06-08
  • 打赏
  • 举报
回复
在屏蔽WM_GETTEXT前加一个算法判断
应该是可以的,不过获取前后都要更新设置,麻烦,应该还能优化点
或者还有更好的方法
SocketUp 2012-06-08
  • 打赏
  • 举报
回复
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);
}
}
}
bwangel 2012-06-08
  • 打赏
  • 举报
回复
密码查看器是什么东东?

在你自己的电脑上运行还是被种马了?

你自己本机运行一个密码查看器的话,那不就相当于自己脱光了在镜子里欣赏自己了?

111,076

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧