Bu yazımızda, Windows’un
pencere sistemi üzerinde dolaşmamızı sağlayan, pencereler üzerinde çeşitli işlemler
yapan ve pencere özelliklerini değiştiren API fonksiyonlarını incelemeye başlayacağız.
Pencereler ve pencere sistemi üzerinde işlem yapan API fonksiyonları genel olarak,
ya bizim verdiğimiz belli kriterlere uyan pencereleri arayarak onların tutamaç
değerlerini döndürür, ya da pencerelerin tutamaç değerlerini parametre değişkeni
olarak alarak pencere özelliklerini değiştirirler.
Bu yazımızda ele
alacağımız API fonksiyonları şunlardır :
HWND
FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName); |
BOOL
EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam); |
BOOL
EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAM lParam); |
HWND
GetNextWindow(HWND hWnd, UINT wCmd); |
HWND
GetTopWindow(HWND hWnd); |
HWND
GetWindow(HWND hWnd, UINT uCmd); |
HWND
GetActiveWindow(VOID); |
- FindWindow Fonksiyonu
: Bu fonksiyon, pencere sınıf ismi ve pencere başlığı verilen ana pencereyi
bulur. Sadece ana pencereler üzerinde dolaşır, alt pencerelere bakmaz. Pencere
başlığı parametre değişkeni yerine NULL geçilmesi, tüm pencere başlıklarının
kabul edileceği anlamına gelir. İlk parametre değişkeni, aranan pencerenin
pencere sınıfının adıdır. Fonksiyon eğer verilen sınıf ismi ve pencere başlığı
parametreleri ile eşleşen bir pencere bulursa, o pencerenin tutamaç değerine
geri döner. Başarısızlık durumunda ise NULL değerine geri döner. Başarısızlık
nedeninin anlaşılması için GetLastError fonksiyonu çağrılabilir.
HWND FindWindow
(
   
LPCTSTR lpClassName,    // Pencere sınıf ismi
    LPCTSTR lpWindowName // Pencere ismi
); |
- EnumWindows
Fonksiyonu : Tüm ana pencereler için, belli bir fonksiyonun çağrılmasını sağlar.
Bu fonksiyon da sadece ana pencereler üzerinde gezinir. Alt pencerlere bakmaz.
İlk parametre değişkeni, bulunan ana pencereler için çağrılacak fonksiyonu
gösteren bir göstericidir. Çağrılacak fonksiyonun, daha önceden belirlenmiş
belli bir parametrik yapıya uyması gerekmektedir. Fonksiyon başarılı olması
durumunda sıfır dışı bir değere, başarı durumunda ise sıfır değerine geri
döner.
BOOL EnumWindows
(
    WNDENUMPROC lpEnumFunc,    // Çağrılacak fonksiyonun
adresi
    LPARAM lParam                      // Çağrılacak fonksiyona geçilecek lParam
parametresi
); |
- EnumChildWindows
Fonksiyonu : Bu fonksiyon, kendisine parametre olarak geçilen bir üst pencereye
ait tüm alt pencereler üzerinde dolaşır. Bu alt pencereler için, ikinci parametresinde
belirtilen fonksiyonun çağrılmasını sağlar. Çağrılacak bu fonksiyon, önceden
belirlenmiş belli bir parametrik yapıya uygun olmalıdır. İlk parametre değişkeni,
alt pencereleri dolaşılacak üst pencerenin tutamaç değeridir. İkinci parametre
değişkeni, bulunan alt pencereler için çağrılacak fonksiyonun adresidir. Üçüncü
parametre değişkeni ise, çağrılacak fonksiyona geçilecek lParam parametresidir.
Fonksiyon başarılı olması durumunda sıfır dışı bir değere, başarısızlık durumunda
ise sıfır değerine geri döner.
BOOL EnumChildWindows
(
    HWND hWndParent,               
// Üst pencerenin tutamaç değeri
    WNDENUMPROC lpEnumFunc,    // Çağrılacak fonksiyonun
adresi
    LPARAM lParam                      // Çağrılacak fonksiyona geçilecek lParam
parametresi
); |
- GetNextWindow
Fonksiyonu : Bu fonksiyon, Z sırasında, kendisine parametre olarak geçilen
pencereden bir sonraki ya da bir önceki sırada yer alan pencerenin tutamaç
değerini döndürür. Tutamaç değeri parametre olarak geçilen pencere bir ana
pencere ise ana pencereler araştırılır, bir alt pencere ise alt pencereler
araştırılır. Fonskiyonun ikinci parametre değişkeni, bir önceki pencerenin
mi yoksa sonraki pencerenin mi araştırılacağını belirtir. Bu parametre değişkeni
için GW_HWNDNEXT sembolik sabiti geçilirse sonraki, GW_HWNDPREV sembolik sabiti
geçilirse önceki pencere araştırılır. Fonksiyon başarılı olması durumunda
bulunan pencerenin tutamaç değerine, başarısızlık durumunda ise (yani pencere
bulunamazsa) NULL değere geri döner.
HWND GetNextWindow
(
    HWND hWnd,    // Pencere tutamacı
    UINT wCmd      // Sıra belirten bayrak
parametre
); |
- GetTopWindow
Fonksiyonu : Bu fonskiyon, tutamaç değeri parametre olarak geçilen pencereye
ilişkin alt pencerelerin Z sırasına bakarak Z sırasının en üstünde yer alan
alt pencerenin tutamaç değerini döndürür. Eğer tutamaç değeri parametre olarak
geçilen pencerenin hiç alt penceresi yoksa fonksiyon NULL değere geri döner.
HWND GetTopWindow
(
    HWND hWnd   // Üst pencere tutamacı
); |
- GetWindow Fonksiyonu
: Bu fonksiyon, tutamaç değeri parametre olarak geçilen pencere ile, ikinci
parametresinde belirtilen ilişkiye sahip olan pencereyi araştırır. İkinci
parametre araştırılacak pencerenin, ilk pencere ile olan ilişkisini belirler.
Bu parametre için aşağıdaki sembolik sabitlerden birisi geçilebilir :
DEĞER
|
ANLAMI
|
GW_CHILD |
Eğer
ilk parametresinde belirtilen pencere bir üst pencere ise ve aradaki
ilişki GW_CHILD olarak belirtilmişse, fonksiyon bu pencereye ilişkin
alt pencerelerden Z sırasında en üstte yer alanının tutamaç değerini
döndürür. Eğer ilk parametresinde belirtilen pencere bir üst pencere
değilse (yani o pencereye ait hiçbir alt pencere yoksa) fonksiyon NULL
değer döndürür . |
GW_HWNDFIRST |
Bu
sabit kullanılırsa fonksiyon, ilk parametresinde belirtilen pencere
ile aynı türden olan pencereler arasından Z sırasında en üstte yer alan
pencerenin tutamaç değerini döndürür. |
GW_HWNDLAST |
Bu
sabit kullanılırsa fonksiyon, ilk parametresinde belirtilen pencere
ile aynı türden olan pencereler arasından Z sırasında en altta yer alan
pencerenin tutamaç değerini döndürür. |
GW_HWNDNEXT |
Bu
sabit kullanılırsa fonksiyon, Z sırasında ilk parametresinde belirtilen
pencereden bir sonraki sırada yer alan pencerenin tutamaç değerini döndürür.
|
GW_HWNDPREV |
Bu
sabit kullanılırsa fonksiyon, Z sırasında ilk parametresinde belirtilen
pencereden bir önceki sırada yer alan pencerenin tutamaç değerini döndürür.
|
GW_OWNER |
İlk
parametresinde belirtilen pencerenin, eğer varsa sahip penceresinin
tutamaç değerini döndürür. |
HWND GetWindow
(
    HWND hWnd,    // Orjinal pencerenin tutamacı
    UINT uCmd      // İlişki belirten bayrak
parametre
); |
- GetActiveWindow
Fonksiyonu : Bu fonksiyon, çağrıldığı kanalda aktif halde bulunan pencerenin
tutamaç değerini döndürür. Söz konusu kanala ilişkin aktif pencere yoksa fonksiyon
NULL değer döndürür.
UYGULAMALAR
1.
FindWindow Fonksiyonunun Kullanımı :
Şimdi küçük uygulamalar
geliştirerek bu fonksiyonları nasıl kullanacağımızı anlamaya çalışalım. İlk
olarak FindWindow fonksiyonunun kullanımını ele alalım. Bunun için altlık olarak,
bir önceki yazımızda oluşturmuş olduğumuz uygulamayı kullanacağız. Bu uygulama,
bir ana pencere, iki alt pencere ve bir de sahiplenilmiş pencere oluşturuyordu.
Öncelikle bu uygulamamızı çalıştıralım. Şu anda elimizde üç tane pencere var.
Bunlardan sadece bir tanesi ana pencere idi. Şimdi bu ana pencereyi başlığına
göre arayalım ve pencereye bir mesaj göndererek kapatılmasını sağlayalım. Bu
amaçla FindWindow fonksiyonunu kullanacağız. (Tanımında verdiğimiz gibi, FindWindow
fonksiyonu sadece ana pencereler üzerinde dolaşır, alt pencerelere bakmaz.)
Bu uygulama içerisinde, bir tane ana pencere oluşturuyoruz. Bu ana pencereye
ilişkin pencere fonksiyonunda, pencerenin oluşturulduğu mesajı alındığı zaman,
diğer ana penceremizi FindWindow fonksiyonu ile arayacağız. Pencere fonksiyonunu
şu şekilde yazmalıyız :
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HWND searchWindow;
   
switch(message) {
       case WM_CREATE :
          searchWindow = FindWindow(NULL,"Pencere
Sistemi - ANA PENCERE");
          if (searchWindow
== NULL) {
             MessageBox(NULL,"Pencere bulunamadı","Hata",MB_OK);
             exit(EXIT_FAILURE);
          }
         
MessageBox(NULL,"Pencere bulundu ve kapatılıyor","Bilgi
Mesajı",MB_OK);
          PostMessage(searchWindow,WM_QUIT,0,0);           break;
       case WM_DESTROY
:
          PostQuitMessage(0);
          break;
       default
:
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
|
Pencere fonksiyonunun
başında, bulduğumuz pencerenin tutamaç değerini daha sonra mesaj gönderme sırasında
kullanacağımız HWND türünden bir nesne tanımladık. Mesajları ele aldığımız switch
- case ifadesi içerisinde WM_CREATE mesajının alınması durumunda, yani uygulamamızın
ana penceresi oluştuğunda, FindWindow fonksiyonunu çağırarak çalışır halde bulunan
diğer ana penceremizi arayacağız. FindWindow fonksiyonunun ilk parametre değişkeni
yerine NULL değerini vererek, arama kriteri olarak pencere sınıf ismi kullanmayacağımızı
belirttik. İkinci parametre değişkeni yerine de aradığımız pencerenin başlığını
verdik. Pencere başlığımız ’Pencere Sistemi - ANA PENCERE’ idi. Fonksiyon eğer
başarılı olursa, bulduğu pencerenin tutamaç değerini HWND cinsinden olan ’searchWindow’
isimli nesnemize atayacak. Fonksiyon çağrısı ifadesinden sonra, bu nesnenin
değerinin NULL değer olup olmadığını kontrol ettik. Eğer nesne NULL değere sahip
ise, pencere bulunamamış veya bir hata oluşmuş demektir. Bu durumda exit fonksiyonu
ile programı sonlandırdık. Eğer nesnemiz NULL değere sahip değilse, aradığımız
pencerenin tutamaç değerini içermektedir. Bir mesaj kutusu ile bu bilgiyi de
kullanıcıya verdik. Şimdi bu değeri, pencereye kapanma mesajı göndermek amacıyla
kullanıyoruz. Mesaj göndermek için PostMessage API fonksiyonunu çağırdık. PostMessage
fonksiyonunun ilk parametre değişkeni yerine, mesajı göndereceğimiz pencerenin
tutamaç değerini geçtik. Bu değer de FindWindow fonksiyonunun bize vermiş olduğu
değerdir. Pencereye kapanmasını sağlayacak WM_QUIT mesajını gönderdik. Uygulamamızı
çalıştırdığımızda, diğer ana pencerenin sonlandığını görmelisiniz. Uygulamaya
ilişkin kaynak kod dosyasını buradan indirebilirsiniz.
2.
EnumWindows Fonksiyonunun Kullanımı :
Şimdi EnumWindows
fonksiyonunun kullanımına geçelim. Bu fonksiyon, tanımında da verdiğimiz gibi,
sadece ana pencereler üzerinde dolaşır. Örnek olarak oluşturacağımız uygulamada,
birden fazla sayıda ana pencere oluşturalım. Bu ana pencereler için EnumWindows
fonksiyonunu çağırarak pencere başlıklarını değiştirelim. Pencere başlıklarını
değiştirmek için SetWindowText API fonksiyonunu kullanacağız. Bu fonksiyon,
pencerenin tutamaç değerini ve yeni başlık metnini parametre değişkeni olarak
alır; pencereye WM_SETTEXT mesajının gönderilmesini sağlayarak başlığını değiştirir.
Pencereler üzerine farenin sol tuşu ile tıklandığı zaman yazacağımız fonksiyonun
çağrılmasını sağlayacağız. WinMain fonksiyonu içerisinde aynı pencere sınıfından
üç tane ayrı ana pencere yarattık. Şimdi bu pencereler için oluşturduğumuz pencere
fonksiyonunu ve EnumWindows fonksiyonunun kullanımını inceleyelim :
//...
BOOL CALLBACK EnumProc(HWND hWnd,LPARAM lParam);
void OnLButtonDown(HWND hWnd);
//...
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
   
switch(message) {
       case WM_LBUTTONDOWN :
          OnLButtonDown(hWnd);
          break;
       case WM_DESTROY
:
          PostQuitMessage(0);
          break;
       default
:
          return DefWindowProc(hWnd,message,wParam,lParam);
       }
       return 0;
}
BOOL CALLBACK
EnumProc(HWND hWnd,LPARAM lParam)
{
       SetWindowText(hWnd,lParam);
       return TRUE;
}
void OnLButtonDown(HWND
hWnd)
{
    char *pStr = "Yeni Başlık Metni";
    EnumWindows(EnumProc,pStr);
}
|
Pencere fonksiyonunda
farenin sol tuşuna basıldığına ilişkin mesaj alınması durumunda, OnLButtonDown
fonksiyonunun çağrılmasını sağladık. OnLButtonDown fonksiyonunda ise EnumWindows
API fonksiyonunu çağırıyoruz. Bu fonksiyon, tanımında da verdiğimiz üzere, bulunan
her ana pencere için çağrılacak bir fonksiyonun adresini ve LPARAM türündeki
bir değeri parametre değişkeni olarak alıyordu. Bu LPARAM türündeki değeri,
pencerelere atanacak yeni başlık metnini tutmak için kullandık. Bulunan her
ana pencere için çağrılan EnumProc fonksiyonunda SetWindowText fonksiyonunu
çağırarak pencerelerin başlık metinlerinin değiştirilmesini sağladık. Uygulamamızı
çalıştırdığımızda karşımıza üç tane ana pencere çıkacaktır. Bu pencerelerden
herhangi birisinin üzerine farenin sol tuşu ile tıkladığımızda üç penceremiz
de EnumWindows fonksiyonu tarafından tespit edilecek ve başlık metinleri değiştirilecektir.
Bunun yanısıra o an bilgisayarımızda çalışır halde bulunan tüm ana pencerelerin
de başlık metinleri değiştirilecektir. Uygulamaya ilişkin kaynak kod dosyasını
buradan indirebilirsiniz.
3.
EnumChildWindows Fonksiyonunun Kullanımı :
EnumWindows API
fonksiyonu sadece ana pencereler üzerinde dolaşmamızı sağlıyordu. Peki bize
alt pencereler de gerekli olursa hangi fonksiyonu kullanmalıyız? İşte EnumChildWindows
fonksiyonu da alt pencereler üzerinde dolaşmamızı sağlar. Bu fonksiyonu da yine
küçük bir uygulama oluşturarak inceleyelim. Bu uygulamada, altlık olarak kullandığımız
uygulamada olduğu gibi bir ana pencere ve bu ana pencereye ait iki alt pencere
oluşturacağız. Ana pencere üzerinde iken, farenin sol tuşuna basıldığında EnumChildWindows
API fonksiyonunu çağırarak, bu ana pencereye ilişkin tüm alt pencereler için
Kendi yazdığımız bir fonksiyonun çağrılmasını sağlayacağız. Bu fonksiyonda da,
alt pencerelerin kapatılması için onlara WM_CLOSE mesajını PostMessage API fonksiyonu
ile göndereceğiz. Uygulamamızın WinMain fonksiyonu içerisinde bir ana pencere
ve bu ana pencereye ilişkin iki alt pencere oluşturduk. Şimdi ana pencere ve
alt pencereler için pencere fonksiyonlarını yazalım :
//...
BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam);
void OnLButtonDown(HWND hWnd);
//...
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HWND hWndChild1, hWndChild2;
    switch(message)
{
       case WM_CREATE :
          hWndChild1 = CreateWindow("ChildWindows","ALT PENCERE 1",
                                                  WS_CHILDWINDOW | WS_CAPTION
                                                  | WS_SYSMENU,
                                                  100,100,200,300,
                                                  hWnd,
                                                  (HMENU)ID_CHILD1,
                                                  ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild1)
             return -1;
          EnableWindow(hWndChild1,TRUE);
          ShowWindow(hWndChild1,SW_SHOW);
          hWndChild2
= CreateWindow("ChildWindows","ALT PENCERE 2",
                                               WS_CHILDWINDOW | WS_CAPTION
                                               | WS_SYSMENU,
                                               400,100,200,300,
                                               hWnd,
                                               (HMENU)ID_CHILD2,
                                               ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild2)
             return -1;
          EnableWindow(hWndChild2,TRUE);
          ShowWindow(hWndChild2,SW_SHOW);
          break;
       case WM_LBUTTONDOWN
:
          OnLButtonDown(hWnd,0);
          break;
       case WM_DESTROY
:
          PostQuitMessage(0);
          break;
       default
:
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
LRESULT CALLBACK
WndChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
{
       default :
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
BOOL CALLBACK
EnumChildProc(HWND hWnd,LPARAM lParam)
{
    MessageBox(NULL,"Alt Pencereler Kapatılıyor","Bilgi Mesajı",MB_OK);
    PostMessage(hWnd,WM_CLOSE,0,0);
}
void OnLButtonDown(HWND
hWnd,LPARAM lParam)
{
    EnumChildWindows(g_hWnd,EnumChildProc,0);
}
|
Ana penceremize
ilişkin alt pencereleri, ana penceremiz yaratıldığı anda oluşan WM_CREATE mesajı
alındığı zaman oluşturduk. Ana penceremizin pencere fonksiyonunda, ’WM_LBUTTONDOWN’
mesajının alınması, ana pencere üzerinde farenin sol tuşuna tıklanmasıyla gerçekleşecektir.
Bu mesaj alındığı zaman ’OnLButtonDown’ fonksiyonunun çağrılmasını sağladık.
OnLButtonDown fonksiyonunda ise EnumChildWindows fonksiyonunu çağırdık. Bu çağrı
ile, sistem fonksiyonun ilk parametresinde tutamaç değerini verdiğimiz ana pencere
ait tüm alt pencereleri dolaşacak ve bulduğu alt pencereler için fonksiyonun
ikinci parametresinde adresini verdiğimiz fonksiyonun çağrılmasını sağlayacaktır.
Çağrılan bu fonksiyonda da, önce kullanıcıya alt pencerelerin kapatılacağına
ilişkin bir bilgi mesajı veriyoruz, ardından PostMessage ile pencerelere WM_CLOSE
mesajı göndererek kapatılmalarını sağlıyoruz. Uygulamayı çalıştırdıktan sonra,
ana pencere üzerinde farenin sol tuşuna bastığımız zaman her bir alt pencere
için bir bilgi mesajı alacağız, ve pencerenin kapatıldığını göreceğiz. Uygulamaya
ilişkin kaynak kod dosyasını buradan indirebilirsiniz.
4.
GetNextWindow ve GetTopWindow Fonksiyonlarının Kullanımı :
Şimdi GetNextWindow
ve GetTopWindow API fonksiyonlarının kullanımını inceleyelim. Bunun için yapacağımız
uygulamada, bir ana pencere ve bu ana pencereye ait iki tane alt pencere oluşturduk.
Ana pencerenin üzerinde farenin sol tuşuna tıklandığında önce Z sırasında en
üstte yer alan pencereyi GetTopWindow API fonksiyonu ile araştırdık ve başlığını
değiştirdik. Ardından Z sırasında, ikinci sırada oluşturduğumuz alt pencereden
bir sonra ve bir önce yer alan pencereleri GetNextWindow API fonksiyonu ile
arayarak başlıklarını değiştirdik. Şimdi bu uygulamamızın pencere fonksiyonunu
ve GetNextWindow fonksiyonunun kullanımını görelim :
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HWND hWndChild1, hWndChild2, hWndChild3;
    switch(message)
{
       case WM_CREATE :
          hWndChild1 = CreateWindow("ChildWindows","ALT PENCERE 1",
                                                  WS_CHILDWINDOW | WS_CAPTION
                                                  | WS_SYSMENU,
                                                  10,100,200,300,
                                                  hWnd,
                                                  (HMENU)ID_CHILD1,
                                                  ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild1)
             return -1;
          EnableWindow(hWndChild1,TRUE);
          ShowWindow(hWndChild1,SW_SHOW);
          hWndChild2
= CreateWindow("ChildWindows","ALT PENCERE 2",
                                                  WS_CHILDWINDOW | WS_CAPTION
                                                  | WS_SYSMENU,
                                                  300,100,200,300,
                                                  hWnd,
                                                  (HMENU)ID_CHILD2,
                                                  ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild2)
             return -1;
          g_hWndChild = hWndChild2;
          EnableWindow(hWndChild2,TRUE);
          ShowWindow(hWndChild2,SW_SHOW);
          hWndChild3
= CreateWindow("ChildWindows","ALT PENCERE 3",
                                                  WS_CHILDWINDOW | WS_CAPTION
                                                  | WS_SYSMENU,
                                                  600,100,200,300,
                                                  hWnd,
                                                  (HMENU)ID_CHILD3,
                                                  ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild3)
             return -1;
          EnableWindow(hWndChild3,TRUE);
          ShowWindow(hWndChild3,SW_SHOW);
          break;
       case WM_LBUTTONDOWN
:
          OnLButtonDown(hWnd,0);
          break;
       case WM_DESTROY
:
          PostQuitMessage(0);
          break;
       default
:
             return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
LRESULT CALLBACK
WndChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
{
       default :
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
void OnLButtonDown(HWND
hWnd,LPARAM lParam)
{
    HWND hWndFound1, hWndFound2, hWndFoundTop;
   
MessageBox(NULL,"Z sırasında en üstte yer alan pencere aranıyor.","Bilgi
Mesajı",MB_OK);
    hWndFoundTop = GetTopWindow(g_hWnd);
    SetWindowText(hWndFoundTop,"En Üst Sırada Yer Alan
Pencere Bulundu!");
   
MessageBox(NULL,"Bir önceki pencere aranıyor","Bilgi Mesajı",MB_OK);
    hWndFound1 = GetNextWindow(g_hWndChild,GW_HWNDPREV);
    SetWindowText(hWndFound1,"Bir Önceki Pencere Bulundu!");
    MessageBox(NULL,"Bir
sonraki pencere aranıyor","Bilgi Mesajı",MB_OK);
    hWndFound2 = GetNextWindow(g_hWndChild,GW_HWNDNEXT);
    SetWindowText(hWndFound2,"Bir Sonraki Pencere Bulundu!");
}
|
WndProc pencere
fonksiyonu içerisinde, kuyruktan WM_CREATE mesajı alındığı durumda, ana pencereye
ilişkin üç tane alt pencere oluşturduk. GetNextWindow fonksiyonunu çağıracağımız
yerde bu pencerelerden birisinin tutamaç değerine ihtiyacımız olacak. İşte biz
de ikinci alt pencerenin tutamaç değerini HWND türünden global bir nesnede sakladık.
Ana pencere üzerinde farenin sol tuşuna basıldığında OnLButtonDown isimli fonksiyonun
çağrılmasını istediğimizi belirttik. Alt pencerelere ilişkin pencere fonksiyonunda
özel herhangi bir işleme ihtiyacımız yok. OnLButtonDown fonksiyonunda ise kullanıcıya
bilgi mesajları vererek, Z sırasında en üstte yer alan pencere ile, global g_hWndChild
nesnesinde tutamaç değerini sakladığımız pencerenin bir öncesinde ve sonrasında
yer alan pencereleri araştırdık. GetNextWindow ve GetTopWindow API fonksiyonları,
aranan pencerenin bulunması durumunda bu pencerelere ilişkin tutamaç değerlerini,
bulunamaması durumunda ise NULL değerini döndürürler. Burada fonksiyonlardan
geri dönen değerleri kontrol etmenizde fayda var. Fonksiyonların bize vermiş
olduğu bu tutamaç değerlerini SetWindowText API fonksiyonuna geçerek bulunan
pencerelerin başlıklarını değiştirdik. Uygulamaya ilişkin kaynak kod dosyasını
buradan indirebilirsiniz.
5.
GetActiveWindow ve GetWindow Fonksiyonlarının Kullanımı :
Son olarak, GetActiveWindow
ve GetWindow API fonksiyonlarını inceleyelim. Bunun için yapacağımız uygulamada,
yine bir ana pencere ve bu ana pencereye ilişkin iki tane alt pencere oluşturduk.
Ana pencere üzerinde farenin sol tuşuna basıldığında önce, o an aktif olan pencereyi
sonra da ana pencereye ilişkin alt pencereyi araştırarak başlıklarını SetWindowText
API fonksiyonu ile değiştirdik. Şimdi pencere fonksiyonumuzu ve API fonksiyonlarının
kullanımını inceleyelim :
LRESULT CALLBACK
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HWND hWndChild1, hWndChild2;
    switch(message)
{
       case WM_CREATE :
          hWndChild1 = CreateWindow("ChildWindows","ALT PENCERE 1",
                                                  WS_CHILDWINDOW | WS_CAPTION
                                                  | WS_SYSMENU,
                                                  10,100,200,300,
                                                  hWnd,
                                                  (HMENU)ID_CHILD1,
                                                  ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild1)
             return -1;
          EnableWindow(hWndChild1,TRUE);
          ShowWindow(hWndChild1,SW_SHOW);
          hWndChild2
= CreateWindow("ChildWindows","ALT PENCERE 2",
                                                  WS_CHILDWINDOW | WS_CAPTION
                                                  | WS_SYSMENU,
                                                  300,100,200,300,
                                                  hWnd,
                                                  (HMENU)ID_CHILD2,
                                                  ((LPCREATESTRUCT)lParam)->hInstance,NULL);
          if (!hWndChild2)
             return -1;
          EnableWindow(hWndChild2,TRUE);
          ShowWindow(hWndChild2,SW_SHOW);
          break;
       case WM_LBUTTONDOWN
:
          OnLButtonDown(hWnd,0);
          break;
       case WM_DESTROY
:
          PostQuitMessage(0);
          break;
       default
:
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
LRESULT CALLBACK
WndChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
{
       default :
          return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}
void OnLButtonDown(HWND
hWnd,LPARAM lParam)
{
    HWND hWndFound, hWndActive;
    MessageBox(NULL,"Aktif
Pencere Aranıyor","Bilgi Mesajı",MB_OK);
    hWndActive = GetActiveWindow();
    SetWindowText(hWndActive,"AKTİF PENCERE");
    MessageBox(NULL,"Ana
Pencereye Ait Alt Pencere Aranıyor","Bilgi Mesajı",MB_OK);
    hWndFound = GetWindow(g_hWnd,GW_CHILD);
    SetWindowText(hWndFound,"Ana Pencerenin Alt Penceresi");
}
|
Ana penceremizin
pencere fonksiyonu içerisinde bu pencereye ilişkin iki tane alt pencere oluşturduk.
Ana pencere üzerinde farenin sol tuşuna basıldığında kendi yazdığımız OnLButtonDown
fonksiyonunun çağrılmasını sağladık. Bu fonksiyonda, önce çalışan uygulamaya
ilişkin aktif pencereyi, sonra da uygulamanın ana penceresinin alt penceresini
araştırdık ve bulduğumuz pencerelerin başlıklarını değiştirdik. Bize aktif pencerenin
tutamaç değerini döndüren GetActiveWindow API fonksiyonunun parametre değişkeni
yok. Bu fonksiyonun bize verdiği tutamaç değerini SetWindowText API fonksiyonuna
geçerek başlık yazısının değiştirilmesini sağladık. Daha sonra uygulamamızın
ana penceresinin alt penceresini araştırmak üzere GetWindow API fonksiyonunu
g_hWnd tutamaç değeri ve GW_CHILD sembolik sabiti ile çağırdık. Bu çağrı sonucunda
bize, ana penceremize ait alt pencere dönecektir. Sistem birden fazla pencere
bulunması durumunda (örneğin bu uygulamamızda) ilk bulduğu pencerenin tutamaç
değerini döndürür. Bu değeri de SetWindowText API fonksiyonuna geçerek başlık
yazısının değiştirilmesini sağladık. Bu fonksiyonların bize vermiş olduğu tutamaç
değerlerinin de NULL değer olup olmadığı mutlaka test edilmelidir. Uygulamaya
ilişkin kaynak kod dosyasını buradan indirebilirsiniz.
Önümüzdeki yazılarda
pencereler üzerinde işlem yapan API fonksiyonlarını incelemeye devam edeceğiz.
Mutlu günler dilerim. (Örnek uygulamalar Visual Studio .Net 2003’te hazırlanmıştır.)
KAYNAKLAR
- Win32 Programlama
Yardım Sayfaları
Makale:
Windows API - Pencerelerle İlgili İşlem Yapan API Fonksiyonları - 1 C ve Sistem Programlama Çiğdem Çavdaroğlu
|