Zwischenstand:
Ich habe nun wieder probiert es hinzubekommen, komplett von vorne bis zum Ende ohne bei Methode b) abzugucken aber mit den Infos von Post 1 angefangen, so das ich theoretisch weiß was ich da mache. Hier stoße ich wieder auf das Layered Problem aber der Rest macht alles Prima. Ist sozusagen ein BestOf ohne Layered support.
Das ist sozusagen Methode c).... da diese Methode nicht klappt fange ich nun an Methode b) umzusetzen, ich sagte ja, alleine bin ich noch nicht im Stande und ich habe mir wirklich Mühe gegeben
MSDN da zu Verstehen und Richtig einzusetzen aber eure Infos zu Layered für Methode b) vorbehalten/reserviert.
OTTB = Geht damit nicht von daher muss ich an dieser Stelle aufgeben mit Methode c)
Delphi-Quellcode:
Function Knipse(const Win: HWND; var tbmp: TBitmap; const FullWindow: Boolean): Boolean;
const
CAPTUREBLT = $40000000;
var
hDCScreen: HDC;
rec: TRect;
begin
Result := False;
if Win = 0 then Exit;
try
begin
if FullWindow then
begin
hDCScreen := GetWindowDC(Win);
Windows.GetWindowRect(Win, rec)
end else
begin
hDCScreen := GetDC(Win);
Windows.GetClientRect(Win, rec);
end;
tbmp.PixelFormat:=pf32bit;
tbmp.Width := Rec.Right - Rec.Left;
tbmp.Height := Rec.Bottom - Rec.Top;
tbmp.Canvas.Lock;
StretchBlt(tbmp.Canvas.Handle, 0, 0,
tbmp.Width, tbmp.Height,
hDCScreen, 0, 0,
tbmp.Width, tbmp.Height,
SRCCOPY or CAPTUREBLT);
tbmp.Canvas.Unlock;
end;
finally
ReleaseDC(0, hDCScreen);
Result := True;
end;
end;
Und nicht das ihr denkt ich lese nicht alles, ich arbeite alles halt nur langsamer ab da es Neuland ist,
hier ist meine Interpretation einer WM_PRINT -> ClipBoard -> HBITMAP Variante, irgendwie alles falsch da ich kein Bild erhalte. Also Versucht habe ich es. Das hier steht allerdings nicht zur Debatte, nur zur Illustration wie man es nicht machen sollte
Delphi-Quellcode:
function MyWM_PRINT(const Win: HWND): HBITMAP;
var
rect: TRECT;
hBmp: HBITMAP;
hOld: HGDIOBJ;
hDCMem, hDCScreen: HDC;
begin
hDCMem := CreateCompatibleDC(0);
GetWindowRect(Win, rect);
hBmp := 0;
hDCScreen := GetDC(Win);
hBmp := CreateCompatibleBitmap(hDCScreen, rect.right - rect.left, rect.bottom - rect.top);
ReleaseDC(Win, hDCScreen);
hOld := SelectObject(hDCMem, hBmp);
SendMessage(Win, WM_PRINT, WPARAM(hDCMem), PRF_CHILDREN or PRF_CLIENT or PRF_ERASEBKGND or PRF_NONCLIENT or PRF_OWNED);
SelectObject(hDCMem, hOld);
DeleteObject(hDCMem); // ich glaub das wär falsch oder?
DeleteDC(hDCMem); // oder doch so? me stupid
OpenClipboard(Win);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBmp);
Result := hBmp;
CloseClipboard();
end;