線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1300
推到 Plurk!
推到 Facebook!

抓取USB大量儲存裝置的方法Part 3-2 Windows硬體設備異動偵測

 
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-04 12:05:32 IP:210.200.xxx.xxx 未訂閱
主題 :       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. 執行這個程式,我們會得到以下的結果 待續......
系統時間:2024-07-04 3:51:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!