Przenoszenie okna na pierwszy plan do screenshota

0

Witam, mam taki problem, przeczytałem, próbowałem zastosować pomysł przedstawiony tutaj: http://4programmers.net/Forum/Delphi_Pascal/159571-Uaktywnianie_okna_-_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;
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.

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?

0

Spróbuj użyć funkcji PrintWindow.

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.

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?

1

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;
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:)

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