Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

capture inactive window

[es] :: Pascal / Delphi / Kylix :: capture inactive window

[ Pregleda: 1879 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon capture inactive window07.10.2009. u 14:02 - pre 177 meseci
Našao sam ovdje

http://delphi.about.com/od/delphitips2008/qt/print_window.htm

kako napraviti capture inactive windov-a, ali me zanima da li je moguće dobiti samo određeni dio te slike (ne naknadnom obradom slike, nego baš screen capture inactive window-a kojeg ja odredim)?

Hvala!
F
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: capture inactive window07.10.2009. u 18:12 - pre 177 meseci
> kako napraviti capture inactive windov-a, ali me zanima da li je moguće dobiti samo određeni dio te slike (ne naknadnom obradom slike,
> nego baš screen capture inactive window-a kojeg ja odredim)?

Ako taj manji deo predstavlja neku win controlu, jednostavno prosledi njen handle, u suprotnom od slike čitavog prozora iskopiraj u novu sliku samo manji deo koji te zanima.

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: capture inactive window07.10.2009. u 18:29 - pre 177 meseci
Citat:
savkic: > kako napraviti capture inactive windov-a, ali me zanima da li je moguće dobiti samo određeni dio te slike (ne naknadnom obradom slike,
> nego baš screen capture inactive window-a kojeg ja odredim)?

Ako taj manji deo predstavlja neku win controlu, jednostavno prosledi njen handle, u suprotnom od slike čitavog prozora iskopiraj u novu sliku samo manji deo koji te zanima.


Hvala savkic.

Ovo sa slikom je isprobano i radi, ali je problem šta je sporo jer se gleda promjena stanja pa se često osvježava slika.

Pokušao sam sa Winspector Spy dobiti handle te kontrole, ali jedino šta dobijem je informacija da je to citiram:

class QWidget

Preciznije, trebam dobiti informaciju o tome kada se na određenoj formi ili šta već je (za nju dobijem handle) pojavio button. Sa Winspectorom ne dobijem nikakvu informaciju nakon što se gumb na formi pojavi.

[Ovu poruku je menjao captPicard dana 07.10.2009. u 19:53 GMT+1]
F
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: capture inactive window07.10.2009. u 22:35 - pre 177 meseci
> class QWidget

To je verovatno iz multiplatform QT toolkita.

> Preciznije, trebam dobiti informaciju o tome kada se na određenoj formi ili šta već je (za nju dobijem handle) pojavio button.

Koristi EnumChildWindows na glavnom prozoru, dobićeš spisak svih child prozora, posle toga periodično pozivaj istu tu metodu sve dok se ne pojavi novi element (child prozor).

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: capture inactive window08.10.2009. u 15:45 - pre 177 meseci
savkic, ako ti nije problem, da mi to malo pojasniš.

Ovako dobijem handle forme:

Code:
function EnumProcess(hHwnd: HWND; lParam : integer): boolean; stdcall;
var
  pPid : DWORD;
  title, ClassName : string;
begin

  if (hHwnd=NULL) then
  begin
    result := false;
  end
  else
  begin

    GetWindowThreadProcessId(hHwnd,pPid);

    SetLength(ClassName, 255);

    SetLength(ClassName,
              GetClassName(hHwnd,
                           PChar(className),
                           Length(className)));
    SetLength(title, 255);

    SetLength(title, GetWindowText(hHwnd, PChar(title), Length(title)));
    if leftStr(title, 5) = 'Nesto' then

    Form1.listbox1.Items.Add
      ('Class Name = ' + className +
       '; Title = ' + title +
       '; HWND = ' + IntToStr(hHwnd) +
       '; Pid = ' + IntToStr(pPid));
    Result := true;
  end;
end;


Kako da sada napravim EnumChildWindows forme ako imam njezin handle?

Hvala!
F
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: capture inactive window08.10.2009. u 17:41 - pre 177 meseci
Napravi novu formu, dodaj memo i button kontrolu:

Code:

procedure TForm1.Button1Click(Sender: TObject);

  function EnumChildProc(AChild: HWND; AResult: TStrings): BOOL; stdcall;
  var
    ClassName: array[0..20] of Char;
  begin
    GetClassName(AChild, ClassName, SizeOf(ClassName));
    AResult.Add(ClassName);
    Result := True;
  end;

begin
  EnumChildWindows(Handle, @EnumChildProc, LPARAM(Memo1.Lines));
end;

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: capture inactive window08.10.2009. u 17:55 - pre 177 meseci
Hvala, na žalost ne dobijem željeni rezultat, dobijem ovo:

QWidget
QWidget

Ipak, hvala na pomoći!
F
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: capture inactive window08.10.2009. u 20:28 - pre 177 meseci
> Hvala, na žalost ne dobijem željeni rezultat, dobijem ovo:
> QWidget
> QWidget

Kako treba da otkriješ kada se pojavi dugme na formi, periodično pozivaj tu metodu i upoređuj dobijenu listu sa početnom, kada se pojavi nova stavka, znači da se pojavila i nova kontrola. Ako nema promene u listi onda znači da se taj buton odmah kreira ali da nije vidljiv, modifikuj primer da gleda da li je i child prozor vidljiv. Takođe možeš tražiti i kombinovati mnoge druge stvari koje ti mogu pomoći u otkrivanju, text (caption) kontrole, poziciju, dimenzije, eventualno ID kontrole (GetDlgCtrlID).

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: capture inactive window09.10.2009. u 07:35 - pre 177 meseci
Ma jasna je meni logika, ali je problem da ne mogu dobiti popis kontrola na toj formi. Kada pozovem EnumChildWindows uvijek dobijem ovaj rezultat

QWidget
QWidget

a na toj formi ima 3+1 buttona, dva grid-a i još par label-a...

Probao sam ovako:

Code:
procedure TForm1.Button1Click(Sender: TObject);

function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall;
var
  buf, Caption: array [0..255] of char;
begin
  Result := True;
  GetClassname(wnd, buf, 256);
  GetWindowText(wnd, Caption, 256);
  Lines.Add(Format('ID: %d, class: %s, caption: %s',
    [GetDlgCtrlID(wnd), buf, Caption]));
end;

begin
 EnumChildWindows(Handle, @EnumProc, Integer(memo1.Lines));
end;


I opet dobijem samo

QWidget "caption forme"
QWidget "caption forme"

[Ovu poruku je menjao captPicard dana 09.10.2009. u 08:46 GMT+1]

[Ovu poruku je menjao captPicard dana 09.10.2009. u 08:48 GMT+1]
F
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: capture inactive window13.10.2009. u 17:50 - pre 176 meseci
> Ma jasna je meni logika, ali je problem da ne mogu dobiti popis kontrola na toj formi. Kada pozovem EnumChildWindows uvijek dobijem ovaj rezultat
> QWidget
> QWidget
> a na toj formi ima 3+1 buttona, dva grid-a i još par label-a...

Možeš još pozvati EnumChildWindows rekurzivno, na ta dva dobijena prozora. Ako ne prođe, onda to nisu standardne windows kontrole sa hendlom već iscrtane slike (poput TLabel). Potraži QT toolkit verovatno u njemu postoji neki standardni način za enumaraciju kontrola.

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: capture inactive window15.10.2009. u 07:50 - pre 176 meseci
Hvala ti još jednom, probao ali neće. Vrlo vjerojatno je ovo šta si rekao da nisu standardne windows kontrole :-(

Ipak hvala puno na trudu!
F
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: capture inactive window

[ Pregleda: 1879 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.