Windows API

İlk WinAPI Programı

Bir önceki bölümde temel bir WinAPI programı oluşturmuş ve çalıştırarak ekranda bir pencere açılmasını görmüştük. Sadece turuncu renk ile gösterilen yerleri değiştirilmiş veya eklenmiş program kodları aşağıda yer almaktadır.

#include <windows.h>

/* Windows fonksiyon bildirimi yapar */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Sınıf adını global bir değişkene atar */
char szClassName[ ] = "WinAPIWindowsApp";
/* HINSTANCE cinsinden global bir değişken bildirimi */
HINSTANCE ghInst;

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    HWND hwndMain;           /* Program penceresine ait Handle */
    MSG messages;            /* Programa gönderilen mesajların kaydedildiği yer */
    WNDCLASSEX wincl;        /* Pencere değerlerini içeren yapı */

    /* Programın bellekteki halinin Handle değeri global bir değişkene atanır */
    ghInst = hThisInstance;
	
    /* Pencere yapısına değer atama */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* Bu fonksiyon Windows tarafından çağrılır */
    wincl.style = CS_DBLCLKS;            /* Çift tıklamaları algılar */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Aktif ikon ve fare göstergesini kullanır */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL; /* Menü olmadığını gösterir */
    wincl.cbClsExtra = 0; /* Pencere sınıfından sonra ekstra byte olmadığını gösterir */
    wincl.cbWndExtra = 0; /* Yapı veya pencerenin instance değeri */
    /* Pencerenin arka planı için Windows geçerli rengini kullanır */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Pencere sınıfını kaydeder, hata oluşursa program sona erer */
    if (!RegisterClassEx (&wincl)) return 0;

    /* Sınıf kaydolmuştur, program oluşturulur */
    hwndMain = CreateWindowEx (
           0,                   /* Değişik uygulamalar için ek olanaklar */
           szClassName,         /* Sınıf adı */
           "WinAPI Temel Program",       /* Program başlığı */
           WS_OVERLAPPEDWINDOW, /* aktif pencere */
           CW_USEDEFAULT,       /* Konumu Windows belirler */
           CW_USEDEFAULT,       /* Pencerenin ekranda sona erdiği yer */
           544,                 /* Program pencere genişliği */
           375,                 /* Program pencere yüksekliği */
           HWND_DESKTOP,        /* Program penceresi masaüstü altında yer alır */
           NULL,                /* Menü olmadığını gösterir */
           hThisInstance,       /* Programın Instance Handle değeri */
           NULL                 /* Pencere oluşturma bilgisi yok */
           );

    /* Pencere oluşturmada problem olursa programı sona erdirir. */
    if (!hwndMain) return 0;
		   
    /* Pencerenin ekranda görünmesini sağlar. */
    ShowWindow (hwndMain, nCmdShow);
    /* Pencereyi günceller */    
    UpdateWindow(hwndMain);

    /* Message döngüsünü çalıştırır. GetMessage() 0 değeri verene kadar devam eder.*/
    while (GetMessage (&messages, NULL, 0, 0) > 0)
    {
        /* Sanal tuş mesajlarını karakter mesajlarına çevirir. */
        TranslateMessage(&messages);
        /* Mesajları WindowProcedure() fonksiyonuna gönderir. */
        DispatchMessage(&messages);
    }	
	
    /* Program dönüş değeri 0'dır - Bu değeri PostQuitMessage() verir. */
    return messages.wParam;
}

/* Bu fonksiyon Windows'un DispatchMessage() fonksiyonu tarafından çağrılır. */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* Mesajlara gerekli işlemi yapar. */
    {
        case WM_DESTROY:
            PostQuitMessage (0);      /* WM_QUIT değerini mesaj kuyruğuna gönderir */
            break;
        default:                      /* İşlem yapmadığımız mesajlar için */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Şimdi, programı oluşturan kodları sırasıyla açıklamaya çalışalım:

Global Bidirimler

Program ilk çalıştığında, ilk üç satırın sıra ile <windows.h> dosyası programa dahil edilir, mesajlara işlem yapan fonksiyonun bildirimi yapılır ve sınıf adı global char bir diziye atanır:

#include <windows.h>

/* Windows fonksiyon bildirimi yapar */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Sınıf adını global bir değişkene atar */
char szClassName[ ] = "WinAPIWindowsApp";
/* HINSTANCE cinsinden global bir değişken bildirimi */
HINSTANCE ghInst;

#include <windows.h>

<windows.h> ana başlık dosyasını programa dahil eder. <windows.h> ana başlık dosyası içinde tanımlı tüm başlık dosyalarının programa dahil edilmesini sağlar.

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

Programa gönderilen mesajların işlem görmesi için çağrılan fonksiyonun bildirimini yapar.

char szClassName[ ] = "WinAPIWindowsApp";

Sınıf adını char veri türünden global bir diziye atar.

HINSTANCE ghInst;

HINSTANCE veri türünden global bir değişken bildirimi yapar.

WinMain() Fonksiyonu

Program çalışır çalışmaz WinMain() fonksiyonu devreye girer ve uygulama burada başlar. WinMain() fonksiyonu, DOS (Disk Operating Sistem) ortamında C programlama dili ile geliştirilen konsol programlarındaki main() fonksiyonu ile aynı işlemi gerçekleştirir. WinMain() fonksiyonu int bir değer geri döndürür.

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)

WINAPI

windef.h dosyası içinde #define WINAPI __stdcall şeklinde tanımlanan WINAPI makrosu WinMain() fonksiyonunun __stdcall şeklinde çağrılacağını gösterir. Bu çağrı şekli derleyicinin fonksiyon argümanlarını stack'e ne şekilde koyup alacağı ve sileceği ile bir dönüş değeri alması ile ilgili kuralları belirler. __stdcall yöntemi Win32 API fonksiyonlarını çağırmak için kullanılır.

HINSTANCE hInstance

Program .exe dosyasının bellekteki halinin Handle (*)'ı. hInstance değeri kaynakları yükleme ve diğer işlemleri gerçekleştirmek için kullanılır.

HINSTANCE hPrevInstance

Win32 program için daima NULL bir değerdir. hPrevInstance, Win16 sistemlerde programın çalışan önceki hali için bir Handle olarak kullanılır.

LPSTR lpCmdLine

Tek bir karakter dizisi halinde verilen, programın adı hariç olmak üzere, komut satırı argümanlarıdır. C programlama diline ek olarak Microsoft için tanımlanmış özel veri türlerinden bir tanesi de LPSTR verisidir. Bu veri winnt.h dosyasında typedef CHAR *LPSTR şeklinde tanımlanmıştır. Windows veri türlerine Windows veri türleri adresinden ulaşabilirsiniz.

int nCmdShow

ShowWindow() fonksiyonuna geçirilebilecek integer bir değer gösterir.

* HANDLE: winnt.h dosyasında typedef PVOID HANDLE şeklinde tanımlanmış bir değerdir.

WinMain() Fonksiyonu Değişken Bildirimleri

WinMain() fonksiyonunun ilk üç satırında sıra ile program penceresine ait bir Handle, mesajları kaydetmek için bir yapı ve pencere değerleri bir yapı bildirimi yapılır:

HWND hwndMain;     /* Program penceresine ait Handle */
MSG messages;      /* Programa gönderilen mesajların kaydedildiği yer */
WNDCLASSEX wincl;  /* Pencere değerlerini içeren yapı */

HWND hwndMain

windef.h dosyası içinde tanımlanmış olan pencere Handle değeridir.

MSG messages

winuser.h dosyası içinde aşağıdaki şekilde tanımlanmış olan bir yapıdır:

typedef struct tagMSG {
	HWND hwnd;      
	UINT message;   
	WPARAM wParam;  
	LPARAM lParam;  
	DWORD time;     
	POINT pt;       
} MSG;

HWND hwnd

Pencere fonksiyonu mesajı alan pencerenin Handle değeri. Bir Thread mesajı olduğunda bu eleman NULL bir değer alır.

UINT message

Sadece düşük WORD değeri kullanılan mesaj tanımlayıcısı (Yüksek WORD sistem tahsisli). UINT veri türü, windef.h dosyasında tanımlı, 0-4294967295 arasındaki tamsayıları kapsayan 32 bit genişliğinde unsigned int bir değerdir.

WPARAM wParam

message elemanına bağlı olarak mesaj hakkında ek bilgi içerir. WPARAM veri türü, windef.h dosyasında typedef UINT_PTR WPARAM şeklinde tanımlanmış bir değerdir. UINT_PTR veri türü ise, basetsd.h dosyasında typedef unsigned int UINT_PTR şeklinde tanımlanmış bir değerdir.

LPARAM lParam

message elemanına bağlı olarak mesaj hakkında ek bilgi içerir. LPARAM veri türü, windef.h dosyasında typedef LONG_PTR LPARAM şeklinde tanımlanmış bir değerdir. LONG_PTR veri türü ise, basetsd.h dosyasında typedef long LONG_PTR şeklinde tanımlanmış bir değerdir.

DWORD time

Mesajın gönderildiği zamanı gösterir. DWORD veri türü, windef.h dosyasında typedef LONG_PTR LPARAM şeklinde tanımlı 0-4294967295 arasındaki tamsayıları kapsayan 32 bit genişliğinde unsigned int bir değerdir.

POINT pt

Mesaj gönderildiği andaki kursor pozisyonunu gösterir. POINT veri türü, içinde LONG x ve LONG y olmak üzere iki long değer bulunan bir yapıdır:

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT;

WNDCLASSEX wincl

winuser.h dosyası içinde aşağıdaki şekilde tanımlanmış olan bir yapıdır:

typedef struct _WNDCLASSEXA {
	UINT cbSize;
	UINT style;
	WNDPROC lpfnWndProc;
	int cbClsExtra;
	int cbWndExtra;
	HINSTANCE hInstance;
	HICON hIcon;
	HCURSOR hCursor;
	HBRUSH hbrBackground;
	LPCSTR lpszMenuName;
	LPCSTR lpszClassName;
	HICON hIconSm;
} WNDCLASSEXA;

typedef WNDCLASSEXA WNDCLASSEX;

Pencere Sınıf Yapısına Değer Atama ve Sınıf Yapısının Kaydedilmesi

WinMain() fonksiyonunda bildirimler yapıldıktan sonra, oluşturacağımız program penceresinin özelliklerini belirleyen pencere yapısı değerleri verilir ve pencere yapı sınıfının kaydı yapılır. Eğer kayıt işleminde herhangi bir hata meydana gelirse program sona erer:

ghInst = hThisInstance;

/* Pencere yapısına değer atama */
wincl.hInstance = hThisInstance;    /* Program .exe dosyasının bellekteki kopyası */
wincl.lpszClassName = szClassName;  /* Global char dizideki sınıf adı kopyalanır */
wincl.lpfnWndProc = WindowProcedure;/* Bu fonksiyon Windows tarafından çağrılır */
wincl.style = CS_DBLCLKS;           /* Çift tıklamaları algılar */
wincl.cbSize = sizeof (WNDCLASSEX); /* Pencere sınıfı boyutu aktarılır */

/* Aktif ikon ve fare göstergesini kullanır */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* Menü olmadığını gösterir */
wincl.cbClsExtra = 0; /* Pencere sınıfından sonra ekstra byte olmadığını gösterir */
wincl.cbWndExtra = 0; /* Yapı veya pencerenin instance değeri */
/* Pencerenin arka planı için Windows geçerli rengini kullanır */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Pencere sınıfını kaydeder, hata oluşursa program sona erer */
if (!RegisterClassEx (&wincl)) return 0;

UINT cbSize

Yapının byte olarak değerini gösterir. sizeof (WNDCLASSEX) ile değer atanır.

UINT style

Sınıf tipleri pencere sınıfı için ek özellikler sağlar. İki veya daha fazla sınıf tipi OR (|) bit işlemcisi ile birlikte tanımlanabilir. CS_ ifadesi ile başlayan sınıf tipi makroları winuser.h dosyası içinde tanımlanmıştır.

WNDPROC lpfnWndProc

Program pencere fonksiyonunu gösteren bir işaretçidir.

int cbClsExtra

Pencere sınıfından sonra tahsis edilecek ekstra byte miktarını gösterir. Sistem ayrılan byte'lara ilk değer olarak sıfır değeri verir.

int cbWndExtra

Pencere instance sonrası tahsis edilecek ekstra byte miktarını gösterir. Sistem ayrılan byte'lara ilk değer olarak sıfır değeri verir. Eğer bir uygulama kaynak dosya içinde CLASS direktifi kullanarak oluşturduğu bir diyalog kutusunu kaydetmek için WNDCLASSEX kullanırsa, bu elemana DLGWINDOWEXTRA değerini vermelidir.

HINSTANCE hInstance

Program .exe dosyasının bellekteki kopyasını gösteren bir Handle değerdir. Bu değer WinMain() fonksiyonuna geçirilen ilk argümandır. HINSTANCE veri türü, windef.h dosyasında typedef HANDLE HINSTANCE şeklinde tanımlanmış bir değerdir.

HICON hIcon

Program ikonunu gösteren bir Handle değerdir. Bu elemana NULL bir değer atandığında, sistem aktif ikonu atar. HICON veri türü, windef.h dosyasında typedef HANDLE HICON şeklinde tanımlanmış bir değerdir.

HCURSOR hCursor

Program kursor'ını gösten bir Handle değerdir. Bu elemana NULL bir değer atandığında, uygulama, fare uygulama penceresi içine girdiğinde kursor şeklini belirlemlidir. HCURSOR veri türü, windef.h dosyasında typedef HICON HCURSOR şeklinde tanımlanmış bir değerdir.

HBRUSH hbrBackground

Program pencere rengini belirleyen fırça rengini gösteren bir Handle değerdir. HBRUSH veri türü, windef.h dosyasında typedef HANDLE HBRUSH şeklinde tanımlanmış bir değerdir.

LPCTSTR lpszMenuName

Program ile kullanılacak kaynak dosyasında yer alan menü adını gösterir. LPCTSTR veri türü, winnt.h dosyasında typedef LPCSTR LPCTSTR şeklinde tanımlanmış bir değerdir. LPCSTR veri türü ise, winnt.h dosyasında typedef CONST CHAR *LPCSTR şeklinde tanımlanmış bir değerdir.

LPCTSTR lpszClassName

Program sınıf adını gösterir.

HICON hIconSm

Program için kullanılan küçük ikonu gösteren bir Handle değerdir.

Pencere yapısının değerleri atandıktan sonra, CreateWindowEx() fonksiyonu ile penceremizi oluşturmak için öncelikle RegisterClassEx() fonksiyonunu kullanarak pencere yapısını kaydetmemiz gerekir. Eğer bu fonksiyon bir hata verirse, program sıfır değeri geri vererek çalışmasını sona erdirir.

Program Penceresinin Oluşturulması ve Ekranda Gösterilmesi

WinMain() fonksiyonunda bildirimler yapıldıktan sonra, pencere yapısı değerleri verilir ve pencere yapı sınıfının kaydı yapılır. Eğer kayıt işleminde herhangi bir hata meydana gelirse program sona erer:

/* Sınıf kaydolmuştur, program oluşturulur */
hwnd = CreateWindowEx (
           0,                   /* Değişik uygulamalar için ek olanaklar */
           szClassName,         /* Sınıf adı */
           "WinAPI Temel Program",       /* Program başlığı */
           WS_OVERLAPPEDWINDOW, /* aktif pencere */
           CW_USEDEFAULT,       /* Konumu Windows belirler */
           CW_USEDEFAULT,       /* Pencerenin ekranda sona erdiği yer */
           544,                 /* Program pencere genişliği */
           375,                 /* Program pencere yüksekliği */
           HWND_DESKTOP,        /* Program penceresi masaüstü altında yer alır */
           NULL,                /* Menü olmadığını gösterir */
           hThisInstance,       /* Programın Instance Handle değeri */
           NULL                 /* Pencere oluşturma bilgisi yok */
       );

/* Pencere oluşturmada problem olursa programı sona erdirir. */
if (!hwndMain) return 0;
		   
/* Pencerenin ekranda görünmesini sağlar. */
ShowWindow (hwndMain, nCmdShow);
/* Pencereyi günceller */
UpdateWindow(hwndMain);
HWND WINAPI CreateWindowEx(
   DWORD dwExStyle,
   LPCTSTR lpClassName,
   LPCTSTR lpWindowName,
   DWORD dwStyle,
   int x,
   int y,
   int nWidth,
   int nHeight,
   HWND hWndParent,
   HMENU hMenu,
   HINSTANCE hInstance,
   LPVOID lpParam
);

DWORD dwExStyle

Oluşturulacak pencere için tanımlanan ek özellikleri belirler. WS_EX_ ifadesi ile başlayan makrolar winuser.h dosyası içinde tanımlanmıştır.

LPCTSTR lpClassName

RegisterClassEx() fonksiyonu ile kaydedilen pencere yapı adını gösterir.

LPCTSTR lpWindowName

Program penceresi başlık çubuğunda yer alan başlığı gösterir.

DWORD dwStyle

Oluşturulacak pencerenin özellikleri belirler. WS_ ifadesi ile başlayan makrolar winuser.h dosyası içinde tanımlanmış olup bu değerleri birleştirerek kullanabilirsiniz. Ayrıca, lpClassName elemanının alacağı değerlere bağlı olarak yine aynı dosya içinde yer alan farklı makrolar da kullanabilirsiniz.

int x

Program penceresinin ilk yatay konumunu belirler. Bir başlık çubuğu, pencere menüsü, boyutlandırma sınır çizgisi, küçültme ve büyütme butonları içeren bir program penceresi (WS_OVERLAPPEDWINDOW) veya pop-up bir pencere için ekran üzerinde pencerenin sol üst köşesinin x koordinatını belirler. Eğer pencere bir alt (child) pencere ise, ana pencerenin sol üst köşesine göre alt pencerenin sol üst köşesinin x koordinatını belirler. Eğer x CW_USEDEFAULT değerine ayarlanırsa, pencerenin sol üst köşesi için sistemin mevcut konum değerini alır ve y parametresini dikkate almaz. CW_USEDEFAULT değeri sadece WS_OVERLAPPEDWINDOW pencere için geçerlidir. pop-up veya alt pencereler için, x ve y parametreleri sıfır değerine ayarlanır.

int y

Program penceresinin ilk dikey konumunu belirler. Bir başlık çubuğu, pencere menüsü, boyutlandırma sınır çizgisi, küçültme ve büyütme butonları içeren bir program penceresi (WS_OVERLAPPEDWINDOW) veya pop-up bir pencere için ekran üzerinde pencerenin sol üst köşesinin y koordinatını belirler. Eğer pencere bir alt (child) pencere ise, ana pencerenin sol üst köşesine göre alt pencerenin sol üst köşesinin y koordinatını belirler. Eğer WS_OVERLAPPEDWINDOW pencere WS_VISIBLE özelliği ile ayarlanırsa ve x CW_USEDEFAULT değerine ayarlanırsa, pencerenin ne şekilde görüntüleneceğini y parametresi belirler. Eğer y CW_USEDEFAULT değerine ayarlanırsa, pencere oluşturulduktan sonra, pencere yöneticisi ShowWindow() fonksiyonunu SW_SHOW değeri ile çağırır. Eğer y parametresi farklı bir değer alırsa, pencere yöneticisi ShowWindow() fonksiyonunu nCmdShow parametre değerine göre çağırır.

int nWidth

Program penceresinin genişliğini belirler. WS_OVERLAPPEDWINDOW pencereler için bir genişlik veya CW_USEDEFAULT değeri içerir. ekran üzerinde pencerenin sol üst köşesinin x koordinatını belirler. Eğer pencere bir alt (child) pencere ise, ana pencerenin sol üst köşesine göre alt pencerenin sol üst köşesinin x koordinatını belirler. Eğer x CW_USEDEFAULT değerine ayarlanırsa, pencerenin sol üst köşesi için sistemin mevcut konum değerini alır ve y parametresini dikkate almaz. CW_USEDEFAULT değeri sadece WS_OVERLAPPEDWINDOW pencere için geçerlidir. pop-up veya alt pencereler için, nWidth ve nHeight parametreleri sıfır değerine ayarlanır.

int nHeight

Program penceresinin yüksekliğini belirler. Eğer nWidth parametresi CW_USEDEFAULT değerine ayarlanırsa, sistem nHeight parametresini dikkate almaz.

HWND hWndParent

Oluşturulan program penceresinin ana penceresinin Handle değerini gösterir.

HMENU hMenu

Program ile kullanılacak menüyü tanımlar. HMENU veri türü, windef.h dosyasında typedef HANDLE HMENU şeklinde tanımlanmış bir değerdir.

HINSTANCE hInstance

Pencere ile ilgili programın bellekteki kopyasının Handle değeridir.

LPVOID lpParam

WM_CREATE mesajının lParam parametresi ile temsil edilen CREATESTRUCT yapısı (lpCreateParams member) ile pencereye geçirilen değeri gösteren bir işaretçidir. Ek veriye gerek duyulmadığında NULL bir değer içerir.

typedef struct tagCREATESTRUCT {
  LPVOID    lpCreateParams;
  HINSTANCE hInstance;
  HMENU     hMenu;
  HWND      hwndParent;
  int       cy;
  int       cx;
  int       y;
  int       x;
  LONG      style;
  LPCTSTR   lpszName;
  LPCTSTR   lpszClass;
  DWORD     dwExStyle;
} CREATESTRUCT;

Penceremizi CreateWindowEx() fonksiyonu ile oluşturduktan sonra ShowWindow() fonksiyonu ile ekranda gösteririz. ShowWindow() fonksiyonu hwnd Handle değerini CreateWindowEx() fonksiyonunun geri verdiği değerden, nCmdShow değerini ise WinMain() fonksiyonunun son parametresinden alır.

Program Ana Döngüsünün Çalışması

Artık programın ana bölümünü oluşturan ve program kapatılmadığı sürece çalışmasına devam eden while döngüsü devreye girer:

/* Message döngüsünü çalıştırır. GetMessage() 0 değeri verene kadar devam eder.*/
while ((GetMessage (&messages, NULL, 0, 0) > 0)
{
    /* Sanal tuş mesajlarını karakter mesajlarına çevirir. */
    TranslateMessage(&messages);
    /* Mesajları WindowProcedure() fonksiyonuna gönderir. */
    DispatchMessage(&messages);
}	
	
/* Program dönüş değeri 0'dır - Bu değeri PostQuitMessage() verir. */
return messages.wParam;

Program artık kullanıcının fareye tıklamak, hareket ettirmek, klavyeden giriş yapmak ve benzeri herhangi bir işlem yapmasını beklemektedir. Bu işlemlerden herhangi biri yapıldığında sistem tarafından bu işleme karşılık gelen bir mesaj oluşturulur ve programın mesaj kuyruğuna eklenir. Bu durumda while döngüsü ile sürekli olarak çalışmasına devam etmekte olan GetMessage() fonksiyonu kuyrukta bekleyen ilk mesajı kuyruktan alır ve işlem yapmak üzere programa dahil eder. Eğer herhangi bir mesaj yoksa, mesaj gelene kadar bekler.

BOOL WINAPI GetMessage(
  LPMSG lpMsg,
  HWND hWnd,
  UINT wMsgFilterMin,
  UINT wMsgFilterMax
);

LPMSG lpMsg

Mesaj kuyruğundan mesaj bilgisini alan MSG yapısını gösteren bir işaretçidir.

HWND hWnd

Mesajları alınacak pencerenin Handle değeri gösterir. Eğer NULL bir değer alırsa, GetMessage() fonksiyonu hem pencere hem de Thread mesajlarını alır.

UINT wMsgFilterMin

Alınacak en düşük değere sahip mesajın int değerini gösterir. Alınacak mesajları sınırlamak için kullanılır. İlk klavye mesajı için WM_KEYFIRST (0x0100), ilk fare mesajı için WM_MOUSEFIRST (0x0200), sadece WM_INPUT mesajlarını almak için WM_INPUT değerini kullanın. wMsgFilterMin ve wMsgFilterMax parametrelerinin her ikisi birden sıfır değeri alırsa, GetMessage() fonksiyonu filtreleme yapmadan tüm mesajları alır.

UINT wMsgFilterMax

Alınacak en yüksek değere sahip mesajın int değerini gösterir. Alınacak mesajları sınırlamak için kullanılır. Son klavye mesajı için WM_KEYLAST, son fare mesajı için WM_MOUSELAST, sadece WM_INPUT mesajlarını almak için WM_INPUT değerini kullanın. wMsgFilterMin ve wMsgFilterMax parametrelerinin her ikisi birden sıfır değeri alırsa, GetMessage() fonksiyonu filtreleme yapmadan tüm mesajları alır.

Geri dönüş değeri

Eğer GetMessage() fonksiyonu WM_QUIT başka bir mesaj aldığında sıfırdan farklı bir değer geri verir.

Eğer fonksiyon WM_QUIT mesajı alırsa, sıfır değeri geri verir.

Eğer bir hata meydana gelirse, geri verilen değer -1 sayısıdır. Eğer hWnd geçersiz bir pencere Handle'ı veya lpMsg geçersiz bir işaretçi olursa fonksiyon hata verir.

TranslateMessage() sanal tuş mesajlarını karakter mesajlarına çevirir. DispatchMessage() mesajları WindowProcedure() fonksiyonuna gönderir.

Herhangi bir nedenle while döngüsünden çıkılırsa, messages.wParam değeri geri döndürülerek program sona erer.

Program Ana Pencere Mesaj İşlem Fonksiyonu

while döngüsünde GetMessage() fonksiyonu ile alınan mesajlar işlem görmek üzere DispatchMessage() fonksiyonu ile aşağıda gösterilen WindowProcedure() fonksiyonuna gönderilir:

/* Bu fonksiyon Windows'un DispatchMessage() fonksiyonu tarafından çağrılır. */

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch (message)                  /* Mesajlara gerekli işlemi yapar. */
    {
        case WM_DESTROY:
            PostQuitMessage (0);      /* WM_QUIT değerini mesaj kuyruğuna gönderir */
            break;
        default:                      /* İşlem yapmadığımız mesajlar için */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

WindowProcedure() fonksiyonu her mesaj için çağrılır. Herhangi bir mesaja işlem yapılmadığında DefWindowProc() fonksiyonu çağrılır.

WM_DESTROY mesajı geldiğinde PostQuitMessage() fonksiyonu çağrılır. PostQuitMessage() fonksiyonu WM_QUIT mesajını mesaj kuyruğuna gönderir. Bu mesaj GetMessage() foksiyonunun FALSE bir değer geri vermesini sağladığından, while döngüsünün ve programın çalışması sona erer.