監視程式在背景持續偵測系統關鍵資訊變更,如登錄檔修改、檔案系統異動等。雖然資源管理器可手動查看,但面對數萬個檔案與龐大登錄檔,人工檢查不切實際。監視程式的核心價值在於自動記錄軟體安裝前後的系統差異,為完整解除安裝提供依據,避免殘留垃圾佔用磁碟空間。市面知名工具如 Uninstaller Manager、RegMonitor 均採用此技術。
| 函數 | 用途 |
|---|---|
FindFirstChangeNotification | 建立監視通知控制代碼,指定路徑、是否遞迴子目錄、監視事件類型 |
FindNextChangeNotification | 請求系統在下一次偵測到變更時發出通知 |
WaitForSingleObject / WaitForMultipleObjects | 等待變更通知訊號,可設定無限等待或超時 |
FindCloseChangeNotification | 關閉通知控制代碼,結束監視前必須呼叫 |
HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, // 監視路徑
BOOL bWatchSubtree, // TRUE=包含子目錄
DWORD dwNotifyFilter // 監視事件篩選器(可組合)
);
FILE_NOTIFY_CHANGE_FILE_NAME:檔案名稱變更(建立/刪除/重命名)FILE_NOTIFY_CHANGE_DIR_NAME:目錄名稱變更FILE_NOTIFY_CHANGE_SIZE:檔案大小變更FILE_NOTIFY_CHANGE_ATTRIBUTES:檔案屬性變更FILE_NOTIFY_CHANGE_LAST_WRITE:最後寫入時間變更FILE_NOTIFY_CHANGE_SECURITY:安全性描述項變更C++ Builder 4 程式碼,偵測到變更時在 Edit 控制項顯示提示:
void __fastcall TForm1::FormCreate(TObject *Sender) {
DWORD dwWaitStatus;
HANDLE hChangeHandle = FindFirstChangeNotification(
"C:\\PWin98", FALSE, FILE_NOTIFY_CHANGE_FILE_NAME);
if (hChangeHandle == INVALID_HANDLE_VALUE)
ExitProcess(GetLastError());
while (true) {
dwWaitStatus = WaitForSingleObject(hChangeHandle, INFINITE);
switch (dwWaitStatus) {
case WAIT_OBJECT_0: // 偵測到變更
Edit1->Text = "Something Changed";
FindCloseChangeNotification(hChangeHandle);
ExitProcess(EXIT_SUCCESS);
default:
ExitProcess(GetLastError());
}
}
}
對應 API:RegNotifyChangeKeyValue,用法類似,可監視特定登錄鍵值的變更(名稱、屬性、內容、安全性等),此處不贅述。
WaitForMultipleObjects 統一等待。FindCloseChangeNotification 釋放核心資源。ReadDirectoryChangesW 提供更豐富資訊(具體變更檔案名、動作類型),可考慮升級。掌握檔案系統與登錄檔監視技術,是開發系統工具、安全軟體、安裝追蹤器的關鍵基石。