282 lines
7.1 KiB
Plaintext
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.
|