因项目中要求密码框不能复制或粘贴内容,也不允许右键菜单,故做此文。
密码框继承于TextBox。
不能复制,粘贴和右键菜单的需求利用Textbox现有的属性无法实现或完全实现,即使ToolStripMenu为空,系统也会自己给添加一个具备 复制粘贴的右键菜单。
针对复制,粘贴和剪切,需要对在消息循环中进行拦截,然后将其处理事件置空。代码如下所示:
1 protected override void WndProc(ref Message m) 2 { 3 //阻止粘贴,复制,剪切 4 if (m.Msg!=WinApi.WM_PASTE && 5 m.Msg!=WinApi.WM_COPY && 6 m.Msg!=WinApi.WM_CUT) 7 { 8 base.WndProc(ref m); 9 } 10 }
针对右键菜单,可以拦截消息循环,也可以将其默认菜单设置为没有菜单项的菜单,我采用了第二种方法:
ContextMenuStrip defaultMenu;
1 public override ContextMenuStrip ContextMenuStrip 2 { 3 get 4 { 5 if (base.ContextMenuStrip == null) 6 { 7 base.ContextMenuStrip = this.defaultMenu; 8 } 9 return base.ContextMenuStrip; 10 } 11 set 12 { 13 if (base.ContextMenuStrip == null) 14 { 15 base.ContextMenuStrip = this.defaultMenu; 16 } 17 } 18 }
在该TextBox的构造函数或Load事件中,将defaultMenu赋值给ContextMenuStrip即可。
文中若有漏洞或有更好的方法,请喷完后再多多指教;