全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:11323
推到 Plurk!
推到 Facebook!

偵測USB儲存裝置的插拔和磁碟代號(含SourceCode)

 
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-29 10:11:14 IP:61.220.xxx.xxx 訂閱
偵測USB儲存裝置的插拔和磁碟代號
程式說明 : 用 WM_DEVICECHANGE 和 DBT_DEVICEARRIVAL 偵測 USB 儲存裝置的插拔
並且顯示出剛剛插入的 USB Flash 磁碟代號
開發工具 : Delphi 7 Enterprise
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
syene
一般會員


發表:17
回覆:12
積分:5
註冊:2003-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-30 11:43:43 IP:203.72.xxx.xxx 訂閱
想利用這程式改成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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-30 16:09:13 IP:61.220.xxx.xxx 訂閱
不好意思, 沒有寫過 Services 程式, 幫不上忙
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-10 14:42:29 IP:59.127.xxx.xxx 訂閱
參考本文(偵測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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-11 16:39:59 IP:59.127.xxx.xxx 訂閱
舉二反三 , 再次回饋 , 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, 註解 無‧
系統時間:2024-04-24 10:22:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!