Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Çiğdem Çavdaroğlu
Çiğdem Çavdaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
28 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: callback degerini fonksiyon fonksiyonu fonksiyonun fonksiyonunu fonksiyonunun iliskin lparam parametre pencere pencereler pencerenin pencereye return C / Sys Prog. Çiğdem Çavdaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 12.10.2005
Okunma Sayısı : 23915
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 4.10.2022
Turhal Temizer
Mac OS/X Removing CUDA 4.10.2022
Burak Selim Şenyurt
Rust Pratikleri - Value Moved Here 4.10.2022
Burak Selim Şenyurt
Rust Pratikleri - State Tasarım Kalıbı 4.10.2022
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows API - Pencerelerle İlgili İşlem Yapan API Fonksiyonları - 1
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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.
HWND GetWindow (VOID);
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
  • Yazılan Yorumlar
  • Yorum Yaz
NİS
6
2010
merhaba ben zafer sizden open gl hakkında yardım almak istiyorum elimde meteryal olarak çalışma videosu yok yardımcı olabilirmisiniz
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor