BSOne.SFC/Tocsg.Module/PrintMark/DLL_PrintMark/PrintHook.pas

3183 lines
105 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{*******************************************************}
{ }
{ PrintHook }
{ }
{ Copyright (C) 2022 kku }
{ }
{*******************************************************}
unit PrintHook;
interface
uses
System.SysUtils, System.Classes, Tocsg.DllEntry, Tocsg.CommonData,
GlobalDefine, Winapi.Windows, Winapi.Messages, Winapi.ShellAPI,
Tocsg.Trace, Vcl.Graphics, System.Generics.Collections, EM.GDIPAPI;
const
IGNORE_PROCESS = '1explorer.exe|taskmgr.exe|dropbox.exe|kakaotalk.exe|telegram.exe|' +
'regedit.exe|eCrmHomeEdition.exe|Everything.exe|Listary.exe|' +
'OpenWith.exe|conhost.exe|PrintMark.exe|Evernote.exe';
SMALL_FONT = 'chrome.exe|msedge.exe|Evernote.exe';
// START_PROCESS = 'excel.exe';
END_PROCESS = 'chrome.exe|msedge.exe|Honeyview.exe|POWERPNT.EXE|' + // 'ApplicationFrameHost.exe|' +
'mspaint.exe|Acrobat.exe|Evernote.exe';
WORD_GAP = ' ';
CaptureBlt = $40000000;
type
TPrintHook = class(TTgDllEntry)
private
SharedData_: TTgFileMapping<TSharedData>;
Trace_: TTgTrace;
dtCreate_: TDateTime;
hProcWnd_: HWND;
hWndHook_,
hMsgHook_,
hCbtHook_,
hShellHook_: HHook;
sCurDocName_,
sPtrText_,
sImgPath_,
sLogPath_: String;
bIsStartPage_,
bIsPrinting_,
bIsWaterMaking_,
bInitOk_,
bBlockDrop_,
bEndDocProc_,
bSmallFont_: Boolean;
OFList_: TStringList;
// DcFileH_: TDictionary<THandle,String>;
CurPtrDC_: HDC;
nPtrCnt_: Integer;
PtrBmp_: TBitmap;
ProcList_: TList<PPointer>;
procedure Log(sLog: String);
procedure DoInterceptCreate;
procedure DoInterceptRemove;
function InstallHook: Integer;
function UnInstallHook: Integer;
function GetActive: Boolean;
function GetRcvWnd: LONGLONG;
function GetText: String;
function GetImagePath: String;
function GetFontSize: Integer;
function GetLineCount: Integer;
procedure SetPtrInfo(sInfo: String);
procedure SetCurDocName(sName: String);
public
Constructor Create;
Destructor Destroy; override;
function IsAblePrintDrawCopy: Boolean;
property Active: Boolean read GetActive;
property RcvWnd: LONGLONG read GetRcvWnd;
property Text: String read GetText;
property ImagePath : String read GetImagePath;
property FontSize: Integer read GetFontSize;
property LineCount: Integer read GetLineCount;
property PtrInfo: String write SetPtrInfo;
property CurDocName: String read sCurDocName_ write SetCurDocName;
end;
TFun_CreateFileA = function(lpFileName: PAnsiChar; dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition,
dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; stdcall;
TFun_CreateFileW = function(lpFileName: PWideChar; dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition,
dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; stdcall;
TFun_CloseHandle = function(hObject: THandle): BOOL; stdcall;
TFun_StartDocA = function(dc: HDC; pDocInfo: PDocInfoA): Integer; stdcall;
TFun_StartDocW = function(dc: HDC; pDocInfo: PDocInfoW): Integer; stdcall;
TFun_HDC = function(dc: HDC): Integer; stdcall;
TFun_DragQueryFileA = function(Drop: HDROP; FileIndex: UINT; FileName: LPSTR; cb: UINT): UINT; stdcall;
TFun_DragQueryFileW = function(Drop: HDROP; FileIndex: UINT; FileName: LPWSTR; cb: UINT): UINT; stdcall;
TFun_DrawTextA = function(hDC: HDC; lpString: LPCSTR; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
TFun_DrawTextW = function(hDC: HDC; lpString: LPCWSTR; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
TFun_DrawTextExA = function(DC: HDC; lpchText: LPCSTR; cchText: Integer; var p4: TRect;
dwDTFormat: UINT; DTParams: PDrawTextParams): Integer; stdcall;
TFun_DrawTextExW = function(DC: HDC; lpchText: LPCWSTR; cchText: Integer; var p4: TRect;
dwDTFormat: UINT; DTParams: PDrawTextParams): Integer; stdcall;
TFun_ExtTextOutA = function(DC: HDC; X, Y: Integer; Options: Longint;
Rect: PRect; Str: LPCSTR; Count: Longint; Dx: PInteger): BOOL; stdcall;
TFun_ExtTextOutW = function(DC: HDC; X, Y: Integer; Options: Longint;
Rect: PRect; Str: LPCWSTR; Count: Longint; Dx: PInteger): BOOL; stdcall;
TFun_TextOutA = function(DC: HDC; X, Y: Integer; Str: LPCSTR; Count: Integer): BOOL; stdcall;
TFun_TextOutW = function(DC: HDC; X, Y: Integer; Str: LPCWSTR; Count: Integer): BOOL; stdcall;
TFun_PolyTextOutA = function(DC: HDC; const PolyTextArray; Strings: Integer): BOOL; stdcall;
TFun_PolyTextOutW = function(DC: HDC; const PolyTextArray; Strings: Integer): BOOL; stdcall;
TFun_TabbedTextOutA = function(hDC: HDC; X, Y: Integer; lpString: LPCSTR; nCount, nTabPositions: Integer;
var lpnTabStopPositions; nTabOrigin: Integer): Longint; stdcall;
TFun_TabbedTextOutW = function(hDC: HDC; X, Y: Integer; lpString: LPCWSTR; nCount, nTabPositions: Integer;
var lpnTabStopPositions; nTabOrigin: Integer): Longint; stdcall;
TFun_SetWindowTextA = function(hWnd: HWND; lpString: LPCSTR): BOOL; stdcall;
TFun_SetWindowTextW = function(hWnd: HWND; lpString: LPCWSTR): BOOL; stdcall;
TFun_MessageBoxA = function(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT): Integer; stdcall;
TFun_MessageBoxW = function(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;
TFun_MessageBoxExA = function(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT; wLanguageId: Word): Integer; stdcall;
TFun_MessageBoxExW = function(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT; wLanguageId: Word): Integer; stdcall;
TFun_BitBlt = function(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;
TFun_StretchBlt = function(DestDC: HDC; X, Y, SrcWidth, SrcHeight: Integer; SrcDC: HDC;
XSrc, YSrc, DestWidth, DestHeight: Integer; Rop: DWORD): BOOL; stdcall;
TFun_TransparentBlt = function(DestDC: HDC; X, Y, DestWidth, DestHeight: Integer; SrcDC: HDC;
XSrc, YSrc, SrcWidth, SrcHeight: Integer; dwTransparent: DWORD): BOOL; stdcall;
TFun_StretchDIBits = function(DC: HDC; DestX, DestY, DestWidth, DestHeight, SrcX,
SrcY, SrcWidth, SrcHeight: Integer; Bits: Pointer; var BitsInfo: TBitmapInfo;
Usage: UINT; Rop: DWORD): Integer; stdcall;
TFun_SetDIBitsToDevice = function(DC: HDC; DestX, DestY: Integer; Width, Height: DWORD;
SrcX, SrcY: Integer; nStartScan, NumScans: UINT; Bits: Pointer;
var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;
TFun_PatBlt = function(DC: HDC; X, Y, Width, Height: Integer; Rop: DWORD): BOOL; stdcall;
TFun_SetMapperFlags = function(DC: HDC; Flag: DWORD): DWORD; stdcall;
TFun_SetGraphicsMode = function(hdc: HDC; iMode: Integer): Integer; stdcall;
TFun_SetMapMode = function(DC: HDC; p2: Integer): Integer; stdcall;
TFun_SetPixel = function(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;
TFun_SetPixelV = function(DC: HDC; X, Y: Integer; Color: COLORREF): BOOL; stdcall;
TFun_LineTo = function(DC: HDC; X, Y: Integer): BOOL; stdcall;
TFun_MoveToEx = function(DC: HDC; p2, p3: Integer; p4: PPoint): BOOL; stdcall;
TFun_Pie = function(DC: HDC; X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): BOOL; stdcall;
TFun_PaintRgn = function(DC: HDC; RGN: HRGN): BOOL; stdcall;
TFun_PolyPolygon = function(DC: HDC; var Points; var nPoints; p4: Integer): BOOL; stdcall;
TFun_Rectangle = function(DC: HDC; X1, Y1, X2, Y2: Integer): BOOL; stdcall;
TFun_StrokePath = function(DC: HDC): BOOL; stdcall;
TFun_StrokeAndFillPath = function(DC: HDC): BOOL; stdcall;
TFun_BeginPath = function(DC: HDC): BOOL; stdcall;
TFun_EndPath = function(DC: HDC): BOOL; stdcall;
TFun_FillPath = function(DC: HDC): BOOL; stdcall;
TFun_FlattenPath = function(DC: HDC): BOOL; stdcall;
TFun_WidenPath = function(DC: HDC): BOOL; stdcall;
TFun_CreatePen = function(Style, Width: Integer; Color: COLORREF): HPEN; stdcall;
TFun_SelectObject = function(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
TFun_DeleteObject = function(p1: HGDIOBJ): BOOL; stdcall;
TFun_Arc = function(hDC: HDC; left, top, right, bottom, startX, startY, endX, endY: Integer): BOOL; stdcall;
TFun_Chord = function(DC: HDC; X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): BOOL; stdcall;
TFun_DrawEscape = function(DC: HDC; p2, p3: Integer; p4: LPCSTR): BOOL; stdcall;
TFun_Ellipse = function(DC: HDC; X1, Y1, X2, Y2: Integer): BOOL; stdcall;
TFun_RoundRect = function(DC: HDC; X1, Y1, X2, Y2, X3, Y3: Integer): BOOL; stdcall;
TFun_AngleArc = function(DC: HDC; p2, p3: Integer; p4: DWORD; p5, p6: Single): BOOL; stdcall;
TFun_ArcTo = function(DC: HDC; RLeft, RTop, RRight, RBottom: Integer; X1, Y1, X2, Y2: Integer): BOOL; stdcall;
TFun_PolyPolyline = function(DC: HDC; const PointStructs; const Points; p4: DWORD): BOOL; stdcall;
TFun_PolyDraw = function(DC: HDC; const Points, Types; cCount: Integer): BOOL; stdcall;
TFun_Polygon = function(DC: HDC; const Points; Count: Integer): BOOL; stdcall;
TFun_Polyline = function(DC: HDC; const Points; Count: Integer): BOOL; stdcall;
TFun_PolyBezier = function(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
TFun_PolyBezierTo = function(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
TFun_PolyLineTo = function(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
TFun_SetPolyFillMode = function(DC: HDC; PolyFillMode: Integer): Integer; stdcall;
TFun_ExtFloodFill = function(DC: HDC; X, Y: Integer; Color: COLORREF; FillType: UINT): BOOL; stdcall;
TFun_FloodFill = function(DC: HDC; nXStart, nYStart: Integer; crFill: COLORREF): BOOL; stdcall;
TFun_FillRgn = function(DC: HDC; hrgn: HRGN; hbr: HBRUSH): BOOL; stdcall;
TFun_FillRect = function(hDC: HDC; const lprc: TRect; hbr: HBRUSH): Integer; stdcall;
TFun_FrameRect = function(hDC: HDC; const lprc: TRect; hbr: HBRUSH): Integer; stdcall;
TFun_GradientFill = function(DC: HDC; Vertex: PTriVertex; NumVertex: ULONG; Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall;
TFun_SetDCBrushColor = function(DC: HDC; Color: COLORREF): COLORREF; stdcall;
TFun_SetDCPenColor = function(DC: HDC; Color: COLORREF): COLORREF; stdcall;
TFun_SetDIBColorTable = function(DC: HDC; p2, p3: UINT; var RGBQuadSTructs): UINT; stdcall;
TFun_SetBkColor = function(DC: HDC; Color: COLORREF): COLORREF; stdcall;
TFun_SetTextAlign = function(DC: HDC; Flags: UINT): UINT; stdcall;
TFun_SetColorAdjustment = function(DC: HDC; const p2: TColorAdjustment): BOOL; stdcall;
TFun_SetArcDirection = function(DC: HDC; Direction: Integer): Integer; stdcall;
TFun_SetViewportExtEx = function(DC: HDC; XExt, YExt: Integer; Size: PSize): BOOL; stdcall;
TFun_SetViewportOrgEx = function(DC: HDC; X, Y: Integer; Point: PPoint): BOOL; stdcall;
TFun_SetICMMode = function(DC: HDC; Mode: Integer): Integer; stdcall;
TFun_SetColorSpace = function(DC: HDC; ColorSpace: HCOLORSPACE): BOOL; stdcall;
TFun_CreateDIBitmap = function(DC: HDC; var InfoHeader: TBitmapInfoHeader;
dwUsage: DWORD; InitBits: Pointer; var InitInfo: TBitmapInfo;
wUsage: UINT): HBITMAP; stdcall;
TFun_SetDIBits = function(DC: HDC; Bitmap: HBITMAP; StartScan, NumScans: UINT;
Bits: Pointer; var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;
TFun_MaskBlt = function(DestDC: HDC; XDest, YDest, Width, Height: Integer; SrcDC: HDC;
XScr, YScr: Integer; Mask: HBITMAP; xMask, yMask: Integer; Rop: DWORD): BOOL; stdcall;
TFun_PlgBlt = function(DestDC: HDC; const PointsArray; SrcDC: HDC;
XSrc, YSrc, Width, Height: Integer; Mask: HBITMAP; xMask, yMask: Integer): BOOL; stdcall;
TFun_GdipDrawRectangle = function(graphics: GPGRAPHICS; pen: GPPEN; x: Single;
y: Single; width: Single; height: Single): GPSTATUS; stdcall;
TFun_GdipDrawRectangleI = function(graphics: GPGRAPHICS; pen: GPPEN; x: Integer;
y: Integer; width: Integer; height: Integer): GPSTATUS; stdcall;
TFun_GdipDrawRectangles = function(graphics: GPGRAPHICS; pen: GPPEN; rects: GPRECTF;
count: Integer): GPSTATUS; stdcall;
TFun_GdipDrawRectanglesI = function(graphics: GPGRAPHICS; pen: GPPEN; rects: GPRECT;
count: Integer): GPSTATUS; stdcall;
TFun_GdipDrawLine = function(graphics: GPGRAPHICS; pen: GPPEN; x1: Single;
y1: Single; x2: Single; y2: Single): GPSTATUS; stdcall;
TFun_GdipDrawLineI = function(graphics: GPGRAPHICS; pen: GPPEN; x1: Integer;
y1: Integer; x2: Integer; y2: Integer): GPSTATUS; stdcall;
TFun_GdipDrawLines = function(graphics: GPGRAPHICS; pen: GPPEN; points: GPPOINTF;
count: Integer): GPSTATUS; stdcall;
TFun_GdipDrawLinesI = function(graphics: GPGRAPHICS; pen: GPPEN; points: GPPOINT;
count: Integer): GPSTATUS; stdcall;
function InstallPrintHook: Integer; export; stdcall;
function UninstallPrintHook: Integer; export; stdcall;
implementation
uses
DDetours, Vcl.Imaging.pngimage, Vcl.Imaging.jpeg, Tocsg.Safe,
Tocsg.Path, Tocsg.Strings, Tocsg.WndUtil, Tocsg.Process, Tocsg.Convert;
var
_PrintHook: TPrintHook = nil;
_bLogProcessing: Boolean = false;
ozStartDocA: TFun_StartDocA = nil;
ozStartDocW: TFun_StartDocW = nil;
ozCloseHandle: TFun_CloseHandle = nil;
ozStartPage: TFun_HDC = nil;
// ozBeginPath: TFun_HDC = nil;
// ozFillPath: TFun_HDC = nil;
ozEndPage: TFun_HDC = nil;
ozEndDoc: TFun_HDC = nil;
ozDragQueryFileA: TFun_DragQueryFileA = nil;
ozDragQueryFileW: TFun_DragQueryFileW = nil;
ozDrawTextA: TFun_DrawTextA = nil;
ozDrawTextW: TFun_DrawTextW = nil;
ozDrawTextExA: TFun_DrawTextExA = nil;
ozDrawTextExW: TFun_DrawTextExW = nil;
ozExtTextOutA: TFun_ExtTextOutA = nil;
ozExtTextOutW: TFun_ExtTextOutW = nil;
ozTextOutA: TFun_TextOutA = nil;
ozTextOutW: TFun_TextOutW = nil;
ozPolyTextOutA: TFun_PolyTextOutA = nil;
ozPolyTextOutW: TFun_PolyTextOutW = nil;
ozTabbedTextOutA: TFun_TabbedTextOutA = nil;
ozTabbedTextOutW: TFun_TabbedTextOutW = nil;
ozSetWindowTextA: TFun_SetWindowTextA = nil;
ozSetWindowTextW: TFun_SetWindowTextW = nil;
ozMessageBoxA: TFun_MessageBoxA = nil;
ozMessageBoxW: TFun_MessageBoxW = nil;
ozMessageBoxExA: TFun_MessageBoxExA = nil;
ozMessageBoxExW: TFun_MessageBoxExW = nil;
ozCreateFileA: TFun_CreateFileA = nil;
ozCreateFileW: TFun_CreateFileW = nil;
ozBitBlt: TFun_BitBlt = nil;
ozStretchBlt: TFun_StretchBlt = nil;
ozTransparentBlt: TFun_TransparentBlt = nil;
ozStretchDIBits: TFun_StretchDIBits = nil;
ozPatBlt: TFun_PatBlt = nil;
ozSetMapperFlags: TFun_SetMapperFlags = nil;
ozSetGraphicsMode: TFun_SetGraphicsMode = nil;
ozSetMapMode: TFun_SetMapMode = nil;
ozLineTo: TFun_LineTo = nil;
ozMoveToEx: TFun_MoveToEx = nil;
ozPie: TFun_Pie = nil;
ozPaintRgn: TFun_PaintRgn = nil;
ozPolyPolygon: TFun_PolyPolygon = nil;
ozRectangle: TFun_Rectangle = nil;
ozStrokePath: TFun_StrokePath = nil;
ozStrokeAndFillPath: TFun_StrokeAndFillPath = nil;
ozBeginPath: TFun_BeginPath = nil;
ozEndPath: TFun_EndPath = nil;
ozFillPath: TFun_FillPath = nil;
ozCreatePen: TFun_CreatePen = nil;
ozSelectObject: TFun_SelectObject = nil;
ozDeleteObject: TFun_DeleteObject = nil;
ozSetPixel: TFun_SetPixel = nil;
ozSetPixelV: TFun_SetPixelV = nil;
ozFlattenPath: TFun_FlattenPath = nil;
ozWidenPath: TFun_WidenPath = nil;
ozArc: TFun_Arc = nil;
ozChord: TFun_Chord = nil;
ozDrawEscape: TFun_DrawEscape = nil;
ozEllipse: TFun_Ellipse = nil;
ozRoundRect: TFun_RoundRect = nil;
ozAngleArc: TFun_AngleArc = nil;
ozArcTo: TFun_ArcTo = nil;
ozPolyPolyline: TFun_PolyPolyline = nil;
ozPolyDraw: TFun_PolyDraw = nil;
ozPolygon: TFun_Polygon = nil;
ozPolyline: TFun_Polyline = nil;
ozPolyBezier: TFun_PolyBezier = nil;
ozPolyBezierTo: TFun_PolyBezierTo = nil;
ozPolyLineTo: TFun_PolyLineTo = nil;
ozSetPolyFillMode: TFun_SetPolyFillMode = nil;
ozExtFloodFill: TFun_ExtFloodFill = nil;
ozFloodFill: TFun_FloodFill = nil;
ozFillRgn: TFun_FillRgn = nil;
ozFillRect: TFun_FillRect = nil;
ozFrameRect: TFun_FrameRect = nil;
ozGradientFill: TFun_GradientFill = nil;
ozSetDCBrushColor: TFun_SetDCBrushColor = nil;
ozSetDCPenColor: TFun_SetDCPenColor = nil;
ozSetDIBColorTable: TFun_SetDIBColorTable = nil;
ozSetColorAdjustment: TFun_SetColorAdjustment = nil;
ozSetArcDirection: TFun_SetArcDirection = nil;
ozSetViewportExtEx: TFun_SetViewportExtEx = nil;
ozSetViewportOrgEx: TFun_SetViewportOrgEx = nil;
ozSetICMMode: TFun_SetICMMode = nil;
ozSetColorSpace: TFun_SetColorSpace = nil;
ozCreateDIBitmap: TFun_CreateDIBitmap = nil;
ozSetDIBits: TFun_SetDIBits = nil;
ozMaskBlt: TFun_MaskBlt = nil;
ozPlgBlt: TFun_PlgBlt = nil;
ozSetBkColor: TFun_SetBkColor = nil;
ozSetTextAlign: TFun_SetTextAlign = nil;
ozSetDIBitsToDevice: TFun_SetDIBitsToDevice = nil;
ozGdipDrawRectangle: TFun_GdipDrawRectangle = nil;
ozGdipDrawRectangleI: TFun_GdipDrawRectangleI = nil;
ozGdipDrawRectangles: TFun_GdipDrawRectangles = nil;
ozGdipDrawRectanglesI: TFun_GdipDrawRectanglesI = nil;
ozGdipDrawLine: TFun_GdipDrawLine = nil;
ozGdipDrawLineI: TFun_GdipDrawLineI = nil;
ozGdipDrawLines: TFun_GdipDrawLines = nil;
ozGdipDrawLinesI: TFun_GdipDrawLinesI = nil;
function process_WH_CALLWNDPROC(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
cwp: PCWPStruct;
begin
if Assigned(_PrintHook) then
Result := CallNextHookEx(_PrintHook.hWndHook_, nCode, wParam, lParam)
else
Result := 0;
end;
function process_WH_GETMESSAGE(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if Assigned(_PrintHook) then
Result := CallNextHookEx(_PrintHook.hMsgHook_, nCode, wParam, lParam)
else
Result := 0;
end;
function process_WH_CBT(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if Assigned(_PrintHook) then
begin
try
try
if nCode >= HC_ACTION then
case nCode of
HCBT_CREATEWND : ; // <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, WM_CREATE, WM_NCCREATE <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܰ<EFBFBD>
HCBT_DESTROYWND : ; // <20><><EFBFBD><EFBFBD><EFBFBD><20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_ACTIVATE : ; // <20><><EFBFBD><EFBFBD><EFBFBD>찡 Ȱ<><C8B0>ȭ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_CLICKSKIPPED : ; // <20><><EFBFBD><20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_KEYSKIPPED : ; // Ű<><C5B0><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> ť<><C5A5><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_MINMAX : ; // <20><><EFBFBD><EFBFBD><EFBFBD><20>ּ<EFBFBD>ȭ/<2F>ִ<EFBFBD>ȭ<EFBFBD><C8AD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_MOVESIZE : ; // <20><><EFBFBD><EFBFBD><EFBFBD><20>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD>ų<EFBFBD> ũ<><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_QS : ; // <20>ý<EFBFBD><C3BD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> ť<>κ<EFBFBD><CEBA><EFBFBD> WM_QUEUESYNC <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޹<EFBFBD><DEB9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_SETFOCUS : ; // <20><><EFBFBD><EFBFBD><EFBFBD>찡 Ű<><C5B0><EFBFBD><EFBFBD> <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HCBT_SYSCOMMAND : ; // <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD>(WM_SYSCOMMAND)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end;
except
exit;
end;
finally
Result := CallNextHookEx(_PrintHook.hCbtHook_, nCode, wParam, lParam);
end;
end else
Result := 0;//CallNextHookEx(0, nCode, wParam, lParam);
end;
function process_WH_SHELL(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
i: Integer;
sTitle: String;
begin
if Assigned(_PrintHook) then
begin
try
try
if nCode >= HC_ACTION then
case nCode of
// HSHELL_ACCESSIBILITYSTATE : _PrintHook.Log('HSHELL_ACCESSIBILITYSTATE'); // Windows 2000/XP: accessibility <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>
// HSHELL_APPCOMMAND : _PrintHook.Log('HSHELL_APPCOMMAND'); // Windows 2000/XP: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Է<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ؼ<EFBFBD> WM_APPCOMMAND <20><> <20>߻<EFBFBD><DFBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// HSHELL_ACTIVATESHELLWINDOW : _PrintHook.Log('HSHELL_ACTIVATESHELLWINDOW'); // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>찡 Ȱ<><C8B0>ȭ <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// HSHELL_GETMINRECT : _PrintHook.Log('HSHELL_GETMINRECT'); // <20><><EFBFBD><EFBFBD><EFBFBD><20>ּ<EFBFBD>ȭ/<2F>ִ<EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// HSHELL_LANGUAGE : _PrintHook.Log('HSHELL_LANGUAGE'); // Ű<><C5B0><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ǰų<C7B0> <20><><EFBFBD>ο<EFBFBD> Ű<><C5B0><EFBFBD><EFBFBD> <20><><EFBFBD>̾ƿ<CCBE><C6BF><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HSHELL_REDRAW, // <20>½<EFBFBD>ũ<EFBFBD>ٿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>Ʋ<EFBFBD><C6B2> <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HSHELL_WINDOWACTIVATED : // ž <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
begin
if _PrintHook.hProcWnd_ = 0 then
_PrintHook.hProcWnd_ := wParam;
end;
HSHELL_WINDOWCREATED : ; // ž <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>
HSHELL_WINDOWDESTROYED : ; // ž <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
HSHELL_WINDOWREPLACED : ;//_PrintHook.Log('HSHELL_WINDOWREPLACED'); // Windows XP: ž <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><>ü(replaced)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end;
except
exit;
end;
finally
Result := CallNextHookEx(_PrintHook.hShellHook_, nCode, wParam, lParam);
end;
end else
Result := 0;
end;
const
PRINT_PATH_EXT = 'DOC|DOCX|PPT|PPTX|XLS|XLSX|TXT|RTF|LOG|PDF|JPG|JPEG|PSD|' +
'BMP|PNG|HWP|HWPX|HTML|HTM|XML';
function CreateFileAHook(lpFileName: PAnsiChar; dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition,
dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; stdcall;
begin
Result := ozCreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
// if (_PrintHook <> nil) and _PrintHook.Active then
begin
if CompareText(PChar(_PrintHook.sLogPath_), PChar(String(AnsiString(lpFileName)))) = 0 then
exit;
if (Result <> 0) and (Result <> INVALID_HANDLE_VALUE) then
begin
var sPath: AnsiString := AnsiString(lpFileName);
if Pos(GetFileExt(sPath).ToUpper, PRINT_PATH_EXT) = 0 then
exit;
if (_PrintHook.OFList_ <> nil) and (_PrintHook.OFList_.IndexOf(sPath) = -1) then
_PrintHook.OFList_.Add(sPath);
end;
end;
end;
function CreateFileWHook(lpFileName: PWideChar; dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition,
dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle; stdcall;
begin
Result := ozCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
// if (_PrintHook <> nil) and _PrintHook.Active then
begin
if CompareText(PChar(_PrintHook.sLogPath_), lpFileName) = 0 then
exit;
if (Result <> 0) and (Result <> INVALID_HANDLE_VALUE) then
begin
var sPath: String := String(lpFileName);
if Pos(GetFileExt(sPath).ToUpper, PRINT_PATH_EXT) = 0 then
exit;
if (_PrintHook.OFList_ <> nil) and (_PrintHook.OFList_.IndexOf(sPath) = -1) then
_PrintHook.OFList_.Add(sPath);
end;
// if (Result <> 0) and (Result <> INVALID_HANDLE_VALUE) and (_PrintHook.DcFileH_ <> nil) then
// begin
// var sPath: String := String(lpFileName);
//// var sFName: String := ExtractFileName(sPath);
////
//// if sFName = '' then
//// exit;
////
//// if Length(sPath) < 2 then
//// exit;
////
//// if sPath[2] <> ':' then
//// exit;
////
//// if GetFileExt(sPath).ToUpper = 'EXE' then
//// exit;
//
// if Pos(GetFileExt(sPath).ToUpper, PRINT_PATH_EXT) = 0 then
// exit;
//
//// if CompareText(_PrintHook.ModuleName, 'notepad.exe') = 0 then
//// _PrintHook.Log(Format('lpFileName = %s', [sPath]));
//
// // <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>а<EFBFBD> <20>ٷ<EFBFBD> <20>ݾƹ<DDBE><C6B9><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD><EFBFBD><EFBFBD>ұ<EFBFBD> 22_0916 14:31:55 kku
// if not _PrintHook.DcFileH_.ContainsKey(Result) then
// begin
// _PrintHook.DcFileH_.Add(Result, sPath);
// end;
// end;
end;
end;
function CloseHandleHook(hObject: THandle): BOOL; stdcall;
begin
// if _PrintHook.DcFileH_ <> nil then
// begin
// if _PrintHook.DcFileH_.ContainsKey(hObject) then
// _PrintHook.DcFileH_.Remove(hObject);
// end;
Result := ozCloseHandle(hObject);
end;
function StartDocAHook(DC: HDC; pDocInfo: PDocInfoA): Integer; stdcall;
var
sFName,
sChkDoc,
sDocName: AnsiString;
enum: TEnumerator<String>;
i: Integer;
begin
sDocName := AnsiString(pDocInfo.lpszDocName);
if (_PrintHook <> nil) and _PrintHook.Active then
begin
_PrintHook.nPtrCnt_ := 0;
_PrintHook.CurDocName := sDocName;
// if _PrintHook.hProcWnd_ = 0 then
// _PrintHook.hProcWnd_ := GetWndHandleFromPID(GetCurrentProcessId);
if _PrintHook.OFList_ <> nil then
begin
sChkDoc := UpperCase(sDocName);
for i := 0 to _PrintHook.OFList_.Count - 1 do
begin
sFName := UpperCase(ExtractFileName(_PrintHook.OFList_[i]));
// _PrintHook.Log('StartDocAHook() - File1 = ' + sFName);
if Pos(sFName, sChkDoc) > 0 then
sDocName := _PrintHook.OFList_[i];
end;
end;
var sInfo: String;
sInfo := _PrintHook.ModuleName;
if _PrintHook.hProcWnd_ <> 0 then
SumString(sInfo, GetWindowCaption(_PrintHook.hProcWnd_), '|')
else
SumString(sInfo, 'None', '|');
SumString(sInfo, sDocName, '|');
_PrintHook.PtrInfo := sInfo;
PostMessage(_PrintHook.RcvWnd, WM_CATCH_PRINT, 0, 0);
end;
_PrintHook.Log('StartDocAHook() - lpszDocName = ' + sDocName);
// _PrintHook.Log('StartDocAHook() - lpszOutput = ' + AnsiString(pDocInfo.lpszOutput));
// _PrintHook.Log('StartDocAHook() - lpszDatatype = ' + AnsiString(pDocInfo.lpszDatatype));
_PrintHook.sPtrText_ := '';
if FileExists(_PrintHook.sLogPath_) then
DeleteFile(PChar(ExtractFilePath(_PrintHook.sLogPath_) + 'PrintText.txt'));
Result := ozStartDocA(dc, pDocInfo);
end;
function StartDocWHook(dc: HDC; pDocInfo: PDocInfoW): Integer; stdcall;
var
sFName,
sChkDoc,
sDocName: String;
enum: TEnumerator<String>;
i: Integer;
begin
sDocName := String(pDocInfo.lpszDocName);
// if _PrintHook.DcFileH_ <> nil then
// begin
// sChkDoc := UpperCase(sDocName);
// Guard(enum, _PrintHook.DcFileH_.Values.GetEnumerator);
// while enum.MoveNext do
// begin
// _PrintHook.Log('StartDocAHook() - File = ' + enum.Current);
// sFName := UpperCase(ExtractFileName(enum.Current));
// if Pos(sFName, sChkDoc) > 0 then
// sDocName := enum.Current;
// end;
// end;
if (_PrintHook <> nil) and _PrintHook.Active then
begin
_PrintHook.nPtrCnt_ := 0;
_PrintHook.CurDocName := sDocName;
// if _PrintHook.hProcWnd_ = 0 then
// _PrintHook.hProcWnd_ := GetWndHandleFromPID(GetCurrentProcessId);
if _PrintHook.OFList_ <> nil then
begin
sChkDoc := UpperCase(sDocName);
for i := 0 to _PrintHook.OFList_.Count - 1 do
begin
sFName := UpperCase(ExtractFileName(_PrintHook.OFList_[i]));
_PrintHook.Log('StartDocAHook() - File1 = ' + sFName);
if Pos(sFName, sChkDoc) > 0 then
sDocName := _PrintHook.OFList_[i];
end;
end;
var sInfo: String;
sInfo := _PrintHook.ModuleName;
if _PrintHook.hProcWnd_ <> 0 then
SumString(sInfo, GetWindowCaption(_PrintHook.hProcWnd_), '|')
else
SumString(sInfo, 'None', '|');
SumString(sInfo, sDocName, '|');
_PrintHook.PtrInfo := sInfo;
PostMessage(_PrintHook.RcvWnd, WM_CATCH_PRINT, 0, 0);
end;
_PrintHook.Log('StartDocWHook() - lpszDocName = ' + sDocName);
// _PrintHook.Log('StartDocWHook() - lpszOutput = ' + String(pDocInfo.lpszOutput));
// _PrintHook.Log('StartDocWHook() - lpszDatatype = ' + String(pDocInfo.lpszDatatype));
_PrintHook.sPtrText_ := '';
if FileExists(_PrintHook.sLogPath_) then
DeleteFile(PChar(ExtractFilePath(_PrintHook.sLogPath_) + 'PrintText.txt'));
Result := ozStartDocW(dc, pDocInfo);
end;
function blur(source:TBitmap):TBitmap;
var
x,y:integer;
tline, mline, bline:PByteArray;
begin
for y := 1 to source.Height - 2 do begin
tline := source.ScanLine[y-1];
mline := source.ScanLine[y];
bline := source.ScanLine[y+1];
for x := 1 to source.Width - 2 do begin
mline^[x*3] := (mline^[x*3 - 3] + mline^[x*3 + 3] +
tline^[x*3 - 3] + tline^[x*3 + 3] + tline^[x*3] +
mline^[x*3 - 3] + mline^[x*3 + 3] + mline^[x*3]) div 8;
mline^[x*3+1] := (mline^[x*3 - 2] + mline^[x*3 + 4] +
tline^[x*3 - 2] + tline^[x*3 + 4] + tline^[x*3+1] +
mline^[x*3 - 2] + mline^[x*3 + 4] + mline^[x*3+1]) div 8;
mline^[x*3+2] := (mline^[x*3 - 1] + mline^[x*3 + 5] +
tline^[x*3 - 1] + tline^[x*3 + 5] + tline^[x*3+2] +
mline^[x*3 - 1] + mline^[x*3 + 5] + mline^[x*3+2]) div 8;
end;
end;
result := source;
end;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 22_0916 09:57:52 kku
{
function ProcessWatermark(DC: HDC): Boolean;
var
nW, nH,
nX, i,
nGapH, nRepeat: Integer;
sExt,
sOut,
sImgPath: String;
MemCanvas: TCanvas;
hbmp,
hOldBmp: HBITMAP;
bf: BLENDFUNCTION;
bmp: TBitmap;
bImgLoad,
bAlphaSupport: Boolean;
pen: HPEN;
begin
Result := false;
try
nW := GetDeviceCaps(DC, HORZRES);
nH := GetDeviceCaps(DC, VERTRES);
Guard(MemCanvas, TCanvas.Create);
MemCanvas.Handle := CreateCompatibleDC(DC);
hbmp := CreateCompatibleBitmap(DC, nW, nH);
hOldBmp := SelectObject(MemCanvas.Handle, hbmp);
_PrintHook.Log(Format('ProcessWatermark() - DocSize W=%d, H=%d, dc=%d', [nW, nH, DC]));
bImgLoad := false;
Guard(bmp, TBitmap.Create);
PatBlt(MemCanvas.Handle, 0, 0, nW, nH, WHITENESS);
sImgPath := _PrintHook.SharedData_.Data.sImgPath;
if FileExists(sImgPath) then
begin
try
sOut := GetFileExt(sImgPath).ToUpper;
if sOut = 'PNG' then
begin
var png: TPngImage;
Guard(png, TPngImage.Create);
png.LoadFromFile(sImgPath);
bmp.Assign(png);
end else
if (sOut = 'JPG') or (sOut = 'JPEG') then
begin
var jpg: TJPEGImage;
Guard(jpg, TJPEGImage.Create);
jpg.LoadFromFile(sImgPath);
bmp.Assign(jpg);
end else
if sOut = 'bmp' then
bmp.LoadFromFile(sImgPath);
// bmp := blur(bmp);
// BitBlt(MemCanvas.Handle, (nW div 2) - (bmp.Width div 2),
// (nH div 2) - (bmp.Height div 2),
// bmp.Width, bmp.Height, bmp.Canvas.Handle, 0, 0, SRCCOPY);
if not StretchBlt(MemCanvas.Handle, 0, 0, nW, nH, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, SRCCOPY) then
_PrintHook.Log('ProcessWatermark() - Fail .. StretchBlt() .. 1');
// StretchBlt(MemCanvas.Handle, (nW div 2) - 400, (nH div 2) - 300, nW div 2, nH div 2, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, SRCCOPY);
bImgLoad := true;
except
// ...
end;
end;
pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
hOldBmp := SelectObject(MemCanvas.Handle, pen);
sOut := _PrintHook.SharedData_.Data.sText;
SetBkMode(MemCanvas.Handle, TRANSPARENT);
if _PrintHook.bSmallFont_ then
begin
MemCanvas.Font.Size := _PrintHook.SharedData_.Data.nFontSize - 125;
if MemCanvas.Font.Size < 10 then
MemCanvas.Font.Size := 10;
end else
MemCanvas.Font.Size := _PrintHook.SharedData_.Data.nFontSize;
MemCanvas.Font.Color := clSilver; // clGray;
MemCanvas.Font.Style := MemCanvas.Font.Style + [fsBold];
MemCanvas.Font.Orientation := 250;
_PrintHook.Log(Format('ProcessWatermark() - Font.Size=%d', [MemCanvas.Font.Size]));
nX := 0;
for i := 0 to 3 do
sOut := sOut + WORD_GAP + sOut;
i := 0;
nRepeat := _PrintHook.SharedData_.Data.nLineCnt;
nGapH := nH div (nRepeat - 1);
while i < nH + nGapH do
begin
MemCanvas.TextOut(nX, i, sOut);
Inc(i, nGapH);
end;
SelectObject(MemCanvas.Handle, hBmp);
// TransparentBlt(MemCanvas2.Handle, 0, 0, nW, nH, MemCanvas.Handle, 0, 0, nW, nH, RGB(255, 255, 255));
// TransparentBlt(DC, 0, 0, nW, nH, MemCanvas.Handle, 0, 0, nW, nH, RGB(255, 255, 255));
// TransparentBlt(DC, 0, 0, nW, nH, MemCanvas.Handle, 0, 0, nW, nH, RGB(0, 0, 0));
bf.AlphaFormat := 0; // <20>Ϲ<EFBFBD> <20><>Ʈ<EFBFBD><C6AE> 0, 32<33><32>Ʈ <20><>Ʈ<EFBFBD><C6AE> AC_SRC_ALPHA
bf.BlendFlags := 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
bf.BlendOp := AC_SRC_OVER; // AC_SRC_OVER
bf.SourceConstantAlpha := 40; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> 0 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 255)
if not AlphaBlend(DC, 0, 0, nW, nH, MemCanvas.Handle, 0, 0, nW, nH, bf) then
_PrintHook.Log('ProcessWatermark() - Fail .. AlphaBlend()');
SelectObject(MemCanvas.Handle, hOldBmp);
DeleteObject(pen);
DeleteObject(hbmp);
DeleteDC(MemCanvas.Handle);
MemCanvas.Handle := 0;
_PrintHook.Log(Format('ProcessWatermark() - Completed, LastError=%d', [GetLastError]));
Result := true;
except
// <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵǰ<C8B5> <20><><EFBFBD>ش<EFBFBD> 22_0907 14:28:52 kku
Result := false;
DeleteDC(DC);
end;
end;
}
function ProcessWatermark(DC: HDC; bStartPage: Boolean = true): Boolean;
var
nW, nH,
nX, i,
nGapH, nRepeat: Integer;
sExt,
sOut,
sImgPath: String;
MemCanvas: TCanvas;
hbmp,
hOldBmp: HBITMAP;
bf: BLENDFUNCTION;
bmp: TBitmap;
bImgLoad,
bAlphaSupport: Boolean;
pen: HPEN;
begin
// Result := true;
//exit;
Result := false;
_PrintHook.bIsWaterMaking_ := true;
try
try
nW := GetDeviceCaps(DC, HORZRES);
nH := GetDeviceCaps(DC, VERTRES);
Guard(MemCanvas, TCanvas.Create);
if bStartPage then
MemCanvas.Handle := CreateCompatibleDC(DC)
else
MemCanvas.Handle := DC; //CreateCompatibleDC(DC);
hbmp := CreateCompatibleBitmap(DC, nW, nH);
hOldBmp := SelectObject(MemCanvas.Handle, hbmp);
_PrintHook.Log(Format('ProcessWatermark() - DocSize W=%d, H=%d, dc=%d', [nW, nH, DC]));
bImgLoad := false;
Guard(bmp, TBitmap.Create);
if bStartPage then
PatBlt(MemCanvas.Handle, 0, 0, nW, nH, WHITENESS);
// sImgPath := _PrintHook.ImagePath;
if FileExists(sImgPath) then
begin
try
sOut := GetFileExt(sImgPath).ToUpper;
if sOut = 'PNG' then
begin
var png: TPngImage;
Guard(png, TPngImage.Create);
png.LoadFromFile(sImgPath);
bmp.Assign(png);
end else
if (sOut = 'JPG') or (sOut = 'JPEG') then
begin
var jpg: TJPEGImage;
Guard(jpg, TJPEGImage.Create);
jpg.LoadFromFile(sImgPath);
bmp.Assign(jpg);
end else
if sOut = 'bmp' then
bmp.LoadFromFile(sImgPath);
// bmp := blur(bmp);
// BitBlt(MemCanvas.Handle, (nW div 2) - (bmp.Width div 2),
// (nH div 2) - (bmp.Height div 2),
// bmp.Width, bmp.Height, bmp.Canvas.Handle, 0, 0, SRCCOPY);
if not StretchBlt(MemCanvas.Handle, 0, 0, nW, nH, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, SRCCOPY) then
_PrintHook.Log('ProcessWatermark() - Fail .. StretchBlt() .. 1');
// StretchBlt(MemCanvas.Handle, (nW div 2) - 400, (nH div 2) - 300, nW div 2, nH div 2, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, SRCCOPY);
bImgLoad := true;
except
// ...
end;
end;
pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
hOldBmp := SelectObject(MemCanvas.Handle, pen);
sOut := _PrintHook.Text;
SetBkMode(MemCanvas.Handle, TRANSPARENT);
if _PrintHook.bSmallFont_ then
begin
MemCanvas.Font.Size := _PrintHook.FontSize - 150;
if MemCanvas.Font.Size < 10 then
MemCanvas.Font.Size := 10;
end else
MemCanvas.Font.Size := _PrintHook.FontSize;
MemCanvas.Font.Orientation := 250;
MemCanvas.Font.Color := $F1F1F1; // clSilver; // clGray;
MemCanvas.Font.Style := MemCanvas.Font.Style + [fsBold];
_PrintHook.Log(Format('ProcessWatermark() - Font.Size=%d', [MemCanvas.Font.Size]));
nX := 0;
for i := 0 to 3 do
sOut := sOut + WORD_GAP + sOut;
i := 0;
nRepeat := _PrintHook.LineCount;
nGapH := nH div (nRepeat - 1);
if _PrintHook.bSmallFont_ then
nGapH := nGapH div 7;
while i < nH + nGapH do
begin
MemCanvas.TextOut(nX, i, sOut);
Inc(i, nGapH);
end;
if bStartPage then
BitBlt(DC, 0, 0, nW, nH, MemCanvas.Handle, 0, 0, SRCCOPY);
SelectObject(MemCanvas.Handle, hOldBmp);
DeleteObject(pen);
DeleteObject(hbmp);
if bStartPage then
DeleteDC(MemCanvas.Handle);
MemCanvas.Handle := 0;
_PrintHook.Log(Format('ProcessWatermark() - Completed, LastError=%d', [GetLastError]));
Result := true;
except
// <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵǰ<C8B5> <20><><EFBFBD>ش<EFBFBD> 22_0907 14:28:52 kku
Result := false;
DeleteDC(DC);
end;
finally
_PrintHook.bIsWaterMaking_ := false;
end;
end;
procedure SetPtrBmpFont(SrcDC: HDC); stdcall;
var
mtr: TTextMetric;
arrName: array [0..255] of Char;
begin
if _PrintHook.IsAblePrintDrawCopy then
begin
_PrintHook.PtrBmp_.Canvas.Font.Color := GetTextColor(SrcDC);
if GetTextFace(SrcDC, 256, arrName) <> 0 then
begin
_PrintHook.PtrBmp_.Canvas.Font.Name := String(arrName);
// _PrintHook.Log(Format('SetPtrBmpFont() .. FontName=%s', [_PrintHook.PtrBmp_.Canvas.Font.Name]));
end;
if GetTextMetrics(SrcDC, mtr) then
begin
_PrintHook.PtrBmp_.Canvas.Font.Size := mtr.tmHeight - 60;
_PrintHook.PtrBmp_.Canvas.Font.Charset := mtr.tmCharSet;
_PrintHook.PtrBmp_.Canvas.Font.Pitch := TFontPitch(mtr.tmPitchAndFamily);
if mtr.tmWeight > 400 then
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style + [fsBold]
else
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style - [fsBold];
if mtr.tmItalic <> 0 then
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style + [fsItalic]
else
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style - [fsItalic];
if mtr.tmUnderlined <> 0 then
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style + [fsUnderline]
else
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style - [fsUnderline];
if mtr.tmStruckOut <> 0 then
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style + [fsStrikeOut]
else
_PrintHook.PtrBmp_.Canvas.Font.Style := _PrintHook.PtrBmp_.Canvas.Font.Style - [fsStrikeOut];
end
else
_PrintHook.Log('Fail .. SetPtrBmpFont()');
end;
end;
procedure SetPtrBmpPixel(SrcDC: HDC); stdcall;
var
gdObj: HGDIOBJ;
BmpInfo: Winapi.Windows.TBitmap;
begin
if _PrintHook.IsAblePrintDrawCopy then
begin
gdObj := GetCurrentObject(SrcDC, OBJ_BITMAP);
if gdObj <> 0 then
begin
if GetObject(gdObj, SizeOf(BmpInfo), @BmpInfo) <> 0 then
begin
case BmpInfo.bmBitsPixel of
8 : _PrintHook.PtrBmp_.PixelFormat := pf8bit;
15 : _PrintHook.PtrBmp_.PixelFormat := pf15bit;
16 : _PrintHook.PtrBmp_.PixelFormat := pf16bit;
24 : _PrintHook.PtrBmp_.PixelFormat := pf24bit;
32 : _PrintHook.PtrBmp_.PixelFormat := pf32bit;
else _PrintHook.PtrBmp_.PixelFormat := pfDevice;
end;
end;
end;
end;
end;
procedure SetPtrBmpBrush(SrcDC: HDC); stdcall;
var
gdObj: HGDIOBJ;
BruInfo: TLogBrush;
begin
gdObj := GetCurrentObject(SrcDC, OBJ_BRUSH);
if gdObj <> 0 then
begin
if GetObject(gdObj, SizeOf(BruInfo), @BruInfo) <> 0 then
begin
_PrintHook.PtrBmp_.Canvas.Brush.Color := BruInfo.lbColor;
_PrintHook.PtrBmp_.Canvas.Brush.Style := TBrushStyle(BruInfo.lbStyle);
// _PrintHook.PtrBmp_.Canvas.Brush.Color := PenInfo.elpColor;
end;
end;
end;
procedure SetPtrBmpPen(SrcDC: HDC); stdcall;
var
gdObj: HGDIOBJ;
// PenInfo: TLogPen;
PenInfo: TExtLogPen;
begin
if _PrintHook.IsAblePrintDrawCopy then
begin
// gdObj := GetCurrentObject(SrcDC, OBJ_PEN);
gdObj := GetCurrentObject(SrcDC, OBJ_EXTPEN);
if gdObj <> 0 then
begin
// _PrintHook.Log(Format('SetPtrBmpPen() .. Get=%d', [GetObject(gdObj, SizeOf(PenInfo), @PenInfo)]));
if GetObject(gdObj, SizeOf(PenInfo), @PenInfo) <> 0 then
begin
// _PrintHook.Log(Format('SetPtrBmpPen() .. 2elpPenStyle=%d, elpWidth=%d, elpColor=%d',
// [PenInfo.elpPenStyle, PenInfo.elpWidth, PenInfo.elpColor]));
_PrintHook.PtrBmp_.Canvas.Pen.Style := TPenStyle(PenInfo.elpPenStyle);
_PrintHook.PtrBmp_.Canvas.Pen.Width := PenInfo.elpWidth;
_PrintHook.PtrBmp_.Canvas.Pen.Color := PenInfo.elpColor;
end;
{
_PrintHook.Log(Format('SetPtrBmpPen() .. Get=%d', [GetObject(gdObj, SizeOf(PenInfo), @PenInfo)]));
// if GetObject(gdObj, SizeOf(PenInfo), @PenInfo) <> 0 then
begin
_PrintHook.Log(Format('SetPtrBmpPen() .. 1elpPenStyle=%d, elpWidth=%d, elpColor=%d',
[PenInfo.lopnStyle, PenInfo.lopnWidth.X, PenInfo.lopnColor]));
_PrintHook.PtrBmp_.Canvas.Pen.Style := TPenStyle(PenInfo.lopnStyle);
_PrintHook.PtrBmp_.Canvas.Pen.Width := PenInfo.lopnWidth.X;
_PrintHook.PtrBmp_.Canvas.Pen.Color := GetDCPenColor(SrcDC);// PenInfo.lopnColor;
end;
}
end;
end;
end;
function BitBltHook(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
begin
_PrintHook.Log(Format('BitBltHook() .. X=%d, Y=%d, Width=%d, Height=%d', [X, Y, Width, Height]));
try
SetPtrBmpPixel(SrcDC);
if not ozBitBlt(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Width, Height, SrcDC, XSrc, YSrc, Rop) then
_PrintHook.Log('Fail .. BitBltHook() .. ozBitBlt()');
except
on E: Exception do
_PrintHook.Log('Fail .. BitBltHook() .. ' + E.Message);
end;
end;
Result := ozBitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Rop);
end;
function StretchBltHook(DestDC: HDC; X, Y, SrcWidth, SrcHeight: Integer; SrcDC: HDC;
XSrc, YSrc, DestWidth, DestHeight: Integer; Rop: DWORD): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
begin
_PrintHook.Log(Format('StretchBltHook() .. XSrc=%d, YSrc=%d, SrcWidth=%d, SrcHeight=%d', [XSrc, YSrc, SrcWidth, SrcHeight]));
try
SetPtrBmpPixel(SrcDC);
ozStretchBlt(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, SrcWidth, SrcHeight, SrcDC, XSrc, YSrc, DestWidth, DestHeight, Rop);
except
on E: Exception do
_PrintHook.Log('Fail .. StretchBltHook() .. ' + E.Message);
end;
end;
Result := ozStretchBlt(DestDC, X, Y, SrcWidth, SrcHeight, SrcDC, XSrc, YSrc, DestWidth, DestHeight, Rop);
end;
function TransparentBltHook(DestDC: HDC; X, Y, DestWidth, DestHeight: Integer; SrcDC: HDC;
XSrc, YSrc, SrcWidth, SrcHeight: Integer; dwTransparent: DWORD): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
begin
_PrintHook.Log(Format('TransparentBltHook() .. XSrc=%d, YSrc=%d, SrcWidth=%d, SrcHeight=%d', [XSrc, YSrc, SrcWidth, SrcHeight]));
try
SetPtrBmpPixel(SrcDC);
ozTransparentBlt(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, DestWidth, DestHeight, SrcDC, XSrc, YSrc, SrcWidth, SrcHeight, dwTransparent);
except
on E: Exception do
_PrintHook.Log('Fail .. TransparentBltHook() .. ' + E.Message);
end;
end;
Result := ozTransparentBlt(DestDc, X, Y, DestWidth, DestHeight, SrcDC, XSrc, YSrc, SrcWidth, SrcHeight, dwTransparent);
end;
function StretchDIBitsHook(DC: HDC; DestX, DestY, DestWidth, DestHeight, SrcX,
SrcY, SrcWidth, SrcHeight: Integer; Bits: Pointer; var BitsInfo: TBitmapInfo;
Usage: UINT; Rop: DWORD): Integer; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.Log(Format('StretchDIBitsHook() .. SrcX=%d, SrcY=%d, SrcWidth=%d, SrcHeight=%d, DestX=%d, DestY=%d, DestWidth=%d, DestHeight=%d',
[SrcX, SrcY, SrcWidth, SrcHeight, DestX, DestY, DestWidth, DestHeight]));
try
SetPtrBmpPixel(DC);
// SetPtrBmpPen(DC);
// var bmp: TBitmap;
// Guard(bmp, TBitmap.Create);
// bmp.Width := SrcWidth;
// bmp.Height := SrcHeight;
// bmp.PixelFormat := _PrintHook.PtrBmp_.PixelFormat;
// ozStretchDIBits(bmp.Canvas.Handle, 0, 0, SrcWidth, SrcHeight, SrcX, SrcY,
// SrcWidth, SrcHeight, Bits, BitsInfo, Usage, Rop);
// bmp.SaveToFile(Format('C:\Users\kkuzil\Desktop\ptrTest\StretchDIBitsHook_%d_W%dH%d.bmp', [_PrintHook.nPtrCnt_, SrcWidth, SrcHeight]));
ozStretchDIBits(_PrintHook.PtrBmp_.Canvas.Handle, DestX, DestY, DestWidth, DestHeight, SrcX, SrcY,
SrcWidth, SrcHeight, Bits, BitsInfo, Usage, Rop);
except
on E: Exception do
_PrintHook.Log('Fail .. StretchDIBitsHook() .. ' + E.Message);
end;
end;
Result := ozStretchDIBits(DC, DestX, DestY, DestWidth, DestHeight, SrcX, SrcY,
SrcWidth, SrcHeight, Bits, BitsInfo, Usage, Rop);
end;
function SetDIBitsToDeviceHook(DC: HDC; DestX, DestY: Integer; Width, Height: DWORD;
SrcX, SrcY: Integer; nStartScan, NumScans: UINT; Bits: Pointer;
var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.Log(Format('SetDIBitsToDeviceHook() .. DestX=%d, DestY=%d, Width=%d, Height=%d', [DestX, DestY, Width, Height]));
try
SetPtrBmpPixel(DC);
ozSetDIBitsToDevice(_PrintHook.PtrBmp_.Canvas.Handle, DestX, DestY, Width, Height, SrcX, SrcY, nStartScan, NumScans, Bits, BitsInfo, Usage);
except
on E: Exception do
_PrintHook.Log('Fail .. SetDIBitsToDeviceHook() .. ' + E.Message);
end;
end;
Result := ozSetDIBitsToDevice(DC, DestX, DestY, Width, Height, SrcX, SrcY, nStartScan, NumScans, Bits, BitsInfo, Usage);
end;
function GdipDrawRectangleHook(graphics: GPGRAPHICS; pen: GPPEN; x: Single;
y: Single; width: Single; height: Single): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawRectangle(graphics, pen, x, y, width, height);
// exit;
Result := ozGdipDrawRectangle(graphics, pen, x, y, width, height);
end;
function GdipDrawRectangleIHook(graphics: GPGRAPHICS; pen: GPPEN; x: Integer;
y: Integer; width: Integer; height: Integer): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawRectangleI(graphics, pen, x, y, width, height);
// exit;
Result := ozGdipDrawRectangleI(graphics, pen, x, y, width, height);
end;
function GdipDrawRectanglesHook(graphics: GPGRAPHICS; pen: GPPEN; rects: GPRECTF;
count: Integer): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawRectangles(graphics, pen, rects, count);
// exit;
Result := ozGdipDrawRectangles(graphics, pen, rects, count);
end;
function GdipDrawRectanglesIHook(graphics: GPGRAPHICS; pen: GPPEN; rects: GPRECT;
count: Integer): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawRectanglesI(graphics, pen, rects, count);
// exit;
Result := ozGdipDrawRectanglesI(graphics, pen, rects, count);
end;
function GdipDrawLineHook(graphics: GPGRAPHICS; pen: GPPEN; x1: Single;
y1: Single; x2: Single; y2: Single): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawLine(graphics, pen, x1, y1, x2, y2);
// exit;
Result := ozGdipDrawLine(graphics, pen, x1, y1, x2, y2);
end;
function GdipDrawLineIHook(graphics: GPGRAPHICS; pen: GPPEN; x1: Integer;
y1: Integer; x2: Integer; y2: Integer): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawLineI(graphics, pen, x1, y1, x2, y2);
// exit;
Result := ozGdipDrawLineI(graphics, pen, x1, y1, x2, y2);
end;
function GdipDrawLinesHook(graphics: GPGRAPHICS; pen: GPPEN; points: GPPOINTF;
count: Integer): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawLines(graphics, pen, points, count);
// exit;
Result := ozGdipDrawLines(graphics, pen, points, count);
end;
function GdipDrawLinesIHook(graphics: GPGRAPHICS; pen: GPPEN; points: GPPOINT;
count: Integer): GPSTATUS; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy then
// begin
// Result := Ok;
// end else
// Result := ozGdipDrawLinesI(graphics, pen, points, count);
// exit;
Result := ozGdipDrawLinesI(graphics, pen, points, count);
end;
function PatBltHook(DC: HDC; X, Y, Width, Height: Integer; Rop: DWORD): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.Log(Format('PatBltHook() .. X=%d, Y=%d, Width=%d, Height=%d', [X, Y, Width, Height]));
try
SetPtrBmpPixel(DC);
// SetPtrBmpPen(DC);
ozPatBlt(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Width, Height, Rop);
except
on E: Exception do
_PrintHook.Log('Fail .. PatBltHook() .. ' + E.Message);
end;
end;
Result := ozPatBlt(DC, X, Y, Width, Height, Rop);
end;
function SetMapperFlagsHook(DC: HDC; Flag: DWORD): DWORD; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
ozSetMapperFlags(_PrintHook.PtrBmp_.Canvas.Handle, Flag);
Result := ozSetMapperFlags(DC, Flag);
end;
function SetGraphicsModeHook(hdc: HDC; iMode: Integer): Integer; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
ozSetGraphicsMode(_PrintHook.PtrBmp_.Canvas.Handle, iMode);
Result := ozSetGraphicsMode(hdc, iMode);
end;
function SetMapModeHook(DC: HDC; p2: Integer): Integer; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
ozSetMapMode(_PrintHook.PtrBmp_.Canvas.Handle, p2);
Result := ozSetMapMode(DC, p2);
end;
function SetBkColorHook(DC: HDC; Color: COLORREF): COLORREF; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
ozSetBkColor(_PrintHook.PtrBmp_.Canvas.Handle, Color);
Result := ozSetBkColor(DC, Color);
end;
function SetTextAlignHook(DC: HDC; Flags: UINT): UINT; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
ozSetTextAlign(_PrintHook.PtrBmp_.Canvas.Handle, Flags);
Result := ozSetTextAlign(DC, Flags);
end;
function SetPixelHook(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := Color;
// end else
// Result := ozSetPixel(DC, X, Y, Color);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
ozSetPixel(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Color);
Result := ozSetPixel(DC, X, Y, Color);
end;
function SetPixelVHook(DC: HDC; X, Y: Integer; Color: COLORREF): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozSetPixelV(DC, X, Y, Color);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
ozSetPixelV(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Color);
Result := ozSetPixelV(DC, X, Y, Color);
end;
function LineToHook(DC: HDC; X, Y: Integer): BOOL; stdcall;
var
pt: TPoint;
begin
// Result := ozMoveToEx(DC, X, Y, @pt);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
// _PrintHook.Log('LineToHook() ..');
SetPtrBmpPen(DC);
// SetPtrBmpBrush(DC);
ozLineTo(_PrintHook.PtrBmp_.Canvas.Handle, X, Y);
end;
Result := ozLineTo(DC, X, Y);
end;
function MoveToExHook(DC: HDC; p2, p3: Integer; p4: PPoint): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozMoveToEx(_PrintHook.PtrBmp_.Canvas.Handle, p2, p3, p4);
end;
Result := ozMoveToEx(DC, p2, p3, p4);
end;
function DrawEscapeHook(DC: HDC; p2, p3: Integer; p4: LPCSTR): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozDrawEscape(DC, p2, p3, p4);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozDrawEscape(_PrintHook.PtrBmp_.Canvas.Handle, p2, p3, p4);
end;
Result := ozDrawEscape(DC, p2, p3, p4);
end;
function EllipseHook(DC: HDC; X1, Y1, X2, Y2: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozEllipse(DC, X1, Y1, X2, Y2);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozEllipse(_PrintHook.PtrBmp_.Canvas.Handle, X1, Y1, X2, Y2);
end;
Result := ozEllipse(DC, X1, Y1, X2, Y2);
end;
function RoundRectHook(DC: HDC; X1, Y1, X2, Y2, X3, Y3: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozRoundRect(DC, X1, Y1, X2, Y2, X3, Y3);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
// SetPtrBmpBrush(DC);
ozRoundRect(_PrintHook.PtrBmp_.Canvas.Handle, X1, Y1, X2, Y2, X3, Y3);
end;
Result := ozRoundRect(DC, X1, Y1, X2, Y2, X3, Y3);
end;
function AngleArcHook(DC: HDC; p2, p3: Integer; p4: DWORD; p5, p6: Single): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozAngleArc(DC, p2, p3, p4, p5, p6);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
// SetPtrBmpBrush(DC);
ozAngleArc(_PrintHook.PtrBmp_.Canvas.Handle, p2, p3, p4, p5, p6);
end;
Result := ozAngleArc(DC, p2, p3, p4, p5, p6);
end;
function ArcToHook(DC: HDC; RLeft, RTop, RRight, RBottom: Integer; X1, Y1, X2, Y2: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozArcTo(DC, RLeft, RTop, RRight, RBottom, X1, Y1, X2, Y2);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozArcTo(_PrintHook.PtrBmp_.Canvas.Handle, RLeft, RTop, RRight, RBottom, X1, Y1, X2, Y2);
end;
Result := ozArcTo(DC, RLeft, RTop, RRight, RBottom, X1, Y1, X2, Y2);
end;
function PolyPolylineHook(DC: HDC; const PointStructs; const Points; p4: DWORD): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyPolyline(DC, PointStructs, Points, p4);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyPolyline(_PrintHook.PtrBmp_.Canvas.Handle, PointStructs, Points, p4);
end;
Result := ozPolyPolyline(DC, PointStructs, Points, p4);
end;
function PolyDrawHook(DC: HDC; const Points, Types; cCount: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyDraw(DC, Points, Types, cCount);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyDraw(_PrintHook.PtrBmp_.Canvas.Handle, Points, Types, cCount);
end;
Result := ozPolyDraw(DC, Points, Types, cCount);
end;
function PolygonHook(DC: HDC; const Points; Count: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolygon(DC, Points, Count);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolygon(_PrintHook.PtrBmp_.Canvas.Handle, Points, Count);
end;
Result := ozPolygon(DC, Points, Count);
end;
function PolylineHook(DC: HDC; const Points; Count: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyline(DC, Points, Count);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyline(_PrintHook.PtrBmp_.Canvas.Handle, Points, Count);
end;
Result := ozPolyline(DC, Points, Count);
end;
function PolyBezierHook(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyBezier(DC, Points, Count);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyBezier(_PrintHook.PtrBmp_.Canvas.Handle, Points, Count);
end;
Result := ozPolyBezier(DC, Points, Count);
end;
function PolyBezierToHook(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyBezierTo(DC, Points, Count);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyBezierTo(_PrintHook.PtrBmp_.Canvas.Handle, Points, Count);
end;
Result := ozPolyBezierTo(DC, Points, Count);
end;
function PolyLineToHook(DC: HDC; const Points; Count: DWORD): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyLineTo(DC, Points, Count);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyLineTo(_PrintHook.PtrBmp_.Canvas.Handle, Points, Count);
end;
Result := ozPolyLineTo(DC, Points, Count);
end;
function SetPolyFillModeHook(DC: HDC; PolyFillMode: Integer): Integer; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := 1;
// end else
// Result := ozSetPolyFillMode(DC, PolyFillMode);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozSetPolyFillMode(_PrintHook.PtrBmp_.Canvas.Handle, PolyFillMode);
end;
Result := ozSetPolyFillMode(DC, PolyFillMode);
end;
function ExtFloodFillHook(DC: HDC; X, Y: Integer; Color: COLORREF; FillType: UINT): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozExtFloodFill(DC, X, Y, Color, FillType);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozExtFloodFill(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Color, FillType);
end;
Result := ozExtFloodFill(DC, X, Y, Color, FillType);
end;
function FloodFillHook(DC: HDC; X, Y: Integer; Color: COLORREF; FillType: UINT): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozFloodFill(DC, X, Y, Color);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozFloodFill(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Color);
end;
Result := ozFloodFill(DC, X, Y, Color);
end;
function FillRgnHook(DC: HDC; hrgn: HRGN; hbr: HBRUSH): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozFillRgn(DC, hrgn, hbr);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozFillRgn(_PrintHook.PtrBmp_.Canvas.Handle, hrgn, hbr);
end;
Result := ozFillRgn(DC, hrgn, hbr);
end;
function FillRectHook(hDC: HDC; const lprc: TRect; hbr: HBRUSH): Integer; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := 1;
// end else
// Result := ozFillRect(hDC, lprc, hbr);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
SetPtrBmpPen(hDC);
ozFillRect(_PrintHook.PtrBmp_.Canvas.Handle, lprc, hbr);
end;
Result := ozFillRect(hDC, lprc, hbr);
end;
function FrameRectHook(hDC: HDC; const lprc: TRect; hbr: HBRUSH): Integer; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := 1;
// end else
// Result := ozFrameRect(hDC, lprc, hbr);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
SetPtrBmpPen(hDC);
ozFrameRect(_PrintHook.PtrBmp_.Canvas.Handle, lprc, hbr);
end;
Result := ozFrameRect(hDC, lprc, hbr);
end;
function GradientFillHook(DC: HDC; Vertex: PTriVertex; NumVertex: ULONG; Mesh: Pointer; NumMesh, Mode: ULONG): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozGradientFill(DC, Vertex, NumVertex, Mesh, NumMesh, Mode);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozGradientFill(_PrintHook.PtrBmp_.Canvas.Handle, Vertex, NumVertex, Mesh, NumMesh, Mode);
end;
Result := ozGradientFill(DC, Vertex, NumVertex, Mesh, NumMesh, Mode);
end;
function SetDCBrushColorHook(DC: HDC; Color: COLORREF): COLORREF; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.PtrBmp_.Canvas.Brush.Color := Color;
end;
Result := ozSetDCBrushColor(DC, Color);
end;
function SetDCPenColorHook(DC: HDC; Color: COLORREF): COLORREF; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.PtrBmp_.Canvas.Pen.Color := Color;
end;
Result := ozSetDCPenColor(DC, Color);
end;
function SetDIBColorTableHook(DC: HDC; p2, p3: UINT; var RGBQuadSTructs): UINT; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
// SetPtrBmpPen(DC);
ozSetDIBColorTable(_PrintHook.PtrBmp_.Canvas.Handle, p2, p3, RGBQuadSTructs);
end;
Result := ozSetDIBColorTable(DC, p2, p3, RGBQuadSTructs);
end;
function SetColorAdjustmentHook(DC: HDC; const p2: TColorAdjustment): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
SetColorAdjustment(_PrintHook.PtrBmp_.Canvas.Handle, p2);
end;
Result := ozSetColorAdjustment(DC, p2);
end;
function SetArcDirectionHook(DC: HDC; Direction: Integer): Integer; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := 1;
// end else
// Result := ozSetArcDirection(DC, Direction);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozSetArcDirection(_PrintHook.PtrBmp_.Canvas.Handle, Direction);
end;
Result := ozSetArcDirection(DC, Direction);
end;
function SetViewportExtExHook(DC: HDC; XExt, YExt: Integer; Size: PSize): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozSetViewportExtEx(_PrintHook.PtrBmp_.Canvas.Handle, XExt, YExt, Size);
end;
Result := ozSetViewportExtEx(DC, XExt, YExt, Size);
end;
function SetViewportOrgExHook(DC: HDC; X, Y: Integer; Point: PPoint): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozSetViewportOrgEx(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Point);
end;
Result := ozSetViewportOrgEx(DC, X, Y, Point);
end;
function SetICMModeHook(DC: HDC; Mode: Integer): Integer; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozSetICMMode(_PrintHook.PtrBmp_.Canvas.Handle, Mode);
end;
Result := ozSetICMMode(DC, Mode);
end;
function SetColorSpaceHook(DC: HDC; ColorSpace: HCOLORSPACE): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozSetColorSpace(_PrintHook.PtrBmp_.Canvas.Handle, ColorSpace);
end;
Result := ozSetColorSpace(DC, ColorSpace);
end;
function CreateDIBitmapHook(DC: HDC; var InfoHeader: TBitmapInfoHeader;
dwUsage: DWORD; InitBits: Pointer; var InitInfo: TBitmapInfo;
wUsage: UINT): HBITMAP; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.Log(Format('CreateDIBitmapHook() ,, W=%d, H=%d', [InfoHeader.biWidth, InfoHeader.biHeight]));
end;
Result := ozCreateDIBitmap(DC, InfoHeader, dwUsage, InitBits, InitInfo, wUsage);
end;
function SetDIBitsHook(DC: HDC; Bitmap: HBITMAP; StartScan, NumScans: UINT;
Bits: Pointer; var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
_PrintHook.Log(Format('ozSetDIBits() ,, W=%d, H=%d', [BitsInfo.bmiHeader.biWidth, BitsInfo.bmiHeader.biHeight]));
end;
Result := ozSetDIBits(DC, Bitmap, StartScan, NumScans, Bits, BitsInfo, Usage);
end;
function MaskBltHook(DestDC: HDC; XDest, YDest, Width, Height: Integer; SrcDC: HDC;
XScr, YScr: Integer; Mask: HBITMAP; xMask, yMask: Integer; Rop: DWORD): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
begin
_PrintHook.Log(Format('PlgBltHook() ,, W=%d, H=%d', [Width, Height]));
end;
Result := ozMaskBlt(DestDC, XDest, YDest, Width, Height, SrcDC, XScr, YScr, Mask, xMask, yMask, Rop);
end;
function PlgBltHook(DestDC: HDC; const PointsArray; SrcDC: HDC;
XSrc, YSrc, Width, Height: Integer; Mask: HBITMAP; xMask, yMask: Integer): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
begin
_PrintHook.Log(Format('PlgBltHook() ,, W=%d, H=%d', [Width, Height]));
end;
Result := ozPlgBlt(DestDC, PointsArray, SrcDC, XSrc, YSrc, Width, Height, Mask, xMask, yMask);
end;
function ArcHook(hDC: HDC; left, top, right, bottom, startX, startY, endX, endY: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ArcHook(hDC, left, top, right, bottom, startX, startY, endX, endY);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
SetPtrBmpPen(hDC);
ozArc(_PrintHook.PtrBmp_.Canvas.Handle, left, top, right, bottom, startX, startY, endX, endY);
end;
Result := ozArc(hDC, left, top, right, bottom, startX, startY, endX, endY);
end;
function ChordHook(DC: HDC; X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozChord(DC, X1, Y1, X2, Y2, X3, Y3, X4, Y4);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozChord(_PrintHook.PtrBmp_.Canvas.Handle, X1, Y1, X2, Y2, X3, Y3, X4, Y4);
end;
Result := ozChord(DC, X1, Y1, X2, Y2, X3, Y3, X4, Y4);
end;
function PieHook(DC: HDC; X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPie(DC, X1, Y1, X2, Y2, X3, Y3, X4, Y4);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPie(_PrintHook.PtrBmp_.Canvas.Handle, X1, Y1, X2, Y2, X3, Y3, X4, Y4);
end;
Result := ozPie(DC, X1, Y1, X2, Y2, X3, Y3, X4, Y4);
end;
function PaintRgnHook(DC: HDC; RGN: HRGN): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPaintRgn(DC, RGN);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPaintRgn(_PrintHook.PtrBmp_.Canvas.Handle, RGN);
end;
Result := ozPaintRgn(DC, RGN);
end;
function PolyPolygonHook(DC: HDC; var Points; var nPoints; p4: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozPolyPolygon(DC, Points, nPoints, p4);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozPolyPolygon(_PrintHook.PtrBmp_.Canvas.Handle, Points, nPoints, p4);
end;
Result := ozPolyPolygon(DC, Points, nPoints, p4);
end;
function RectangleHook(DC: HDC; X1, Y1, X2, Y2: Integer): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozRectangle(DC, X1, Y1, X2, Y2);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozRectangle(_PrintHook.PtrBmp_.Canvas.Handle, X1, Y1, X2, Y2);
end;
Result := ozRectangle(DC, X1, Y1, X2, Y2);
end;
function StrokePathHook(DC: HDC): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozStrokePath(DC);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozStrokePath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozStrokePath(DC);
end;
function StrokeAndFillPathHook(DC: HDC): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozStrokeAndFillPath(DC);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozStrokeAndFillPath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozStrokeAndFillPath(DC);
end;
function BeginPathHook(DC: HDC): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozBeginPath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozBeginPath(DC);
end;
function EndPathHook(DC: HDC): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozEndPath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozEndPath(DC);
end;
function FillPathHook(DC: HDC): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) then
// begin
// Result := TRUE;
// end else
// Result := ozFillPath(DC);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
SetPtrBmpBrush(DC);
ozFillPath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozFillPath(DC);
end;
function FlattenPathHook(DC: HDC): BOOL; stdcall;
begin
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
// begin
// Result := TRUE;
// end else
// Result := ozFlattenPath(DC);
// exit;
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozFlattenPath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozFlattenPath(DC);
end;
function WidenPathHook(DC: HDC): BOOL; stdcall;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
SetPtrBmpPen(DC);
ozWidenPath(_PrintHook.PtrBmp_.Canvas.Handle);
end;
Result := ozWidenPath(DC);
end;
function CreatePenHook(Style, Width: Integer; Color: COLORREF): HPEN; stdcall;
begin
Result := ozCreatePen(Style, Width, Color);
end;
function SelectObjectHook(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
begin
Result := ozSelectObject(DC, p2);
// <20>Ʒ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܵ<EFBFBD> 23_0107 19:46:38 kku
// if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DestDC) and _PrintHook.DcPen_.ContainsKey(p2) then
// begin
// pEnt := _PrintHook.DcPen_[p2];
// _PrintHook.Log(Format('SelectObjectHook() .. Style=%d, Width=%d, Color=%d', [pEnt.nStyle, pEnt.nWidth, pEnt.nColor]));
// _PrintHook.PtrBmp_.Canvas.Pen.Style := TPenStyle(pEnt.nStyle);
// _PrintHook.PtrBmp_.Canvas.Pen.Width := pEnt.nWidth;
// _PrintHook.PtrBmp_.Canvas.Pen.Color := pEnt.nColor;
// end;
end;
function DeleteObjectHook(p1: HGDIOBJ): BOOL; stdcall;
begin
Result := ozDeleteObject(p1);
end;
function StartPageHook(DC: HDC): Integer; stdcall;
begin
// if _PrintHook.nPtrCnt_ > 1 then
// begin
// Result := -1;
// _PrintHook.bIsStartPage_ := false;
// _PrintHook.bIsPrinting_ := false;
// exit;
// end;
_PrintHook.bIsStartPage_ := true;
_PrintHook.bIsPrinting_ := true;
// if _PrintHook.Active and (_PrintHook.hMemDC_ = 0) then
if _PrintHook.Active and (_PrintHook.PtrBmp_ = nil) then
begin
Inc(_PrintHook.nPtrCnt_);
_PrintHook.CurPtrDC_ := DC;
_PrintHook.PtrBmp_ := TBitmap.Create;
_PrintHook.PtrBmp_.Width := GetDeviceCaps(DC, HORZRES);
_PrintHook.PtrBmp_.Height := GetDeviceCaps(DC, VERTRES);
SetPtrBmpFont(DC);
SetPtrBmpPixel(DC);
// SetPtrBmpPen(DC);
_PrintHook.PtrBmp_.Canvas.Font.Name := 'Tahoma';
_PrintHook.PtrBmp_.Canvas.Pen.Width := 2;
_PrintHook.PtrBmp_.Canvas.Pen.Style := psSolid;
_PrintHook.PtrBmp_.Canvas.Pen.Color := clRed;
// _PrintHook.PtrBmp_.Canvas.Brush.Style := bsClear;
// _PrintHook.PtrBmp_.Canvas.Brush.Color := clRed;
// _PrintHook.PtrBmp_.Canvas.Pen.Mode
// _PrintHook.hMemDC_ := CreateCompatibleDC(DC);
// _PrintHook.hbmp_ := CreateCompatibleBitmap(DC, _PrintHook.nW_, _PrintHook.nH_);
// SelectObject(_PrintHook.hMemDC_, _PrintHook.hbmp_);
//
// var hFont := CreateFont(50,0,0,0,0,0,0,0,HANGEUL_CHARSET,0,0,0,
// VARIABLE_PITCH or FF_ROMAN, '<27>ü<EFBFBD>');
// SelectObject(_PrintHook.hMemDC_, hFont);
// PatBlt(_PrintHook.hMemDC_, 0, 0, _PrintHook.nW_, _PrintHook.nH_, WHITENESS);
end;
Result := ozStartPage(DC);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵȴ<C8B5>.. <20>׷<EFBFBD><D7B7><EFBFBD> StartPageHook(), EndPageHook() <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 22_0907 15:06:14 kku
if not _PrintHook.Active or _PrintHook.bEndDocProc_ then
exit;
if Result = 1 then
begin
_PrintHook.Log('StartPageHook() .. ProcessWatermark()');
if not ProcessWatermark(DC) then
// if not ProcessWatermark(_MemCanvas.Handle) then
Result := -1;
end;
end;
function EndPageHook(DC: HDC): Integer; stdcall;
begin
if _PrintHook.Active and _PrintHook.bEndDocProc_ then
begin
_PrintHook.Log('EndPageHook() .. ProcessWatermark()');
// if _MemCanvas <> nil then
// begin
// if not ProcessWatermark(_MemCanvas.Handle, false) then
// begin
// Result := -1;
// exit;
// end;
// end else
begin
if not ProcessWatermark(DC, false) then
begin
Result := -1;
exit;
end;
end;
end;
_PrintHook.Log('EndPageHook()');
_PrintHook.bIsStartPage_ := false;
if _PrintHook.PtrBmp_ <> nil then
begin
_PrintHook.CurPtrDC_ := 0;
try
var jpg: TJPEGImage;
Guard(jpg, TJPEGImage.Create);
jpg.Assign(_PrintHook.PtrBmp_);
// _PrintHook.PtrBmp_.SaveToFile(Format('C:\Users\kkuzil\Desktop\ptrTest\%s-%.2d.bmp', [_PrintHook.CurDocName, _PrintHook.nPtrCnt_]));
FreeAndNil(_PrintHook.PtrBmp_);
jpg.SaveToFile(Format('C:\Users\kku\Desktop\ptr_test\%s-%.2d.jpg', [ExtractFileName(_PrintHook.CurDocName), _PrintHook.nPtrCnt_]));
except
on E: Exception do
_PrintHook.Log('Fail .. EndPageHook(), ' + E.Message);
end;
end;
Result := ozEndPage(DC);
_PrintHook.bIsPrinting_ := false;
end;
function EndDocHook(DC: HDC): Integer; stdcall;
begin
if FileExists(_PrintHook.sLogPath_) then
WriteLnFileEndUTF8(ExtractFilePath(_PrintHook.sLogPath_) + 'PrintText.txt', _PrintHook.sPtrText_);
Result := ozEndDoc(DC);
_PrintHook.Log('EndDocHook()');
end;
function DragQueryFileAHook(Drop: HDROP; FileIndex: UINT; FileName: LPSTR; cb: UINT): UINT; stdcall;
begin
if _PrintHook.Active then
begin
// <20><><EFBFBD><EFBFBD>
Result := 0;
end else
Result := ozDragQueryFileA(Drop, FileIndex, FileName, cb);
end;
function DragQueryFileWHook(Drop: HDROP; FileIndex: UINT; FileName: LPWSTR; cb: UINT): UINT; stdcall;
begin
if _PrintHook.Active then
begin
// <20><><EFBFBD><EFBFBD>
Result := 0;
end else
Result := ozDragQueryFileW(Drop, FileIndex, FileName, cb);
end;
procedure ReplaceTextA(sStr: LPCSTR); inline; stdcall;
var
sData: AnsiString;
bMod: Boolean;
begin
bMod := false;
sData := AnsiString(sStr);
if Pos('<27>α<EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27>α<EFBFBD>', '**', [rfReplaceAll]);
bMod := true;
end else
if Pos('<27><EFBFBD><E8B1B8>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><EFBFBD><E8B1B8>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD>ȣ', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD>ȣ', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD>ȣ', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD>ȣ', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD>켺', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD>켺', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('svchost', sData) > 0 then
begin
sData := StringReplace(sData, 'svchost', 'xxxxxxx', [rfReplaceAll]);
bMod := true;
end;
if bMod then
CopyMemory(@sStr[0], @sData[1], Length(sData));
end;
procedure ReplaceTextW(sStr: LPCWSTR); inline; stdcall;
var
sData: String;
bMod: Boolean;
begin
bMod := false;
sData := String(sStr);
if Pos('<27>α<EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27>α<EFBFBD>', '**', [rfReplaceAll]);
bMod := true;
end else
if Pos('<27><EFBFBD><E8B1B8>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><EFBFBD><E8B1B8>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD>ȣ', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD>ȣ', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD>ȣ', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD>ȣ', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('<27><><EFBFBD>켺', sData) > 0 then
begin
sData := StringReplace(sData, '<27><><EFBFBD>켺', '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', [rfReplaceAll]);
bMod := true;
end;
if Pos('svchost', sData) > 0 then
begin
sData := StringReplace(sData, 'svchost', 'xxxxxxx', [rfReplaceAll]);
bMod := true;
end;
if bMod then
CopyMemory(@sStr[0], @sData[1], Length(sData) * 2);
end;
function DrawTextAHook(hDC: HDC; lpString: LPCSTR; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
var
sData: AnsiString;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
ReplaceTextA(lpString);
sData := AnsiString(lpString);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(hDC);
ozDrawTextA(_PrintHook.PtrBmp_.Canvas.Handle, lpString, nCount, lpRect, uFormat);
end;
Result := ozDrawTextA(hDc, lpString, nCount, lpRect, uFormat);
end;
function DrawTextWHook(hDC: HDC; lpString: LPCWSTR; nCount: Integer;
var lpRect: TRect; uFormat: UINT): Integer; stdcall;
var
sData: String;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
ReplaceTextW(lpString);
sData := String(lpString);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(hDC);
ozDrawTextW(_PrintHook.PtrBmp_.Canvas.Handle, lpString, nCount, lpRect, uFormat);
end;
Result := ozDrawTextW(hDc, lpString, nCount, lpRect, uFormat);
end;
function DrawTextExAHook(DC: HDC; lpchText: LPCSTR; cchText: Integer; var p4: TRect;
dwDTFormat: UINT; DTParams: PDrawTextParams): Integer; stdcall;
var
sData: AnsiString;
begin
ReplaceTextA(lpchText);
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
sData := AnsiString(lpchText);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(DC);
ozDrawTextExA(_PrintHook.PtrBmp_.Canvas.Handle, lpchText, cchText, p4, dwDTFormat, DTParams);
end;
Result := ozDrawTextExA(DC, lpchText, cchText, p4, dwDTFormat, DTParams);
end;
function DrawTextExWHook(DC: HDC; lpchText: LPCWSTR; cchText: Integer; var p4: TRect;
dwDTFormat: UINT; DTParams: PDrawTextParams): Integer; stdcall;
var
sData: String;
begin
ReplaceTextW(lpchText);
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
sData := String(lpchText);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(DC);
ozDrawTextExW(_PrintHook.PtrBmp_.Canvas.Handle, lpchText, cchText, p4, dwDTFormat, DTParams);
// if _PrintHook.hMemDC_ <> 0 then
// ozDrawTextExW(_PrintHook.hMemDC_, lpchText, cchText, p4, dwDTFormat, DTParams);
end;
Result := ozDrawTextExW(DC, lpchText, cchText, p4, dwDTFormat, DTParams);
end;
function ExtTextOutAHook(DC: HDC; X, Y: Integer; Options: Longint;
Rect: PRect; Str: LPCSTR; Count: Longint; Dx: PInteger): BOOL; stdcall;
var
sData: AnsiString;
begin
ReplaceTextA(Str);
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
sData := AnsiString(Str);
SumString(_PrintHook.sPtrText_, sData, ' ');
if _PrintHook.IsAblePrintDrawCopy then
begin
SetPtrBmpFont(DC);
ozExtTextOutA(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Options, Rect, Str, Count, Dx);
end;
// if _PrintHook.hMemDC_ <> 0 then
// ozExtTextOutA(_PrintHook.hMemDC_, X, Y, Options, Rect, Str, Count, Dx);
end;
Result := ozExtTextOutA(DC, X, Y, Options, Rect, Str, Count, Dx);
end;
function ExtTextOutWHook(DC: HDC; X, Y: Integer; Options: Longint;
Rect: PRect; Str: LPCWSTR; Count: Longint; Dx: PInteger): BOOL; stdcall;
var
sData: String;
begin
ReplaceTextW(Str);
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
ReplaceTextW(Str);
sData := String(Str);
SumString(_PrintHook.sPtrText_, String(Str), ' ');
if _PrintHook.IsAblePrintDrawCopy then
begin
SetPtrBmpFont(DC);
// _PrintHook.Log('ExtTextOutWHook() .. FontName : ' + _PrintHook.PtrBmp_.Canvas.Font.Name);
// ozTextOutW(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Str, Count);
ozExtTextOutW(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Options, Rect, Str, Count, Dx);
end;
// if _PrintHook.hMemDC_ <> 0 then
// ozExtTextOutW(_PrintHook.hMemDC_, X, Y, Options, Rect, Str, Count, Dx);
end;
Result := ozExtTextOutW(DC, X, Y, Options, Rect, Str, Count, Dx);
end;
function TextOutAHook(DC: HDC; X, Y: Integer; Str: LPCSTR; Count: Integer): BOOL; stdcall;
var
sData: AnsiString;
begin
ReplaceTextA(Str);
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
sData := AnsiString(Str);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(DC);
if _PrintHook.IsAblePrintDrawCopy then
ozTextOutA(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Str, Count);
// if _PrintHook.hMemDC_ <> 0 then
// ozTextOutA(_PrintHook.hMemDC_, X, Y, Str, Count);
end;
Result := ozTextOutA(DC, X, Y, Str, Count);
end;
function TextOutWHook(DC: HDC; X, Y: Integer; Str: LPCWSTR; Count: Integer): BOOL; stdcall;
var
sData: String;
begin
ReplaceTextW(Str);
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
sData := String(Str);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(DC);
if _PrintHook.IsAblePrintDrawCopy then
ozTextOutW(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, Str, Count);
// if _PrintHook.hMemDC_ <> 0 then
// ozTextOutW(_PrintHook.hMemDC_, X, Y, Str, Count);
end;
Result := ozTextOutW(DC, X, Y, Str, Count);
end;
function PolyTextOutAHook(DC: HDC; const PolyTextArray; Strings: Integer): BOOL; stdcall;
type
TArrayLPCSTR = array [0..0] of LPCSTR;
var
i: Integer;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
try
for i := 0 to Strings - 1 do
begin
ReplaceTextA(TArrayLPCSTR(PolyTextArray)[i]);
SumString(_PrintHook.sPtrText_, AnsiString(TArrayLPCSTR(PolyTextArray)[i]), ' ');
end;
SetPtrBmpFont(DC);
if _PrintHook.IsAblePrintDrawCopy then
ozPolyTextOutA(_PrintHook.PtrBmp_.Canvas.Handle, PolyTextArray, Strings);
except
// ..
end;
end;
Result := ozPolyTextOutA(DC, PolyTextArray, Strings);
end;
function PolyTextOutWHook(DC: HDC; const PolyTextArray; Strings: Integer): BOOL; stdcall;
type
TArrayLPCWSTR = array [0..0] of LPCWSTR;
var
i: Integer;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = DC) then
begin
try
for i := 0 to Strings - 1 do
begin
ReplaceTextW(TArrayLPCWSTR(PolyTextArray)[i]);
SumString(_PrintHook.sPtrText_, String(TArrayLPCWSTR(PolyTextArray)[i]), ' ');
end;
SetPtrBmpFont(DC);
if _PrintHook.IsAblePrintDrawCopy then
ozPolyTextOutW(_PrintHook.PtrBmp_.Canvas.Handle, PolyTextArray, Strings);
except
// ..
end;
end;
Result := ozPolyTextOutW(DC, PolyTextArray, Strings);
end;
function TabbedTextOutAHook(hDC: HDC; X, Y: Integer; lpString: LPCSTR; nCount, nTabPositions: Integer;
var lpnTabStopPositions; nTabOrigin: Integer): Longint; stdcall;
var
sData: AnsiString;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
ReplaceTextA(lpString);
sData := AnsiString(lpString);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(hDC);
if _PrintHook.IsAblePrintDrawCopy then
ozTabbedTextOutA(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, lpString, nCount, nTabPositions,
lpnTabStopPositions, nTabOrigin);
end;
Result := ozTabbedTextOutA(hDC, X, Y, lpString, nCount, nTabPositions,
lpnTabStopPositions, nTabOrigin);
end;
function TabbedTextOutWHook(hDC: HDC; X, Y: Integer; lpString: LPCWSTR; nCount, nTabPositions: Integer;
var lpnTabStopPositions; nTabOrigin: Integer): Longint; stdcall;
var
sData: String;
begin
if _PrintHook.IsAblePrintDrawCopy and (_PrintHook.CurPtrDC_ = hDC) then
begin
ReplaceTextW(lpString);
sData := String(lpString);
SumString(_PrintHook.sPtrText_, sData, ' ');
SetPtrBmpFont(hDC);
if _PrintHook.IsAblePrintDrawCopy then
ozTabbedTextOutW(_PrintHook.PtrBmp_.Canvas.Handle, X, Y, lpString, nCount, nTabPositions,
lpnTabStopPositions, nTabOrigin);
end;
Result := ozTabbedTextOutW(hDC, X, Y, lpString, nCount, nTabPositions,
lpnTabStopPositions, nTabOrigin);
end;
function SetWindowTextAHook(hWnd: HWND; lpString: LPCSTR): BOOL; stdcall;
var
sData: AnsiString;
begin
if _PrintHook.Active and _PrintHook.bIsPrinting_ then
begin
ReplaceTextA(lpString);
sData := AnsiString(lpString);
SumString(_PrintHook.sPtrText_, sData, ' ');
end;
Result := SetWindowTextA(hWnd, lpString);
end;
function SetWindowTextWHook(hWnd: HWND; lpString: LPCWSTR): BOOL; stdcall;
var
sData: String;
begin
if _PrintHook.Active and _PrintHook.bIsPrinting_ then
begin
ReplaceTextW(lpString);
sData := String(lpString);
SumString(_PrintHook.sPtrText_, sData, ' ');
end;
Result := SetWindowTextW(hWnd, lpString);
end;
function MessageBoxAHook(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT): Integer; stdcall;
var
sData: AnsiString;
begin
if _PrintHook.Active and _PrintHook.bIsPrinting_ then
begin
ReplaceTextA(lpText);
ReplaceTextA(lpCaption);
sData := AnsiString(lpText);
SumString(_PrintHook.sPtrText_, sData, ' ');
end;
Result := MessageBoxA(hWnd, lpText, lpCaption, uType);
end;
function MessageBoxWHook(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;
var
sData: String;
begin
if _PrintHook.Active and _PrintHook.bIsPrinting_ then
begin
ReplaceTextW(lpText);
ReplaceTextW(lpCaption);
sData := String(lpText);
SumString(_PrintHook.sPtrText_, sData, ' ');
end;
Result := MessageBoxW(hWnd, lpText, lpCaption, uType);
end;
function MessageBoxExAHook(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT; wLanguageId: Word): Integer; stdcall;
var
sData: AnsiString;
begin
if _PrintHook.Active and _PrintHook.bIsPrinting_ then
begin
ReplaceTextA(lpText);
ReplaceTextA(lpCaption);
sData := AnsiString(lpText);
SumString(_PrintHook.sPtrText_, sData, ' ');
end;
Result := MessageBoxExA(hWnd, lpText, lpCaption, uType, wLanguageId);
end;
function MessageBoxExWHook(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT; wLanguageId: Word): Integer; stdcall;
var
sData: String;
begin
if _PrintHook.Active and _PrintHook.bIsPrinting_ then
begin
ReplaceTextW(lpText);
ReplaceTextW(lpCaption);
sData := String(lpText);
SumString(_PrintHook.sPtrText_, sData, ' ');
end;
Result := MessageBoxExW(hWnd, lpText, lpCaption, uType, wLanguageId);
end;
{ TPrintHook }
Constructor TPrintHook.Create;
procedure GetStartTime;
var
ftCreate,
ftExit,
ftKernel,
ftUser: TFileTime;
nDosTime: Integer;
begin
dtCreate_ := 0;
GetProcessTimes(GetCurrentProcess, ftCreate, ftExit, ftKernel, ftUser);
if FileTimeToLocalFileTime(ftCreate, ftCreate) then
if FileTimeToDosDateTime(ftCreate, LongRec(nDosTime).Hi, LongRec(nDosTime).Lo) then
dtCreate_ := FileDateToDateTime(nDosTime);
end;
var
IgrList: TStringList;
begin
Inherited Create;
ASSERT(_PrintHook = nil);
_PrintHook := Self;
hWndHook_ := 0;
hMsgHook_ := 0;
hShellHook_ := 0;
bInitOk_ := false;
bIsPrinting_ := false;
bIsStartPage_ := false;
bIsWaterMaking_ := false;
CurPtrDC_ := 0;
sPtrText_ := '';
sCurDocName_ := '';
nPtrCnt_ := 0;
hProcWnd_ := 0;
GetStartTime;
ProcList_ := TList<PPointer>.Create;
// DcFileH_ := TDictionary<THandle,String>.Create;
OFList_ := TStringList.Create;
OFList_.CaseSensitive := false;
SharedData_ := TTgFileMapping<TSharedData>.Create(MAP_FILENAME_APIHOOK, SizeOf(TSharedData));
if SharedData_.IsAvailable then
begin
// sImgPath_ := SharedData_.Data.sImgPath;
sLogPath_ := SharedData_.Data.sLogPath;
end;
Guard(IgrList, TStringList.Create);
IgrList.CaseSensitive := false;
SplitString(END_PROCESS, '|', IgrList);
bEndDocProc_ := IgrList.IndexOf(ModuleName) > -1;
SplitString(SMALL_FONT, '|', IgrList);
bSmallFont_ := IgrList.IndexOf(ModuleName) > -1;
SplitString(IGNORE_PROCESS, '|', IgrList);
if IgrList.IndexOf(ModuleName) = -1 then
begin
Trace_ := TTgTrace.Create(ExtractFilePath(sLogPath_), ExtractFileName(sLogPath_));
DoInterceptCreate;
end;
end;
Destructor TPrintHook.Destroy;
begin
UnInstallHook;
_PrintHook := nil;
FreeAndNil(SharedData_);
if Trace_ <> nil then
FreeAndNil(Trace_);
// FreeAndNil(DcFileH_);
FreeAndNil(OFList_);
FreeAndNil(ProcList_);
Inherited;
end;
function TPrintHook.IsAblePrintDrawCopy: Boolean;
begin
Result := not bIsWaterMaking_ and bIsPrinting_ and GetActive and (PtrBmp_ <> nil);
end;
procedure TPrintHook.DoInterceptCreate;
procedure AddInterceptAPI(var aProcDest: Pointer; aProcSrc, aProcHook: Pointer; sProcName: String);
begin
if aProcDest = nil then
begin
aProcDest := InterceptCreate(aProcSrc, aProcHook);
if aProcDest <> nil then
begin
Log(Format('>>> InterceptCreate() - %s <<<', [sProcName]));
ProcList_.Add(@aProcDest);
end else
Log(Format('>>> Fail .. InterceptCreate() - %s <<<', [sProcName]));
end;
end;
begin
Log('DoInterceptCreate()');
DoInterceptRemove;
AddInterceptAPI(@ozCreateFileA, @CreateFileA, @CreateFileAHook, 'CreateFileA');
AddInterceptAPI(@ozCreateFileW, @CreateFileW, @CreateFileWHook, 'CreateFileW');
AddInterceptAPI(@ozCloseHandle, @CloseHandle, @CloseHandleHook, 'CloseHandle');
AddInterceptAPI(@ozStartDocA, @StartDocA, @StartDocAHook, 'StartDocA');
AddInterceptAPI(@ozStartDocW, @StartDocW, @StartDocWHook, 'StartDocW');
AddInterceptAPI(@ozStartPage, @StartPage, @StartPageHook, 'StartPage');
AddInterceptAPI(@ozEndPage, @EndPage, @EndPageHook, 'EndPage');
AddInterceptAPI(@ozEndDoc, @EndDoc, @EndDocHook, 'EndDoc');
AddInterceptAPI(@ozBitBlt, @BitBlt, @BitBltHook, 'BitBlt');
AddInterceptAPI(@ozStretchBlt, @StretchBlt, @StretchBltHook, 'StretchBlt');
AddInterceptAPI(@ozTransparentBlt, @TransparentBlt, @TransparentBltHook, 'TransparentBlt');
AddInterceptAPI(@ozStretchDIBits, @StretchDIBits, @StretchDIBitsHook, 'StretchDIBits'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozSetDIBitsToDevice, @SetDIBitsToDevice, @SetDIBitsToDeviceHook, 'SetDIBitsToDevice');
// AddInterceptAPI(@ozGdipDrawLine, @GdipDrawLine, @GdipDrawLineHook, 'GdipDrawLine');
// AddInterceptAPI(@ozGdipDrawLineI, @GdipDrawLineI, @GdipDrawLineIHook, 'GdipDrawLineI');
// AddInterceptAPI(@ozGdipDrawLines, @GdipDrawLines, @GdipDrawLinesHook, 'GdipDrawLines');
// AddInterceptAPI(@ozGdipDrawLinesI, @GdipDrawLinesI, @GdipDrawLinesIHook, 'GdipDrawLinesI');
// AddInterceptAPI(@ozGdipDrawRectangle, @GdipDrawRectangle, @GdipDrawRectangleHook, 'GdipDrawRectangle');
// AddInterceptAPI(@ozGdipDrawRectangleI, @GdipDrawRectangleI, @GdipDrawRectangleIHook, 'GdipDrawRectangleI');
// AddInterceptAPI(@ozGdipDrawRectangles, @GdipDrawRectangles, @GdipDrawRectanglesHook, 'GdipDrawRectangles');
// AddInterceptAPI(@ozGdipDrawRectanglesI, @GdipDrawRectanglesI, @GdipDrawRectanglesIHook, 'GdipDrawRectanglesI');
// AddInterceptAPI(@ozPatBlt, @PatBlt, @PatBltHook, 'PatBlt');
AddInterceptAPI(@ozSetMapperFlags, @SetMapperFlags, @SetMapperFlagsHook, 'SetMapperFlags');
AddInterceptAPI(@ozSetGraphicsMode, @SetGraphicsMode, @SetGraphicsModeHook, 'SetGraphicsMode');
AddInterceptAPI(@ozSetMapMode, @SetMapMode, @SetMapModeHook, 'SetMapMode');
AddInterceptAPI(@ozSetPixel, @SetPixel, @SetPixelHook, 'SetPixel');
AddInterceptAPI(@ozSetPixelV, @SetPixelV, @SetPixelVHook, 'SetPixelV');
AddInterceptAPI(@ozLineTo, @LineTo, @LineToHook, 'LineTo'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozMoveToEx, @MoveToEx, @MoveToExHook, 'MoveToEx'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozPolyLineTo, @PolyLineTo, @PolyLineToHook, 'PolyLineTo');
AddInterceptAPI(@ozPolyBezierTo, @PolyBezierTo, @PolyBezierToHook, 'PolyBezierTo'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozPolyDraw, @PolyDraw, @PolyDrawHook, 'PolyDraw');
AddInterceptAPI(@ozRectangle, @Rectangle, @RectangleHook, 'Rectangle');
AddInterceptAPI(@ozRoundRect, @RoundRect, @RoundRectHook, 'RoundRect');
AddInterceptAPI(@ozPolygon, @Polygon, @PolygonHook, 'Polygon');
AddInterceptAPI(@ozPolyBezier, @PolyBezier, @PolyBezierHook, 'PolyBezier');
AddInterceptAPI(@ozPolyline, @Polyline, @PolylineHook, 'Polyline');
// AddInterceptAPI(@ozMaskBlt, @MaskBlt, @MaskBltHook, 'MaskBlt'); // X
// AddInterceptAPI(@ozPlgBlt, @PlgBlt, @PlgBltHook, 'PlgBlt'); // X
// AddInterceptAPI(@ozCreateDIBitmap, @CreateDIBitmap, @CreateDIBitmapHook, 'CreateDIBitmap'); // X
// AddInterceptAPI(@ozSetDIBits, @SetDIBits, @SetDIBitsHook, 'SetDIBits'); // X
AddInterceptAPI(@ozBeginPath, @BeginPath, @BeginPathHook, 'BeginPath'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozEndPath, @EndPath, @EndPathHook, 'EndPath'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozFillPath, @FillPath, @FillPathHook, 'FillPath'); // chrome <20>ʼ<EFBFBD>
AddInterceptAPI(@ozStrokePath, @StrokePath, @StrokePathHook, 'StrokePath');// >> X
AddInterceptAPI(@ozStrokeAndFillPath, @StrokeAndFillPath, @StrokeAndFillPathHook, 'StrokeAndFillPath');// >> X
AddInterceptAPI(@ozFlattenPath, @FlattenPath, @FlattenPathHook, 'FlattenPath');
AddInterceptAPI(@ozWidenPath, @WidenPath, @WidenPathHook, 'WidenPath');
AddInterceptAPI(@ozSetDCBrushColor, @SetDCBrushColor, @SetDCBrushColorHook, 'SetDCBrushColor');
AddInterceptAPI(@ozSetDCPenColor, @SetDCPenColor, @SetDCPenColorHook, 'SetDCPenColor');
AddInterceptAPI(@ozSetDIBColorTable, @SetDIBColorTable, @SetDIBColorTableHook, 'SetDIBColorTable');
AddInterceptAPI(@ozSetTextAlign, @SetTextAlign, @SetTextAlignHook, 'SetTextAlign');
// AddInterceptAPI(@ozSetBkColor, @SetBkColor, @SetBkColorHook, 'SetBkColor'); // <20>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>.. 23_0107 22:41:09 kku
AddInterceptAPI(@ozGradientFill, @GradientFill, @GradientFillHook, 'GradientFill');
AddInterceptAPI(@ozFillRect, @FillRect, @FillRectHook, 'FillRect');
AddInterceptAPI(@ozFrameRect, @FrameRect, @FrameRectHook, 'FrameRect');
AddInterceptAPI(@ozFloodFill, @FloodFill, @FloodFillHook, 'FloodFill');
AddInterceptAPI(@ozExtFloodFill, @ExtFloodFill, @ExtFloodFillHook, 'ExtFloodFill');
AddInterceptAPI(@ozFillRgn, @FillRgn, @FillRgnHook, 'FillRgn');
AddInterceptAPI(@ozSetPolyFillMode, @SetPolyFillMode, @SetPolyFillModeHook, 'SetPolyFillMode');
AddInterceptAPI(@ozDrawEscape, @DrawEscape, @DrawEscapeHook, 'DrawEscape');
AddInterceptAPI(@ozPaintRgn, @PaintRgn, @PaintRgnHook, 'PaintRgn');
AddInterceptAPI(@ozSetColorAdjustment, @SetColorAdjustment, @SetColorAdjustmentHook, 'SetColorAdjustment');
AddInterceptAPI(@ozSetArcDirection, @SetArcDirection, @SetArcDirectionHook, 'SetArcDirection');
AddInterceptAPI(@ozSetViewportExtEx, @SetViewportExtEx, @SetViewportExtExHook, 'SetViewportExtEx');
AddInterceptAPI(@ozSetViewportOrgEx, @SetViewportOrgEx, @SetViewportOrgExHook, 'SetViewportOrgEx');
AddInterceptAPI(@ozSetICMMode, @SetICMMode, @SetICMModeHook, 'SetICMMode');
AddInterceptAPI(@ozSetColorSpace, @SetColorSpace, @SetColorSpaceHook, 'SetColorSpace');
AddInterceptAPI(@ozAngleArc, @AngleArc, @AngleArcHook, 'AngleArc');
AddInterceptAPI(@ozArcTo, @ArcTo, @ArcToHook, 'ArcTo');
AddInterceptAPI(@ozPolyPolyline, @PolyPolyline, @PolyPolylineHook, 'PolyPolyline');
AddInterceptAPI(@ozEllipse, @Ellipse, @EllipseHOok, 'Ellipse');
AddInterceptAPI(@ozChord, @Chord, @ChordHook, 'Chord');
AddInterceptAPI(@ozArc, @Arc, @ArcHook, 'Arc');
AddInterceptAPI(@ozPie, @Pie, @PieHook, 'Pie');
AddInterceptAPI(@ozPolyPolygon, @PolyPolygon, @PolyPolygonHook, 'PolyPolygon');
// AddInterceptAPI(@ozCreatePen, @CreatePen, @CreatePenHook, 'CreatePen');
// AddInterceptAPI(@ozSelectObject, @SelectObject, @SelectObjectHook, 'SelectObject');
// AddInterceptAPI(@ozDeleteObject, @DeleteObject, @DeleteObjectHook, 'DeleteObject');
AddInterceptAPI(@ozExtTextOutA, @ExtTextOutA, @ExtTextOutAHook, 'ExtTextOutA'); // notepad++
AddInterceptAPI(@ozExtTextOutW, @ExtTextOutW, @ExtTextOutWHook, 'ExtTextOutW'); // notepad++
AddInterceptAPI(@ozDrawTextA, @DrawTextA, @DrawTextAHook, 'DrawTextA');
AddInterceptAPI(@ozDrawTextW, @DrawTextW, @DrawTextWHook, 'DrawTextW');
AddInterceptAPI(@ozDrawTextExA, @DrawTextExA, @DrawTextExAHook, 'DrawTextExA');
AddInterceptAPI(@ozDrawTextExW, @DrawTextExW, @DrawTextExWHook, 'DrawTextExW');
AddInterceptAPI(@ozTextOutA, @TextOutA, @TextOutAHook, 'TextOutA');
AddInterceptAPI(@ozTextOutW, @TextOutW, @TextOutWHook, 'TextOutW');
AddInterceptAPI(@ozPolyTextOutA, @PolyTextOutA, @PolyTextOutAHook, 'PolyTextOutA');
AddInterceptAPI(@ozPolyTextOutW, @PolyTextOutW, @PolyTextOutWHook, 'PolyTextOutW');
AddInterceptAPI(@ozTabbedTextOutA, @TabbedTextOutA, @TabbedTextOutAHook, 'TabbedTextOutA');
AddInterceptAPI(@ozTabbedTextOutW, @TabbedTextOutW, @TabbedTextOutWHook, 'TabbedTextOutW');
// AddInterceptAPI(@ozDragQueryFileA, @DragQueryFileA, @DragQueryFileAHook, 'DragQueryFileA');
// AddInterceptAPI(@ozDragQueryFileW, @DragQueryFileW, @DragQueryFileWHook, 'DragQueryFileW');
bInitOk_ := true;
end;
procedure TPrintHook.DoInterceptRemove;
procedure RemoveAPI(var aProc: Pointer);
var
nRet: Integer;
begin
if aProc <> nil then
begin
nRet := InterceptRemove(aProc);
// Log('DoInterceptRemove() .. RemoveAPI() .. nRet=' + IntToStr(nRet));
aProc := nil;
end;
end;
var
i: Integer;
begin
if bInitOk_ then
begin
Log('DoInterceptRemove()');
for i := 0 to ProcList_.Count - 1 do
RemoveAPI(ProcList_[i]^);
ProcList_.Clear;
bInitOk_ := false;
end;
end;
procedure TPrintHook.Log(sLog: String);
begin
if Trace_ <> nil then
begin
_bLogProcessing := true;
Trace_.T('(%s) %s', [ModuleName, sLog]);
_bLogProcessing := false;
end;
end;
function TPrintHook.InstallHook: Integer;
begin
Log('InstallPrintHook');
try
// hWndHook_ := SetWindowsHookEx(WH_CALLWNDPROC, process_WH_CALLWNDPROC, HInstance, 0);
// if hWndHook_ = 0 then
// begin
// Log('SetWindowsHookEx(WH_CALLWNDPROC) fail!!');
// Result := 4;
// exit;
// end;
// hMsgHook_ := SetWindowsHookEx(WH_GETMESSAGE, process_WH_GETMESSAGE, HInstance, 0);
// if hMsgHook_ = 0 then
// begin
// Log('SetWindowsHookEx(WH_GETMESSAGE) fail!!');
// Result := 3;
// exit;
// end;
// hCbtHook_ := SetWindowsHookEx(WH_CBT, process_WH_CBT, HInstance, 0);
// if hCbtHook_ = 0 then
// begin
// Log('SetWindowsHookEx(WH_CBT) fail!!');
// Result := 1;
// exit;
// end;
hShellHook_ := SetWindowsHookEx(WH_SHELL, process_WH_SHELL, HInstance, 0);
if hShellHook_ = 0 then
begin
Log('SetWindowsHookEx(WH_SHELL) fail!!');
Result := 2;
exit;
end;
except
exit;
end;
// if (hCbtHook_ <> 0) and (hShellHook_ <> 0) then
Result := 0;
// else
// Result := -2;
end;
function TPrintHook.UnInstallHook: Integer;
begin
Log('UninstallPrintHook');
try
if hWndHook_ <> 0 then
begin
Log('UnhookWindowsHookEx(WndHook)');
UnhookWindowsHookEx(hWndHook_);
hWndHook_ := 0;
end;
if hMsgHook_ <> 0 then
begin
Log('UnhookWindowsHookEx(MsgHook)');
UnhookWindowsHookEx(hMsgHook_);
hMsgHook_ := 0;
end;
try
if hCbtHook_ <> 0 then
begin
Log('UnhookWindowsHookEx(CbtHook)');
UnhookWindowsHookEx(hCbtHook_);
hCbtHook_ := 0;
end;
except
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. OS <20><><EFBFBD>ٴٸ<D9B4><D9B8><EFBFBD><EFBFBD><EFBFBD> <20>𸣰<EFBFBD><F0B8A3B0><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20>״´<D7B4>. 14_1023 17:57:08 sunk
hCbtHook_ := 0;
end;
if hShellHook_ <> 0 then
begin
Log('UnhookWindowsHookEx(ShellHook)');
UnhookWindowsHookEx(hShellHook_);
hShellHook_ := 0;
end;
DoInterceptRemove;
except
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. OS <20><><EFBFBD>ٴٸ<D9B4><D9B8><EFBFBD><EFBFBD><EFBFBD> <20>𸣰<EFBFBD><F0B8A3B0><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20>״´<D7B4>. 14_1023 17:57:08 sunk
hMsgHook_ := 0;
hShellHook_ := 0;
end;
Result := 0;
end;
function TPrintHook.GetActive: Boolean;
begin
Result := false;
try
if SharedData_.Data <> nil then
Result := SharedData_.Data.bActive;
except
Log('Fail .. GetActive()');
end;
end;
function TPrintHook.GetRcvWnd: LONGLONG;
begin
Result := 0;
try
if SharedData_.Data <> nil then
Result := SharedData_.Data.llRcvWnd;
except
Log('Fail .. GetRcvWnd()');
end;
end;
function TPrintHook.GetText: String;
begin
Result := 'ToCSG';
try
if SharedData_.Data <> nil then
Result := SharedData_.Data.sText;
except
Log('Fail .. GetText()');
end;
end;
function TPrintHook.GetImagePath: String;
begin
Result := '';
// try
// if SharedData_.Data <> nil then
// Result := SharedData_.Data.ssImgPath_;
// except
// Log('Fail .. GetImagePath()');
// end;
end;
function TPrintHook.GetFontSize: Integer;
begin
Result := 0;
try
if SharedData_.Data <> nil then
Result := SharedData_.Data.nFontSize;
except
Log('Fail .. GetFontSize()');
end;
end;
function TPrintHook.GetLineCount: Integer;
begin
Result := 0;
try
if SharedData_.Data <> nil then
Result := SharedData_.Data.nLineCnt;
except
Log('Fail .. GetLineCount()');
end;
end;
procedure TPrintHook.SetPtrInfo(sInfo: String);
begin
try
ZeroMemory(@_PrintHook.SharedData_.Data.sPtrInfo, 4096);
StrCopy(_PrintHook.SharedData_.Data.sPtrInfo, PChar(sInfo));
except
Log('Fail .. SetPtrInfo()');
end;
end;
procedure TPrintHook.SetCurDocName(sName: String);
begin
try
sCurDocName_ := sName;
ZeroMemory(@_PrintHook.SharedData_.Data.sCurDocName, 1024);
StrCopy(_PrintHook.SharedData_.Data.sCurDocName, PChar(sCurDocName_));
except
Log('Fail .. SetCurDocName()');
end;
end;
function InstallPrintHook: Integer;
begin
Result := -1;
if Assigned(_PrintHook) then
Result := _PrintHook.InstallHook;
end;
function UninstallPrintHook: Integer;
begin
Result := -1;
if Assigned(_PrintHook) then
Result := _PrintHook.UnInstallHook;
end;
exports
InstallPrintHook, UninstallPrintHook;
end.