textbox的防拷贝
来源:互联网 发布:图片文字识别算法 编辑:程序博客网 时间:2024/04/29 23:41
一:
在csdn上讨论textbox的防拷贝。
一般得出的结论是可以重写Form的ProcessCmdKey 方法。
代码如下:
...{
if(keyData == (Keys.Control | Keys.C)||keyData ==(Keys.Control | Keys.V))
...{
MessageBox.Show("不能粘贴,复制");
return true;
}
else
return base.ProcessCmdKey(ref msg, keyData);
// return false;
}
ProcessCmdKey将截获Form的命令按键,并进行处理。
该方法判断 用户是否按下了Ctrl+C和Ctrl+V按键组合。
如果是,则弹出一个对话框,并返回真,这里返回了true,则表示我已经对该事件进行了处理,程序不需要继续对它做别的处理。
否则,调用base.ProcessCmdKey继续对事件做处理。
但是个人认为这样做有很大的问题。
首先,这样做并不能从根本上解决TextBox防拷贝,因为当用户点击鼠标右键的时候,仍然可以激活标准的contextmeun .可以通过该弹出菜单轻松的完成拷贝。
其次,ProcessCmdKey重载自From, 也就是说以该Form为容器的所有子控件上按键都将接受这个重灾方法的处理。
举例来说,我想实现一个Form,其中有一个TextBox1,不能拷贝其上的数据。还有一个TextBox2允许用户粘贴拷贝,那么用这个方法就无法实现,不管是在哪个控件。程序都会无情地弹出一个MessageBox 告诉你不能拷贝。
所以在Form中重载ProcessCmdKey不但实用价值不高,而且给人的感觉非常不好。。。
所以更好的办法就是开发自定义控件。例如在这个应用中的TextBox, 完全可以开发一个NoCopyTextBox。
该控件继承自TextBox.
我们在该控件中重载ProcessCmdKey方法, 并替换掉NoCopyTextBox的默认contextmenu,这样就可以很好的解决上诉问题。
而且在将来的开发中,遇到同样的问题,我们可以直接使用NoCopyTextBox
对于那些不需要禁止Copy的TextBox使用标准控件就好。
NoCopyTextBox代码如下:
...{
ContextMenu noContext =new ContextMenu();
public NoCopyTextBox()
...{
this.ContextMenu =noContext;
}
private void InitializeComponent()
...{
}
protected override bool ProcessCmdKey(ref Message msg,Keys keyData)
...{
if(keyData == (Keys.Control | Keys.C)||keyData ==(Keys.Control | Keys.V))
...{
MessageBox.Show("不能粘贴,复制");
return true;
}
else
return base.ProcessCmdKey(ref msg, keyData);
// return false;
}
}
该控件在构造的时候用一个空contextmenu代替了默认contextmeun,这样,右键点击便什么也出不来了。
所以我想说的是,实际上可以在实际开发中,在以有标准控件的基础上去创造细节不同的控件。这可能比直接使用标准控件麻烦,但总算比重头开始制造控件来的轻松多了:)
所以应用派的程序员还是应该有自己的一套库比较好。
二:
其实也可以通过截获Windows 消息来达到屏蔽拷贝与粘贴的功能,同时可以限制用户可以输入的字符:
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Drawing.Text;
using System.Runtime.Serialization;
using System.Globalization;
using System.Windows.Forms;
namespace DivineEagleControl
...{
/**//// <summary>
/// DivineTextBox 的摘要说明。
/// 修改日期:2006.04.08
/// (DIVINE EAGLE)
/// 属性:控制控件输入的数据类型
/// InputType:数字 Digital
/// 文本 Text
/// 正常的输入Normal
/// </summary>
public enum InputType
...{
Digital,
Text,
Normal,
Default
};
public class DivineTextBox:System.Windows.Forms.TextBox
...{
private InputType curinput=InputType.Digital;
[Bindable(true),Category("DivineEagle"),Description("控制数据输入的类型,主要就是(0)/数字,(1)/文本,(2)/字符/数字,(3)/所有字符")]
public int DataInputType
...{
get
...{
return (int)this.curinput;
}
set
...{
if(this.curinput!=(InputType)value)
...{
this.curinput=(InputType)value;
this.Invalidate();
}
}
}
protected override void WndProc(ref System.Windows.Forms.Message e)
...{
//屏蔽复制与粘贴功能
if (e.Msg==0x302)
return;
else
if (e.Msg==0x008)
...{
return;
}
else
//限制用户可以输入的字符
if (e.Msg==0x102)
...{
if((char)e.WParam==(char)8)
...{
}
else
if((char)e.WParam==(char)13)
...{
SendKeys.Send("{TAB}");
}
else
...{
switch(curinput)
...{
case InputType.Digital:
...{
if(!Char.IsDigit((char)e.WParam ))
return;
break;
}
case InputType.Text:
...{
if(!Char.IsLetter((char)e.WParam))
return;
break;
}
case InputType.Normal:
...{
if(!Char.IsLetterOrDigit((char)e.WParam))
return;
break;
}
default:
break;
}
}
}
base.WndProc(ref e);
}
}
}
- textbox的防拷贝
- 常见的光盘防拷贝保护技术
- 文档防泄密,防拷贝,防打印
- 防拷贝光盘破解
- c++::如何防拷贝~
- scoed_ptr------防拷贝
- 破解防拷贝脚本
- scoped_ptr防拷贝
- 软件防拷贝注册机制的程序实现
- web 页面防复制防拷贝
- 网页防拷贝禁另存代码
- U盘防拷贝组件
- 网页防拷贝javascript代码
- 如何破解防拷贝光盘
- 拷优(CopyU!)mini独家具备穿透U盘防拷贝软件的功能!
- CSS代码(二):巧用content实现文档的防拷贝功能
- 代理服务器中的内容防拷贝技术
- U盘防拷贝选择隐大师
- vs2003->vs2005时就注意的事项(转)
- Asp.Net ==Web 应用程序中长时间装载页面时显示进度条
- 转:如何在JAVA中使用日期 (一)
- 综合 对外包的种种看法
- ZK, Ajax but no JavaScript
- textbox的防拷贝
- 关于上下文
- 如何获得免费网络空间
- 来到CSDN
- apache中.htaccess文件的功能写法
- 17种家常菜竟然是健康杀手
- dojo toolkit
- 在 ASP.NET 中实现会话状态的基础
- 用WinCVS删除文件