Ich überwache mit der
API Funktion RegNotifyChangeKeyValue einen Registryschlüssel:
Delphi-Quellcode:
type
TThreadParams = packed record
Root: HKEY;
Key: String[255];
end;
PThreadParams = ^TThreadParams;
function WatchRegKey(Root: HKEY; Key: String): DWORD;
var
err: DWORD;
hEvent: THandle;
hndlkey: HKEY;
begin
hEvent := CreateEvent(nil, False, False, nil);
if hEvent <> 0 then
begin
err := RegConnectRegistry(nil, Root, hndlkey);
if err = 0 then
begin
err := RegOpenKeyEx(hndlkey, PChar(Key), 0, KEY_NOTIFY, hndlkey);
if err = 0 then
begin
err := RegNotifyChangeKeyValue(hndlkey, False, REG_NOTIFY_CHANGE_LAST_SET, hEvent, True);
case WaitForSingleObject(hEvent, INFINITE) of
WAIT_OBJECT_0: ShowMessage('Kuckuck');
end;
end;
end;
end
else
err := GetLastError;
result := err;
end;
function Thread(p: PThreadParams): Integer;
var
Root: HKEY;
Key: String;
begin
Root := p.Root;
Key := p.Key;
WatchRegKey(Root, Key);
Dispose(p);
result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID: Cardinal;
ThreadParams: PThreadParams;
begin
New(ThreadParams);
ThreadParams.Root := HKEY_CURRENT_USER;
ThreadParams.Key := 'Software\mp\Test';
CloseHandle(BeginThread(nil, 0, @Thread, ThreadParams, 0, ThreadID));
end;
Nur ist es so, dass wenn der Event ausgelöst wurde, die Überwachung aufgehoben wird. Das Problem ist jetzt aber, dass der Schlüssel so lange überwacht werden soll, wie das Programm läuft. Hat da jemand eine Idee, wie ich das realisieren könnte? Ich habe da im Moment einen Blackout.