BSOne.SFC/Tocsg.Module/ScreenLock/DLockScreen.pas

282 lines
7.1 KiB
Plaintext

unit DLockScreen;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
System.Generics.Collections, Vcl.ExtCtrls, Vcl.Buttons, Vcl.Imaging.pngimage,
System.ImageList, Vcl.ImgList, PngImageList;
type
TDlgLockScreen = class(TForm)
pnClient: TPanel;
tCheckTk: TTimer;
pnPass: TPanel;
edPass: TEdit;
lbHint: TLabel;
imgMain: TImage;
imgBottom: TImage;
imgPass: TImage;
imgHint: TImage;
imgOk: TImage;
imgMsg: TImage;
imgBtnList: TPngImageList;
imgViewList: TPngImageList;
lbMsg: TLabel;
Image1: TImage;
lbTitleBig: TLabel;
lbTitleSmall: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tCheckTkTimer(Sender: TObject);
procedure edPassKeyPress(Sender: TObject; var Key: Char);
procedure imgOkMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imgOkMouseEnter(Sender: TObject);
procedure imgOkMouseLeave(Sender: TObject);
procedure imgHintClick(Sender: TObject);
procedure imgOkClick(Sender: TObject);
procedure lbHintMouseEnter(Sender: TObject);
procedure lbHintMouseLeave(Sender: TObject);
procedure lbHintClick(Sender: TObject);
private
{ Private declarations }
sPass_: String;
LsList_: TList<TDlgLockScreen>;
nCheckCnt_: Integer;
procedure OnLockScreenNotify(Sender: TObject; const Item: TDlgLockScreen; Action: TCollectionNotification);
procedure SetPosition(aMonitor: TMonitor);
procedure SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer);
public
{ Public declarations }
Constructor Create(aOwner: TComponent; sPass: String);
Destructor Destroy; override;
procedure DoLockScreen;
end;
var
DlgLockScreen: TDlgLockScreen;
implementation
uses
{$IFDEF _HE_}
DeCrmHeMain, Condition, ManagerService, GlobalDefine, Tocsg.Trace,
{$ELSE}
DScrLckMain,
{$ENDIF}
Tocsg.Process, Define;
resourcestring
RS_InvalidPass = '비밀번호가 틀렸습니다.';
{$R *.dfm}
Constructor TDlgLockScreen.Create(aOwner: TComponent; sPass: String);
begin
Inherited Create(aOwner);
sPass_ := sPass;
nCheckCnt_ := 0;
LsList_ := TList<TDlgLockScreen>.Create;
SetImgBtn(imgBtnList, imgOk, 0);
SetImgBtn(imgViewList, imgHint, 0);
{$IFDEF _HE_}
lbHint.Enabled := false;
lbHint.Visible := lbHint.Enabled;
imgBottom.Visible := false; // CUSTOMER_TYPE = CUSTOMER_HANATI;
if IsBS1Display then
lbTitleSmall.Caption := 'BSOne';
{$ENDIF}
end;
Destructor TDlgLockScreen.Destroy;
begin
FreeAndNil(LsList_);
{$IFDEF DEBUG}
if DebugHook = 0 then
{$ENDIF}
begin
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, 2, 0);
keybd_event(VK_RWIN, 0, 2, 0);
keybd_event(VK_LMENU, $B8, 2, 0);
keybd_event(VK_RMENU, $B8, 2, 0);
keybd_event(VK_CONTROL, $9D, 2, 0);
keybd_event(VK_LCONTROL, $9D, 2, 0);
keybd_event(VK_RCONTROL, $9D, 2, 0);
if gMain.KeyMon <> nil then
begin
gMain.KeyMon.SetDisableKey_ESC(false);
gMain.KeyMon.SetDisableKey_Win(false);
gMain.KeyMon.SetDisableKey_Alt(false);
gMain.KeyMon.SetDisableKey_Ctrl(false);
end;
end;
Inherited;
end;
procedure TDlgLockScreen.SetImgBtn(aImgList: TPngImageList; imgBtn: TImage; nImgIdx: Integer);
begin
aImgList.GetIcon(nImgIdx, imgBtn.Picture.Icon);
imgBtn.Repaint
end;
procedure TDlgLockScreen.OnLockScreenNotify(Sender: TObject; const Item: TDlgLockScreen; Action: TCollectionNotification);
begin
case Action of
cnAdded: ;
cnRemoved: Item.Close;
cnExtracted: ;
end;
end;
procedure TDlgLockScreen.DoLockScreen;
var
i: Integer;
dlg: TDlgLockScreen;
begin
for i := 0 to Screen.MonitorCount - 1 do
begin
if Screen.Monitors[i].Primary then
begin
{$IFDEF DEBUG}
if DebugHook = 0 then
{$ENDIF}
begin
if gMain.KeyMon <> nil then
begin
gMain.KeyMon.SetDisableKey_ESC(true);
gMain.KeyMon.SetDisableKey_Win(true);
gMain.KeyMon.SetDisableKey_Alt(true);
gMain.KeyMon.SetDisableKey_Ctrl(true);
end;
end;
tCheckTk.Enabled := true;
SetPosition(Screen.Monitors[i]);
Show;
end else begin
dlg := TDlgLockScreen.Create(Self, sPass_);
dlg.pnClient.Visible := false;
dlg.SetPosition(Screen.Monitors[i]);
dlg.Show;
end;
end;
{$IFDEF _HE_}
TTgTrace.T('화면 잠금됨. 모니터 수=%d', [Screen.MonitorCount], 1);
gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_EVENT_SCRNLOCK, 'Screen Locked');
{$ENDIF}
end;
procedure TDlgLockScreen.edPassKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Key := #0;
imgOkClick(nil);
end;
end;
procedure TDlgLockScreen.SetPosition(aMonitor: TMonitor);
begin
Left := aMonitor.Left;
Top := aMonitor.Top;
Width := aMonitor.Width;
Height := aMonitor.Height;
pnPass.Left := (Width div 2) - (pnPass.Width div 2);
pnPass.Top := (Height div 2) - (pnPass.Height div 2);
imgBottom.Left := (Width div 2) - (imgBottom.Width div 2);
imgBottom.Top := Height - imgBottom.Height - 80;
end;
procedure TDlgLockScreen.tCheckTkTimer(Sender: TObject);
begin
TerminateProcessByName('taskmgr.exe');
if GetForegroundWindow <> Handle then
SetForegroundWindow(Handle);
end;
procedure TDlgLockScreen.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TDlgLockScreen.imgHintClick(Sender: TObject);
begin
if edPass.PasswordChar = #7 then
begin
edPass.PasswordChar := #0;
SetImgBtn(imgViewList, imgHint, 1);
end else begin
edPass.PasswordChar := #7;
SetImgBtn(imgViewList, imgHint, 0);
end;
end;
procedure TDlgLockScreen.imgOkClick(Sender: TObject);
begin
edPass.Text := Trim(edPass.Text);
// if edPass.Text = '' then // 빈 패스워드가 들어갈 수 있다. 22_0819 13:05:01 kku
// exit;
if edPass.Text <> sPass_ then
begin
if edPass.Text <> '' then
begin
Inc(nCheckCnt_);
imgMsg.Visible := true;
lbMsg.Caption := Format(RS_InvalidPass + ' (%d)', [nCheckCnt_]);
lbMsg.Visible := true;
edPass.Text := '';
end;
exit;
end;
{$IFDEF _HE_}
TTgTrace.T('화면 잠금 해제됨.', 1);
gMgSvc.SendEventLog(URI_USER_ACTION, LOGCODE_EVENT_SCRNLOCK, 'Screen Unlock', false);
{$ENDIF}
Close;
end;
procedure TDlgLockScreen.imgOkMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetImgBtn(imgBtnList, imgOk, 2);
end;
procedure TDlgLockScreen.imgOkMouseEnter(Sender: TObject);
begin
SetImgBtn(imgBtnList, imgOk, 1);
end;
procedure TDlgLockScreen.imgOkMouseLeave(Sender: TObject);
begin
SetImgBtn(imgBtnList, imgOk, 0);
end;
procedure TDlgLockScreen.lbHintClick(Sender: TObject);
begin
lbMsg.Caption := '힌트 : ' + sPass_;
imgMsg.Visible := true;
lbMsg.Visible := true;
end;
procedure TDlgLockScreen.lbHintMouseEnter(Sender: TObject);
begin
lbHint.Font.Style := lbHint.Font.Style + [fsUnderline];
end;
procedure TDlgLockScreen.lbHintMouseLeave(Sender: TObject);
begin
lbHint.Font.Style := lbHint.Font.Style - [fsUnderline];
end;
end.