Какое-то странное поведение ф-и RegNotifyChangeKeyValue. Код приведен ниже. Если нажимаем кнопку Button1 один раз, а потом нажимаем кнопку Button2, то программа сигнализирует 1 раз. Если нажимаем кнопку Button1 два раза, то программа потом сигнализирует 2 раза. Но если нажимаем кнопку Button1 три и больше раз, то программа каждый раз будет сигнализировать 2 раза. Никак не могу понять, почему именно 2 раза? Не один и не столько раз, сколько нажали кнопку Button1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Registry, StdCtrls,
ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
hEvent: THandle;
Registry1, Registry2: TRegistry;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
hEvent := CreateEvent(nil, True, False, nil);
Registry1 := TRegistry.Create;
with Registry1 do begin
OpenKey('\Software\Test\Events', True);
RegNotifyChangeKeyValue(Registry1.CurrentKey, True, REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET, hEvent, True);
end;
Registry2 := TRegistry.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with Registry2 do begin
OpenKey('\Software\Test\Events\'+IntToStr(GetTickCount()), True);
CloseKey;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
while WaitForSingleObject(hEvent, 0)=WAIT_OBJECT_0 do begin
ResetEvent(hEvent);
with Panel1 do begin
Color := clRed;
Update;
Sleep(500);
Color := clBtnFace;
Update;
Sleep(200);
end;
RegNotifyChangeKeyValue(Registry1.CurrentKey, True, REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET, hEvent, True);
end;
end;
end.
Влияет
Каждый раз создает новый ключ в реестре. А RegNotifyChangeKeyValue остлеживает эти изменения.