AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Screenshot via Handle
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot via Handle

Ein Thema von meg91 · begonnen am 15. Jun 2008 · letzter Beitrag vom 22. Jun 2008
 
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, 12: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
 


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 00:10 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