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

在XP SP2下如何擷取USB裝置拔除 or 插入的信號給程式知道?

尚未結案
RON1103
一般會員


發表:4
回覆:2
積分:1
註冊:2003-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-28 02:33:04 IP:220.135.xxx.xxx 未訂閱
各位前輩,請幫幫忙: 請問在XP下該如何擷取USB裝置拔除 or 插入的信號給程式知道? 該使用何種語法來擷取,請告知一下!謝謝! 之前有先看過站內一些類似USB裝置Q&A ,但還是有看沒有懂? 不知是否有哪位先進可以較詳細說明該部份(因為微軟DDK我實在不懂>_<) 不好意思!再請多協助!
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-28 09:59:15 IP:61.63.xxx.xxx 未訂閱
引言: 各位前輩,請幫幫忙: 請問在XP下該如何擷取USB裝置拔除 or 插入的信號給程式知道? 該使用何種語法來擷取,請告知一下!謝謝! 之前有先看過站內一些類似USB裝置Q&A ,但還是有看沒有懂? 不知是否有哪位先進可以較詳細說明該部份(因為微軟DDK我實在不懂>_<) 不好意思!再請多協助!
RON1103你好: >: 剛剛臨時查了一下 class="code"> Unit1.h ~~ class TForm1 : public TForm { __published: // IDE-managed Components TMemo *Memo1; private: // User declarations TWndMethod OldFormWndProc; void __fastcall FormWndProc(TMessage& Message); public: // User declarations __fastcall TForm1(TComponent* Owner); }; ~~ Unit1.cpp ~~ TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldFormWndProc=this->WindowProc; this->WindowProc=FormWndProc; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormWndProc(TMessage& Message) { OldFormWndProc(Message); if (Message.Msg==WM_DEVICECHANGE) { if (Message.WParam==DBT_DEVICEARRIVAL) { Memo1->Lines->Add("新插入了一項裝置!"); } if (Message.WParam==DBT_DEVICEREMOVECOMPLETE) { Memo1->Lines->Add("卸除了一項裝置!"); } } } 對,主要就是等看看有沒有收到WM_DEVICECHANGE這訊息即可,收到後再細分析是那些conditions! 這裡我是攔Main Form的訊息的,照講任何視窗都可以攔的到的(因為是broadcast的),不過剛試了一下 在application攔就好像不行,待研究! 最後突然想到這樣可以偵測到usb port的裝置插取沒錯,但其它port的裝置插取應該也是可以偵測到才 對,結果試了一下在com port插了一隻滑鼠,卻沒偵測到,可能是沒安裝這滑鼠還是根本不會偵側這樣的port ,不曉得,要再下去研究一下! 我的大至精神,all! <>我的是 >
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-28 10:34:15 IP:61.66.xxx.xxx 未訂閱
可以參考一下下面的CODE COUNT是目前的USB數目(不含滑鼠,裝置管理員不把滑鼠當USB DEVICE) 可從COUNT的變化得知插入或拔出 想要即時監控就把TIMER的INTERVAL調小一點    
 
#include 
#include     void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Registry->RootKey = HKEY_LOCAL_MACHINE;
    // False because we do not want to create it if it doesn't exist
    if ( Registry->OpenKeyReadOnly("SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum") == true )
    {
        //how many USB strorages we get
        Count = Registry->ReadInteger("Count");//how many device we have now
    }
}
RON1103
一般會員


發表:4
回覆:2
積分:1
註冊:2003-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-29 17:33:59 IP:203.75.xxx.xxx 未訂閱
感謝m8815010 & blk5743 兩位先進的指導! 特別感謝m8815010 兄 完善的講解!我也了解了WM_DEVICECHANGE的功能作用 另外我還有一個疑問詢問: 目前我已可以偵測USB插拔動作再透過devcon.exe這個微軟程式可以下批次檔方式去disable/enable USB隨身碟 ;但是否有其他參數可以像XP裝置管理員一樣直接讓硬體做一次"硬體變更掃描" ?USB隨身碟一般硬體辨識皆為USBSTOR\GENDISK ,該使用何種指令來重新掃描該區域 , 請幫忙指點方向!謝謝!! 另外程式少了#include  ,加入後程式就可執行!^_^
hap0702
一般會員


發表:0
回覆:5
積分:1
註冊:2007-04-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-04 10:56:44 IP:220.128.xxx.xxx 訂閱
您好
1.請問您是在VC 寒是BCB的環境作Complier?
2.整個source code可以寄給我當作範例ㄇ?
謝謝您

hap0702@yahoo.com.tw


===================引 用 文 章===================
感謝m8815010 & blk5743 兩位先進的指導! 特別感謝m8815010 兄 完善的講解!我也了解了WM_DEVICECHANGE的功能作用另外我還有一個疑問詢問: 目前我已可以偵測USB插拔動作再透過devcon.exe這個微軟程式可以下批次檔方式去disable/enable USB隨身碟 ;但是否有其他參數可以像XP裝置管理員一樣直接讓硬體做一次"硬體變更掃描" ?USB隨身碟一般硬體辨識皆為USBSTOR\GENDISK ,該使用何種指令來重新掃描該區域 , 請幫忙指點方向!謝謝!! 另外程式少了#include ,加入後程式就可執行!^_^
pcboy
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-05 15:48:50 IP:61.220.xxx.xxx 訂閱
補上相關宣告, 小改成為完整程式
[code cpp]
/*
偵測目前有幾個USB 儲存裝置(不含USB滑鼠)
開發工具 : Borland C Builder 6.0
參考來源 : http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=58642
*/
//---------------------------------------------------------------------------

#include
#pragma hdrstop
#include "USBSTOR.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
#include
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TRegistry *Registry = new TRegistry();
int Count;
Registry->RootKey = HKEY_LOCAL_MACHINE;
// False because we do not want to create it if it doesn't exist
if ( Registry->OpenKeyReadOnly("SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum") == true )
{
//how many USB strorages we get
Count = Registry->ReadInteger("Count");//how many device we have now
Edit1->Text = "USB設備目前有 " IntToStr(Count) " 個";
}
}
[/code]


===================引 用 blk5743 文 章===================
可以參考一下下面的CODE COUNT是目前的USB數目(不含滑鼠,裝置管理員不把滑鼠當USB DEVICE) 可從COUNT的變化得知插入或拔出想要即時監控就把TIMER的INTERVAL調小一點
 
#include 
#include     void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Registry->RootKey = HKEY_LOCAL_MACHINE;
    // False because we do not want to create it if it doesn't exist
    if ( Registry->OpenKeyReadOnly("SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum") == true )
    {
        //how many USB strorages we get
        Count = Registry->ReadInteger("Count");//how many device we have now
    }
}
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-11-21 21:47:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!