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