首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测USB驱动器是否已插入?

如何检测USB驱动器是否已插入?
EN

Stack Overflow用户
提问于 2011-05-15 02:05:01
回答 2查看 105.2K关注 0票数 60

我想构建一个程序来检测usb (或两个或更多)是否插入(并将所有内容复制到硬盘上的任何文件夹中)

有什么想法吗?我有这个,

代码语言:javascript
复制
using System.Runtime.InteropServices;

但这并不是一种简单的方式(我相信)。我想要简单的东西。

我有另一个想法(如果(文件夹存在)然后复制)一些东西--但可能会有问题,我想要一个好的解决方案。

可能还有一个叫SerialPort的工具;我可以使用它吗?如果是这样,我该如何使用它?

EN

回答 2

Stack Overflow用户

发布于 2012-10-17 19:09:43

这是一个适用于我的代码,它是上面网站的一部分,结合了我早期的试验:http://www.codeproject.com/KB/system/DriveDetector.aspx

这基本上使你的表单监听windows消息,过滤usb驱动器和(cd-dvd),抓取消息的lparam结构并提取驱动器号。

代码语言:javascript
复制
protected override void WndProc(ref Message m)
    {

        if (m.Msg == WM_DEVICECHANGE)
        {
            DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
            if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) &&  (vol.dbcv_devicetype == DBT_DEVTYPVOLUME) )
            {
                MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
            }
            if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
            {
                MessageBox.Show("usb out");
            }
        }
        base.WndProc(ref m);
    }

    [StructLayout(LayoutKind.Sequential)] //Same layout in mem
    public struct DEV_BROADCAST_VOLUME
    {
        public int dbcv_size;
        public int dbcv_devicetype;
        public int dbcv_reserved;
        public int dbcv_unitmask;
    }

    private static char DriveMaskToLetter(int mask)
    {
        char letter;
        string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C
        int cnt = 0;
        int pom = mask / 2;
        while (pom != 0)    // while there is any bit set in the mask shift it right        
        {        
            pom = pom / 2;
            cnt++;
        }
        if (cnt < drives.Length)
            letter = drives[cnt];
        else
            letter = '?';
        return letter;
    }

不要忘了添加以下内容:

代码语言:javascript
复制
using System.Runtime.InteropServices;

和以下常量:

代码语言:javascript
复制
    const int WM_DEVICECHANGE = 0x0219; //see msdn site
    const int DBT_DEVICEARRIVAL = 0x8000;
    const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
    const int DBT_DEVTYPVOLUME = 0x00000002;  
票数 13
EN

Stack Overflow用户

发布于 2012-02-19 21:22:00

Microsoft API代码包。ShellObjectWatcher类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6003822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档