A Windows üzenetkezelése
Minden Windows-alkalmazás rendelkezik ablakokkal, melyek változatos funkcióval rendelkeznek. Minden ablak rendelkezik egy ablakkezelő függvénnyel, mely feldolgozza az ablaknak érkezett rendszer-, illetve felhasználói üzeneteket. Az üzeneteket az ablakfüggvény az ablak üzenetsorából veszi ki. Az üzenetek speciális formátumú konstansok, melyeket egyrészt a Windows rögzít, másrészt mi fejlesztők is írhatunk saját üzeneteket. Az üzenetek küldése általában úgy történik, hogy a függvényben megadjuk az ablak kezelőjét, melynek az üzenet szól, valamint az üzenetet, és paramétereit. Az üzenetküldő függvények azonban változatos működésűek, vagyis nem mind azonos módon hajtja végre az üzenetküldést. Az üzenetkezelő funkciókat a user32.dll-be implementálva bocsátja rendelkezésünkre a rendszer.
A SendMessageCallback függvény
Működését tekintve a függvény átadja az ablaknak, vagy ablakoknak az üzenetet, majd rögtön visszatér. Azt követően, hogy az ablak feldolgozta az üzenetet, meghívja a függvényben átadott callback függvényt, átadva neki a végrehajtás eredményét, valamint egy alkalmazás-specifikus értéket. A függvény aszinkron működésűnek tekinthető. A függvény deklarációja a következő:

SENDMESSAGECALLBACK;
function SendMessageCallback(hWnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM; lpResultCallBack: TFNSendAsyncProc; dwData: DWORD):
BOOL;
Paraméterek
| Paraméterek |
Típus |
Megjegyzés |
| HWnd |
HWND |
Az ablak kezelője, melynek az üzenet szól |
| Msg |
UINT |
Az elküldött üzenet |
| WParam |
WPARAM |
Első üzenet paraméter |
| LParam |
LPARAM |
Az üzenet második paramétere |
| LpResultCallback |
TFNSendAsyncProc |
Mutató az ablak által meghívott callback függvényre |
| DwData |
DWORD |
Alkalmazás specifikus adat, mely a callback függvény paramétere lesz |
Visszatérési érték
A függvény visszatérési értéke 0, amennyiben az üzenet átadása sikeres volt, és valamilyen nullától eltérő érték sikertelen üzenetküldés esetén.
Megjegyzés
Amennyiben a függvény első paramétere HWND_BROADCAST értékű, az üzenet minden ablaknak szól a rendszerben; azoknak is amelyek nem láthatóak, vagy takartak. Viszont az üzenet nem szól az ablakok gyermekeinek.
A működéshez hozzátartozik, hogy az aszinkron üzenetküldő függvények, mint amilyen a SenMessageCallback függvény is, nem tartalmazhatnak mutatót az üzenet paraméterei közt, amennyiben a WM_USER üzenettartományból küldenek üzenetet, ugyanis a függvény visszatérve felszabadítja a memóriaterületet, mielőtt azt az ablak feldolgozta volna.
A SendMessageCallback függvény csak akkor lesz meghívva, amikor a szál, mely hívta azt, meghívja a GetMessage, PeekMessage vagy WaitMessage függvények valamelyikét.
A függvény működését egy egyszerű példával lehetne demonstrálni, melyben egy gomb eseménykezelője indítja az üzenetküldést. Az üzenet egy általános Windows-os üzenet, mégpedig a WM_LBUTTONDBLCLK, melynek kezelőjét szintén megvalósítjuk, de ez a felhasználó klikkelése nélkül fut le. A függvény a példában a következőképpen hívódott meg:
SendMessageCallback(handle,WM_LBUTTONDBLCLK,0,0,
@MyCallback,dwData);
A rendszer által meghívott MyCallback függvény megváltoztatja a Form Edit-kontroljának Text property-jét, így az eredmény szemmel is látható. A függvény az alábbi formában deklarálható:

MyCallback
procedure MyCallback(handle : HWND;msg: UINT;dwData: DWORD;lResult:RESULT);
Paraméterek
handle : HWND
Az ablak kezelője, melynek az üzenet szól.
msg: UINT
Az elküldött üzenet.
dwData: DWORD
Alkalmazás-specifikus érték, mely az üzenetfüggvény által küldött adatokat tartalmazhatja.
lResult: LRESULT
Az üzenet feldolgozás eredménye.
A callback függvény törzsében kiolvassuk az ablakfüggvény által átadott értéket, jelen esetben az üzenet decimális kódját, és beírjuk a Form Edit-kontroljába:
Form1.Edit1.Text := 'A küldött üzenet kódja: ' + IntToStr(dwData);