![]() |
Delphi-Version: 10 Seattle
MagSetWindowFilterList function not remove specified window of screenshot
Liste der Anhänge anzeigen (Anzahl: 1)
I had build part of this code below based in
![]() Then i have two troubles with this following code: 1 - MagSetWindowFilterList function not remove main form (Form1). 2 - How recovery the content of "MagnifierWindow" to a image format? My actual code is this: Magnification.pas
Delphi-Quellcode:
Main
unit Magnification;
{$ALIGN ON} {$MINENUMSIZE 4} interface uses Windows; const // Magnifier Class Name WC_MAGNIFIERA: AnsiString = 'Magnifier'; WC_MAGNIFIERW: WideString = 'Magnifier'; WC_MAGNIFIER = 'Magnifier'; // Magnifier Window Styles MS_SHOWMAGNIFIEDCURSOR = $0001; MS_CLIPAROUNDCURSOR = $0002; MS_INVERTCOLORS = $0004; // Filter Modes MW_FILTERMODE_EXCLUDE = 0; MW_FILTERMODE_INCLUDE = 1; type tagMAGTRANSFORM = record v: array[1..3, 1..3] of Single; end; MAGTRANSFORM = tagMAGTRANSFORM; TMagTransform = tagMAGTRANSFORM; PMagTransform = ^TMagTransform; tagMAGIMAGEHEADER = record width: UINT; height: UINT; format: TGUID; stride: UINT; offset: UINT; cbSize: UINT; end; MAGIMAGEHEADER = tagMAGIMAGEHEADER; TMagImageHeader = tagMAGIMAGEHEADER; PMagImageHeader = ^TMagImageHeader; tagMAGCOLOREFFECT = record transform: array[1..5, 1..5] of Single; end; MAGCOLOREFFECT = tagMAGCOLOREFFECT; TMagColorEffect = tagMAGCOLOREFFECT; PMagColorEffect = ^TMagColorEffect; TMagImageScalingCallback = function (hwnd: HWND; srcdata: Pointer; srcheader: MAGIMAGEHEADER; destdata: Pointer; destheader: MAGIMAGEHEADER; unclipped: TRect; clipped: TRect; dirty: HRGN): BOOL; stdcall; THWNDArray = array[0..0] of HWND; PHWNDArray = ^THWNDArray; // Public Functions function MagInitialize(): BOOL; stdcall; function MagUninitialize(): BOOL; stdcall; function MagSetWindowSource(hwnd: HWND; rect: TRect): BOOL; stdcall; function MagGetWindowSource(hwnd: HWND; var Rect: TRect): BOOL; stdcall; function MagSetWindowTransform(hwnd: HWND; var Transform: TMagTransform): BOOL; stdcall; function MagGetWindowTransform(hwnd: HWND; var Transform: TMagTransform): BOOL; stdcall; function MagSetWindowFilterList(hwnd: HWND; dwFilterMode: DWORD; count: Integer; pHWND: PHWNDArray): BOOL; stdcall; function MagGetWindowFilterList(hwnd: HWND; var dwFilterMode: DWORD; count: Integer; pHWND: PHWNDArray): Integer; stdcall; function MagSetImageScalingCallback(hwnd: HWND; MagImageScalingCallback: TMagImageScalingCallback): BOOL; stdcall; // MagImageScalingCallback WINAPI MagGetImageScalingCallback(HWND hwnd ); function MagSetColorEffect(hwnd: HWND; var Effect: TMagColorEffect): BOOL; stdcall; function MagGetColorEffect(hwnd: HWND; var Effect: TMagColorEffect): BOOL; stdcall; implementation const MagnificationDll = 'Magnification.dll'; function MagInitialize; external MagnificationDll name 'MagInitialize'; function MagUninitialize; external MagnificationDll name 'MagUninitialize'; function MagSetWindowSource; external MagnificationDll name 'MagSetWindowSource'; function MagGetWindowSource; external MagnificationDll name 'MagGetWindowSource'; function MagSetWindowTransform; external MagnificationDll name 'MagSetWindowTransform'; function MagGetWindowTransform; external MagnificationDll name 'MagGetWindowTransform'; function MagSetWindowFilterList; external MagnificationDll name 'MagSetWindowFilterList'; function MagGetWindowFilterList; external MagnificationDll name 'MagGetWindowFilterList'; function MagSetImageScalingCallback; external MagnificationDll name 'MagSetImageScalingCallback'; function MagSetColorEffect; external MagnificationDll name 'MagSetColorEffect'; function MagGetColorEffect; external MagnificationDll name 'MagGetColorEffect'; end.
Delphi-Quellcode:
var
Form1: TForm1; implementation uses Unit3, Magnification; {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var desktop, hwndMag: HWND; desktoprect, sourceRect: TRect; filterList: PHWNDArray; m_ScreenX, m_ScreenY, m_ScreenT, m_ScreenL: Integer; begin desktop := GetDesktopWindow; GetWindowRect(desktop, desktoprect); m_ScreenT := desktoprect.Top; m_ScreenL := desktoprect.Left; m_ScreenX := desktoprect.right; m_ScreenY := desktoprect.bottom; Form3 := TForm3.Create(Form3); SetWindowPos(Form3.Handle, 0, 0, 0, desktoprect.right, desktoprect.bottom, SWP_SHOWWINDOW); SetWindowLong(Form3.Handle, GWL_EXSTYLE, GetWindowLong(Form3.Handle, GWL_EXSTYLE) or WS_EX_LAYERED); SetLayeredWindowAttributes(Form3.Handle, 0, 255, LWA_ALPHA); 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, Form3.Handle, 0, hInstance, nil); if (hwndMag = 0) then begin Application.MessageBox('MagnifierWindow creation failed', 'Error', mb_Ok + mb_IconError); Exit; end; try filterList[0] := Handle; except end; if (not MagSetWindowFilterList(hwndMag, MW_FILTERMODE_EXCLUDE, 1, filterList)) 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; |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Delphi-Quellcode:
{ Here's how you can save the screen content into a bitmapfile.
If you don't want to include the active (Delphi-)Application just put easily a 'Application.Minimize;' at the beginning of the procedure } uses Windows, Graphics, Forms; procedure TForm1.Button1Click(Sender: TObject); var DC: HDC; Canvas: TCanvas; MyBitmap: TBitmap; begin Canvas := TCanvas.Create; MyBitmap := TBitmap.Create; DC := GetDC(0); try Canvas.Handle := DC; with Screen do begin { detect the actual height and with of the screen } MyBitmap.Width := Width; MyBitmap.Height := Height; { copy the screen content to the bitmap } MyBitmap.Canvas.CopyRect(Rect(0, 0, Width, Height), Canvas, Rect(0, 0, Width, Height)); { stream the bitmap to disk } MyBitmap.SaveToFile('c:\windows\desktop\screen.bmp'); end; finally { free memory } ReleaseDC(0, DC); MyBitmap.Free; Canvas.Free end; end; |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
I really need of help to fix code that was posted on question. |
AW: MagSetWindowFilterList function not remove specified window of screenshot
use this command wherever you need
this will hide a window by its handle
Code:
use this code careful, it can be used to also tweak control (in and outside of your program)
ShowWindow(EnterHandle, SW_HIDE); // Enter Handle of Window wich needs to become invisible
or ShowWindow(FindWindow(EnterClassName,nil), SW_HIDE); // EnterClassName can be something like TForm1 etc, adjust to your or ShowWindow(FindWindow(nil,'Enter Forms Caption'), SW_HIDE); // self explaining replace SW_HIDE with SW_SHOW to bring it back |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Hiding / minimizing a window to exclude it from a screenshot is an invasive operation and I as an user would not like it (even if it's only for a split second).
Zitat:
Delphi-Quellcode:
as
filterList
Delphi-Quellcode:
. Just use a normal
PHWNDArray
Delphi-Quellcode:
as variable declaration and pass it like this:
THWNDArray
Delphi-Quellcode:
. You could even use plain
MagSetWindowFilterList(hwndMag, MW_FILTERMODE_EXCLUDE, 1, @filterList[0])
Delphi-Quellcode:
as type for
HWND
Delphi-Quellcode:
(in case there's always only one handle in your "list").
filterList
Zitat:
Delphi-Quellcode:
.
MagImageScalingCallback
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
@Zacherl,
thank you very much, your suggestion about MagSetWindowFilterList worked fine. I will try translate the part of save content of hwndmag to a image format. I tried the suggestion of @Fukiszo but not worked see:
Delphi-Quellcode:
But if someone know a way in Delphi and that works, i will accept.
Canvas := TCanvas.Create;
MyBitmap := TBitmap.Create; DC := GetWindowDC(hwndMag); GetWindowRect(hwndMag, r); try Canvas.Handle := DC; MyBitmap.Width := r.Width; MyBitmap.Height := r.Height; MyBitmap.Canvas.CopyRect(Rect(0, 0, MyBitmap.Width, MyBitmap.Height), Canvas, Rect(0, 0, r.Width, r.Height)); MyBitmap.SaveToFile('c:\screen.bmp'); finally ReleaseDC(0, DC); MyBitmap.Free; Canvas.Free end; |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Delphi-Quellcode:
but better wait, others may give much better methods than my rude ones.
my example was made for a full screen, not part of screen
use it like this: MyBitmap.Canvas.CopyRect(Rect(X.Start, Y.Start, X.End, Y.End), Canvas, Rect(X.Start, Y.Start, X.End, Y.End)); X and Y are Screen Offsets, not your Application Window Offsets eg, Position [0,0] = topleft screen corner and not your application windows coordinate! |
AW: MagSetWindowFilterList function not remove specified window of screenshot
@Fukiszo,
i tried your two suggestions and none works, but this can be the reason: Zitat:
So, i think that with BMP.Canvas.CopyRect() also not is different. |
AW: MagSetWindowFilterList function not remove specified window of screenshot
sorry i dont know MagXXXXX.pas units neither their .dll,
i gave general examples, if MAGxxx uses overlay to display something, my method fail. that i think your warning is telling. I'm sorry! Zitat:
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Zitat:
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
if it is allowed, upload the 80kb source, i dont have access on your link to look at.
edit: forget it, i just scrolled down and what i read is pretty simple, when you translated the callback part you automatic have imported BMP format from where you can create hundrets of copies.
Code:
at that point the image is ready
LONG lineSize = bmif.biWidth * bmif.biBitCount / 8;
BYTE* pLineData = new BYTE[lineSize]; BYTE* pStart; BYTE* pEnd; LONG lineStart = 0; LONG lineEnd = bmif.biHeight - 1; while (lineStart < lineEnd) { // Get the address of the swap line pStart = pData + (lineStart * lineSize); pEnd = pData + (lineEnd * lineSize); // Swap the top with the bottom memcpy(pLineData, pStart, lineSize); memcpy(pStart, pEnd, lineSize); memcpy(pEnd, pLineData, lineSize); // Adjust the line index lineStart++; lineEnd--; } delete pLineData; |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Look to the MagCaptureDlg.cpp file |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Here is my complete code updated, i tried translate callback function (was a combine of these 2 links:
![]() ![]()
Delphi-Quellcode:
Timer is be to 10000ms
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; |
AW: MagSetWindowFilterList function not remove specified window of screenshot
The calling convention of the callback should be
Delphi-Quellcode:
. But besides that MSDN says:
stdcall
Zitat:
Zitat:
I guess the "magnifier window" uses a DirectX surface to display the desktop screenshot. It might be possible to obtain its handle (e.g. by hooking the corresponding DirectX interface(s), if there is no other way to do it). |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
The C++ example works fine with DWM enable :). And i followed your suggestion below, thank you: Zitat:
Delphi-Quellcode:
So, like already said, when i put breakpoint inside my ImageScaling function, debug not go to function, then i noted that this callback function not is executed. TMagImageScalingCallback = function (hwnd: HWND; srcdata: Pointer; srcheader: MAGIMAGEHEADER; destdata: Pointer; destheader: MAGIMAGEHEADER; unclipped: TRect; clipped: TRect; dirty: HRGN): BOOL; stdcall; // definition found in Magnification.pas posted on question function ImageScaling(hwnd: hwnd; srcdata: Pointer; srcheader: MAGIMAGEHEADER; destdata: Pointer; destheader: MAGIMAGEHEADER; unclipped: TRect; clipped: TRect; dirty: HRGN): BOOL; stdcall; 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; //... end; //... // calling in MagSetImageScalingCallback api if (not MagSetImageScalingCallback(hwndMag, TMagImageScalingCallback(@ImageScaling))) then Here is how be is C++ code:
Code:
typedef BOOL (CALLBACK* MagImageScalingCallback)(HWND hwnd, void * srcdata, MAGIMAGEHEADER srcheader, void * destdata, MAGIMAGEHEADER destheader, RECT unclipped, RECT clipped, HRGN dirty ); //... BOOL MagImageScaling(HWND hwnd, void *srcdata, MAGIMAGEHEADER srcheader, void *destdata, MAGIMAGEHEADER destheader, RECT unclipped, RECT clipped, HRGN dirty) { // Setup the bitmap info header bmif.biSize = sizeof(BITMAPINFOHEADER); bmif.biHeight = srcheader.height; bmif.biWidth = srcheader.width; //... } if (!MagSetImageScalingCallback(hwndMag, (MagImageScalingCallback)MagImageScaling)) |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Thats strange :? If
Delphi-Quellcode:
returns
MagSetImageScalingCallback
Delphi-Quellcode:
, the callback should at least get invoked. I'm trying out the C++ example now. Could you upload your complete Delphi project files as well?
true
Edit: C++ example does not work for me (Windows 10 64-bit Build 1709).
Delphi-Quellcode:
raises an access violation in `Magnification.dll`. It does not crash, if I remove the call to
MagSetWindowSource
Delphi-Quellcode:
, tho. I guess MSDN is correct about the deprecation :wink: Never mind, the callback is getting invoked, but something inside the callback crashes the example for some reason.
MagSetImageScalingCallback
Edit2: Wow, the author of the C++ example forgot about the
Delphi-Quellcode:
as well :wall: :-D It seems to work now.
stdcall
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
but which works only in the IDE. Changed with D2010 for the future your should initialize a new Form if is NIL. ;) callback works.. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
The diference here was only that you created the Form3 in runtime. |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Win7 64 Bit as you can see on my Screenshot! MagScreenShot is no longer Global is a part of Form1 now. and i get the Shot from any Window where the mouse hover.
Delphi-Quellcode:
as say works always by me.
GetCursorPos(Point);
desktop := WindowFromPoint(Point); Caption := IntToStr(desktop); I'm out ;) shot removed.. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
I want know why my callback function not is executed :wall: :(
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
But as I said my code I uploaded here works. sorry.. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Edition: The callback is working to me now, i discovered that my callback function is executed always that Magnifier window is resized:
Delphi-Quellcode:
My trouble now is that i'm getting a black image. Some idea how fix?
function MagImageScalingCallback(hwnd: hwnd; srcdata: Pointer;
srcheader: MAGIMAGEHEADER; destdata: Pointer; destheader: MAGIMAGEHEADER; unclipped: TRect; clipped: TRect; dirty: HRGN): BOOL; stdcall; 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; bmp.SaveToFile('c:\tela.bmp'); finally DeleteObject(aBitmap); DeleteDC(aDC); bmp.Free; end; Result := True; end; //... if (not MagSetImageScalingCallback(hwndMag, MagImageScalingCallback)) then |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Zitat:
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Delphi-Quellcode:
(breakpoint inside callback does not trigger) - again, only if I set the callback.
MagSetWindowSource
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
not is necessary, i tested here (Delphi code) without this api and screenshot still is works.
MagSetWindowSource
About callback also is working fine here, my callback function is executed when Magnifier window (Form1) is maximized, now i need of some help to fix this trouble of black capture :) Edition:
Delphi-Quellcode:
and
MagSetWindowSource
Delphi-Quellcode:
works fine since that (Form1) is maximized. My trouble now really is with the black capture in callback function.
MagSetImageScalingCallback
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
sorry your should learn C++ before translate any.. as i see, what your do here? as example
Delphi-Quellcode:
ImageScaling(hwnd: hwnd;
that looks very bad for me. you can use in C++
Code:
but not in Delphi to..
hwnd Hwnd
should be
Delphi-Quellcode:
ImageScaling(Handle: HWND;
then your set your Window not on TopMost that is bad also... and so on. read the API then create a application from beginning, just my 2 Cent. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Delphi is case insensitive and is able to know waht is a variable name and a type.
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
i think not. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
Delphi-Quellcode:
. Callstack points to `msvcrt.memcpi` so I guess there's something fishy somewhere else. Could be anything like wrong types, calling conventions, buffer overreads, ... Same problem might cause your black image. Buffer overreads/overflows can be tricky sometimes and do not always result in reproducable problems.
MagSetWindowSource
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
but it works on W7 32 BIT. i think you can nothing do on it. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Liste der Anhänge anzeigen (Anzahl: 1)
Here is project solved and working 100% like must be.
Delphi-Quellcode:
var
Form1: TForm1; implementation uses Unit3, Magnification; {$R *.dfm} function MagImageScalingCallback(hwnd: hwnd; srcdata: Pointer; srcheader: MAGIMAGEHEADER; destdata: Pointer; destheader: MAGIMAGEHEADER; unclipped: TRect; clipped: TRect; dirty: HRGN): BOOL; stdcall; var lpbmi: TBitmapInfo; bmp: TBitmap; aDC: HDC; abitmap: HBitmap; begin Fillchar(lpbmi, sizeof(lpbmi), 0); lpbmi.bmiHeader.biSize := sizeof(lpbmi.bmiHeader); lpbmi.bmiHeader.biHeight := -srcheader.height; // Otherwise the image is upside down. lpbmi.bmiHeader.biWidth := srcheader.width; lpbmi.bmiHeader.biSizeImage := srcheader.cbSize; lpbmi.bmiHeader.biPlanes := 1; lpbmi.bmiHeader.biBitCount := 32; lpbmi.bmiHeader.biCompression := BI_RGB; aDC := GetWindowDC(hwnd); bmp := TBitmap.Create; abitmap := 0; try abitmap := CreateDIBitmap(aDC, lpbmi.bmiHeader, CBM_INIT, srcdata, lpbmi, DIB_RGB_COLORS); bmp.handle := abitmap; bmp.SaveToFile('c:\screen.bmp'); 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 Form1.WindowState := wsMaximized; 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, MagImageScalingCallback)) 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; Sleep(200); 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.btn1Click(Sender: TObject); begin MagScreenShot; end; |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
|
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
it works and does not work. MagImageScalingCallback is not needed. and if you deactivate Desktop Theme then it Crash always.. on this line
Delphi-Quellcode:
if (not MagSetWindowSource(hwndMag, sourceRect)) then
with Floating Point invalid Operation. ![]() which works without Crash, please deactivate Desktop Themes before run. sorry your source text is fully flawed. 1. Each new call creates a new instance of the Magnification Dll without uninitializing the old one before. 2. Each new call creates a new Window without destroy the old one before. 3. Array of tagMAGTRANSFORM is wrong. 4. Filterlist is not Needed. 5. a second form is not needed. 6. the callback also if your use a Timer. .. and so on. greets |
AW: MagSetWindowFilterList function not remove specified window of screenshot
Zitat:
![]() About item 5º, is necessary because i not want show Magnifier window to user (i still will hide Form1 in my project), based on C++ example. Please, read item 2 on page of ![]() Relative to black screen, see in my last updated that is black only on Magnifier window, but on bmp file not. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz