**:利用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控制項中的顯示。
監視登錄檔,,列舉登錄檔項
建立登錄檔項 lret regopenkeyex hkey current user,t software hrjd ascpatch 0,key all access,hkey if lret error success waifainfo info lret regsetvalueex hkey...
讀取登錄檔(delphi)
function readreg xbf widestring widestring var xbfconnect string xbfconn1,regconn2,xbfconn3 string tempregbin array 0.15 of char xbflen integer h1 tha...
delphi 遍歷登錄檔
下面程式是讀出windows中所有的已安裝的程式.你自己看一下,很容易的.uses registry procedure tform1.button1click sender tobject var list,softlist tstringlist reg tregistry fpath,fkey...