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

關於WM_DEVICECHANGE的問題

尚未結案
tandylo
一般會員


發表:3
回覆:4
積分:1
註冊:2003-09-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-18 18:34:32 IP:218.166.xxx.xxx 未訂閱
各位大大好: 小弟經常用BCB為公司寫一些USB裝置的應用程式,最近卻發現到一個有趣的現象就是,如果監視一個未做過partition的USB HDD的插拔,在BCB的程式只會收到DBT_DEVNODES_CHANGED這個message, 但是用VC的程式(DDk 中的USBview)卻可以收到DBT_DEVNODES_CHANGED,DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE. 而如果將USB HDD做過partition後,BCB的程式也能收到DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE這兩個訊息了. 不曉得有沒有人碰過這種情況. 當然只收的到DBT_DEVNODES_CHANGED還是能做事,但就麻煩多了. 謝謝. 附上 BCB source: unit1.h : class TForm1 : public TForm { __published: // IDE-managed Components TMemo *Memo_Msg; TCheckBox *CheckBox1; private: // User declarations TWndMethod OldFormWndProc; int __fastcall DeviceChgMsg(TMessage &Message); public: // User declarations __fastcall TForm1(TComponent* Owner); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,DeviceChgMsg) END_MESSAGE_MAP(inherited) }; //------------------------------- unit1.cpp: int __fastcall TForm1::DeviceChgMsg(TMessage &Message) { switch (Message.WParam) { case DBT_DEVICEARRIVAL: Memo_Msg->Lines->Add("新插入了一項裝置!"); break; case DBT_DEVICEREMOVECOMPLETE: Memo_Msg->Lines->Add("卸除了一項裝置!"); break; case DBT_DEVNODES_CHANGED: Memo_Msg->Lines->Add("DBT_DEVNODES_CHANGED"); break; } return 1; }
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-20 12:52:35 IP:210.192.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
tandylo
一般會員


發表:3
回覆:4
積分:1
註冊:2003-09-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-21 12:48:08 IP:61.217.xxx.xxx 未訂閱
自問自答 再仔細看了一下DDK的程式之後,發現原來是因為DDK的程式有多呼叫了RegisterDeviceNotification這個function. 原來是自己沒有把程式看仔細.嘖!耽誤大家的時間了.
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-21 13:10:07 IP:61.228.xxx.xxx 未訂閱
To tandylo:      我對這一點很有興趣, 因為我也是收不到, 而且也找過 很多這個站上的資料; 你說DDK有呼叫RegisterDeviceNotification 這個函數, 你試試看, 我試過, 一樣收不到; 但我實驗的結果 在換CD片時也會發生WM_DEVICECHANGE, 而且DBT_DEVICEARRIVAL 真的收得到, 所以USB裝置, 我不曉得怎麼才收得到, 還是要改 用VC呢? 
tandylo
一般會員


發表:3
回覆:4
積分:1
註冊:2003-09-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-21 16:18:42 IP:61.217.xxx.xxx 未訂閱
在下確實已經試過可以了, 重點就是要在程式init時呼叫RegisterDeviceNotification這個function. 之後message的處理就沒問題了.只是還不清楚有沒有做過partition為何有此差別.因為我以前處理的都是已經partition好的USB HDD. 至於cdrom我就沒碰過了.關於RegisterDeviceNotification的code如下: 
                 HIMAGELIST                      himl;
                HICON                           hicon;
                DEV_BROADCAST_DEVICEINTERFACE   broadcastInterface;                    // Register to receive notification when a USB device is plugged in.
                broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
                broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;                    memcpy( &(broadcastInterface.dbcc_classguid),
                                &(GUID_CLASS_USB_DEVICE),
                                sizeof(struct _GUID));                    gNotifyDevHandle = RegisterDeviceNotification(Handle,
                                                                                                          &broadcastInterface,
                                                                                                          DEVICE_NOTIFY_WINDOW_HANDLE);                    // Now register for Hub notifications.
                memcpy( &(broadcastInterface.dbcc_classguid),
                                &(GUID_CLASS_USBHUB),
                                sizeof(struct _GUID));                    //gNotifyHubHandle = RegisterDeviceNotification(Handle,
                //                                                                                          &broadcastInterface,
                //                                                                                          DEVICE_NOTIFY_WINDOW_HANDLE);    
如有興趣我可以將這個小程式提供出來. 謝謝.
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-21 19:26:55 IP:210.68.xxx.xxx 未訂閱
引言:如有興趣我可以將這個小程式提供出來. 謝謝.
tandylo前輩您好: 歡迎您在[會員作品發表區(限本人創作發表)] http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79 發表您的大作
tandylo
一般會員


發表:3
回覆:4
積分:1
註冊:2003-09-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-21 20:32:51 IP:61.217.xxx.xxx 未訂閱
程式已上傳,請參考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=81695 謝謝.
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-22 14:46:07 IP:210.202.xxx.xxx 未訂閱
To tandylo: 嗯, 沒錯, 可以偵測得到. 一年多前, 我為了這個原因才 找到這裏, 查了些資料來試都沒有成功, 你給的小程式, 忘 了在那位大大的文章已有提過, 只是我還是沒試成功. 感恩啊.
系統時間:2024-11-21 21:19:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!