抓取USB大量儲存裝置的方法Part 3-2 Windows硬體設備異動偵測 |
|
G01
高階會員 發表:249 回覆:379 積分:215 註冊:2002-05-21 發送簡訊給我 |
主題 :
CallBack物件元件化與Windows硬體設備異動偵測 現在,我們將3-1的CallBack物件予以元件化 unit UWinCallBackOBJ;
interface
uses
SysUtils, Windows, Classes, Messages;
type
//定義CallBack VCL物件與其它VCL物件在CallBack狀況發生時,
//Callback VCL物件要呼叫其它VCL物件做處理的procedure 連結函式樣板!!
TCallBackOBJLinkVCLProc = procedure(var Msg:TMessage) of Object;
TWinCallBackOBJ = class(TComponent)
private
{ Private declarations }
FWinProcCallBackHandle:HWND; //給OS 進行CallBack時使用的 Event handle
FVCLProc:TCallBackOBJLinkVCLProc; //給VCL物件進行處理的連結(Event Link)
procedure WinProc(var Msg:TMessage);//給OS CallBack時使用的procedure
protected
{ Protected declarations }
public
{ Public declarations }
Constructor Create(AOwner:TComponent); Override;
Destructor Destroy; Override;
published
{ Published declarations }
property OnOsCallBack:TCallBackOBJLinkVCLProc read FVCLProc write FVCLProc;
end; procedure Register; implementation procedure Register;
begin
RegisterComponents('Win32', [TWinCallBackOBJ]);
end; //TWinCallBackOBJ.
Constructor TWinCallBackOBJ.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
self.FWinProcCallBackHandle := 0;
//向OS要求配置一個Event Handle !!
//也就是說,一有風吹草動;OS 要通知本物件進行相關處理!!
self.FWinProcCallBackHandle := AllocateHWnd(self.WinProc);
end; Destructor TWinCallBackOBJ.Destroy;
begin
//釋放先前配置的Event Handle !! (PS. 有借有還,記得喔!!)
DeallocateHWnd(self.FWinProcCallBackHandle);
self.FWinProcCallBackHandle := 0;
inherited Destroy;
end; procedure TWinCallBackOBJ.WinProc(var Msg: TMessage);
begin
//將訊息傳給要攔截訊息的VCL物件!!
if(Assigned(self.FVCLProc))then self.FVCLProc(Msg);
end; end. OK !! 如此一來,我們就有自訂的CallBack介面元件了!! 接下來我們要討論的是Windows硬體設備異動偵測
讓我們參考下面的這一段程式碼 //將訊息傳給要攔截訊息的VCL物件!!
if(Assigned(self.FVCLProc))then self.FVCLProc(Msg); 在Delphi中,我們可以看到Msg變數的定義
....啊....給它有點辛苦....!!
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=12514692&CC=279888"> 根據查詢的結果,我們可以得知;當USB設備有異動時;
CallBack元件會得到一個Msg.Mag = WM_DEVICECHANGE 的訊息 現在,我們來做個練習;參考以下的程式碼(記得要安裝剛才的CallBack元件喔!!) unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, UWinCallBackOBJ; type
TForm1 = class(TForm)
WinCallBackOBJ1: TWinCallBackOBJ;
Memo1: TMemo;
procedure WinCallBackOBJ1OsCallBack(var Msg: TMessage);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WinCallBackOBJ1OsCallBack(var Msg: TMessage);
begin
case Msg.Msg of
WM_DEVICECHANGE:
begin
self.Memo1.Lines.Add('USB 裝置異動!!')
end;
end;//case...end!!
end; end. 執行這個程式,我們會得到以下的結果 待續......
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |