|
[ captPicard @ 07.10.2009. 14:02 ] @
[ savkic @ 07.10.2009. 18:12 ] @
> 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.
[ captPicard @ 07.10.2009. 18:29 ] @
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]
[ savkic @ 07.10.2009. 22:35 ] @
> 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).
[ captPicard @ 08.10.2009. 15:45 ] @
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!
[ savkic @ 08.10.2009. 17:41 ] @
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;
[ captPicard @ 08.10.2009. 17:55 ] @
Hvala, na žalost ne dobijem željeni rezultat, dobijem ovo:
QWidget
QWidget
Ipak, hvala na pomoći!
[ savkic @ 08.10.2009. 20:28 ] @
> 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).
[ captPicard @ 09.10.2009. 07:35 ] @
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]
[ savkic @ 13.10.2009. 17:50 ] @
> 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.
[ captPicard @ 15.10.2009. 07:50 ] @
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!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|