Registriert seit: 10. Nov 2013
83 Beiträge
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
28. Jan 2018, 02:30
Here is my complete code updated, i tried translate callback function (was a combine of these 2 links: LNK1 and LNK2), seems right but not is executing when MagSetImageScalingCallback api is called.
Delphi-Quellcode:
var
Form1: TForm1;
implementation
uses
Unit3, Magnification;
{$R *.dfm}
function ImageScaling(hwnd: hwnd; srcdata: Pointer; srcheader: MAGIMAGEHEADER;
destdata: Pointer; destheader: MAGIMAGEHEADER; unclipped: TRect;
clipped: TRect; dirty: HRGN): Boolean;
var
lpbmih: TBitmapInfoHeader;
lpbmi: TBitmapInfo;
aBitmap: HBITMAP;
aDC: HDC;
bmp: TBitmap;
begin
Fillchar(lpbmih, SizeOf(lpbmih), 0);
lpbmih.biSize := SizeOf(lpbmih);
lpbmih.biWidth := srcheader.width;
lpbmih.biHeight := srcheader.height;
lpbmih.biPlanes := 1;
lpbmih.biBitCount := Floor(lpbmih.biSizeImage / lpbmih.biHeight /
lpbmih.biWidth * 8);
lpbmih.biCompression := BI_RGB;
Fillchar(lpbmi, SizeOf(lpbmi), 0);
lpbmi.bmiHeader.biSize := SizeOf(lpbmi.bmiHeader);
lpbmi.bmiHeader.biWidth := srcheader.width;
lpbmi.bmiHeader.biHeight := srcheader.height;
lpbmi.bmiHeader.biPlanes := 1;
lpbmi.bmiHeader.biBitCount :=
Floor(lpbmi.bmiHeader.biSizeImage / lpbmi.bmiHeader.biHeight /
lpbmi.bmiHeader.biWidth * 8);
lpbmi.bmiHeader.biCompression := BI_RGB;
aDC := GetWindowDC(hwnd);
bmp := TBitmap.Create;
aBitmap := 0;
try
aBitmap := CreateDIBitmap(aDC, lpbmih, 0, nil, lpbmi, DIB_RGB_COLORS);
bmp.handle := aBitmap;
finally
DeleteObject(aBitmap);
DeleteDC(aDC);
bmp.Free;
end;
Result := True;
end;
procedure MagScreenShot;
var
desktop, hwndMag: hwnd;
desktoprect, sourceRect: TRect;
filterList: THWNDArray;
m_ScreenX, m_ScreenY, m_ScreenT, m_ScreenL: Integer;
begin
if not Form3.Showing then
Form3.Show;
desktop := GetDesktopWindow;
GetWindowRect(desktop, desktoprect);
m_ScreenT := desktoprect.Top;
m_ScreenL := desktoprect.Left;
m_ScreenX := desktoprect.right;
m_ScreenY := desktoprect.bottom;
if (not MagInitialize) then
begin
Application.MessageBox('Init magnification failed', 'Error',
mb_Ok + mb_IconError);
Exit;
end;
hwndMag := CreateWindow(WC_MAGNIFIER, 'MagnifierWindow',
WS_CHILD or MS_SHOWMAGNIFIEDCURSOR or WS_VISIBLE, 0, 0, m_ScreenX,
m_ScreenY, Form1.handle, 0, hInstance, nil);
if (hwndMag = 0) then
begin
Application.MessageBox('MagnifierWindow creation failed', 'Error',
mb_Ok + mb_IconError);
Exit;
end;
if (not MagSetImageScalingCallback(hwndMag, TMagImageScalingCallback(@ImageScaling))) then
begin
Application.MessageBox('Cannot set callback', 'Error',
mb_Ok + mb_IconError);
Exit;
end;
try
filterList[0] := Form3.handle;
except
end;
if (not MagSetWindowFilterList(hwndMag, MW_FILTERMODE_EXCLUDE, 1,
@filterList[0])) then
begin
Application.MessageBox('Cannot exclude main window', 'Error',
mb_Ok + mb_IconError);
Exit;
end;
sourceRect.Top := m_ScreenT;
sourceRect.Left := m_ScreenL;
sourceRect.right := m_ScreenX;
sourceRect.bottom := m_ScreenY;
if (not MagSetWindowSource(hwndMag, sourceRect)) then
begin
Application.MessageBox('Cannot set source to MagnifierWindow', 'Error',
mb_Ok + mb_IconError);
Exit;
end;
{ if (not MagUninitialize) then
begin
Application.MessageBox('Finalize magnification failed', 'Error',
mb_Ok + mb_IconError);
Exit;
end; }
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
MagScreenShot;
end;
Timer is be to 10000ms
Geändert von flashcoder (28. Jan 2018 um 03:20 Uhr)
|