textbox的防拷贝

2024-01-31 13:48
文章标签 textbox 防拷贝

本文主要是介绍textbox的防拷贝,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一: 

在csdn上讨论textbox的防拷贝。
一般得出的结论是可以重写Form的ProcessCmdKey 方法。

代码如下:

 

  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; 
}
 

 

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代码如下:

 

public   class  NoCopyTextBox :System.Windows.Forms.TextBox
    
{
        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;
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的防拷贝的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/663976

相关文章

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

C#下设置TextBox默认显示文字,点击后消失

TextBox的ID为account和password //用户输入account.Attributes.Add("Value", "请输入用户名");account.Attributes.Add("OnFocus", "if(this.value=='请输入用户名') {this.value=''}");account.Attributes.Add("OnBlur", "if

Fabric.js TextBox揭秘:splitByGrapheme属性实现文本自然换行

在Node.js的前端图形处理库中,Fabric.js是一个功能强大的库,允许开发者在HTML5的<canvas>元素上绘制和操作图形、图像和文本。然而,在Fabric.js中直接处理文本时,默认情况下文本并不会自动换行。为了实现文本的自动换行,Fabric.js提供了TextBox类,并通过splitByGrapheme属性来控制文本的换行行为。本文将深入解析splitByGrapheme属性的

EasyUI textbox 修改字体样式

EasyUI textbox 修改字体样式 现象 后端代码如下 <input id="statusName" name="statusName" disabled="disabled" class="easyui-textbox" style="width: 80%;color: red;"/> 发现直接在style中写css不起作用 问题原因 easyui 会将原有的inpu

Fabric.js中fabric.Textbox的深入解析

在Web开发中,文本处理是一个重要的环节,尤其是在图形编辑和画布应用中。Fabric.js作为一个强大的Canvas库,提供了丰富的API来处理图形和文本。其中,fabric.Textbox是Fabric.js中用于创建和管理文本框对象的类。本文将深入解析fabric.Textbox,包括其API函数定义和代码示例解释,帮助开发者更好地理解和使用这个类。 一、fabric.Textbox概述

【学生信息管理系统】对输入框-TextBox的限制

学生信息管理系统中的输入框,需要限制。就像我们从来没有见过谁的名字是数字一样,另外界面还要跟后台的数据库相联系,我们不能让输入框输入的长度超过数据库对该字段长度的范围。     对输入框的限制是通过TextBox的KeyPress事件实现的,通过限制键盘上键对应的Ascii码值达到效果。每一个输入框,都要保证退格键和Delete键可用,达到修改的目的 学号:我们限制它只能是数字

AppInventor2 文本输入框(TextBox)已支持文本变更事件,非常便于实时处理输入的内容

自 v2.70开始,文本输入框加入了文本变更事件: 效果如下: 文本事件.gif (99.17 KB, 下载次数: 3) 下载附件 昨天 19:57 上传 同理,密码输入框组件也是一样的。 原文:AppInventor2 文本输入框(TextBox)已支持文本变更事件,非常便于实时处理输入的内容 - App Inventor 2 中文网 - 清泛IT社区,为创新赋能!

TextBox 数字,范围限制

直接上代码 /// <summary>/// 文本框文本输入事件/// </summary>private void txt_PreviewTextInput(object sender, TextCompositionEventArgs e){Regex regex = new Regex("^[0-9]+$");e.Handled = !regex.IsMatch

WPF TextBox 只能输入数字,并限制输入大小

/// <summary>/// 文本框文本输入事件/// </summary>private void txt_PreviewTextInput(object sender, TextCompositionEventArgs e){Regex regex = new Regex("^[0-9]+$");e.Handled = !regex.IsMatch(e.Text);if (e

WPF 下TextBox 换行与 C#下TextBox换行

有时候在WPF中要设置TEXTBOX自动换行 1、到文本框边缘后会自动换行 TextWrapping=Wrap 2、设置按Enter 健换行 AcceptsReturn=True 在C#下属性与WPF不同,所以要写个函数来控制自动换行 private void textBox2_TextChanged( object sender,TextChangedEventArgse) { int int