Hallo,
ich habe eine Funktion geschrieben, die es ermöglicht einen Screenshot von einem Programm zu machen, welches ich über einen
Handle ausfindig gemacht habe. Es soll kein richtiger Screenshot enstehen, sondern nur eine Durchschnittsfarbe berechnet werden.
Soweit funktioniert das auch, nur wenn man den Taskmanager öffnet, kann man zusehen, wie der Speicherverbrauch meines Programms kontinuierlich ansteigt, bis sich mein ganzer PC aufhängt. Die
IDE sag dazu auch nichts mehr, weil die dabei auch den Dienst versagt
Es muss an diesem Stück Code liegen, weil sobald ich diese Prozedure nicht benutze alles ganz normal funktioniert
Delphi-Quellcode:
var
h_window: HWND; //das ist das Fenster welches gescannt werden soll
procedure HandleToPix2();
var
//h_desktop: THandle;
i_tmp_x, i_tmp_y: Integer;
i_gesRed, i_gesGreen, i_gesBlue: Integer;
bRed, bGreen, bBlue: Byte;
//b_tmp: TBitmap;
//c_tmp: TCanvas;
c_color: TColor;
r_window: TRect;
i_width, i_height: Integer;
PixelColor: Integer;
ha_window: THandle;
const
c_aspectorato = (4/3);
//c_aspectorato = (16/9);
c_vertical = 7;
begin
try
//ha_window := GetWindowDC(h_window);
ha_window := GetDC(h_window);
GetWindowRect(ha_window , r_window);
i_width := r_window.Right - r_window.Left;
i_height := r_window.Bottom - r_window.Top;
i_gesBlue := 0;
i_gesGreen := 0;
i_gesRed := 0;
for i_tmp_x := 1 to round(c_aspectorato*c_vertical) do
begin
for i_tmp_y := 1 to c_vertical do
begin
PixelColor := GetPixel(ha_window, r_window.Left + round((i_width / (c_aspectorato*c_vertical))*i_tmp_x), r_window.Top + round((i_height/c_vertical)*i_tmp_y));
bBlue := GetBValue(PixelColor);
bGreen := GetGValue(PixelColor);
bRed := GetRValue(PixelColor);
// c_color := c_tmp.Pixels[round((i_width / (c_aspectorato*c_vertical))*i_tmp_x), round((i_height/c_vertical)*i_tmp_y)];
// bBlue := GetBValue(c_color);
// bGreen := GetGValue(c_color);
// bRed := GetRValue(c_color);
rgb_threshold(bRed, bGreen, bBlue);
i_gesBlue := i_gesBlue + bBlue;
i_gesGreen := i_gesGreen + bGreen;
i_gesRed := i_gesRed + bRed;
end;
end;
//Werte ausgeben
changeRGB(Round(i_gesRed / (round(c_aspectorato*c_vertical)*c_vertical)),
Round(i_gesGreen / (round(c_aspectorato*c_vertical)*c_vertical)),
Round(i_gesBlue / (round(c_aspectorato*c_vertical)*c_vertical)));
finally
ReleaseDC(h_window, ha_window);
end;
end;
wahrscheinlich vergesse ich irgendwo etwas wieder freizugeben oder mein Zugriff auf die Handles ist falsch.
Sieht jemand den Fehler, ich komm einfach nicht drauf
gruß
markus