Click here to Skip to main content
12,073,325 members (71,720 online)
Click here to Skip to main content
Add your own
alternative version

Stats

69.6K views
2.4K downloads
52 bookmarked
Posted

Detecting when drives are added or removed

, 4 Jul 2007 CPOL
Rate this:
Please Sign up or sign in to vote.
Dealing with the WM_DEVICECHANGE message to detect volumes being added or removed.

Screenshot - Drive_Detect.jpg

Introduction

This is possibly my smallest article, and just shows a method of detecting when drives are added to or removed from the system. What you do with that information is up to you!

Background

I was answering a question from Akin Ocal yesterday, when Matthew Faithful came up with a much deeper answer than mine.

In a fit of pique / curiosity, I thought I'd come up with a different way of doing what he described, using Windows messages to do the heavy lifting. As I had to do a bit of digging from barely remembered details, I thought I'd share the work with others.

Using the code

I created a blank MFC dialog project, and added a handler for WM_DEVICECHANGE. The MFC handler structure exists, but it could not be added with the Class Wizard, so I typed it in manually.

ON_WM_DEVICECHANGE ()

I then added the actual handler, which does nothing except log the fact that a drive has been added or removed.

BOOL CDriveDetectDlg::OnDeviceChange( UINT nEventType, DWORD dwData )
{
    BOOL bReturn = CWnd::OnDeviceChange (nEventType, dwData);

    DEV_BROADCAST_VOLUME *volume = (DEV_BROADCAST_VOLUME *)dwData;
    CString log;

    if (nEventType == DBT_DEVICEARRIVAL)
    {
        if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
        {
            for (int n = 0; n < 32; n++)
            {
                if (IsBitSet (volume->dbcv_unitmask, n))
                {
                    log.Format ("Drive %c: Inserted\n", n + 'A');
                    m_DetectLog.AddString (log);
                }
            }
        }
    }

    if (nEventType == DBT_DEVICEREMOVECOMPLETE)
    {
        if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
        {
            for (int n = 0; n < 32; n++)
            {
                if (IsBitSet (volume->dbcv_unitmask, n))
                {
                    log.Format ("Drive %c: Removed\n", n + 'A');
                    m_DetectLog.AddString (log);
                }
            }
        }
    }

    return bReturn;
}

As you can see, there's not a vast amount of code for the job.

Updates

  • 27/6/2007 - Little drive icons added next to the drives being added / removed. The credit for steering me in the right direction (and providing some code for me to steal^h^h^h^h^hreuse) goes to dgendreau.
  • 20/6/2007 - Original version posted.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Iain Clarke, Warrior Programmer
Software Developer (Senior)
Sweden Sweden
I have now moved to Sweden for love, and recently married a lovely Swede.


-----------------
I started programming on BBC micros (6502) when I was six and never quite stopped even while I was supposed to be studying physics and uni.

I've been working for ~13 years writing software for machine control and data analysis. I now work on financial transaction transformation software, for a Software company in Gamlastan, Stockholm.
Look at my articles to see my excellent coding skills. I'm modest too!

You may also be interested in...

Comments and Discussions

 
GeneralMy vote of 5 Pin
manoj kumar choubey18-Feb-12 1:02
membermanoj kumar choubey18-Feb-12 1:02 
QuestionThis code does exactly what I need but the problem is with the MFC components used in it. I need to write the code in Embarcadero c++ builder, can anybody provide suggestions about how to modify the code? Pin
lilyNaz25-Oct-11 21:15
memberlilyNaz25-Oct-11 21:15 
AnswerRe: This code does exactly what I need but the problem is with the MFC components used in it. I need to write the code in Embarcadero c++ builder, can anybody provide suggestions about how to modify the code? Pin
Iain Clarke, Warrior Programmer12-Dec-11 5:27
memberIain Clarke, Warrior Programmer12-Dec-11 5:27 
GeneralShame : copy from MSDN ... Pin
kilt9-Oct-09 0:32
memberkilt9-Oct-09 0:32 
GeneralRe: Shame : copy from MSDN ... Pin
Iain Clarke, Warrior Programmer13-Oct-09 5:31
mvpIain Clarke, Warrior Programmer13-Oct-09 5:31 
GeneralRe: Shame : copy from MSDN ... Pin
pnswdv5-Aug-14 6:11
memberpnswdv5-Aug-14 6:11 
QuestionFound a bug on Win2000 Pin
wangk070529-Dec-07 3:54
memberwangk070529-Dec-07 3:54 
GeneralRe: Found a bug on Win2000 Pin
Iain Clarke1-Feb-08 4:55
memberIain Clarke1-Feb-08 4:55 
GeneralDBT_DEVICEQUERYREMOVE support Pin
64BitWho12-Oct-07 2:13
member64BitWho12-Oct-07 2:13 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
Iain Clarke12-Oct-07 5:12
memberIain Clarke12-Oct-07 5:12 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
64BitWho12-Oct-07 5:48
member64BitWho12-Oct-07 5:48 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
64BitWho13-Oct-07 5:23
member64BitWho13-Oct-07 5:23 
QuestionRe: DBT_DEVICEQUERYREMOVE support Pin
Member 43522244-Sep-08 3:10
memberMember 43522244-Sep-08 3:10 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
Member 43522244-Sep-08 3:20
memberMember 43522244-Sep-08 3:20 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
Iain Clarke7-Sep-08 23:40
memberIain Clarke7-Sep-08 23:40 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
Iain Clarke7-Sep-08 23:43
memberIain Clarke7-Sep-08 23:43 
GeneralRe: DBT_DEVICEQUERYREMOVE support Pin
Member 43522248-Sep-08 0:52
memberMember 43522248-Sep-08 0:52 
JokeRe: DBT_DEVICEQUERYREMOVE support Pin
Member 229365217-Sep-09 19:23
memberMember 229365217-Sep-09 19:23 
QuestionWM_DEVICECHANGE Ok! But what about Linux? Pin
PeterShilkin12-Jul-07 2:11
memberPeterShilkin12-Jul-07 2:11 
AnswerRe: WM_DEVICECHANGE Ok! But what about Linux? Pin
Iain Clarke14-Jul-07 4:53
memberIain Clarke14-Jul-07 4:53 
GeneralMissing file Pin
XaRoP4-Jul-07 8:08
memberXaRoP4-Jul-07 8:08 
GeneralRe: Missing file Pin
Iain Clarke4-Jul-07 11:35
memberIain Clarke4-Jul-07 11:35 
GeneralRe: Missing file Pin
Iain Clarke4-Jul-07 23:21
memberIain Clarke4-Jul-07 23:21 
QuestionWhat about insert devices Pin
VC Spark3-Jul-07 3:28
memberVC Spark3-Jul-07 3:28 
AnswerRe: What about insert devices Pin
Iain Clarke3-Jul-07 5:16
memberIain Clarke3-Jul-07 5:16 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160208.1 | Last Updated 5 Jul 2007
Article Copyright 2007 by Iain Clarke, Warrior Programmer
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid