RegNotifyChangeKeyValue-Funktion (winreg.h)

Benachrichtigt den Aufrufer über Änderungen an den Attributen oder Inhalten eines angegebenen Registrierungsschlüssels.

Syntax

LSTATUS RegNotifyChangeKeyValue(
  [in]           HKEY   hKey,
  [in]           BOOL   bWatchSubtree,
  [in]           DWORD  dwNotifyFilter,
  [in, optional] HANDLE hEvent,
  [in]           BOOL   fAsynchronous
);

Parameter

[in] hKey

Ein Handle zu einem geöffneten Registrierungsschlüssel. Dieses Handle wird von der RegCreateKeyEx - oder RegOpenKeyEx-Funktion zurückgegeben. Es kann auch einer der folgenden vordefinierten Schlüssel sein:

HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS.

Dieser Parameter muss ein lokales Handle sein. Wenn RegNotifyChangeKeyValue mit einem Remotehandle aufgerufen wird, wird ERROR_INVALID_HANDLE zurückgegeben.

Der Schlüssel muss mit dem KEY_NOTIFY Zugriffsrecht geöffnet worden sein. Weitere Informationen finden Sie unter Registry Key Security and Access Rights.

[in] bWatchSubtree

Wenn dieser Parameter WAHR ist, meldet die Funktion Änderungen am angegebenen Schlüssel und den zugehörigen Unterschlüsseln. Wenn der Parameter FALSCH ist, ändert sich die Funktion nur im angegebenen Schlüssel.

[in] dwNotifyFilter

Ein Wert, der die Änderungen angibt, die gemeldet werden sollen. Dieser Parameter kann einen der folgenden Werte annehmen.

Wert Bedeutung
REG_NOTIFY_CHANGE_NAME
0x00000001L
Benachrichtigen Sie den Aufrufer, wenn ein Unterschlüssel hinzugefügt oder gelöscht wird.
REG_NOTIFY_CHANGE_ATTRIBUTES
0x00000002L
Benachrichtigen Sie den Aufrufer über Änderungen an den Attributen des Schlüssels, z. B. die Sicherheitsbeschreibungsinformationen.
REG_NOTIFY_CHANGE_LAST_SET
0x00000004L
Benachrichtigen Sie den Aufrufer über Änderungen an einem Wert des Schlüssels. Dies kann das Hinzufügen oder Löschen eines Werts oder das Ändern eines vorhandenen Werts umfassen.
REG_NOTIFY_CHANGE_SECURITY
0x00000008L
Benachrichtigen Sie den Aufrufer über Änderungen an der Sicherheitsbeschreibung des Schlüssels.
REG_NOTIFY_THREAD_AGNOSTIC
0x10000000L
Gibt an, dass die Lebensdauer der Registrierung nicht an die Lebensdauer des Threads gebunden werden darf, der den RegNotifyChangeKeyValue-Aufruf ausgibt.
Note Dieser Flagwert wird nur in Windows 8 und höher unterstützt.
 

[in, optional] hEvent

Ein Handle für ein Ereignis. Wenn der fAsynchronous-ParameterWAHR ist, gibt die Funktion sofort zurück, und Änderungen werden durch Signalisieren dieses Ereignisses gemeldet. Wenn "fAsynchronous" FALSCH ist, wird "hEvent" ignoriert.

[in] fAsynchronous

Wenn dieser Parameter WAHR ist, gibt die Funktion sofort zurück und meldet Änderungen, indem das angegebene Ereignis signalisiert wird. Wenn dieser Parameter FALSCH ist, wird die Funktion erst zurückgegeben, wenn eine Änderung aufgetreten ist.

Wenn hEvent kein gültiges Ereignis angibt, kann der fAsynchronous-Parameter nicht TRUE sein.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ERROR_SUCCESS.

Wenn die Funktion fehlschlägt, ist der Rückgabewert ein nichtzero-Fehlercode, der in Winerror.h definiert ist. Sie können die FormatMessage-Funktion mit dem FORMAT_MESSAGE_FROM_SYSTEM Flag verwenden, um eine generische Beschreibung des Fehlers zu erhalten.

Bemerkungen

Diese Funktion erkennt eine einzelne Änderung. Nachdem der Aufrufer ein Benachrichtigungsereignis empfängt, sollte die Funktion erneut aufgerufen werden, um die nächste Benachrichtigung zu erhalten.

Note On Windows NT, Windows 2000 und Windows XP aufrufen RegNotifyChangeKeyValue für ein bestimmtes Schlüsselhandle bewirkt, dass Änderungsbenachrichtigungen weiterhin auftreten, solange der Tastenhandle gültig ist. Dies führt dazu, dass ein zweiter Aufruf von RegNotifyChangeKeyValue sofort zurückgegeben wird, wenn änderungen im Zwischenzeitraum zwischen dem ersten und dem zweiten Aufruf aufgetreten sind. Wenn die API asynchron verwendet wird, wird das übergebene Ereignishandle sofort signalisiert, wenn Zwischenänderungen vorgenommen wurden.
 
Diese Funktion kann nicht verwendet werden, um Änderungen an der Registrierung zu erkennen, die sich aus der Verwendung der RegRestoreKey-Funktion ergeben.

Wenn der angegebene Schlüssel geschlossen ist, wird das Ereignis signalisiert. Dies bedeutet, dass eine Anwendung nicht davon abhängig sein sollte, dass der Schlüssel geöffnet wird, nachdem sie von einem Wartevorgang für das Ereignis zurückgegeben wurde.

Das in Windows 8 eingeführte flag REG_NOTIFY_THREAD_AGNOSTIC ermöglicht die Verwendung von RegNotifyChangeKeyValue für ThreadPool-Threads.

Wenn der Thread, der RegNotifyChangeKeyValue beendet, wird das Ereignis signalisiert. Rufen Sie RegNotifyChangeKeyValue erneut aus einem anderen Thread auf, um weitere Änderungen im Wert des Schlüssels zu überwachen.

Mit Ausnahme von RegNotifyChangeKeyValue-Aufrufen mit REG_NOTIFY_THREAD_AGNOSTIC Satz muss diese Funktion für persistente Threads aufgerufen werden. Wenn der aufrufende Thread aus einem Threadpool stammt und es nicht dauerhaft ist, wird das Ereignis jedes Mal signalisiert, wenn der Thread beendet wird, nicht nur, wenn eine Registrierungsänderung vorhanden ist. Um genaue Ergebnisse sicherzustellen, führen Sie den Threadpool in einem beständigen Thread mithilfe der SetThreadpoolCallbackPersistent-Funktion aus, oder erstellen Sie ihren eigenen Thread mithilfe der CreateThread-Funktion . (Geben Sie für die ursprüngliche Threadpool-API WT_EXECUTEINPERSISTENTTHREAD mithilfe der QueueUserWorkItem-Funktion an.)

Diese Funktion sollte nicht mehrmals mit demselben Wert für den hKey aufgerufen werden, sondern verschiedene Werte für die Parameter bWatchSubtree und dwNotifyFilter . Die Funktion wird erfolgreich ausgeführt, die Änderungen werden jedoch ignoriert. So ändern Sie die
watch parameters, you must first close the key handle by calling RegCloseKey, reopen the key handle by calling RegOpenKeyEx, and then call RegNotifyChangeKeyValue with the new parameters.

Jedes Mal, wenn ein Prozess RegNotifyChangeKeyValue mit demselben Satz von Parametern aufruft, wird ein weiterer Wartevorgang eingerichtet, wodurch ein Ressourcenverlust entsteht. Überprüfen Sie daher, dass Sie RegNotifyChangeKeyValue nicht mit denselben Parametern aufrufen, bis der vorherige Wartevorgang abgeschlossen ist.

Weitere Informationen zum Überwachen von Registrierungsvorgängen finden Sie unter "Registrierung".

Windows XP/2000: When RegNotifyChangeKeyValue wird für ein bestimmtes Schlüsselhandle aufgerufen, Änderungsbenachrichtigungen treten so lange auf, wie der Tastenziehpunkt gültig ist. Dies bewirkt, dass ein zweiter Aufruf von RegNotifyChangeKeyValue sofort zurückgegeben wird, wenn Änderungen zwischen dem ersten und dem zweiten Aufruf vorgenommen werden. Wenn die Funktion asynchron verwendet wird, wird das übergebene Ereignishandle sofort signalisiert, wenn änderungen in der Zwischenzeit auftreten.

Beispiele

Das folgende Programm veranschaulicht die Verwendung von RegNotifyChangeKeyValue.

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

//void main(int argc, char *argv[])
void __cdecl _tmain(int argc, TCHAR *argv[])
{
   DWORD  dwFilter = REG_NOTIFY_CHANGE_NAME |
                     REG_NOTIFY_CHANGE_ATTRIBUTES |
                     REG_NOTIFY_CHANGE_LAST_SET |
                     REG_NOTIFY_CHANGE_SECURITY; 

   HANDLE hEvent;
   HKEY   hMainKey;
   HKEY   hKey;
   LONG   lErrorCode;

   // Display the usage error message.
   if (argc != 3) 
   {
      _tprintf(TEXT("Usage: notify [HKLM|HKU|HKCU|HKCR|HCC] [<subkey>]\n"));
      return;
   }

   // Convert parameters to appropriate handles.
   if (_tcscmp(TEXT("HKLM"), argv[1]) == 0) hMainKey=HKEY_LOCAL_MACHINE;
   else if(_tcscmp(TEXT("HKU"), argv[1]) == 0) hMainKey=HKEY_USERS;
   else if(_tcscmp(TEXT("HKCU"), argv[1]) == 0) hMainKey=HKEY_CURRENT_USER;
   else if(_tcscmp(TEXT("HKCR"), argv[1]) == 0) hMainKey=HKEY_CLASSES_ROOT;
   else if(_tcscmp(TEXT("HCC"), argv[1]) == 0) hMainKey=HKEY_CURRENT_CONFIG;
   else 
   {
      _tprintf(TEXT("Usage: notify [HKLM|HKU|HKCU|HKCR|HCC] [<subkey>]\n"));
      return;
   }

   // Open a key.
    lErrorCode = RegOpenKeyEx(hMainKey, argv[2], 0, KEY_NOTIFY, &hKey);
   if (lErrorCode != ERROR_SUCCESS)
   {
      _tprintf(TEXT("Error in RegOpenKeyEx (%d).\n"), lErrorCode);
      return;
   }

   // Create an event.
   hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
   if (hEvent == NULL)
   {
      _tprintf(TEXT("Error in CreateEvent (%d).\n"), GetLastError());
      return;
   }

   // Watch the registry key for a change of value.
   lErrorCode = RegNotifyChangeKeyValue(hKey, 
                                        TRUE, 
                                        dwFilter, 
                                        hEvent, 
                                        TRUE);
   if (lErrorCode != ERROR_SUCCESS)
   {
      _tprintf(TEXT("Error in RegNotifyChangeKeyValue (%d).\n"), lErrorCode);
      return;
   }

   // Wait for an event to occur.
   _tprintf(TEXT("Waiting for a change in the specified key...\n"));
   if (WaitForSingleObject(hEvent, INFINITE) == WAIT_FAILED)
   {
      _tprintf(TEXT("Error in WaitForSingleObject (%d).\n"), GetLastError());
      return;
   }
   else _tprintf(TEXT("\nChange has occurred.\n"));

   // Close the key.
   lErrorCode = RegCloseKey(hKey);
   if (lErrorCode != ERROR_SUCCESS)
   {
      _tprintf(TEXT("Error in RegCloseKey (%d).\n"), GetLastError());
      return;
   }
   
   // Close the handle.
   if (!CloseHandle(hEvent))
   {
      _tprintf(TEXT("Error in CloseHandle.\n"));
      return;
   }
}

Requirements

Anforderung Wert
Mindestens unterstützter Client Windows 2000 Professional [nur Desktop-Apps]
Mindestanforderungen für unterstützte Server Windows 2000 Server [nur Desktop-Apps]
Zielplattform Windows
Header winreg.h (einschließen Windows.h)
Bibliothek Advapi32.lib
DLL Advapi32.dll

Siehe auch

RegCloseKey

RegDeleteKey

RegEnumKeyEx

RegEnumValue

RegQueryInfoKey

RegQueryValueEx

Registrierungsfunktionen