淘先锋技术网

首页 1 2 3 4 5 6 7

在一些C/S软件和登录网站输入账号密码时经常只能进行输入,而不让用户直接粘贴,防止上次用户登录账号没清除,下一个用户直接粘贴该账号而导致账号信息泄露,刚好在公司开发中要实现该功能,下面记录下在Delphi中实现该功能的方法。粘贴主要是利用了windows的剪贴板功能,因此清除剪贴板中内容即可实现。

打开Delphi,新建一个应用程序,在窗体上放置2个Edit控件和一个popupmenu控件。窗体文件和源码如下:

object Form1: TForm1
  Left = 333
  Top = 327
  Width = 328
  Height = 199
  Caption = '禁用粘贴功能'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object edt1: TEdit
    Left = 64
    Top = 32
    Width = 121
    Height = 21
    PopupMenu = pm1
    TabOrder = 0
    OnKeyDown = edt1KeyDown
  end
  object edt2: TEdit
    Left = 64
    Top = 72
    Width = 121
    Height = 21
    TabOrder = 1
    OnKeyDown = edt2KeyDown
  end
  object pm1: TPopupMenu
    Left = 216
    Top = 64
  end
end

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    pm1: TPopupMenu;
    edt1: TEdit;
    edt2: TEdit;
    procedure edt1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure edt2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses clipbrd;

procedure TForm1.edt1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key in [86..118]) and (ssCtrl in Shift) then
   edt1.ReadOnly:=True
  else
   edt1.ReadOnly:=False;
end;

procedure TForm1.edt2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key in [86..118]) and (ssCtrl in Shift) then
   begin
     if clipboard.HasFormat(CF_Text) then
       clipboard.SetTextBuf('');
   end;
end;

end.

方法一利用了控件的只读属性,而方法二直接给剪贴板内容设置为空串,这样其他地方也不能再使用该内容。效果如下:

   屏蔽了右键菜单,只能输入不能粘贴内容。