Função RegNotifyChangeKeyValue (winreg.h)

Notifica o chamador sobre alterações nos atributos ou conteúdo de uma chave do Registro especificada.

Sintaxe

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

Parâmetros

[in] hKey

Um identificador para uma chave aberta do Registro. Esse identificador é retornado pela função RegCreateKeyEx ou RegOpenKeyEx . Também pode ser uma das seguintes chaves predefinidas:

HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERS Esse parâmetro deve ser um identificador local. Se RegNotifyChangeKeyValue for chamado com um identificador remoto, ele retornará ERROR_INVALID_HANDLE.

A chave deve ter sido aberta com o KEY_NOTIFY direito de acesso. Para obter mais informações, consulte Segurança de Chave do Registro e Direitos de Acesso.

[in] bWatchSubtree

Se esse parâmetro for TRUE, a função relatará alterações na chave especificada e em suas subchaves. Se o parâmetro for FALSE, a função relatará alterações somente na chave especificada.

[in] dwNotifyFilter

Um valor que indica as alterações que devem ser relatadas. Esse parâmetro pode usar um dos valores a seguir.

Valor Significado
REG_NOTIFY_CHANGE_NAME
0x00000001L
Notifique o chamador se uma subchave for adicionada ou excluída.
REG_NOTIFY_CHANGE_ATTRIBUTES
0x00000002L
Notifique o chamador de alterações nos atributos da chave, como as informações do descritor de segurança.
REG_NOTIFY_CHANGE_LAST_SET
0x00000004L
Notifique o chamador de alterações para um valor da chave. Isso pode incluir a adição ou exclusão de um valor ou a alteração de um valor existente.
REG_NOTIFY_CHANGE_SECURITY
0x00000008L
Notifique o chamador de alterações ao descritor de segurança da chave.
REG_NOTIFY_THREAD_AGNOSTIC
0x10000000L
Indica que o tempo de vida do registro não deve estar vinculado ao tempo de vida do thread que emite a chamada RegNotifyChangeKeyValue .
Nota Esse valor de sinalizador só tem suporte no Windows 8 e posterior.
 

[in, optional] hEvent

Um identificador para um evento. Se o parâmetro fAsynchronous for TRUE, a função retornará imediatamente e as alterações serão relatadas sinalizando esse evento. Se fAsynchronous for FALSE, hEvent será ignorado.

[in] fAsynchronous

Se esse parâmetro for TRUE, a função retornará imediatamente e relatará alterações sinalizando o evento especificado. Se esse parâmetro for FALSE, a função não retornará até que ocorra uma alteração.

Se hEvent não especificar um evento válido, o parâmetro fAsynchronous não poderá ser TRUE.

Valor retornado

Se a função obtiver êxito, o valor retornado será ERROR_SUCCESS.

Se a função falhar, o valor de retorno será o código de erro diferente de zero definido em Winerror.h. Você pode usar a função FormatMessage com o sinalizador FORMAT_MESSAGE_FROM_SYSTEM para obter uma descrição genérica do erro.

Comentários

Essa função detecta uma única alteração. Depois que o chamador receber um evento de notificação, ele deverá chamar a função novamente para receber a próxima notificação.

Nota No Windows NT, Windows 2000 e Windows XP chamando RegNotifyChangeKeyValue para um identificador de chave específico faz com que as notificações de alteração continuem a ocorrer enquanto o identificador de chave for válido. Isso faz com que uma segunda chamada para RegNotifyChangeKeyValue retorne imediatamente, se alguma alteração tiver ocorrido no período provisório entre a primeira e a segunda chamadas. Se a API estiver sendo usada de forma assíncrona, o identificador de evento passado será sinalizado imediatamente se alguma alteração provisória tiver ocorrido.
 
Essa função não pode ser usada para detectar alterações no registro resultantes do uso da função RegRestoreKey .

Se a chave especificada for fechada, o evento será sinalizado. Isso significa que um aplicativo não deve depender da chave estar aberta após retornar de uma operação de espera no evento.

O sinalizador REG_NOTIFY_THREAD_AGNOSTIC introduzido no Windows 8 permite o uso de RegNotifyChangeKeyValue para threads do ThreadPool.

Se o thread chamado RegNotifyChangeKeyValue for encerrado, o evento será sinalizado. Para continuar monitorando alterações adicionais no valor da chave, chame RegNotifyChangeKeyValue novamente de outro thread.

Com exceção das chamadas RegNotifyChangeKeyValue com REG_NOTIFY_THREAD_AGNOSTIC definido, essa função deve ser chamada em threads persistentes. Se o thread de chamada for de um pool de threads e não for persistente, o evento será sinalizado sempre que o thread for encerrado, não apenas quando houver uma alteração no Registro. Para garantir resultados precisos, execute o trabalho do pool de threads em um thread persistente usando a função SetThreadpoolCallbackPersistent ou crie seu próprio thread usando a função CreateThread . (Para a API do pool de threads original, especifique WT_EXECUTEINPERSISTENTTHREAD usando a função QueueUserWorkItem .)

Essa função não deve ser chamada várias vezes com o mesmo valor para o hKey , mas valores diferentes para os parâmetros bWatchSubtree e dwNotifyFilter . A função terá êxito, mas as alterações serão ignoradas. Para alterar a
watch parâmetros, primeiro você deve fechar o identificador de chave chamando RegCloseKey, reabrir o identificador de chave chamando RegOpenKeyEx e, em seguida, chamar RegNotifyChangeKeyValue com os novos parâmetros.

Sempre que um processo chama RegNotifyChangeKeyValue com o mesmo conjunto de parâmetros, ele estabelece outra operação de espera, criando um vazamento de recursos. Portanto, marcar que você não está chamando RegNotifyChangeKeyValue com os mesmos parâmetros até que a operação de espera anterior seja concluída.

Para monitorar as operações do Registro com mais detalhes, consulte Registro.

Windows XP/2000: Quando RegNotifyChangeKeyValue é chamado para um identificador de chave específico, as notificações de alteração ocorrem desde que o identificador de chave seja válido. Isso faz com que uma segunda chamada para RegNotifyChangeKeyValue retorne imediatamente, se ocorrerem alterações nesse ínterim entre a primeira e a segunda chamadas. Se a função estiver sendo usada de forma assíncrona, o identificador de evento passado será sinalizado imediatamente se ocorrerem alterações nesse ínterim.

Exemplos

O programa a seguir ilustra como usar 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;
   }
}

Requisitos

   
Cliente mínimo com suporte Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows 2000 Server [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho winreg.h (inclua Windows.h)
Biblioteca Advapi32.lib
DLL Advapi32.dll

Confira também

Regclosekey

RegDeleteKey

RegEnumKeyEx

RegEnumValue

RegQueryInfoKey

Regqueryvalueex

Funções do Registro