我想在卸载U盘之前先关闭在内核打开的U盘句柄
在程序中处理OnDeviceChange事件,在DBT_DEVICEREMOVECOMPLETE时做处理,关闭U盘句柄
但点击“安全删除xx盘”后,总是提示资源正在使用之类的。
但如果在程序中手动执行先关闭内核打开的U盘句柄,再安全删除则正常
现在处理看来只能在OnDeviceChange的DBT_DEVICEREMOVECOMPLETE之前处理了。
查MSDN,可以看到DBT_DEVICEQUERYREMOVE、DBT_DEVICEQUERYREMOVEFAILED好像可以提前处理,但我在相应的事件下面弹出提示信息,结果这几个事件都不会执行。只能捕获到U盘的插入DBT_DEVICEARRIVAL、和删除完成DBT_DEVICEREMOVECOMPLETE,其它都不会执行。
好像有个消息预处理是不是可以提前处理?大家给点意见或思路,谢谢~

解决方案 »

  1.   

    在windowproc函数中检查DBT_DEVICEREMOVECOMPLETE,并做相应处理
      

  2.   

    感觉很奇怪,MSDN上写的几条只有两条能捕获,其它的都没反应
     
    得到拨出消息的时候,其实已经执行完了
      

  3.   

    再换一种方法描述下我的问题:
    比如你打开一个U盘里的1.txt,这时候你再去点“安全删除U盘”,就会提示“现在无法停止 通用卷 设备。请稍候再停止该设备”
    而我要做的是,在获得点击删除U盘事件之前,把这个文件关闭掉,再删除。这时就可以正常卸载U盘了。
    但我在PreTranslateMessage里处理,不起作用
    BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
    {
    // 预处理拔出U盘
    if (pMsg->message == WM_DEVICECHANGE && pMsg->wParam == DBT_DEVICEREMOVECOMPLETE)
    {
    AfxMessageBox(L"即将拔出U盘\n请关闭正在操作的U盘文件");
    return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    你用sky++ 看看到底这些消息发了没有,是不是给别人吃了.
      

  5.   


    MARK,关注,我也对这个感到疑惑
      

  6.   

    现在发现这个消息是系统已经处理完后才发出来的,广播给每个进程(可能是这种,不确定)
    如果有打开的东西没关闭,这时点卸载,程序还没接到卸载消息,系统就先弹出“现在无法停止 通用卷 设备。请稍候再停止该设备” 对话框了。
    在网上看到处理流程:
    发现点由下图标的 “安全删除硬件” 时候, explorer会调用 rundll32.exe 。。接着实现功能是在一个DLL中。hotplug.dll. 接着到 HotPlugEjectVetoedW    HandleVetoedOperation   HotPlugEjectDevice 调用CM系统函数。DDK有相关函数在 cfgmgr32.h定义。
    CM_Locate_DevNode 函数获得设备节点的设备实例句柄,关联本机指定的设备实例标识符。
    http://hi.baidu.com/sysnap/blog/item/70bafb316c4d8e12ebc4affa.html
      

  7.   

    DBT_DEVICEQUERYREMOVE要注册一下,才能接收到