Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 21 odgovor
  • 6.141 pregleda

Najnovija ↓

Refresh system tray 14.11.2008. u 15:18 · pre 218 meseci #1
Pozdrav,
uradio sam app koja gasi odredjeni program (proces)
u nekom zadatom vremenu ili samo proverava (nije ni bitno),
cija se ikonica nalazi u system tray, pomeri
neke fajlove i opet startuje taj isti program, cija se
opet ikonica regularno pojavi u treju.
E sad vizuelno se ne refreshuje sam izgled desktopa
tj. samog s.tray tako da izgleda kao da se gomilaju
ikonice pored satica. Elem kada se predje misem
verovatno se triguje neki win event pa se refreshuje i nestanu
ne-validne.
Da li ima neka funkcija za sam refresh system tray-a.
Nemam neke velike zelje da googlujem.
Ako neko zna bio bih mu zahvalan,
poz
i unapred hvala.
Potpis
'Think evolution, not revolution.'
Re: Refresh system tray 14.11.2008. u 16:21 · pre 218 meseci #2
Umesto sto na silu ubijas proces (sto i nije bas pozeljno) probaj da posaljes programu koji gasis poruku da se ugasi sam. Ako je program koji gasis dobro napisan pocistice sam za sobom i ikonica ce nestati sama.

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refresh system tray 14.11.2008. u 16:33 · pre 218 meseci #3
znaci goooooooooogluj ............
Potpis
'Think evolution, not revolution.'
Re: Refresh system tray 14.11.2008. u 16:51 · pre 218 meseci #4
Nece ti to mnogo pomoci (sto naravno ne znaci da ne treba da googlujes :)), jedini za sada poznati nacin je lociranje prozora klase TrayNotifyWnd i otimanje kurzora misa korisniku i setanje istog iznad client area tog prozora i onda vracanje misa na poziciju sa koje je ukraden. U principu hack i simulacija korisnickog setanja misa iznad tray-a, googlaj za "TrayNotifyWnd" i naci ces neki sample.



Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refresh system tray 14.11.2008. u 17:45 · pre 218 meseci #5
Da na zalost vec sam odradio ,
uuuuf sto mrzim da surfujem, ko iglu u plastu sena. vazda.
Ali
na msdn-u nadjoh slican problem
te je covek pomogao sa
Code:

//Include following code with yours to refresh System Tray.

public const int WM_PAINT = 0xF;
[DllImport("USER32.DLL")]
public static extern int SendMessage(IntPtr hwnd, int msg, int character, IntPtr lpsText);


//Send WM_PAINT Message to paint System Tray which will refresh it.
SendMessage(traynotifywnd,WM_PAINT,0,IntPtr.Zero);

Sad jos samo treba to malo prevesti i trebalo bi
da funkcionise. Videh da mu se zahvaljivao covek
pa nema smisla da sumnjam.

poz
Potpis
'Think evolution, not revolution.'
Re: Refresh system tray 14.11.2008. u 20:36 · pre 218 meseci #6
Nazalost to znam jos od ranijeda, WM_PAIN ne reseava ovaj problem, on sam ponovo iscrta wintray prozor ali ne radi callback u aplikacije da vidi koja je jos ziva. (mozda win2008 i vista rade, to ne znam, ali na XP/2003 meni nije radilo)

Nadjoh taj tvoj post, pa procitaj malo nize:
Citat:
I tried this, but it doesn't work. That is, sending the WM_PAINT message to the traynotifywnd window doesn't make the icon (whose associated app was killed) go away.


Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refresh system tray 14.11.2008. u 20:48 · pre 218 meseci #7
aj jaj jaj
taman sam hteo da se pozabavim kodom,
al bolje da si mi rekao nego da gubim vreme.

nista.....
trazim dalje........

poz
Potpis
'Think evolution, not revolution.'
Re: Refresh system tray 15.11.2008. u 14:38 · pre 218 meseci #8
Da li si koristio ove funkcije
Update :
Code:

NOTIFYICONDATA    IconData;
Shell_NotifyIcon(NIM_MODIFY,&IconData);


Delete :
Code:

NOTIFYICONDATA    IconData;
Shell_NotifyIcon(NIM_DELETE,&IconData);


Mene nikad nije zezao tray sa ovim funkcijama , e sad mozda si nesto propustio ..
Potpis
Viva lollapalooza
Re: Refresh system tray 15.11.2008. u 23:24 · pre 218 meseci #9
Pokusao sam,
ne uspeva,
funkcija vraca gresku, a.k.a. povratna vrednost je 0.
a i ikone se gomilaju :)


pardon, pa i ne moze kad.
Joj, pa treba da prosledim HWND od app koju gasim :(((((((

uf hrkljus !
Potpis
'Think evolution, not revolution.'
Re: Refresh system tray 16.11.2008. u 09:53 · pre 218 meseci
izmenjeno 1 put, poslednji put X Files 16.11.2008. u 10:13
  1. X Files16.11.2008. u 10:13zapis iz teksta poruke
#10
Letimičnim Google-ovanjem nisam pronašao neki automatizovan metod za refresh sistemskog tray-a. Izgleda da ne postoji. Ono što preostaje je simuliranje WM_MOUSEMOVE iznad regije tray-a, što će ukloniti mrtve ikone.

Ovde sam pronašao neki kod:
http://www.themssforum.com/MFC/Refresh-system/

@BaseQ
Koje razvojno okruženje koristiš? Da li beše BCB?
Ako da, evo koda koji sam delimično modifikovao (da radi kad je tray u vise linija) i prilagodio (neke casting konvencije) da se kompajlira i radi sa Borland C++ Builder okruženjem.

Ono što uočavam kao anomaliju ovog programa (originalni primer) je da on prolazi samo po jednoj horizontalnoj liniji po širini tray-a, očekujući da niko od korisnika nema tray u dva ili više redova, kao na primer ja. He he ;) Drugim rečima, ovaj kod neće raditi ako je tray ikona u drugom redu. Dalje, korak mu je jedan piksel, sto je verovatno isuvise sitno, ali nema veze. Brzo ce to raditi.

Evo koda:
Code:

// ...
BOOL CALLBACK ProcessTrayChildren (HWND hwnd, LPARAM lParam);
BOOL CALLBACK ProcessIcons (HWND hwnd, LPARAM lParam);
// ...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND hTray = ::FindWindow( "Shell_TrayWnd", NULL );
    if (hTray)
    {
        EnumChildWindows( hTray, (WNDENUMPROC)ProcessTrayChildren, 0 );
    }
}

BOOL CALLBACK ProcessTrayChildren( HWND hwnd, LPARAM lParam )
{
    char ClassName[256];
    GetClassName( hwnd, ClassName, sizeof( ClassName ) );

    if ( strcmp( ClassName, "TrayNotifyWnd" ) == 0 )
    {
        EnumChildWindows( hwnd, (WNDENUMPROC)ProcessIcons, 0 );
        return FALSE;
    }
    return TRUE;
}

BOOL CALLBACK ProcessIcons( HWND hwnd, LPARAM lParam )
{
    RECT rect_tb;
    int y,x;

    char ClassName[256];
    GetClassName( hwnd, ClassName, sizeof(ClassName) );

    if ( strcmp( ClassName, "ToolbarWindow32" ) == 0 )
    {
        ::GetClientRect( hwnd, &rect_tb );
        for ( y=rect_tb.left; y<=rect_tb.right; y++ )
        {
            for ( x=rect_tb.top; x<=rect_tb.bottom; x++ )
            {
                ::SendMessage( hwnd, WM_MOUSEMOVE, 0, MAKELONG(x,y) );
            }
        }
        return FALSE;
    }
    return TRUE;
}
// ...
Re: Refresh system tray 16.11.2008. u 10:31 · pre 218 meseci #11
Mislim da mozes i da skratis kod i izbacis enumeracije i iskoristis FindWindowEx api samo sa imenom klase (postoji samo jedan takav prozor ako se ne varam)

FindWindowEx(NULL, NULL, "TrayNotifyWnd", NULL);

i isto ako se ne varam mozes slobodono da se prosetas po ovom hWnd-u

Za ovaj hack postoje jos dva problema pored ovih koje si naveo. Prvo mrtve ikonice mogu da se nadju i u "skrivenom" delu system tray-a (znaci moras da prvo uradis expand tray-a ako hoces da ih sve istrebis) i drugo mora da ide mali delta za pomeraj misa da ne bi bilo preskocenih ikonica. Recimo da je delta 8 piksela, imas XxY ukupno cetiri 'udara' u jedno mesto za ikonicu, posto se ikonice sklanjaju odmah pri pomeranju misa i tray se shiftuje i sad ti je ispod misa druga ikonica koja se nece odmah skloniti jer ceka svoj pomeraj misa i moze lako biti preskocena.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refresh system tray 16.11.2008. u 11:08 · pre 218 meseci #12
^
Da, definitivno može i kraće, jednostavno sam kopirao već postojeći kod kao polazni.

To za mali pomeraj je svakako bitno (jer ako se ne varam, nemamo odmah povratni info o uklanjanju ikone, pa da ostanemo na istom pikselu dok ima šta da se ukloni), kao što je bitno i da se krene "odozgo na dole", jer se ikone slažu kao tetris, odnosno padaju dole.

Kada bih radio kod za sebe (a da budem siguran da radi besprekorno), možda bih uveo i par prolaza:
for ( int prolaz=0; prolaz<BROJ_PROLAZA; ++prolaz)
{
// ovde ceo kod
}
... jer očekujem da prolazi rade vrlo brzo.

Expand treba obavezno.
Re: Refresh system tray 16.11.2008. u 11:27 · pre 218 meseci #13
^
A mozda i povremenu rekalkulaciju granica poligona.
Re: Refresh system tray 16.11.2008. u 11:56 · pre 218 meseci #14
Hvala ljudi,
to je to.
Koristim bcb :)
I da, koristim tray u vise redova :)

thx 1ce more
pozz svima
Potpis
'Think evolution, not revolution.'
Re: Refresh system tray 16.11.2008. u 12:03 · pre 218 meseci #15
OT:
Baš sad gledam nešto u vezi tray-a u više linija (barem kod Viste).
2 reda Quick launch ikona = 3 reda tray ikona (al' su se zbile, svaka čast). Nisam to ranije uočavao.
Re: Refresh system tray 16.11.2008. u 12:16 · pre 218 meseci #16
http://www.themssforum.com/MFC/Refresh-system/

Mislim da nema mnogo potrebe za ovom gore egzibicijom "proccess Icons" itd ..
Dovoljno je staviti u OnDestroy handleru od prozora ikonice Shell_NotifyIcon(NIM_DELETE,&IconData);
i radice. Meni je tako radilo , bas sad isprobah pre neki minut cisto da budem siguran .
Potpis
Viva lollapalooza
Re: Refresh system tray 16.11.2008. u 12:18 · pre 218 meseci #17
E sad kad smo sve to rekli, ja bih ti opet preporucio da ne radis sve ovo vec da lociras glavni HWND procesa koji gasis nasilno i umesto da upucas proces posalji mu WM_CLOSE i pusti ga koji trenutak da se ugasi sam i verovatno ce ikonica sama nestati kao deo cleanup-a aplikacije koju gasis pa ti nista od ovoga ne treba. Ikonica nije jedini problem koji mozes da imas sa nasilnim ubijanjem procesa (samo je problem koji vidis), ima tu i drugih vaznijih problema (ako ubijes proces tokom asinhronog upisivanja u fajl i slicno).

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refresh system tray 16.11.2008. u 13:02 · pre 218 meseci #18
Citat:
deerbeer: Dovoljno je staviti u OnDestroy handleru od prozora ikonice Shell_NotifyIcon(NIM_DELETE,&IconData);
i radice. Meni je tako radilo , bas sad isprobah pre neki minut cisto da budem siguran .


Jos samo treba da pogodis koji hWnd i IconID koristi aplikacija koju je upravo ubio. ;)
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refresh system tray 16.11.2008. u 16:20 · pre 218 meseci #19
Citat:

@deerbeer
Dovoljno je staviti u OnDestroy handleru od prozora ikonice Shell_NotifyIcon(NIM_DELETE,&IconData);

Nikola, da li govorimo o istom?
Problem je u tome sto kada se nasilno (TerminateProcess/Task manager>End Process) ubije aplikacija koja koristi tray, ona ne stigne da izvrsi clean-up kod u koji spada i Shell_NotifyIcon(NIM_DELETE,&IconData).

Citat:

@mmix
E sad kad smo sve to rekli, ja bih ti opet preporucio da ne radis sve ovo vec da lociras glavni HWND procesa koji gasis nasilno i umesto da upucas proces posalji mu WM_CLOSE i pusti ga koji trenutak da se ugasi sam i verovatno ce ikonica sama nestati kao deo cleanup-a aplikacije koju gasis pa ti nista od ovoga ne treba.

Naravno. Slanje WM_CLOSE u message queue aplikacije je prvo sto bi trebalo pokusati.

@BaseQ
Jesi li pokusao ovo sa slanjem WM_CLOSE, to je svakako najbolje resenje ?
Re: Refresh system tray 16.11.2008. u 16:47 · pre 218 meseci #20
Ne iskreno nisam,
ceo program mi se javio iz potrebe
sto neke procese ne mozes da ugasis
iz task managera, a nakon toga sam ga doradio
za gasenje nekih programa p2p koji
dl-uju raznorazne stvari :) i jos ubacio
i za gasenje sistema itd.
Mislim nastao je za ubijanje procesa
i....... eto... bezveze.
Neznam, probacu sigurno.
Za sad sve radi kao sto sam i zamislio,
iz ciste moje potrebe :)
Elem i pod XP-om, kada je dvoredni
u tray-u su tri reda ikonica.
Ovo Windows 2003 je u stvari XP x64 bitni ili ti zvanicno Windows Server 2003

poz
Potpis
'Think evolution, not revolution.'
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme