關於WM_DEVICECHANGE的問題 |
尚未結案
|
tandylo
一般會員 發表:3 回覆:4 積分:1 註冊:2003-09-26 發送簡訊給我 |
各位大大好:
小弟經常用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 發送簡訊給我 |
|
tandylo
一般會員 發表:3 回覆:4 積分:1 註冊:2003-09-26 發送簡訊給我 |
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
|
tandylo
一般會員 發表:3 回覆:4 積分:1 註冊:2003-09-26 發送簡訊給我 |
在下確實已經試過可以了, 重點就是要在程式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 發送簡訊給我 |
引言:如有興趣我可以將這個小程式提供出來. 謝謝.tandylo前輩您好: 歡迎您在[會員作品發表區(限本人創作發表)] http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79 發表您的大作 |
tandylo
一般會員 發表:3 回覆:4 積分:1 註冊:2003-09-26 發送簡訊給我 |
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |