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

Pronalazenje otvorenog prozora i njegovo aktiviranje

[es] :: Pascal / Delphi / Kylix :: Pronalazenje otvorenog prozora i njegovo aktiviranje

[ Pregleda: 2271 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

yiwan
Novi Sad

Član broj: 81026
Poruke: 63
*.ns.ac.yu.



Profil

icon Pronalazenje otvorenog prozora i njegovo aktiviranje01.02.2007. u 10:02 - pre 210 meseci


Pokusavam da iz moje aplikacije detektujem da li je neka aplikacija otvorena i ako jeste da prebacim fokus na nju (otvorim glavni prozor te aplikacije).

Uspeo sam da odredim da li je aplikacija aktivna pretrazivanjem procesa i to radi mnogo bolje nego FindWindow, ali nikako ne mogu da pomocu handle-a koji dobijam od tog procesa toj aplikaciji dam fokus...

U cemu moze biti problem? Ima li neko neki predlog ili resenje za ovaj moj problem?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Pronalazenje otvorenog prozora i njegovo aktiviranje01.02.2007. u 10:38 - pre 210 meseci

> Uspeo sam da odredim da li je aplikacija aktivna pretrazivanjem procesa i to radi mnogo bolje
> nego FindWindow, ali nikako ne mogu da pomocu handle-a koji dobijam od tog procesa toj aplikaciji dam fokus...

Evo ti primer koji aktivira tekući program, samo zameni Application.Handle sa željenim prozorom.

Code:

procedure ActivateApplication;
var
  ActiveThreadId, CurrentThreadId: DWORD;
begin
  if GetForegroundWindow <> Application.Handle then
  begin
    ActiveThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
    CurrentThreadId := GetCurrentThreadId;
    AttachThreadInput(CurrentThreadId, ActiveThreadId, True);
    SetForegroundWindow(Application.Handle);
    AttachThreadInput(CurrentThreadId, ActiveThreadId, False);
    BringWindowToTop(Application.Handle);
  end;
end;



> U cemu moze biti problem? Ima li neko neki predlog ili resenje za ovaj moj problem?

Windows od W2K (koliko se sećam), promenu aktivnog prozora sa SetForegrounWindow dozvoljava samo ako se izvršava iz procesa/threada koji je povezan sa trenutno aktivnim prozorom. ActivateApplication radi na tom principu.



 
Odgovor na temu

yiwan
Novi Sad

Član broj: 81026
Poruke: 63
*.ns.ac.yu.



Profil

icon Re: Pronalazenje otvorenog prozora i njegovo aktiviranje01.02.2007. u 11:20 - pre 210 meseci
Hvala na brzom odgovoru... Probao sam ali nista se ne desava...

Ovako odredjujem da li je imeapp aplikacija aktivna (imeapp.exe je proces te aplikacije):

AktivirajHandle := 0;
handler := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if Process32First(handler, data) then
begin
if GetName() = 'imeapp.exe' then AktivirajHandle := handler;
while Process32Next(handler, data) do
if GetName() = 'imeapp.exe' then AktivirajHandle := handler;
end
else begin
ShowMessage('Error');
AktivirajHandle := 0;
end;

Na osnovu ovoga ako je AktivirajHandle <> 0 znam da je aplikacija ne koju hocu da prebacim fokus aktivna.

Da li taj AktivirajHandle treba da zamenim s Application.handle (to sam uradio i nista)?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Pronalazenje otvorenog prozora i njegovo aktiviranje01.02.2007. u 11:41 - pre 210 meseci
> handler := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
> if Process32First(handler, data) then
> begin
> if GetName() = 'imeapp.exe' then AktivirajHandle := handler;
> while Process32Next(handler, data) do
> if GetName() = 'imeapp.exe' then AktivirajHandle := handler;

Što bi reko naš bivši ministar: "Don't mix grandmothers and frogs" ;) Handler u tvom primeru je handle process searcha a tebi treba HWND main prozora te aplikacije. Kada identifikuješ proces preko EnumThreadWindows možeš doći do te informacije. Mislim da jedi biblioteka ima nešto slično pa potraži prvo tamo da se ne bi previše mučio.
Ovako na prvi pogled mi tvoja enumeracija procesa malo čudno deluje, nisam ni siguran da je tačna, ne vidi se čitav kod.

 
Odgovor na temu

yiwan
Novi Sad

Član broj: 81026
Poruke: 63
*.static.sbb.co.yu.



Profil

icon Re: Pronalazenje otvorenog prozora i njegovo aktiviranje02.02.2007. u 23:22 - pre 210 meseci

I dalje mi nije bas najjasnije... :(

Probao sam ponovo, ali umesto sa procesima, da sa EnumWindows inadjem prozor, i uspem da procitam caption-e od svih prozora ali to mi nije dovoljno dobar kriterijum da pronadjem prozor koji me zanima...

Znaci, hocu da proverim da li postoji prozor koji je nastao aktiviranjem aplikacije 'xxx.exe' i da ga postavim za aktivnog ako nije aktivan...

Moze li neki primer ili neki link gde bi mogao da pogledam kako da to uradim?

Unapred hvala.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Pronalazenje otvorenog prozora i njegovo aktiviranje03.02.2007. u 15:27 - pre 210 meseci
> Probao sam ponovo, ali umesto sa procesima, da sa EnumWindows inadjem prozor, i uspem da procitam caption-e od svih prozora ali to mi
> nije dovoljno dobar kriterijum da pronadjem prozor koji me zanima...

Sa GetWindowThreadProcessId možeš dobiti kom procesu taj prozor pripada, a već imaš kod koji ti nalazi proces...
Kao što sam ti rekao možeš koristiti i EnumThreadWindows, treba ti main thread id na osnovu processID a možeš ga dobiti pomoću CreateToolhelp32Snapshot/Thread32First, primera ja mislim da ima u JCL biblioteci, ima ih u MSDNu i u news grupama.



 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pronalazenje otvorenog prozora i njegovo aktiviranje

[ Pregleda: 2271 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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