![]() |
Delphi-Version: 10 Seattle
Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Ich versuche, einen C-Code zu übersetzen, der Screenshots in Z-Reihenfolge aufnehmen kann. Wenn ich den Delphi-Code teste, wird nur das Desktopfenster gedruckt. Wie kann das behoben werden?
C code:
Code:
#include "stdafx.h"
#include <Windows.h> #include <gdiplus.h> #include <conio.h> #pragma warning(disable : 4996) #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if (size == 0) return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if (pImageCodecInfo == NULL) return -1; GetImageEncoders(num, size, pImageCodecInfo); for (UINT j = 0; j < num; ++j) { if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; } } free(pImageCodecInfo); return -1; } //======================================================================================================== BOOL xPrintWindow(HWND hWnd, HDC hDc, HDC hDcScreen) { BOOL ret = FALSE; RECT rect; GetWindowRect(hWnd, &rect); HDC hDcWindow = CreateCompatibleDC(hDc); HBITMAP hBmpWindow = CreateCompatibleBitmap(hDc, rect.right - rect.left, rect.bottom - rect.top); SelectObject(hDcWindow, hBmpWindow); if (PrintWindow(hWnd, hDcWindow, 0)) { BitBlt(hDcScreen, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hDcWindow, 0, 0, SRCCOPY); ret = TRUE; } DeleteObject(hBmpWindow); DeleteDC(hDcWindow); return ret; } void EnumWindowsTopToDown(HWND owner, WNDENUMPROC proc, LPARAM param) { HWND currentWindow = GetTopWindow(owner); if (currentWindow == NULL) return; if ((currentWindow = GetWindow(currentWindow, GW_HWNDLAST)) == NULL) return; while (proc(currentWindow, param) && (currentWindow = GetWindow(currentWindow, GW_HWNDPREV)) != NULL); } struct EnumHwndsPrintData { HDC hDc; HDC hDcScreen; }; BOOL CALLBACK EnumHwndsPrint(HWND hWnd, LPARAM lParam) { EnumHwndsPrintData *data = (EnumHwndsPrintData *)lParam; if (!IsWindowVisible(hWnd)) return TRUE; xPrintWindow(hWnd, data->hDc, data->hDcScreen); DWORD style = GetWindowLongA(hWnd, GWL_EXSTYLE); SetWindowLongA(hWnd, GWL_EXSTYLE, style | WS_EX_COMPOSITED); /*OSVERSIONINFOA versionInfo; ZeroMemory(&versionInfo, sizeof(OSVERSIONINFO)); versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); GetVersionExA(&versionInfo); if (versionInfo.dwMajorVersion < 6) EnumWindowsTopToDown(hWnd, EnumHwndsPrint, (LPARAM)data);*/ return TRUE; } void testPrintWindow(int serverWidth, int serverHeight) { RECT rect; HWND hWndDesktop = GetDesktopWindow(); GetWindowRect(hWndDesktop, &rect); HDC hDc = GetDC(NULL); HDC hDcScreen = CreateCompatibleDC(hDc); HBITMAP hBmpScreen = CreateCompatibleBitmap(hDc, rect.right, rect.bottom); SelectObject(hDcScreen, hBmpScreen); EnumHwndsPrintData data; data.hDc = hDc; data.hDcScreen = hDcScreen; EnumWindowsTopToDown(NULL, EnumHwndsPrint, (LPARAM)&data); if (serverWidth > rect.right) serverWidth = rect.right; if (serverHeight > rect.bottom) serverHeight = rect.bottom; if (serverWidth != rect.right || serverHeight != rect.bottom) { HBITMAP hBmpScreenResized = CreateCompatibleBitmap(hDc, serverWidth, serverHeight); HDC hDcScreenResized = CreateCompatibleDC(hDc); SelectObject(hDcScreenResized, hBmpScreenResized); SetStretchBltMode(hDcScreenResized, HALFTONE); StretchBlt(hDcScreenResized, 0, 0, serverWidth, serverHeight, hDcScreen, 0, 0, rect.right, rect.bottom, SRCCOPY); DeleteObject(hBmpScreen); DeleteDC(hDcScreen); hBmpScreen = hBmpScreenResized; hDcScreen = hDcScreenResized; } //======================================================================================================= // ========== HBITMAP to bmp file =========== GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); Bitmap *image = new Bitmap(hBmpScreen, NULL); CLSID myClsId; int retVal = GetEncoderClsid(L"image/bmp", &myClsId); image->Save(L"output.bmp", &myClsId, NULL); delete image; GdiplusShutdown(gdiplusToken); //======================================================================= } int _tmain(int argc, _TCHAR* argv[]) { testPrintWindow(800, 600); _getch(); return 0; }
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses Windows, Vcl.Graphics, SysUtils; type PEnumHwndsPrintData = ^TEnumHwndsPrintData; TEnumHwndsPrintData = record _hDc: HDC; hDcScreen: HDC; end; type TFNWndEnumProc = function(_hwnd: HWND; _lParam: LPARAM): BOOL; stdcall; function xPrintWindow(_hwnd: HWND; _hDc, hDcScreen: HDC): BOOL; const sPrintWindow = 'PrintWindow'; var PrintWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC; nFlags: UINT): BOOL; stdcall; User32DLLHandle: THandle; bPrint: Boolean; Ret: BOOL; R: TRect; hDcWindow: HDC; hBmpWindow: HBITMAP; begin Ret := False; User32DLLHandle := GetModuleHandle(user32); if User32DLLHandle <> 0 then begin @PrintWindowAPI := GetProcAddress(User32DLLHandle, sPrintWindow); if @PrintWindowAPI <> nil then begin GetWindowRect(_hwnd, R); hDcWindow := CreateCompatibleDC(_hDc); hBmpWindow := CreateCompatibleBitmap(_hDc, R.Right - R.Left, R.Bottom - R.Top); SelectObject(hDcWindow, hBmpWindow); bPrint := PrintWindowAPI(_hwnd, hDcWindow, 0); if bPrint then begin BitBlt(hDcScreen, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, hDcWindow, 0, 0, SRCCOPY); Ret := True; end; DeleteObject(hBmpWindow); DeleteDC(hDcWindow); end; end; Result := Ret; end; function GetPrevHwnd(hWindow: HWND): HWND; begin hWindow := GetWindow(hWindow, GW_HWNDPREV); Result := hWindow; end; procedure EnumWindowsTopToDown(Owner: HWND; Proc: TFNWndEnumProc; _Param: LPARAM); var CurrentWindow, _CurrentWindow: HWND; begin repeat CurrentWindow := GetTopWindow(Owner); if CurrentWindow = 0 then Exit; CurrentWindow := GetWindow(CurrentWindow, GW_HWNDLAST); if CurrentWindow = 0 then Exit; _CurrentWindow := GetPrevHwnd(CurrentWindow); until Proc(CurrentWindow, _Param) and (_CurrentWindow <> 0); end; function EnumHwndsPrint(wHandle: HWND; _lParam: LPARAM): BOOL; stdcall; var VersionInfo: TOSVersionInfo; Data: PEnumHwndsPrintData; Style: DWORD; begin Result := True; if not IsWindowVisible(wHandle) then Exit; Data := PEnumHwndsPrintData(_lParam); Writeln('oi'); xPrintWindow(wHandle, Data._hDc, Data.hDcScreen); Style := GetWindowLong(wHandle, GWL_EXSTYLE); SetWindowLong(wHandle, GWL_EXSTYLE, Style or WS_EX_COMPOSITED); VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo); GetVersionEx(VersionInfo); if (VersionInfo.dwMajorVersion < 6) then EnumWindowsTopToDown(wHandle, EnumHwndsPrint, LPARAM(Data)); end; procedure testPrintWindow(Width, Height: Integer); var hWndDesktop: HWND; Data: TEnumHwndsPrintData; _hDcScreen, hDc_, hDcScreenResized: HDC; hBmpScreen, hBmpScreenResized: HBITMAP; Rect: TRect; bmp: TBitmap; begin hWndDesktop := GetDesktopWindow; GetWindowRect(hWndDesktop, Rect); hDc_ := GetDC(0); _hDcScreen := CreateCompatibleDC(hDc_); hBmpScreen := CreateCompatibleBitmap(hDc_, Rect.Right, Rect.Bottom); SelectObject(_hDcScreen, hBmpScreen); with Data do begin _hDc := hDc_; hDcScreen := _hDcScreen; end; EnumWindowsTopToDown(0, EnumHwndsPrint, LPARAM(@Data)); if (Width > Rect.Right) then Width := Rect.Right; if (Height > Rect.Bottom) then Height := Rect.Bottom; if (Width <> Rect.Right) or (Height <> Rect.Bottom) then begin hBmpScreenResized := CreateCompatibleBitmap(hDc_, Width, Height); hDcScreenResized := CreateCompatibleDC(hDc_); SelectObject(hDcScreenResized, hBmpScreenResized); SetStretchBltMode(hDcScreenResized, HALFTONE); StretchBlt(hDcScreenResized, 0, 0, Width, Height, _hDcScreen, 0, 0, Rect.Right, Rect.Bottom, SRCCOPY); DeleteObject(hBmpScreen); DeleteDC(_hDcScreen); hBmpScreen := hBmpScreenResized; _hDcScreen := hDcScreenResized; end; bmp := TBitmap.Create; bmp.Handle := hBmpScreen; bmp.SaveToFile('output.bmp'); bmp.Free; end; begin try testPrintWindow(800, 600); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
na ja..
Wenn du das Handle des Desktop verwendest was denkst du dann was du als ScreenShot bekommst. Überlege dir das mal.. Richtig! Einen ScreenShot des Desktop nix anderes. gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Delphi-Quellcode:
Dann denke ich, dass mein Problem hier ist, aber ich weiß nicht, wie ich es lösen soll.
function GetPrevHwnd(hWindow: HWND): HWND;
begin hWindow := GetWindow(hWindow, GW_HWNDPREV); Result := hWindow; end; procedure EnumWindowsTopToDown(Owner: HWND; Proc: TFNWndEnumProc; _Param: LPARAM); var CurrentWindow, _CurrentWindow: HWND; begin repeat CurrentWindow := GetTopWindow(Owner); if CurrentWindow = 0 then Exit; CurrentWindow := GetWindow(CurrentWindow, GW_HWNDLAST); if CurrentWindow = 0 then Exit; _CurrentWindow := GetPrevHwnd(CurrentWindow); until Proc(CurrentWindow, _Param) and (_CurrentWindow <> 0); end; |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Meine Vermutung ist das dein Problem die Funktion GetTopWindow ist die ist nicht zuverlässig. Das hier ist aber schon mal unnötig auch wenn es jetzt direkt nichts mit dem Problem zu tun hat.
Delphi-Quellcode:
du löschst das _hDcScreen
DeleteObject(hBmpScreen);
DeleteDC(_hDcScreen); hBmpScreen := hBmpScreenResized; _hDcScreen := hDcScreenResized; end; bmp := TBitmap.Create; bmp.Handle := hBmpScreen; bmp.SaveToFile('output.bmp'); bmp.Free; weist diesen ein neues zu und zwar das des hDcScreenResized Und anschließend wird das _hDcScreen nicht mehr verwendet. Das sieht mir sehr nach einem Speicherleck aus.. Google mal nach GetTopWindow gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
![]() Da war noch ein Frage, aber die wurde wohl gelöscht. |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Nebenbei auch deine Lösung funktioniert nicht, anschließend kannst du dein System neu starten. Durch den Code zerstört sich der Explorer der IE geht nicht mehr, die Gadges laufen mit einer Auslastung von 50% usw.. Ich kann nur davon abraten. gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Meine Version. Keine Ahnung ob die macht, was du möchtest. Ich weiß nämlich nicht genau, was du möchtest.
Delphi-Quellcode:
program PrintInZOrder;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Winapi.Windows, Vcl.Graphics; function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UInt32): BOOL; stdcall; external 'user32.dll' name 'PrintWindow'; function xPrintWindow(hWnd: HWND; hdc, hdcScreen: HDC): Boolean; var ret: Boolean; rect: TRect; hdcWindow: Winapi.Windows.HDC; hbmpWindow: HBITMAP; begin ret := False; GetWindowRect(hWnd, rect); hdcWindow := CreateCompatibleDC(hDC); hbmpWindow := CreateCompatibleBitmap(hDC, rect.Width, rect.Height); SelectObject(hdcWindow, hbmpWindow); if PrintWindow(hWnd, hdcWindow, 0) then begin BitBlt(hdcScreen, rect.Left, rect.Top, rect.Width, rect.Height, hdcWindow, 0, 0, SRCCOPY); ret := True; end; DeleteObject(hbmpWindow); DeleteDC(hdcWindow); Result := ret; end; // https://stackoverflow.com/a/55885143/95954 type WNDENUMPROC = function(hwnd: HWND; lParam: LPARAM): BOOL stdcall; procedure EnumWindowsTopToDown(owner: HWND; proc: WNDENUMPROC; param: LPARAM); var currentWindow: HWND; begin currentWindow := GetTopWindow(owner); if currentWindow = 0 then Exit; currentWindow := GetWindow(currentWindow, GW_HWNDLAST); while (currentWindow <> 0) and proc(currentWindow, param) do currentWindow := GetWindow(currentWindow, GW_HWNDPREV); end; type PEnumHwndsPrintData = ^TEnumHwndsPrintData; TEnumHwndsPrintData = record hdc, hdcScreen: Winapi.Windows.HDC; end; function EnumHwndsPrint(hwnd: HWND; lParam: LPARAM): BOOL; stdcall; var data: PEnumHwndsPrintData; style: Integer; begin data := PEnumHwndsPrintData(LPARAM); if not IsWindowVisible(hwnd) then Exit(True); xPrintWindow(hwnd, data^.hdc, data^.hdcScreen); // Folgende Zeilen machen die IDE total banane (Endlos-Repaint-Schleife), und sind wohl nicht nötig. Wenn doch, dann nur ohne IDE starten. // style := GetWindowLongA(hwnd, GWL_EXSTYLE); // SetWindowLongA(hwnd, GWL_EXSTYLE, style or WS_EX_COMPOSITED); Result := True; end; procedure testPrintWindow(serverWidth, serverHeight: Integer); var rect: TRect; hwndDesktop: HWND; hdc, hdcScreen: Winapi.Windows.HDC; hbmpScreen: HBITMAP; data: TEnumHwndsPrintData; hbmpScreenResized: HBITMAP; hdcScreenResized: Winapi.Windows.HDC; image: TBitmap; begin hwndDesktop := GetDesktopWindow; GetWindowRect(hwndDesktop, rect); hdc := GetDC(0); hdcScreen := CreateCompatibleDC(hdc); hbmpScreen := CreateCompatibleBitmap(hdc, rect.Right, rect.Bottom); SelectObject(hdcScreen, hbmpScreen); data.hdc := hdc; data.hdcScreen := hdcScreen; EnumWindowsTopToDown(0, EnumHwndsPrint, Winapi.Windows.LPARAM(@data)); if serverWidth > rect.Right then serverWidth := rect.Right; if serverHeight > rect.Bottom then serverHeight := rect.Bottom; if (serverWidth <> rect.Right) or (serverHeight <> rect.Bottom) then begin // Diesen Block kann man wahrscheinlich viel einfacher direkt mit einer Vcl.Graphics.TBitmap ausführen. hbmpScreenResized := CreateCompatibleBitmap(hdc, serverWidth, serverHeight); hdcScreenResized := CreateCompatibleDC(hdc); SelectObject(hdcScreenResized, hbmpScreenResized); SetStretchBltMode(hdcScreenResized, HALFTONE); StretchBlt(hdcScreenResized, 0, 0, serverWidth, serverHeight, hdcScreen, 0, 0, rect.Right, rect.Bottom, SRCCOPY); DeleteObject(hbmpScreen); DeleteDC(hdcScreen); hbmpScreen := hbmpScreenResized; hdcScreen := hdcScreenResized; end; image := TBitmap.Create; try image.Handle := hbmpScreen; image.SaveToFile('output.bmp'); finally image.Free; end; // Nicht im Original, aber hier notwendig. DeleteDC(hdcScreen); end; procedure Main; begin testPrintWindow(800, 600); Writeln('Gespeichert, bitte Enter-Taste drücken...'); end; begin try Main; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Delphi-Quellcode:
hdcScreen := hdcScreenResized;
den gleichen Fehler übernommen den ich schon gemeldet habe. Zitat:
Und wenn schon dann SetWindowLongPtrA.. gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Delphi-Quellcode:
nicht mehr gebraucht wird. Das Leck ist dowieso da, denn auch wenn da nicht gestaucht werden soll wird hdcScreen nicht mit DeleteObject gelöscht. Ich weiß auch, dass man den ganzen Block wohl besser direkt mit einer
hdcScreen
Delphi-Quellcode:
macht. Aber Visual C++ kennt keine Delphi-TBitmaps. <g>
TBitmap
Das
Delphi-Quellcode:
Problem tritt bei mir nur in der IDE auf, sonst nicht.
SetWindowLongA(...EX_STYLE...)
|
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Nur ein Neustart korrigiert das wieder. Zitat:
gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Zitat:
|
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
1. Die IDE lässt sich nur noch über den Taskmanager beenden. 2. Das gesamte System wird mit fast 50% ausgelastet. 3. Ich kann keine Eingaben hier im Forum mehr machen als Beispiel auf deinen Beitrag antworten oder irgendetwas editieren. 4. Es wirkt sich also auf das gesamte System aus. 5. Ein Neustart des System ist nötig! Und nun macht was ihr wollt. :) Nebenbei es wird alles falsch aufgenommen. Es ist nicht verwendbar. Zitat:
gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Zitat:
Ich habe keine Ahnung was OP nun wirklich vorhat. Jedes Fenster vollständig als Screenshot, auch wenn es verdeckt ist? Was zeigt dein Screenshot? Sieht fast aus wie ein Mac mit Parallels oder ähnlichem. Oder etwas, was aussehen soll wie ein Mac. |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Jedes Fenster das diesen Style verwendet wird schwarz gezeichnet kann man doch auf meinem ScreenShot definitiv sehr genau erkennen. Das betrifft meinen KVideo Player64, Meine Anwendung OTTB die aussieht wie beim Mac. Das CMD Fenster das plötzlich den Windows 10 Style verliert und in Win7 Style aufgenommen wird. Und nein mein System ist Windows 10 keine VM oder ähnliches. Wie gesagt das Teil taugt leider nichts da es nicht das tut was es soll. Links ist das aufgenommene Bild im ScreenShot dort kannst du sehen das mein Player der eigentlich den Composite Modus verwendet schwarz ist. Vergleiche das doch einfach mit dem Player auf der rechten Seite. ;) PS: Ich denke du hast kein Problem weil du keine Anwendung mit WS_EX_LAYERED style verwendest.. Zitat:
Und bringt das System komplett durcheinander. gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Rudy Velthuis,
Ihr Code funktionierte problemlos mit IDE oder System. Danke für die Lösung! |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
OK! ;) Ich bin raus aus dem Thread. gruss |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
EWeiss, hast du eine Lösung für dieses Problem? |
AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Zitat:
Siehe Shot so muss ein ScreenShot aussehen und alles wiedergeben was Original auf dem Desktop sichtbar ist. Das kann ich dir geben wenn du damit klar kommst.
Delphi-Quellcode:
GI_CreateImageBackground erstellt ein 32Bit Bitmap über "CreateDIBSection"
procedure ScreenCaptureToBackground;
var Width, Height: Integer; hDeskTop: HWND; hDCSrce: HDC; pBits: PByte; bm: BITMAP; p: Integer; GIDC: HDC; begin Width := GetSystemMetrics(SM_CXSCREEN); Height := GetSystemMetrics(SM_CYSCREEN); GIDC := gSprCtrl.GI_CreateImageBackground(HSprCtrl, Width, Height); hDeskTop := GetDesktopWindow; hDCSrce := GetWindowDC(hDeskTop); BitBlt(GIDC, 0, 0, Width, Height, hDCSrce, 0, 0, SRCCOPY); FillChar(bm, sizeof(bm), 0); GetObject(GetCurrentObject(GIDC, OBJECT_BITMAP), sizeof(bm), @bm); pBits := bm.bmBits; for p := (bm.bmWidth * bm.bmHeight) - 1 downto 1 do begin pBits[3] := 255; pBits := pBits + 4; end; ReleaseDC(hDeskTop, hDCSrce); end; bsp.
Delphi-Quellcode:
GI_CreateImageBackground(HSprCtrl, Width, Height);
Delphi-Quellcode:
macht folgendes..
function gCreateDIBSection(DC: HDC; Width, Height, BitCount: Integer): HBitmap;
var bi: TBitmapInfo; lpBitmapBits: Pointer; begin // Fill in the BITMAPINFOHEADER bi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth := Width; bi.bmiHeader.biHeight := Height; bi.bmiHeader.biPlanes := 1; bi.bmiHeader.biBitCount := Word(BitCount); bi.bmiHeader.biCompression := BI_RGB; bi.bmiHeader.biSizeImage := 0; bi.bmiHeader.biXPelsPerMeter := 0; bi.bmiHeader.biYPelsPerMeter := 0; bi.bmiHeader.biClrUsed := 0; bi.bmiHeader.biClrImportant := 0; Result := CreateDIBSection(DC, bi, DIB_RGB_COLORS, lpBitmapBits, 0, 0); end;
Delphi-Quellcode:
Das Ergebnis siehst du auf dem Shot!
DC := GetDC(HSprCtrl);
hDCSrc := CreateCompatibleDC(DC); hDIB := gCreateDIBSection(hDCSrc, Width, Height, 32); // Ich speicher das HBitmap in meine Propertys und hole sie im PaintEvent mit GI_GetProperty zurück. // Dafür musst du eine andere Lösung finden.. GI_SetProperty(HSprCtrl, GI_Bitmap, LONG_PTR(hDIB)); SelectObject(hDCSrc, hDIB); // Ich speicher den Source DC in meine Property und hole sie im PaintEvent mit GI_GetProperty zurück. // Dafür musst du eine andere Lösung finden.. GI_SetProperty(HSprCtrl, GI_DC, LONG_PTR(hDCSrc)); ReleaseDC(HSprCtrl, DC); Result := hDCSrc; PS: Nebenbei die ZOrder scheint dich nicht wirklich zu interessieren warum dann der ganze Aufwand? Ein einfaches ScreenShot Programm sollte dann ausreichend sein dafür gibt es hier genug Beispiele.. ![]() gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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