转帖:利用Delphi监视注册表的变化 2009-12-23 11:53:51

分类:

利用Delphi监视注册表的变化
 
    我们在编写软件的时候,常常需要把一些信息保存到系统的注册表中。如果用户更改了注册表的信息,我们如何及时知道,并做相应的处理呢?通过研究,我们发现 在Win98以上操作系统中,微软在SDK函数库中增加了RegNotifyChangeKeyValue函数,用于监视注册表特定键值的变化。下面我们 就怎样用Delphi编一个注册表监视器,做详细地探讨。
 
关于注册表监视函数
   下面是注册表监视函数地声明:
function RegNotifyChangeKeyValue(
   hKey : HKEY,             // 需要监视地注册表键
   bWatchSubtree : LongBool,  // 是否监视其子键
   dwNotifyFilter : Cardinal,   //  监视键变化的类型  
   hEvent : Cardinal,               // 当有变化时所触发的通知事件句柄
   fAsynchronous : LongBool  // 异步通知事件标志
   ) : integer;
    根据MSDN中对该函数的描述,我们对其参数做一下描述:
    hKey --我们所要监视的目标键值句柄,它必须是已经被打开的。要打开一个注册表键可以利用Tregistry 中的OpenKeyReadOnly函数。
    dwNotifyFilter ――是一组标志集合,用于标识我们需要监视的变化类型,它们包括: 
    REG_NOTIFY_CHANGE_NAME – 增加或删除了子键
    REG_NOTIFY_CHANGE_ATTRIBUTES – 改变了键的属性
    REG_NOTIFY_CHANGE_LAST_SET – 键值发生了改变
    REG_NOTIFY_CHANGE_SECURITY -键的安全属性发生了改变
    hEvent ――当有变化时所触发的通知事件句柄。我们可以利用SDK函数CreateEvent来创建一个事件。
    fAsynchronous ――以异步方式触发事件标志。
   
现在我们已经对如何利用该函数有了大体的了解:
1.打开需要监视的注册表键
2.创建触发事件
3.调用注册表监视函数,等待事件触发。
  如果等待事件触发在主界面中实现,就会造成界面堵塞。一个解决办法就是,等待事件触发在线程中实现。
 
在线程中实现注册表的监视
    在Delphi下进行多现成程序设计并不需要去学习庞大的Win32 API函数,我们可以利用Delphi标准的多线程类Tthread来完成我们的工作。
    Tthread是一个抽象类――一个带有虚拟抽象方法的类,不能直接使用它。要做的是把Tthread作为基类,用继承的形式来生成子类。实际上,根据TThread来写线程应用是非常容易的。
    1.  无论何时创建一个TThread对象,首先要创建它的派生类。
    2.  每次创建一个TThread对象的派生类的时候,都要重载Execute方法。
    我们可以利用Delphi的向导,来生成创建TThread派生类的代码:
选择Delphi的File菜单下的New选项,再选择“TThread Object”项目,Delphi就会构造基本的程序模块,然后我们再根据需要做相应修改。如下图我们构建了一个注册表监视线程:
 
    下面我们看看该线程是如何实现对注册表的监视的:
 
procedure TRegMonitorThread.Execute;
begin
  InitThread;   // 打开注册表键,创建通知事件
  while not Terminated do
  begin
    if WaitForSingleObject(FEvent, INFINITE) = WAIT_OBJECT_0 then
    begin
      fChangeData.RootKey := RootKey;
      fChangeData.Key := Key;
      SendMessage(Wnd, WM_REGCHANGE,
                  RootKey, LongInt(PChar(Key)));
      ResetEvent(FEvent);   // Fevent对象复位,等待再次被触发
     RegNotifyChangeKeyValue(FReg.CurrentKey, 1, Filter, FEvent, 1);
    end;
  end;
end;
    我们可以看到,Execute 过程实际上是一个循环,结束的条件是进程退出。在循环中,调用WaitForSingleObject
API函数进入等待状态,直到FEvent 对象变为有信号状态。可以看出我们所等待的Fevent
,RegNotifyChangeKeyValue  曾经调用。
    注意,Fevent 被触发后,我们用SendMessage 发送消息到主窗口,下面我们对此做详细讨论。
利用自定义消息传递监视信息
利用自定义消息传递监视信息
   
消息是Windows发出的一个通知,它告诉应用程序某个事件发生了。在Delphi中,大多数情况下Windows的消息被封装在VCL的事件中,我们
只需处理相应的VCL事件就可以了,但如果我们需要利用自己定义的消息实现某些功能,再Delphi中是如何实现的呢?下面我们看看是如何利用自定义消息
传递监视信息的:
    1.  首先定义自定义休息WM_REGCHANGE:
WM_REGCHANGE  = WM_USER + 1973;
    2.  声明主窗体中消息响应应函数:
procedure WMREGCHANGE(var Msg : TMessage); message WM_REGCHANGE;
    3.  实现消息响应函数:
 
procedure TForm1.WMREGCHANGE(var Msg: TMessage);
begin
 with Memo1.Lines  do
 begin
  Add('-----------------------------------');
  Add('Registry change at ' + DateTimeToStr(Now));
  Add(IntToStr(RegMonitorThread.ChangeData.RootKey) +
      ' - ' + RegMonitorThread.ChangeData.Key);
 end;
end;
    我们在主界面上放了一个TMemo控件,用于显示注册表监视信息,在消息响应函数中,监视信息在TMemo控件中的显示。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oury/archive/2005/04/12/343722.aspx

利用Delphi监视注册表的变化的更多相关文章

  1. Delphi的注册表操作

    转帖:Delphi的注册表操作 2009-12-21 11:12:52 分类: Delphi的注册表操作 32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息.     一.创 ...

  2. XP 之后, Delphi 动注册表不方便了...逼出来一个办法:

    XP 之后, Delphi 动注册表不方便了...逼出来一个办法: 手头的程序需要修改注册表, 以让当前程序成为某格式的默认打开程序并关联图标; Vista 之后需要管理员权限才能操作注册表, 很麻烦 ...

  3. 贴一份用delphi修改注册表改网卡MAC地址的代码

    //提示:此代码需要use Registry, Common; function WriteMAC(model:integer):integer; var reg:TRegistry; begin r ...

  4. 利用angularjs完成注册表单

    ng-init="username = 'first'"设置初始显示first字段 ng-class="{'error':signUpForm.username.$inv ...

  5. 利用C#访问注册表获取软件的安装路径

    文章地址:https://blog.csdn.net/yl2isoft/article/details/17332139

  6. delphi 注册表

    Delphi中定义了一个Tregistry类,通过使用这个类中封装的很多有关对注册表操作的方法和属性可以完成对注册表的操作.1. 在注册表中创建一个新的关键字Tregistry类中有一个CreateK ...

  7. delphi 注册表操作(读取、添加、删除、修改)完全手册

    DELPHI VS PASCAL(87)  32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操 ...

  8. 注册表(regedit)

    注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息. 打开方式:1.开始>>运行.中 ...

  9. VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)

    在上一篇中介绍了几个写入注册表数据和读取注册表数据的接口,并介绍了使用方法. 这一片教你如何使得你的应用程序在下次打开时保持上一次关闭前的状态. 在上一篇添加的代码的基础上,要添加WM_CLOSE消息 ...

随机推荐

  1. NSIS脚本:更改壁纸

    原文 NSIS脚本:更改壁纸 我们在制作主题安装包的时候,经常要进行自动更改壁纸的操作,其实用NSIS实现这一点非常简单.示例代码如下: 01 Name "更改壁纸" 02 Out ...

  2. hdu4758 Walk Through Squares 自动机+DP

    题意:给n*m的地图,在地图的点上走,(n+1)*(m+1)个点,两种操作:往下走D和往右走R.现在要从左上角走到右下角,给定两个操作串,问包含这两个串的走法总共有多少种. 做法:用这两个串构建自动机 ...

  3. Ansible@一个有效的配置管理工具--Ansible configure management--翻译(十)

    未经书面许可,.请勿转载 Custom Modules Until now we have been working solely with the tools provided to us by A ...

  4. OR1200数据Cache运用情景分析

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 13.7DCache使用情景之中的一个--存储指令运行阶段DCache失靶 存储指令运行阶段DCache失靶这样的情景 ...

  5. Spark编译与部署

    Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建   [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.S ...

  6. [cocos2dx注意事项009]试用quick-cocos2dx-2.2.4

    quick-cocos2d-x 在中国站http://quick.cocoachina.com/?page_id=40,用他们自己的话说:quick-cocos2d-x(后文简称 quick)与 co ...

  7. Poj Roadblocks(次短路)

    Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best ...

  8. 三个水杯 (bfs)

    给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...

  9. 第4章 建造者模式(Builder Pattern)

    原文 第4章 建造者模式(Builder Pattern) 定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 实用范围 1 当创建复杂对象 ...

  10. JDBC加载过程

    jdbc载入的过程如图所看到的. 桥接模式请參照:设计模式:桥接模式 blog目的:与图说话 版权声明:本文博客原创文章,博客,未经同意,不得转载.