unit DFndWndMain; interface uses Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, DAngle, ThdCloseSidebar, Winapi.Windows; type TDlgFndWndMain = class(TForm) toolAddWindow: TBitBtn; Button1: TButton; Button2: TButton; Button3: TButton; procedure toolAddWindowMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure toolAddWindowMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure toolAddWindowMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } hPreTopHWND_: HWND; bSeeking_: Boolean; DlgAngle_: TDlgAngle; ThdCSB_: TThdCloseSidebar; function IsAbleAddWindow(hWindow: HWND): Boolean; public { Public declarations } Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; end; var DlgFndWndMain: TDlgFndWndMain; implementation uses Tocsg.WndUtil, Tocsg.Process, Winapi.WinSvc, Winapi.ActiveX, System.Win.ComObj, Winapi.AccCtrl, Winapi.AclAPI; {$R *.dfm} Constructor TDlgFndWndMain.Create(aOwner: TComponent); begin Inherited Create(aOwner); hPreTopHWND_ := 0; bSeeking_ := false; DlgAngle_ := TDlgAngle.Create(Self); ThdCSB_ := nil; end; Destructor TDlgFndWndMain.Destroy; begin if ThdCSB_ <> nil then FreeAndNil(ThdCSB_); Inherited; end; procedure TDlgFndWndMain.Button1Click(Sender: TObject); begin if ThdCSB_ = nil then begin ThdCSB_ := TThdCloseSidebar.Create(DlgAngle_); ThdCSB_.StartThread; end; end; procedure TDlgFndWndMain.Button2Click(Sender: TObject); begin if ThdCSB_ <> nil then FreeAndNil(ThdCSB_); end; function GetCurrentUserName: string; var UserName: array[0..MAX_PATH - 1] of Char; Size: DWORD; begin Size := SizeOf(UserName); GetUserName(UserName, Size); Result := UserName; end; function DenyAllAccessToFile(const FileName: string): Boolean; var ea: EXPLICIT_ACCESS; pac: PACL; sd: PSECURITY_DESCRIPTOR; begin Result := False; // EXPLICIT_ACCESS ����ü �ʱ�ȭ ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS)); ea.grfAccessPermissions := GENERIC_ALL; ea.grfAccessMode := REVOKE_ACCESS; ea.grfInheritance := NO_INHERITANCE; ea.Trustee.TrusteeForm := TRUSTEE_IS_NAME; ea.Trustee.TrusteeType := TRUSTEE_IS_USER; ea.Trustee.ptstrName := PChar(GetCurrentUserName); // ���� ����� // ACL ���� if SetEntriesInAcl(1, @ea, nil, pac) <> ERROR_SUCCESS then Exit; // ���� ������ �������� if GetNamedSecurityInfo(PChar(FileName), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @pac, nil, @sd) <> ERROR_SUCCESS then begin LocalFree(pac); Exit; end; // ���� ������ ���� if SetNamedSecurityInfo(PChar(FileName), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, pac, nil) <> ERROR_SUCCESS then begin LocalFree(pac); LocalFree(sd); Exit; end; LocalFree(pac); LocalFree(sd); Result := True; end; function ProtectProcess: DWORD; const ACL_REVISION = $00000002; var hProcess: THandle; EmptyDacl: TACL; dwErr: DWORD; begin hProcess := GetCurrentProcess(); if not InitializeAcl(EmptyDacl, sizeof(ACL), ACL_REVISION) then begin dwErr := GetLastError(); end else begin dwErr := SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @EmptyDacl, nil); end; // FreeMem(pEmptyDacl); // Delphi's equivalent of free Result := dwErr; end; procedure TDlgFndWndMain.Button3Click(Sender: TObject); begin ShowMessage(IntToStr(ProtectProcess)); // if DenyAllAccessToFile('C:\Users\kku\Desktop\TEST\test2.log') then // ShowMessage('����') // else // ShowMessage('����'); end; function TDlgFndWndMain.IsAbleAddWindow(hWindow: HWND): Boolean; var sProcName, sClassName: String; hTemp: HWND; begin Result := false; sProcName := UpperCase(GetProcessNameByPid(GetProcessPIDFromWndHandle(hWindow))); // if (WndPages_.GetWndPage(hWindow) <> nil) or // (sProcName = sSelfProcName_) then exit; if sProcName = 'EXPLORER.EXE' then begin sClassName := UpperCase(GetWndClassName(hWindow)); if sClassName <> 'CABINETWCLASS' then exit; hTemp := FindWindowEx(0, 0, 'Progman', 'Program Manager'); if hTemp = 0 then exit; // if GetProcessPIDFromWndHandle(hTemp) = GetProcessPIDFromWndHandle(hWindow) then // exit; end; Result := true; end; procedure TDlgFndWndMain.toolAddWindowMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin bSeeking_ := true; SetCapture(toolAddWindow.Handle); end; procedure TDlgFndWndMain.toolAddWindowMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var pt: TPoint; hTemp, hTopHWND: HWND; WndRect: TRect; sClassName, sProcName: String; begin if bSeeking_ then begin pt.X := X; pt.Y := Y; pt := ClientToScreen(pt); // OutputDebugString(PChar(Format('X=%d, Y=%d', [pt.X, pt.Y]))); hTopHWND := WindowFromPoint(pt); // GetTopParentHWND(WindowFromPoint(pt)); if hTopHWND = 0 then begin hPreTopHWND_ := 0; exit; end; if (hTopHWND <> Handle) and (hTopHWND <> 0) and (hPreTopHWND_ <> hTopHWND) then begin hPreTopHWND_ := 0; DlgAngle_.Hide; if not IsAbleAddWindow(hTopHWND) then exit; hPreTopHWND_ := hTopHWND; GetWindowRect(hPreTopHWND_, WndRect); DlgAngle_.ShowAngle(WndRect); // OutputDebugString(PChar(GetWindowCaption(hTopHWND))); end; end; end; procedure TDlgFndWndMain.toolAddWindowMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin DlgAngle_.Hide; ReleaseCapture; bSeeking_ := false; try if (hPreTopHWND_ <> 0) and (hPreTopHWND_ <> Handle) then begin ShowMessage(Format('%s, PID=%d, HWND=%d', [GetWindowCaption(hPreTopHWND_), GetProcessPIDFromWndHandle(hPreTopHWND_), hPreTopHWND_])); // SendMessage(hPreTopHWND_, WM_QUIT, 0, 0); // SendMessage(hPreTopHWND_, WM_CLOSE, 0, 0); // ShowWindow(hPreTopHWND_, SW_HIDE); // EnableWindow(hPreTopHWND_, false); // DestroyWindow(hPreTopHWND_); // SetWindowPos(hPreTopHWND_, 0, 0, 0, 1, 1, SWP_NOMOVE or SWP_NOZORDER); end; finally hPreTopHWND_ := 0; end; end; end.