Declaração: Qualquer grupo ou indivíduo que não seja a CSDN que reimprimir este artigo deverá indicar a fonte e o autor.
A classe TRegistry que vem com o Delphi só pode implementar as operações básicas do registro. Se quisermos monitorar as alterações no registro em tempo real ou verificar todas as subchaves em uma chave específica no registro, a classe TRegistry é impotente. Fiquei muito tempo mastigando o SDK e finalmente percebi o monitoramento e a verificação do registro do Delphi. Não me atrevi a guardá-lo para mim, então o dediquei à maioria dos entusiastas do Delphi.
O monitoramento de alterações em itens relacionados ao registro requer uma API: RegNotifyChangeKeyValue.
LONGO RegNotifyChangeKeyValue(
HKEY hKey, // identificador para um item a ser monitorado
BOOL bWatchSubtree, // Se deve monitorar as subchaves deste item
DWord dwNotifyFilter, // Quais mudanças monitorar
HANDLE hEvent, // identificador do objeto de evento que aceita eventos de alteração de registro
BOOL fAsynchronous // Relatório antes das alterações no registro ou após as alterações no registro
);
Observe que o hEvent acima é o identificador do objeto de evento que aceita eventos de alteração de registro. Precisamos usar API: CreateEvent para criar um objeto de evento do sistema.
HANDLE CriarEvento(
LPSECURITY_ATTRIBUTES lpEventAttributes, // estrutura SECURITY_ATTRIBUTES
BOOL bManualReset, // Se deseja redefinir automaticamente
BOOL bInitialState, // Se deve definir o estado inicial
LPCTSTR lpName //O nome do objeto de evento
);
Crie um novo projeto e adicione um ListBox e dois Buttons.
//Primeiro escreva um exemplo de monitoramento do registro
//Monitora todas as subchaves no item HKEY_CURRENT_USER/Software
Procedimento TForm1.Button1Click(Remetente: TObject);
var
hNotify: THandle;
hKeyx:HKEY;
dwRes: DWORD;
começar
hNotify := CreateEvent( nil, //Não use a estrutura SECURITY_ATTRIBUTES
FALSE, //Não reinicia automaticamente
TRUE, //Definir estado inicial
'RegistryNotify' //O nome do objeto de evento
);
se hNotify = 0 então
começar
Showmessage('Falha na criação do evento.');
saída;
fim;
if RegOpenKeyEx(HKEY_CURRENT_USER, //Segue a chave
'Software', //Subchave
0, //reservado
KEY_NOTIFY, //para monitoramento
hKeyx //Salvar identificador
) <> ERROR_SUCCESS então
começar
CloseHandle(hNotify);
Showmessage('RegOpenKeyEx falhou.');
saída;
fim;
if RegNotifyChangeKeyValue( hKeyx, //Monitorar identificador de subchave
TRUE, //Monitora as subchaves deste item
REG_NOTIFY_CHANGE_NAME ou REG_NOTIFY_CHANGE_LAST_SET,
hNotify, //Identificador de objeto de evento que aceita eventos de alteração de registro
TRUE //Relatório antes das alterações no registro
) <> ERROR_SUCCESS então
começar
CloseHandle(hNotify);
RegCloseKey( hKeyx );
Showmessage('Falha no RegNotifyChangeKeyValue');
saída;
fim;
dwRes := WaitForSingleObject( hNotify, 60 * 1000 );
se dwRes = 0 então
Showmessage( 'O registro será alterado.' );
CloseHandle(hNotify);
RegCloseKey( hKeyx );
fim;
Deve-se observar que API: WaitForSingleObject não retornará até que o evento de alteração do registro ocorra ou expire. Durante esse período, nosso programa perderá a resposta. A solução é criar um novo thread e monitorar o registro no novo thread.
Duas outras APIs são usadas para verificar o registro: RegEnumKey e RegEnumValue.
LONG RegEnumKey(
HKEY hKey, // identificador do item de registro a ser verificado
DWORD dwIndex, // número de série da subchave a ser verificada
LPTSTR lpName,//O nome da subchave a ser verificada
LPDWORD lpcbName, // O nome da subchave a ser verificada ocupa espaço
);
O método para usar esta função é: primeiro atribua 0 a dwIndex, chame RegEnumKey; em seguida, Inc(dwIndex) e, em seguida, chame RegEnumKey até que o valor de retorno seja ERROR_NO_MORE_ITEMS, indicando que não há mais subitens.
//Exemplo de verificação do registro
//Demonstra apenas como enumerar um nível de subitens em HKEY_CURRENT_USER/Software
procedimento TForm1.Button2Click(Remetente: TObject);
var
buf: matriz [0..255] de char;
iRes : inteiro;
hKeyx:HKEY;
dwIndex, dwSize: DWORD;
começar
se RegOpenKeyEx(HKEY_CURRENT_USER, 'Software', 0, KEY_READ ou
KEY_ENUMERATE_SUB_KEYS, hKeyx) <> ERROR_SUCCESS então
começar
Showmessage('RegOpenKeyEx falhou.');
saída;
fim;
dwIndex := 0;
repita
dwSize := 255;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
se iRes = ERROR_NO_MORE_ITEMS então
quebrar
senão se iRes = ERROR_SUCCESS então
começar
Listbox1.Items.Add(buf);
Inc(dwÍndice);
fim;
até iRes <> ERROR_SUCCESS;
RegCloseKey( hKeyx );
fim;