在XP SP2下如何擷取USB裝置拔除 or 插入的信號給程式知道? |
尚未結案
|
RON1103
一般會員 發表:4 回覆:2 積分:1 註冊:2003-08-18 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 各位前輩,請幫幫忙: 請問在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 發送簡訊給我 |
可以參考一下下面的CODE
COUNT是目前的USB數目(不含滑鼠,裝置管理員不把滑鼠當USB DEVICE)
可從COUNT的變化得知插入或拔出
想要即時監控就把TIMER的INTERVAL調小一點
#include |
RON1103
一般會員 發表:4 回覆:2 積分:1 註冊:2003-08-18 發送簡訊給我 |
感謝m8815010 & blk5743 兩位先進的指導!
特別感謝m8815010 兄 完善的講解!我也了解了WM_DEVICECHANGE的功能作用
另外我還有一個疑問詢問:
目前我已可以偵測USB插拔動作再透過devcon.exe這個微軟程式可以下批次檔方式去disable/enable USB隨身碟 ;但是否有其他參數可以像XP裝置管理員一樣直接讓硬體做一次"硬體變更掃描" ?USB隨身碟一般硬體辨識皆為USBSTOR\GENDISK ,該使用何種指令來重新掃描該區域 , 請幫忙指點方向!謝謝!!
另外程式少了#include
|
hap0702
一般會員 發表:0 回覆:5 積分:1 註冊:2007-04-04 發送簡訊給我 |
您好
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 發送簡訊給我 |
補上相關宣告, 小改成為完整程式
[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
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |