State and Notifications Broker提供了一个在注册表中存储系统和应用程序信息的机制和一个存储信息改变的通知系统。它可以用于监控系统中的任何注册表键值。通知种类包括以下几种:
- System state information, such as features present (camera, keyboard), active application, cradled state, battery state.
- Message information, such as count of unread, last received, account info.
- Tasks and appointments information, such as upcoming, overdue, location.
- Windows Media Player information, such as currently playing album, artist.
- Phone information, such as signal information, operator information, call information, multiline information.
- Connections information, related to bluetooth, cellular, network, modem, etc.
snapi.h中包含了需要监控的注册表Key、Path、Value Name和Mask,比方说你想知道现在的phone处在一个什么状态,可以看到snapi.h中有这么一段:
// PhoneRoaming
// Gets a value indicating whether the phone is currently in roaming mode.
#define SN_PHONEROAMING_ROOT HKEY_LOCAL_MACHINE
#define SN_PHONEROAMING_PATH TEXT("System//State//Phone")
#define SN_PHONEROAMING_VALUE TEXT("Status")
#define SN_PHONEROAMING_BITMASK 0x200当键值[HKLM/System/State/Phone] "Status"值的0x200这一位上为1时,说明phone处在漫游状态。
那么,如何监控注册表键值呢?可以用RegistryNotifyApp、RegistryNotifyWindow、RegistryNotifyCallback等API。以下是Sample Code:
- #include <snapi.h>
- #include <regext.h>
- #define UM_REGNOTIFY WM_USER+1000
- // Global Variables:
- HREGNOTIFY g_hRegNotify;
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_CREATE:
- NOTIFICATIONCONDITION nc;
- ZeroMemory(&nc, sizeof(NOTIFICATIONCONDITION));
- nc.ctComparisonType = REG_CT_EQUAL;
- nc.dwMask = 0x200;
- nc.TargetValue.dw = 0x200;
- RegistryNotifyWindow(SN_PHONEROAMING_ROOT, SN_PHONEROAMING_PATH, SN_PHONEROAMING_VALUE, hWnd, UM_REGNOTIFY, 0, &nc, &g_hRegNotify);
- break;
- case UM_REGNOTIFY:
- MessageBox(hWnd, _T("Phone is roaming!"), _T("Notification Broker"), MB_OK);
- break;
- case WM_DESTROY:
- RegistryCloseNotification(g_hRegNotify);
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }