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 
             |