Close Panel

Sunt (un pic) mai mult de 11 ani de când, pentru prima oară, am dat nas în nas cu Windows. Mă decisesem, după nişte asigurări ferme că voi fi ajutat dacă va fi nevoie, să încerc să intru la liceu într-o secţie de informatică, deşi nu văzusem un calculator în viaţa mea (n-am pus filmele la socoteală … dar acolo arată bine big grin)

Înainte de examenele de admitere din vara anului 1998 am fost cu mama mea la serviciul ei unde, la birouri, erau nişte calculatoare, iar fiica şefei butona deseori pe acolo. Evident, pentru a vedea cum arată un calculator. Bineînţeles că, inteligent cum mă ştiam, îmi imaginam ca în două săptămâni o să învăţ tot ce se poate despre calculatoare (nu mă mai prea uit la filme după deziluzia de atunci straight face). Ştefania, fata cu pricina, cu un an mai mare ca mine (deja la liceu, tot la secţie de informatică) nu prea avea stofă de profesor, aşa că a apăsat butonul de Power, au început să se deruleze nişte linii cu scris alb pe ecran, iar eu mă uitam ca la pagubă. Când liniile au obosit să tot fugă, Ştefania a scris trei litere, w, i, n şi a apăsat Enter (Enter … adică o tastă mare aflată la dreapta centrului tastaturii).

Windows. Versiune: 3.11. Totul a devenit luminos, in majoritate alb. Ferestre. Cursor de mouse. Ferestre. Apoi desene micuţe, colorate, în fiecare ocean de alb. Am văzut imediat că a intrat într-un ocean pln de jocuri şi a tot înotat până a găsit Solitaire. A fost interesant, dar … I mean, nu plec de la cărţile de joc de acasă ca să joc cărţi pe un calculator.

A trecut mult timp de atunci (din punctul meu de vedere), dar am rămas pe Windows. Altfel spus, plouă cu ferestre în continuare. Ce-i drept, de ani buni plouă cu ferestre şi în Linux…

Până nu demult, uitasem cât m-au fascinat pe mine ferestrele de Windows în liceu (mai ales după olimpiada de informatică dintr-a 9-a … mi s-a spus să-mi copiez fişierele sursă pe o dischetă, din Windows … foarte spăşit, a trebuit să-i explic lu’ tanti profesoara că habar n-am cum). Atât de mult că, în clasa a 11-a, am făcut un program, în Delphi, care să-mi listeze ferestrele de prin sistem, inclusiv cele ascunse … şi, mai ales, să îmi permită să mă joc cu ele big grin Să le pun always on top, să le ascund, să le mut … vremuri frumoase happy

Admiţând că aţi avut răbdare până acum, în cele ce urmează o să vă prezint respectivul progrămel, explicând câteva bucăţi de cod şi, ca şi până acum, să-l ofer ca open-source.

Prima funcţie care mi-a fost necesară a fost EnumWindows, o funcţie API care oferă lista completă a ferestrelor din sistem, având nevoie de doi parametri: o funcţie callback şi o valoare definită de programator pentru a fi pasată acestei funcţii callback. Să fiu sincer, la început n-am înţeles ce pisici e cu funcţia asta callback şi de ce, în acest caz, are nevoie de un parametru pentru un handle al unei ferestre şi parametrul definit de mine. I mean, într-un sistem sunt sute de ferestre … cum o să mi le dea pe toate într-un singur handle ?

Am trecut repede peste acest aspect, afişând acel “unic” handle (cum mă aşteptam eu) într-un ShowMessage. Mai trebuie să spun că dupa al 20-lea ShowMessage am intrat in Delphi şi am dat Ctrl + F2 (program reset) ? Funcţia callback este apelată pentru fiecare fereastră principală găsită de EnumWindows, oferindu-mi handle-ul ei.

Buuun … am rezolvat lista de ferestre. Am o listă de handle-uri către ferestre care, sincer, arată zdrobitor. În sensul de ciocan. Eu vroiam ceva flashy, ceva care să ia ochiul, ceva care să arate, oricui s-ar uita, că programul e super-mega-ultra-bla-bla. Hmm … titlul ferestrei (de obicei, caption bar-ul) ar da bine …

Am trecut la aflarea numelui ferestrei, nume oferit generos de GetWindowText, dacă oferi handle-ul ferestrei şi un locşor unde să toarne caracterele.

Da, deja arată mai bine. Totuşi, sunt o gramadă de nume ciudate pe aici. CiceroUIWndFrame, curtain, AXWIN Frame Window, DDE Server Window, SysFader … WTF ? Microsoft sucks! Totuşi, ce naiba e cu ferestrele astea? Trebuie să le vedem big grin

ShowWindow to the rescue. O funcţie foarte atractivă şi glumeaţă. Dai un handle şi îi specifici SW_SHOW and voila … fereastra a ieşit din ceaţa invizibilităţii. Specifici SW_HIDE şi … uite popa, nu e popa. Mai ştie şi alte treburi, dar dacă vă interesează, n-aveţi decât să RTFM pe linkul dat mai sus.

Acesta a fost un moment adevărat de răscruce. Mi-am dat seama că, având în vedere perechile Get / Set de funcţii, trebuie să existe SetWindowText. Lucky bet. Am implementat rapid funcţionalitatea şi am fost foarte mândru de mine când fereastra de Windows Explorer se prezenta drept “Bond. James Bond”. Glumesc, bineînţeles. Se numea “Pop. Victor Pop”.

Indiferent de nume, funcţia SetWindowPos are în grijă şi setarea Z-order-ului, plus setarea ferestrelor top-level, pe lângă faptul evident că poate muta / redimensiona o fereastra. A fost o plăcere să lucrez cu această funcţie pentru a seta o fereastra, aleasă de mine, să fie Always On Top sau Always … sau nu.

Restul codului ar trebui să fie destul de explicit, dar dacă aveţi nelămuriri, let me know. O să încerc să fac pe bunul samaritean, o dată în viaţă big grin

Download:

Sursa : [download id="2"]
Executabil : [download id="1"]
Screenshot


DarkByte is
Email this author | All posts by DarkByte | Subscribe to Entries (RSS)

 

4 Responses to “Să numărăm ferestrele …”

  1. 1
    Scratch Says:

    M-am distrat copios citind articolul laughing, acum pot sa invat mai usor la biologie :-#big grin.
    Sti, acum, din cauza ta, evident, o sa ma apuc si eu curand de Delphi, dar intai trebuie sa ma mai zbengui in c++, in matricele si vectorii doamnei profesoare, care a reusit sa ma ameteasca total.
    Keep up the good work, DarkByte !

  2. 2
    deea Says:

    Mi-a povestit si mie intamplarea. happy

  3. 3
    Ramona Says:

    îmi aduc şi eu aminte de olimpiada aia..la Goldiş s-a ţinut….ce habarnistă eram de Pascal, mai ţii minte?

  4. 4
    DarkByte Says:

    Hello there happy Nu mă aşteptam să mă găseşti aici, dar e o surpriză plăcută.

    Nu-mi amintesc prea multe de cât erai tu de habarnistă, abia ne cunoşteam. Îmi amintesc, în schimb, ce habarnist eram eu happy

    Ce-mi amintesc de atunci e că, parcă, ai ieşit înaintea mea şi m-ai aşteptat fiindcă nu aveai tren.

    Trebuie să ne întâlnim şi să depănăm amintiri o dată …

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">