Przenoszenie okna na pierwszy plan do screenshota

Odpowiedz Nowy wątek
2011-08-08 12:59
0

Witam, mam taki problem, przeczytałem, próbowałem zastosować pomysł przedstawiony tutaj: http://4programmers.net/Forum/Delphi_Pascal/159571-Uaktywnianieokna-_problem ale niestety nie zadziałało mi...
a już mówię co chciałbym zrobić...
chciałbym napisać program który robi mi screenshota konkretnego okna firefoxa, potrafię zrobić i napisałem taki programik ale dla okna będącego na pierwszym planie, problem pojawia się w miejscu gdy chciałbym, żeby program wywołał to okno na pierwszy plan, żeby móc zrobić screenshota, nie umiem wywołać okna na pierwszy plan, bo zrobienie zrzutu okna niewidocznego chyba jest niemożliwe, no nie?
Proszę o pomoc, właściwie tyle tylko, żeby nauczyć program wyciągać dane okno na wierzch, np po nazwie tego okna.

To, co już mam prezentuję:

 procedure TForm1.Button9Click(Sender: TObject);
var Can: TCanvas;
  B: TBitmap;
  okno:tHandle;
  han1:hwNd;
begin
      //zrzut ekranu
      { tworzenie zmiennej }
      Can := TCanvas.Create;
      { tworzenie bitmapy}
      B := TBitmap.Create;
     {w tym momencie rozmiary okna są na sztywno, ale nie o to chodzi...}
      b.height:=200;
      b.width:=400;
      Han1 := findwindowext('Roulette|Sportingbet.com - Mozilla Firefox');
      okno:=getwindow(han1,GW_OWNER);
      ShowWindow(okno, SW_RESTORE);
      setforegroundwindow(okno);
      can.Handle:= getwindowdc(findwindow(nil,'Roulette|Sportingbet.com - Mozilla Firefox'));
      B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), Can, Rect(0,0,B.Width,B.Height));
      B.SaveToFile('zrzut.bmp');
end;
 
function tform1.FindWindowExt(Text: string): hWnd;
var
 Han: hWnd;
 cTitle: array [0..254] of Char;
 sTitle: string;
begin
 Han  := FindWindow(nil, nil);
 Text := AnsiLowerCase(Text);
 
 while Han <> 0 do
   begin
    GetWindowText(Han, cTitle, 255);
    sTitle := cTitle;
    if cTitle = '' then
      begin
       Han := GetWindow(Han, GW_HWNDNEXT);
       Continue;
      end;
 
    sTitle := AnsiLowerCase(sTitle);
    Application.ProcessMessages;
    if Pos(Text, sTitle) <> 0 then Break;
    Han := GetWindow(Han, GW_HWNDNEXT);
  end;
 
 Result := Han;
end;
edytowany 4x, ostatnio: jaje16, 2011-08-08 13:05

Pozostało 580 znaków

2011-08-08 14:39
0

Ale to okno, jest tylko przykryte przez inne okno, czy jest zminimalizowane ? Bo jeżeli nie jest zminimalizowane, to mając poprawny uchwyt do okna funkcja SetForegroundWindow, powinna zadziałać, a gdy jest zminimalizowane to najpierw je wywiń, a potem daj na pierwszy plan.

Pozdrawiam.

Pozostało 580 znaków

2011-08-08 16:44
0

jest przykryte tylko, mógłbyś sprawdzić co w tym kodzie jest złego, że jako taki nie przenosi mi tego okna? ani nie widzę żeby po zadziałaniu okno było faktycznie na wierzchu, a i screenshot nie przedstawia właściwego okna, faktem jest, że dobrze odczytuje położenie lewego górnego rogu tego okna z firefoxa, ale ss robi z tego, co aktualnie widzi... więc w czym może być problem?

edytowany 1x, ostatnio: jaje16, 2011-08-08 16:48

Pozostało 580 znaków

2011-08-08 17:33
0

Spróbuj użyć funkcji PrintWindow.


Pozostało 580 znaków

2011-08-08 17:40
0

Z tego co mówiłeś, to screen wychodził, tylko był urywkiem okna, a nie screenem całości,a to dlatego, że podawałeś na początku kodu :

b.height:=200;
b.width:=400;

Przerobiłem trochę kod i wszystko powinno być w porządku :

function tform1.FindWindowExt(Text: string): hWnd;
var
 Han: hWnd;
 cTitle: array [0..254] of Char;
 sTitle: string;
begin
 Han  := FindWindow(nil, nil);
 Text := AnsiLowerCase(Text);
 
 while Han <> 0 do
   begin
    GetWindowText(Han, cTitle, 255);
    sTitle := cTitle;
    if cTitle = '' then
      begin
       Han := GetWindow(Han, GW_HWNDNEXT);
       Continue;
      end;
 
    sTitle := AnsiLowerCase(sTitle);
    Application.ProcessMessages;
    if Pos(Text, sTitle) <> 0 then Break;
    Han := GetWindow(Han, GW_HWNDNEXT);
  end;
 
 Result := Han;
end;
 
procedure TForm1.Button9Click(Sender: TObject);
var Can: TCanvas;
  B: TBitmap;
  okno:tHandle;
  han1:hwNd;
  polozenie : TRect;
begin
      //zrzut ekranu
      { tworzenie zmiennej }
      Can := TCanvas.Create;
      { tworzenie bitmapy}
      B := TBitmap.Create;
 
      Han1 := findwindowext('Roulette|Sportingbet.com - Mozilla Firefox');
      okno:=getwindow(han1,GW_OWNER);
      ShowWindow(okno, SW_RESTORE);
      setforegroundwindow(okno);
      can.Handle:= getwindowdc(findwindow(nil,'Roulette|Sportingbet.com - Mozilla Firefox'));
       GetWindowRect(han1,polozenie);
      b.Width := polozenie.Right-polozenie.Left;
      b.Height := polozenie.Bottom-polozenie.Top;
 
      B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), Can, Rect(0,0,B.Width,B.Height));
      B.SaveToFile('C:\zrzut.bmp');
end;

Pozdrawiam.

edytowany 3x, ostatnio: Golden_Mind, 2011-08-08 17:44
Ja tam nie widzę, aby napisał, że screen był urywkiem okna... - Patryk27 2011-08-08 17:59
Kolega jaje16 napisał : "faktem jest, że dobrze odczytuje położenie lewego górnego rogu tego okna z firefoxa, ale ss robi z tego, co aktualnie widzi" a gdy zobaczyłem w kodzie, że pobiera on tylko obraz o wymiarach 200x400 to domyśliłem się, że dostaje tylko urywek okna. - Golden_Mind 2011-08-08 18:03

Pozostało 580 znaków

2011-08-08 18:04
0

niestety, nie przenosi okna na pierwszy plan dalej...:/ screen był mały, ale nie chodziło mi o wielkość, powiem tak, jest kilka okien, firefox umyślnie z tyłu, żeby było widać, czy program działa, włączamy program, na pierwszym planie jest project, potem okno delphi, okienko z kodem z delphi, klikamy buttona9, i robi się screenshot(SS) le tego co aktualnie widać, czyli delphi, a firefox jak był z tyłu, tak jest...
jest to dodatkowe okno otwierane przez główne okno firefoxa, ale na pasku wyświetla mi się osobno, i dalej samodzielnie działa po wyłączeniu głównego okna, dlatego uznałem, że jest to okno równorzędne, to ma jakieś znaczenie?

edytowany 1x, ostatnio: jaje16, 2011-08-08 18:06
Pokaż pozostałe 6 komentarzy
Chyba... PrintWindow(Han1, can.Handle, PW_ClientOnly) popróbuj :) - Patryk27 2011-08-08 18:16
chyba muszę jakąś biblioteke dołożyć, bo mam undeclared identifier... - jaje16 2011-08-08 18:19
Zamiast "PW_ClientOnly" daj 0 - Patryk27 2011-08-08 18:20
Poza tym, nauka funkcji WinApi się przyda :) - Patryk27 2011-08-08 18:20
no nie jestem zaawansowanym programistą, coś tam wiem, ale tyle ile się sam z neta nauczę... i przyznam się bez bicia, że coś gdzies o WinApi widziałem po googlach, ale do tej pory nie wiem jak to się je...;-) - jaje16 2011-08-08 18:32

Pozostało 580 znaków

2011-08-08 18:21

Co prawda nie mam Firefox'a, ale Chrome był również oporny przy robieniu screena, zmieniłem kod i u mnie działa prawidłowo, ale ponieważ mam stary sprzęt, musiałem opóźnić w kodzie funkcję pobierania screena o 100 milisekund, gdyż mój superkomputer nie nadążał :D :

var Can: TCanvas;
  B: TBitmap;
  okno:tHandle;
  han1:hwNd;
  polozenie : TRect;
begin
      //zrzut ekranu
      { tworzenie zmiennej }
      Can := TCanvas.Create;
      { tworzenie bitmapy}
      B := TBitmap.Create;
 
      Han1 := findwindowext('Google - Google Chrome');
      okno:=getwindow(han1,GW_OWNER);
      ShowWindow(okno, SW_RESTORE);
      setforegroundwindow(han1);
      sleep(100);
      can.Handle:= getwindowdc(findwindow(nil,'Google - Google Chrome'));
 
      GetWindowRect(han1,polozenie);
      b.Width := polozenie.Right-polozenie.Left;
      b.Height := polozenie.Bottom-polozenie.Top;
 
      B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), Can, Rect(0,0,B.Width,B.Height));
      B.SaveToFile('C:\zrzut.bmp');
end;
edytowany 1x, ostatnio: Golden_Mind, 2011-08-08 18:22

Pozostało 580 znaków

2011-08-08 18:25
0

no, i to jest to o co mi chodziło...:)
tak, teraz działa, wywala firefoxa na pierwszy plan, widzę to:)
jesteś świetny:)
jeszcze przeanalizuję co się właściwie zmieniło, ale poprzekopiowaniu działa:)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0