AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi MagSetWindowFilterList function not remove specified window of screenshot
Thema durchsuchen
Ansicht
Themen-Optionen

MagSetWindowFilterList function not remove specified window of screenshot

Ein Thema von flashcoder · begonnen am 27. Jan 2018 · letzter Beitrag vom 29. Jan 2018
Antwort Antwort
Seite 2 von 4     12 34      
Fukiszo
(Gast)

n/a Beiträge
 
#11

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 27. Jan 2018, 23:18
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:
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;
at that point the image is ready

Geändert von Fukiszo (27. Jan 2018 um 23:26 Uhr)
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#12

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 27. Jan 2018, 23:29
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:
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;
at that point the image is ready
I attached the source file of C++ example on question
Look to the MagCaptureDlg.cpp file

Geändert von flashcoder (27. Jan 2018 um 23:33 Uhr)
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#13

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 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)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 13:29
The calling convention of the callback should be stdcall . But besides that MSDN says:
Zitat:
Note The MagSetImageScalingCallback function is deprecated in Windows 7 and later, and should not be used in new applications. There is no alternate functionality.
and
Zitat:
This function works only when Desktop Window Manager (DWM) is off.

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).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (28. Jan 2018 um 13:31 Uhr)
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#15

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 14:40
Zitat von Zacherl:
This function works only when Desktop Window Manager (DWM) is off.
@Zacherl,

The C++ example works fine with DWM enable .
And i followed your suggestion below, thank you:

Zitat von Zacherl:
The calling convention of the callback should be stdcall
Delphi-Quellcode:

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

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))
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 17:29
Thats strange If MagSetImageScalingCallback returns true , 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?

Edit:
C++ example does not work for me (Windows 10 64-bit Build 1709). MagSetWindowSource raises an access violation in `Magnification.dll`. It does not crash, if I remove the call to MagSetImageScalingCallback , tho. I guess MSDN is correct about the deprecation Never mind, the callback is getting invoked, but something inside the callback crashes the example for some reason.

Edit2:
Wow, the author of the C++ example forgot about the stdcall as well It seems to work now.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (28. Jan 2018 um 17:43 Uhr)
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#17

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 17:55
Zitat von Zacherl:
Could you upload your complete Delphi project files as well?
My Delphi project is attach below.
Angehängte Dateien
Dateityp: zip Magnification DEMO.zip (93,8 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 20:42
Zitat von Zacherl:
Could you upload your complete Delphi project files as well?
My Delphi project is attach below.
Here is your fix..
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

Geändert von EWeiss (11. Jul 2019 um 16:49 Uhr)
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#19

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 21:10
Zitat von EWeiss:
Here is your fix..
but which works only in the IDE.
Changed with D2010
Sorry, but this is the same project and with the same trouble, callback not is executed.
The diference here was only that you created the Form3 in runtime.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: MagSetWindowFilterList function not remove specified window of screenshot

  Alt 28. Jan 2018, 21:36
Zitat von EWeiss:
Here is your fix..
but which works only in the IDE.
Changed with D2010
Sorry, but this is the same project and with the same trouble, callback not is executed.
The diference here was only that you created the Form3 in runtime.
execute always by me..
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:
  GetCursorPos(Point);
  desktop := WindowFromPoint(Point);
  Caption := IntToStr(desktop);
as say works always by me.
I'm out

shot removed..

greets

Geändert von EWeiss (28. Jan 2018 um 22:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz