WinAPI.txt

(8 KB) Pobierz
WINAPI - kraina Billa cz. II


Witam ponownie w kolejnym arcie opisuj�cym krain� winapi...heh

Jak obieca�em, w poprzedniej cz�ci,  teraz poka�� wam ciekawsze zak�tki.
Dodam tylko, �e nie odpowiadam za wasze wybryki z kodem ;)

Tym razem tematem naszych rozwarza� b�d� OKNA...takie fajne prostok�tne okna.

Dawno, dawno temu, kiedy DOS jeszcze rz�dzi�, Bill wymy�li� okienka.
Tym samym ustali� pewien standard, kt�ry bardzo przypad� do gustu u�ytkownikom. R�wnie� wielow�tkowo�� zadecydowa�a o popularno�ci tego systemu. No dobra, dosy� tego be�kotu...teraz nauczymy si� kilku porzytecznych rzeczy:)

WINAPI obfituje w r�ne nowe typy danych, strukturki, kt�re zosta�y stworzone po to aby obrazowa� to co windowsie wa�ne. Typ, kt�ry reprezentuje okno to HWND, nazywa si� go popularnie uchwytem.
Oto przyk�adowa deklaracja:

//----
HWND hOkno ;
//----

W uchwycie hOkno na razie nic nie ma. Mo�emy na przyk�ad tej zmiennej przypisa� okno, kt�re jest w aktualnie u�ywane. S�u�y do tego funkcja o trafnej nazwie: HWND GetForegroundWindow...

//----
hOkno = GetForegroundWindow() ;
//----

Kiedy mamy ju� uchwyt aktywnego okna mo�emy z nim zrobi� wszystko.
Na przyk�ad chcemy, �eby...znik�o i pojawi�o si� dopiero po 10 sekundach.
Takie operacje z oknem mo�na przeprowadza� za pomoc� funkcji
BOOL ShowWindow(HWND hwnd, int nCmdShow)...

//----
ShowWindow(hOkno, SW_HIDE) ;
Sleep(10000) ;
ShowWindow(hOkno, SW_SHOW) ;
//----

I to wszystko. Jak widzisz jako parametr podali�my nasz uchwyt, �eby funkcja ukry�a aktywne okno (SW_HIDE) i po 10 sekundach (Sleep powoduje przerw� okre�lon� w milisekundach st�d te 10000) pojawi�o si� spowrotem (SW_SHOW). Jest jeszcze kilka flag, kt�re mo�na u�y�: SW_MINIMIZE,SW_MAXIMIZE, SW_SHOWNORMAL.

Opr�cz tego mo�na okno...zniszczy�...hehe

//----
bool powiodlo_sie = DestroyWindow(hOkno) ;
//----

Hmmm...mo�na jeszcze sprawdzi� jaki ma tytu�:

//----
char window_title[255] ;
GetWindowText(hOkno, window_title, 255) ;
//----

W ostatnim parametrze podajemy rozmiar bufora, �eby nam si� nie rozerwa� czasem...heh

Mo�na r�wnie� zmieni� tytu�:

//----
SetWindowText(hOkno, "blablabla") ;
//----

Nic nie stoi na przeszkodzie aby je troch� poprzesuwa�:

//----
SetWindowPos(hOkno, HWND_TOP, -1000, -1000, 0, 0, SWP_NOSIZE) ;
//----

Drugi parametr to flaga, kt�ra sprawi, �e okno b�dzie na wierzchu, dalej mamy wsp�rz�dne x i y oraz szeroko�� i wysoko�c, a SWP_NOSIZE m�wi funkcji, �e ma nie zmienia� rozmiaru okna.

Dezaktywacja okna - co wy na to:

//----
EnableWindow(hOkno, FALSE) ;
//----

I okno nieaktywne, jak chcesz �eby si� da�o z niego korzysta� to oczywi�cie w drugim parametierze TRUE...heh.

Wiesz ju� jak pobra� uchwyt okna, kt�re jest aktualnie u�ywane.
Ka�de okno ma swoj� klas�, kt�ra okre�la typ okna (GetWindowClassName - tak samo jak GetWindowText). Na przyk�ad kontrolka edit jest klasy edit. Zwyk�e okno nie ma zawsze takiej samej klasy, programista sam ustala jej nazw�. Sp�jrz na pulpit...hehe s� tam ikonki, pasek zada� na nim przycisk start, ikonki tray'a i inne. Ka�da kontrolka (button, edit) jest oknem, czyli mo�emy z powodzeniem u�y� na nich powy�szych funkcji musimy jednak dysponowa� ich uchwytem...

//----
HWND hIkony ;
hIkony = FindWindow(NULL, "Program Manager) ;
ShowWindow(hIkony, SW_HIDE) ;
//----

...i niczym David Copperfild (czy jak to si� tam pisze) sprawili�my, �e ikony znik�y z naszego pulpitu.
Zajmijmy si� jednak funkcj� FindWindow. Ma ona tylko dwa parametry.
Pierwszy to nazwa klasy, a drugi to jego tekst(tytu�). Nazwa, tytu� kontrolki, kt�ra wy�wietla ikony na pulpicie to Program Manager. Nie dysponujemy nazw� klasy tej kontrolki wi�c przekazujemy tylko klas�, a funkcja juz nam zw�rci odpowiedni uchwycik ;)
Tak na marginesie nazwa klasy paska zada� to: Shell_TrayWnd.

Powy�sza funkcja wyszukuje okna, kt�re nale�� do pulpitu (r�wie� otwarte okna aplikacji). Co zrobi� gdy mamy uchyt do okna Notatnika i chcieliby�my pobra� uchyt do jego edita, �eby wypisa� tam jaki� ciekawy tekst. Z pomoc� przychodzi FindWindowEx (niestety niedost�pna w NT)...

//----
HWND hNotepad, hEdit ;
hNotepad = FindWindow(NULL, "Bez tytu�u - Notatnik") ;

if(hNotepad)
hEdit = FindWindowEx(hNotepad, 0, "edit", NULL) ;

if(hEdit)
SetWindowText(hEdit, "hyhy...jaki ten windows elastyczny...") ;
//----

Najpierw funkcji przekazujemy uchwyt do okna notatnika (je�li takie istnieje) , nast�pny parametr okre�la okno od kt�rego funkcja rozpocznie wyszukiwanie np. je�li szukamy na pulpicie i jest wiele okien w r�nej kolejno�ci, zignorowanie tego parametru powoduje, �e funkcja zaczyna szukanie od pierwszych okien rodzica. Dalej mamy nazw� klasy...nazw�, tekst ignorujemy.

Pasek zada� (ShellTrayWnd) ma swoje dzieci ;)
ReBarWindow32 - ikonki na pasku
TrayNotifyWnd - ikonki traya
button - nasz kochany przycisk start

Mie�ej zabawy...ale idziemy dalej...

Program komunikuje si� z systemem za pomoc� komunikat�w.
Ka�dy komunikat trafia do jakiego� okna, ma swoj� nazw� oraz dwie 32 bitowe warto�ci, kt�re go okre�laj� (WPARAM i LPARAM).

Teraz zajmiemy si� komunikatem WM_SYSCOMMAND.

//----
SendMessage(FindWindow(NULL, "Program Manager"), WM_SYSCOMMAND, SC_TASKLIST, 0) ;
//----

Podajemy funkcji uchwyt (nasz pulpicik z ikonami) potem wysy�amy wiadomo�� WM_SYSCOMMAND i jako wParam podajemy SC_TASKLIST, kt�re jest odpowidzialny za klikni�cie w menu start, lParam zostawiamy w spokoju.

Do wParam mo�emy wpisa� inne flagi np. SC_SCREENSAVER uruchamia wygaszacz ekranu, SC_PREVWINDOW pokazuje poprzednie okno, SC_NEXTWINDOW nast�pne, SC_MONITORPOWER prze��cza nasz monitor (lParam 2 - wy��czony - (minus) 1 w��czony) niestety tylko w win9x...i tak mo�na wylicza�.

Teraz nab�dziemy umiej�tno�c pobrania wszystkich uchyt�w okien-rodzic�w naszego systemu, potem b�dziesz m�g� je przefiltrowa� (np. po nazwach) i wykona� jakie� operacje...

//----
//====
BOOL CALLBACK EnumWindowsProc(HWND, LPARAM) ;
//====

//====
hOkna[100] ;
//====

//====
EnumWindows(EnumWindowsProc, (LPARAM) hOkna) ;

   for(int j = 0 ; j < 100 ; j++)
   {
       if(IsWindowVisible(hOkna[j]))
       {
           ShowWindow(hOkna[j], SW_HIDE) ;
       }        
   }

//====

//====
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
HWND *TabhWnd = (HWND*) lParam ;  
static int j = 0 ;    

TabhWnd[j] = hwnd ;  
j++; 

return TRUE ;    
}    
//====
//----


uff....

Najpierw musisz napisa� procedure EnumWindowsProc, kt�ra b�dzie przekazywa� uchwyty okna. Potem wywo�ujesz funkcje EnumWindows, kt�rej podajemy adres EnumWindowsProc i podajemy nasz� tablic� okien.

Nast�pnie w p�tli sprawdzamy czy okno jest widoczne na ekranie, je�li jest to ukrywamy je...
Czasami takie c� si� przydaje mo�na np. pobra� sobie wszystkie kontrolki danego okna, ale do tego potrzebna b�dzie funkcja EnumChildWindow.
R�ni si� od powy�ej opisanej tym, �e posiada jeszcze jeden parametr, kt�ry okre�la okno, w kt�rym odb�dzie si� wyszukiwanie...

//----
EnumChildWindow(hOknoRodzic, EnumsWindowProc, (LPARAM) hOknaDzieci) ;
//----

Je�li chodzi o okna to mo�e warto by�o by powy�wietla� jakie� okienka z wiadomo�ciami...ciekawymi...heh...

MessageBox(hUchwyt, "Musz� zaraz wy��czy� kompa ;(", "Warning", MB_OK | MB_ICONWARNING) ;

Komunikat wy�wietli si� w oknie okre�lonym w hUchwyt, drugi parametier to tekst komunikatu, dalej mamy tytu�, no i nasze kochane flagi...kt�rych jest eee w bardzo du�o...

Przyciski:
MB_ABORTRETRYIGNORE      
MB_OK      
MB_OKCANCEL
MB_RETRYCANCEL
MB_YESNO
MB_YESNOCANCEL      

Ikony:
MB_ICONQUESTION
MB_ICONWARNING
MB_ICONERROR
MB_ICONINFORMATION

Zwracane warto�ci:
IDABORT
IDCANCEL
IDIGNORE
IDNO      
IDOK      
IDRETRY      
IDYES      

...hyh to te podstawowe...

HAPPY (?) END
W tym artykule przedstawi�em podstawowe wiadomo�ci na temat okien. By�y chyba nieco ciekawsze ni� te poprzednie...co? Mo�e nie zdajesz sobie jeszcze sprawy jak wielk� w�adz� daje nam winapi je�li chodzi o system windows...postaram si� ci to bardziej u�wiadomi� w nast�pnych cz�sciach, kt�re oczywi�cie...si� pojawi�...niestety ko�cz� mi si� ferie ;(

Pozdrrawiam wszystkich...jak co to na maila...
Zgłoś jeśli naruszono regulamin