Interakció más emberek ablakaiival - delphi sources faq

Képzeljünk el egy buta felhasználó ül, mintha semmi soha nem látott bölcsen már egy ideje próbál létrehozni egy dokumentumot a Microsoft Word'e, de hirtelen az ablak elkezd vágta vadul az egész képernyőt, obszcén üzenetek jelennek meg a fejlécben, hogy a lehető legkisebb legyen, kibontakozik, állandóan változó mérete, de a végén teljesen eltűnik, elvételét feledésbe az összes szöveget, amely tele van olyan sok nehézséget lameryuga. és ha igen, bármely program bármikor viselkedhet. ennek benyomása hosszú ideig tart.

Ahhoz, hogy valamilyen ablakot meg tudjon csinálni, először meg kell kapnia a fogantyút, azaz pozícióját az operatív memóriában. Ehhez használja a FindWindow funkciót. Csak két paramétert kell megadnia: először a keresőablak osztályát, majd annak címét. Nos, a problémák címével általában nincs - látjuk, de itt van az, hogy hogyan definiáljuk az osztályt. mert a felhasználó hangja el van rejtve. Valójában csak az ablak címét adhatjuk meg, az osztály helyett nullát.

Először futtassa a szabványos Notepad programot - és mit látunk? A Jegyzettömbben az ablak címe tartja nyomon az aktuális fájl nevét. Kezdetben t. fájl nem használható, a notebook címe így néz ki: "Névtelen - Jegyzettömb". Megpróbáljuk megtalálni a notebook ablakát ennek a kritériumnak megfelelően. Így fog kinézni:

Amint azt a kódból látjuk, ha programunk notebook-ablakot talál, akkor egy üzenetet fogunk látni.

Ezután próbálja meg áthelyezni ezt az ablakot

Ismét találunk jegyzettömböt. A leíróját egy osztály HWND változójába helyezzük [From English Handle Window - ablakkezelő]. Ezután beállítjuk a SetWindowPos funkciót. Paraméterként meg kell adnia:

Ha ez a függvény sikeres, akkor nem nulla értéket ad vissza. Nos, most áthelyezhetjük és átméretezhetjük más emberek ablakait. Az ablak címének megváltoztatásához a következő kódot kell írni:

A setwindowtext függvényben csak két paramétert kell megadni: a szükséges ablak fogantyúja és a fejléc új értéke. Ez minden!

Van egy másik érdekes ShowWindow funkció, amely lehetővé teszi az ablakok elrejtését vagy megjelenítését. Ehhez hasonlóan kell használni.

A zárójelben először jelezzük, hogy melyik ablakban akarunk nevetni, és akkor pontosan mit akarunk vele csinálni. A lehetséges lépésekben meghatározhatjuk:

  • SW_HIDE Elrejti az ablakot, és aktiválja a másikat.
  • SW_MAXIMIZE Kiterjeszti az ablakot.
  • SW_MINIMIZE Összecsukja az ablakot.
  • SW_RESTORE Aktiválja és megjeleníti az ablakot. Ha az ablak kibontott vagy összecsukott - visszaállítja az eredeti méretét és pozícióját.
  • SW_SHOW Aktiválja és megjeleníti az eredeti méretével és pozíciójával rendelkező ablakot.
  • SW_SHOWDEFAULT A STARTUPINFO struktúrában megadott beállításokkal aktiválódik, amikor az alkalmazás létrehozta a kívánt programot elindító folyamatot.
  • SW_SHOWMAXIMIZED Megjeleníti az ablakot kiterjesztett formában.
  • SW_SHOWMINIMIZED Megjeleníti az ablakot ikonként a tálcán.
  • SW_SHOWMINNOACTIVE Megjeleníti a tálcán minimalizált ablakot, és nem adja át a bemeneti fókuszt, pl. egy olyan ablak, amely korábban aktív volt, mint korábban.
  • SW_SHOWNA Megjeleníti az aktuális állapotban lévő ablakot. Az aktív ablak továbbra is aktív marad.
  • SW_SHOWNOACTIVATE Megjeleníti az ablakot az utolsó pozícióban és az utoljára használt méretekkel. Az aktív ablak továbbra is aktív marad.
  • SW_SHOWNORMAL Megjeleníti az ablakot. Ha összeomlik vagy kibontja - visszaállítja eredeti méretét és pozícióját

De bonyolítja a cselekvés abban a tényben rejlik, hogy a cím Notepad nyomon aktuális fájl nevét és értékét használja „Untitled - Jegyzettömb” nem mindig tudjuk. . (Különösen azért, mert ez nem csak abban az esetben a notebook, de van egy módja :. Mivel a funkció FindWindow találni az ablak azt jelzi, nem csak a címe a kívánt ablakot, de minél több az osztályban Mi a kiadási mondhatnánk, az ablak címét, azt látjuk, akkor tudjuk. mit jelezzen - és az ablakosztályt is. Valójában még egy kis erőfeszítést is találhat!

A Delphi csomag tartalmaz egy speciális segédprogramot az összes aktív folyamat nyomon követéséhez, WinSight32-nek nevezik. Ezt fogjuk használni. Fuss, turkálni a folyamatok listájában, keresse meg a sort, ahol az aktuális cím jelenik meg a kívánt ablakot, például a Jegyzettömb, és a bal oldali ebben a sorban zárójelek megtalálja a nevét az ablak osztály. A jegyzettömbre ez a "Notepad" lesz. Most, ismerjük az ablak osztály nevét, így átírhatjuk az ablakkeresést:

Most, az ablak cím helyett, a nulla értéket adjuk meg, figyelmen kívül hagyva ezt a paramétert.

Van még egy remek mód a parancsok átadására az ablakokra - A PostMessage funkció. Paraméterként meg kell határozni:

  • Az ablak kezelője, amelyhez az üzenetet küldi, vagy a következő értékek:
    • HWND_BROADCAST üzenetet fog küldeni az összes ablakot, a felső szinten a rendszer, beleértve az inaktív és láthatatlan ablakok, átfedésben-ablak és a felugró ablakban, de az üzenet nem lesz elküldve a gyermek [gyermek] ablak.
    • NULL Úgy viselkedik, mint egy PostThreadMessage függvény, a hozzá tartozó dwThreadId paraméterrel.
  • Az elküldött üzenet
  • Az üzenet első paramétere
  • Az üzenet második paramétere

Például, ha üzenetet küld wm_quit notepad - az ablak bezárása nélkül üzenet jelenik meg a mentés szükségességéről!