Delphi - Értesítése minden alkalmazásnak a regisztrációs adatbázis változásáról

forráskód letöltése
Amikor a Registry-ben, vagy bármely rendszerhez tartozó INI fájlban módosításokat végzünk, akkor jól tesszük, ha erről értesítjük az összes futó alkalmazást. Ebben a cikkben arra is látunk példát, hogy hogyan tudjuk saját alkalmazásunkban az ilyen üzeneteket fogadni. A cikkhez két példaprogram is tartozik. Az első (Project1) egy új bejegyzést helyez el a Registry-ben, majd küld egy üzenetet az összes futó alkalmazásnak. A második program ezt az üzenetet figyeli, és ha sikerült azonosítani a küldőt, akkor kiolvassa a Registry-ben elhelyezett adatot.

Az első programban tehát a Button1 OnClick eseményénél beírjuk az aktuális időpontot a Registry egy meghatározott címére, majd küldünk egy üzenetet. Az üzenetküldés a következőképpen történik:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LongInt(PChar('AnimareSoftware')));
A SendMessage függvény első paramétere egy konstans, amely jelen esetben HWND_BROADCAST. Ezzel adjuk meg, hogy az üzenetet az összes futó alkalmazáshoz el szeretnénk juttatni. A következő paraméter szintén egy konstans, ami az üzenet típusát adja meg, ez jelen esetben WM_SETTINGCHANGE. Régebbi rendszerekkel való kompatibilitás miatt használhatjuk a WM_WININICHANGE konstanst is (Windows NT 3.1). Az üzenet harmadik paramétere annak a rendszer tulajdonságnak az azonosítója, amit megváltoztattunk (A SystemParametersInfo függvénynél használt konstansok). Mivel mi nem rendszerbeállítást változtattunk meg, ezért 0-t adunk meg. Az utolsó paraméter általában egy sztring, ami a módosított címet tartalmazza. Például ha a Registry-ben lett módosítva egy adat, akkor a Registry címet. A legtöbb program ezt a paramétert nem használja. Mi most egy egyedi sztringet adunk meg, amivel a második példaprogram azonosítani tudja az üzenetet.

Ahhoz, hogy az üzenetet fogadni tudjuk a WM_SETTINGCHANGE eseményhez kell írnunk egy eseménykezelő eljárást.
procedure WMSettingChange(var Msg: TWMSettingChange); message WM_SETTINGCHANGE;
Az Msg paraméter Section mezőjéből kiolvasható a sztring, amit az üzenet azonosítására használunk. Ha más alkalmazás küldte az üzenetet, akkor ez valószínűleg nil. Ha sikerült azonosítani azt az üzenetet, amit vártunk, akkor kiolvassuk a Registry-ből az eltárolt időpontot. Ha nem a mi programunk küldte az üzenetet, akkor megjelenítjük a megváltoztatott rendszerparaméter azonosító kódját. Ezt a Flag mezőből olvashatjuk ki.