passaction.pas

来自「用delphi写的密码管理工具.」· PAS 代码 · 共 94 行

PAS
94
字号
unit PassAction;

interface

uses Classes, Dialogs, SysUtils, Clipbrd, Forms, Controls, Windows;

type
  TActionType = (atCopy, atSend, atSendToWindow);

  TPassAction = class
  private
    FName: string;
    FActionType: TActionType;
    FKeyString: string;
    FHotKey: TShortCut;
    function KeyString4Copy(UserName, Password, GroupName: string): string;
    function KeyString4Send(UserName, Password, GroupName: string): string;
  public
    property Name: string read FName;
    property HotKey: TShortCut read FHotKey;
    constructor Create(Name: string; ActionType: TActionType; KeyString: string; HotKey: TShortCut);
    procedure DoAction(UserName, Password, GroupName: string);
  end;

implementation

uses Log, Main, SNDKEY32, SelectWin;

constructor TPassAction.Create(Name: string; ActionType: TActionType; KeyString: string; HotKey: TShortCut);
begin
  FName := Name;
  FActionType := ActionType;
  FKeyString := KeyString;
  FHotKey := HotKey;
end;

function TPassAction.KeyString4Copy(UserName, Password, GroupName: string): string;
begin
  Result := StringReplace(FKeyString, '{USERNAME}', UserName, [rfReplaceAll, rfIgnoreCase]);
  Result := StringReplace(Result, '{PASSWORD}', Password, [rfReplaceAll, rfIgnoreCase]);
  Result := StringReplace(Result, '{GROUPNAME}', GroupName, [rfReplaceAll, rfIgnoreCase]);
end;

function TPassAction.KeyString4Send(UserName, Password, GroupName: string): string;

  function ReplaceSpecialCharacters(S: string): string;
  begin
    S := StringReplace(S, '~', '{~}', [rfReplaceAll]);
    S := StringReplace(S, '+', '{+}', [rfReplaceAll]);
    S := StringReplace(S, '^', '{^}', [rfReplaceAll]);
    S := StringReplace(S, '%', '{%}', [rfReplaceAll]);
    Result := S;
  end;

begin
  UserName := ReplaceSpecialCharacters(UserName);
  Password := ReplaceSpecialCharacters(Password);
  GroupName := ReplaceSpecialCharacters(GroupName);
  Result := StringReplace(FKeyString, '{USERNAME}', UserName, [rfReplaceAll, rfIgnoreCase]);
  Result := StringReplace(Result, '{PASSWORD}', Password, [rfReplaceAll, rfIgnoreCase]);
  Result := StringReplace(Result, '{GROUPNAME}', GroupName, [rfReplaceAll, rfIgnoreCase]);
end;

procedure TPassAction.DoAction(UserName, Password, GroupName: string);
begin
  if FActionType = atCopy then
    Clipboard.SetTextBuf(PChar(KeyString4Copy(UserName, Password, GroupName)))
  else if FActionType = atSend then
  begin
    frmMain.GetWindows;
    if frmMain.slWinHandle.Count > 0 then
    begin
      SetForegroundWindow(StrToInt(frmMain.slWinHandle[0]));
      SendKeys(PChar(KeyString4Send(UserName, Password, GroupName)), True);
    end;
  end
  else if FActionType = atSendToWindow then
    with frmSelectWin do
    begin
      lstWin.Items.Assign(frmMain.slWinTitle);
      if frmSelectWin.ShowModal = mrOK then
      begin
        SetForegroundWindow(StrToInt(frmMain.slWinHandle[lstWin.ItemIndex]));
        SendKeys(PChar(KeyString4Send(UserName, Password, GroupName)), True);
      end;
    end;


  fraLog.WriteLog;
end;


end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?