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...
khazi