Thema: Delphi Screenshot via Handle

Einzelnen Beitrag anzeigen

Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#1

Screenshot via Handle

  Alt 15. Jun 2008, 13:11
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
  Mit Zitat antworten Zitat