偵測USB儲存裝置的插拔和磁碟代號(含SourceCode) |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
偵測USB儲存裝置的插拔和磁碟代號
程式說明 : 用 WM_DEVICECHANGE 和 DBT_DEVICEARRIVAL 偵測 USB 儲存裝置的插拔 並且顯示出剛剛插入的 USB Flash 磁碟代號 開發工具 : Delphi 7 Enterprise
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
syene
一般會員 發表:17 回覆:12 積分:5 註冊:2003-01-04 發送簡訊給我 |
想利用這程式改成service,只要一開機就在背景執行.
但發現改成service方式之後就沒辦法動了 http://delphi.ktop.com.tw/board.php?cid=30&fid=73&tid=93886 請教這段程式應該如何修正, 才可利用service application的方式執行 or 改成DLL的方式讓USER一開機之後就無法避免該USB偵測程式的檢查及處理? Tkx. ===================引 用 pcboy 文 章=================== 偵測USB儲存裝置的插拔和磁碟代號 程式說明 : 用 WM_DEVICECHANGE 和 DBT_DEVICEARRIVAL 偵測 USB 儲存裝置的插拔 並且顯示出剛剛插入的 USB Flash 磁碟代號 開發工具 : Delphi 7 Enterprise |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
參考本文(偵測USB儲存裝置的插拔和磁碟代號)
因使用 BCB5 故改成了 Borland C Builder 5.0 , 回饋一下 [code cpp] #include "dbt.h" //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { WindowProc=MyWndProc; //攔截訊息 } //--------------------------------------------------------------------------- //攔截系統訊息 //--------------------------------------------------------------------------- void __fastcall TForm1::MyWndProc(TMessage &Message) { PDEV_BROADCAST_VOLUME dbvDev; DWORD vn; char disk_label; if(Message.Msg == WM_DEVICECHANGE) { switch(Message.WParam) { case DBT_DEVICEARRIVAL : dbvDev =(PDEV_BROADCAST_VOLUME)Message.LParam; vn = dbvDev->dbcv_unitmask; disk_label = FirstDriveFromMask(vn); ShowMessage("CARD INSERT IN " String(disk_label)); break; case DBT_DEVICEREMOVECOMPLETE: ShowMessage("CARD NOT INSERT"); break; } } //將訊息還給 Form 原來處理程序 WndProc(Message); } //--------------------------------------------------------------------------- char __fastcall TForm1::FirstDriveFromMask(ULONG unitmask) { char i; for (i = 0; i < 26; i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return (i 'A'); } [/code]
編輯記錄
digitraveler 重新編輯於 2009-08-10 14:44:28, 註解 無‧
digitraveler 重新編輯於 2009-08-10 14:45:21, 註解 無‧ digitraveler 重新編輯於 2009-08-10 14:46:05, 註解 無‧ |
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
舉二反三 , 再次回饋 , VS2003 C# 版
[code c#] namespace WindowsApplication1 { /// /// Summary description for Form1. /// public class Form1 : System.Windows.Forms.Form { //自行宣告一個 DEV_BROADCAST_VOLUME 結構 //[StructLayout(LayoutKind.Sequential)] public struct DEV_BROADCAST_VOLUME { public int dbcv_size; public int dbcv_devicetype; public int dbcv_reserved; public int dbcv_unitmask; } (其它 CODE) //--------------------------------------------------------------------------- protected override void WndProc(ref Message m) { DEV_BROADCAST_VOLUME vol; const int WM_DEVICECHANGE = 0x219; const int DBT_DEVICEARRIVAL = 0x8000; const int DBT_DEVICEREMOVECOMPLETE = 0x8004; if (m.Msg == WM_DEVICECHANGE) { switch (m.WParam.ToInt32()) { case DBT_DEVICEARRIVAL: //MessageBox.Show("DBT_DEVICEARRIVAL"); vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam,typeof(DEV_BROADCAST_VOLUME)); MessageBox.Show("CARD INSERT IN DISK " FirstDriveFromMask(vol.dbcv_unitmask)); break; case DBT_DEVICEREMOVECOMPLETE: MessageBox.Show("DBT_DEVICEREMOVECOMPLETE"); break; } } base.WndProc (ref m); } //--------------------------------------------------------------------------- private string FirstDriveFromMask(int unitmask) { byte[] r = new byte[] {0, (byte)':', 0}; int i; for (i = 0; i < 26; i) { if ((unitmask & 0x1) !=0) break; unitmask = unitmask >> 1; } r[0]=(byte)(i 65); string rr=System.Text.Encoding.Default.GetString(r); //byte[] 轉 string return rr; } [/code]
編輯記錄
digitraveler 重新編輯於 2009-08-11 16:41:34, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |