关于USB设备插入的问题

wlk2002 2005-03-05 09:22:03
当有USB设备(如U盘)插入时,Windows产生什么消息?
比如:当U盘插入时,Windows会运行自动播放。
谢谢~
...全文
302 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
neilxp 2005-04-09
  • 打赏
  • 举报
回复
// der_USB_Dieb.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"

#include <setupapi.h>

#include <regstr.h>
#include <winbase.h>

#include <Dbt.h>

LPVOID pszMySharedMapView;

char FirstDriveFromMask (ULONG unitmask)
{
char i;

for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}

return (i + 'A');
}

void DeviceChangeEventOpt(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
// case DBT_CONFIGCHANGECANCELED:
// MessageBox(NULL,"设备改变DBT_CONFIGCHANGECANCELED","提示",MB_OK);
// break;
// case DBT_CONFIGCHANGED:
// MessageBox(NULL,"设备改变DBT_CONFIGCHANGED","提示",MB_OK);
// break;
// case DBT_CUSTOMEVENT:
// MessageBox(NULL,"设备改变DBT_CUSTOMEVENT","提示",MB_OK);
// break;
case DBT_DEVICEARRIVAL: // A device has been inserted and is now available.

// MessageBox(NULL,"设备改变DBT_DEVICEARRIVAL","提示",MB_OK);

DEV_BROADCAST_HDR *stHDR;
stHDR = (DEV_BROADCAST_HDR *)lParam;

//判断设备类型
switch(stHDR->dbch_devicetype)
{
// case DBT_DEVTYP_DEVICEINTERFACE:
// MessageBox(NULL,"设备类型 DBT_DEVTYP_DEVICEINTERFACE","提示",MB_OK);
// break;
// case DBT_DEVTYP_HANDLE:
// MessageBox(NULL,"设备类型 DBT_DEVTYP_HANDLE","提示",MB_OK);
// break;
// case DBT_DEVTYP_OEM:
// MessageBox(NULL,"设备类型 DBT_DEVTYP_OEM","提示",MB_OK);
// break;
// case DBT_DEVTYP_PORT:
// MessageBox(NULL,"设备类型 DBT_DEVTYP_PORT","提示",MB_OK);
// break;
case DBT_DEVTYP_VOLUME:// Logical volume. This structure is a DEV_BROADCAST_VOLUME structure
DEV_BROADCAST_VOLUME *lpdbv=(DEV_BROADCAST_VOLUME *)&stHDR;
char szPath[_MAX_PATH]={0};

sprintf(szPath,"%c,%lx",
FirstDriveFromMask(lpdbv ->dbcv_unitmask),lpdbv->dbcv_flags);
MessageBox(NULL,szPath,"提示",MB_OK);
break;
}
//

break;
// case DBT_DEVICEQUERYREMOVE:
// MessageBox(NULL,"设备改变DBT_DEVICEQUERYREMOVE","提示",MB_OK);
// break;
// case DBT_DEVICEQUERYREMOVEFAILED:
// MessageBox(NULL,"设备改变DBT_DEVICEQUERYREMOVEFAILED","提示",MB_OK);
// break;
// case DBT_DEVICEREMOVECOMPLETE:// A device has been removed.
// MessageBox(NULL,"设备改变DBT_DEVICEREMOVECOMPLETE","提示",MB_OK);
// break;
// case DBT_DEVICEREMOVEPENDING://
// MessageBox(NULL,"设备改变DBT_DEVICEREMOVEPENDING","提示",MB_OK);
// break;
// case DBT_DEVICETYPESPECIFIC://
// MessageBox(NULL,"设备改变DBT_DEVICETYPESPECIFIC","提示",MB_OK);
// break;
// case DBT_QUERYCHANGECONFIG:
// MessageBox(NULL,"设备改变DBT_QUERYCHANGECONFIG","提示",MB_OK);
// break;
// case DBT_USERDEFINED ://
// MessageBox(NULL,"设备改变DBT_USERDEFINED","提示",MB_OK);
// break;

}

// PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
// char szMsg[80];
//
// switch(wParam)
// {
// case DBT_DEVICEARRIVAL:
// // Check whether a CD or DVD was inserted into a drive.
// if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
// {
// PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
//
// if (lpdbv -> dbcv_flags & DBTF_MEDIA)
// {
// sprintf (szMsg, "Drive %c: Media has arrived.\n",
// FirstDriveFromMask(lpdbv ->dbcv_unitmask));
//
// MessageBox (NULL, szMsg, "WM_DEVICECHANGE", MB_OK);
// }
// }
// break;
//
// case DBT_DEVICEREMOVECOMPLETE:
// // Check whether a CD or DVD was removed from a drive.
// if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
// {
// PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
//
// if (lpdbv -> dbcv_flags & DBTF_MEDIA)
// {
// sprintf (szMsg, "Drive %c: Media was removed.\n",
// FirstDriveFromMask(lpdbv ->dbcv_unitmask));
//
// MessageBox (NULL, szMsg, "WM_DEVICECHANGE", MB_OK);
// }
// }
// break;
//
// default:
// /*
// Process other WM_DEVICECHANGE notifications for other
// devices or reasons.
// */
// ;
// }

}



INT_PTR CALLBACK DialogProc( HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg) {
case WM_INITDIALOG:
{
//only one instance
HANDLE hInstanceMap=CreateFileMapping(((HANDLE)0xFFFFFFFF),
NULL,PAGE_READWRITE,0,0x10,"der USB Dieb");

if (hInstanceMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(hDlg,"ALREADY_EXISTS","exit",MB_ICONEXCLAMATION|MB_OK);
CloseHandle(hInstanceMap);
hInstanceMap = NULL;
PostMessage(hDlg,WM_CLOSE,0,0);
return TRUE;
}
pszMySharedMapView=MapViewOfFile(hInstanceMap,FILE_MAP_READ|FILE_MAP_WRITE
,0,0,0);
//sprintf(pszMySharedMapView,"%d");
//CopyMemory(pszMySharedMapView,&hDlg,sizeof(hDlg));
sprintf((PCHAR)pszMySharedMapView,"%lx",(long)hDlg);

//Setup USB message receiver
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
DWORD Err;

ZeroMemory( ¬ificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size =
sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
//NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;

HANDLE hDevNotify = RegisterDeviceNotification( GetModuleHandle(NULL),
¬ificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE
);

if(!hDevNotify)
{
Err = GetLastError();
PostMessage(hDlg,WM_CLOSE,0,0);
return TRUE;
}

return TRUE;
}
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDOK:
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
}
return TRUE;

case WM_NCPAINT :
//Hide window
ShowWindow(hDlg,SW_HIDE);
return TRUE;
break;
// case WM_DESTROY :
case WM_NCDESTROY :
MessageBox(hDlg,"WM_DESTROY","exit",MB_ICONEXCLAMATION|MB_OK);
if (!UnmapViewOfFile(pszMySharedMapView))
{}
return TRUE;
break;
case WM_DEVICECHANGE:
DeviceChangeEventOpt(wParam,lParam);
return TRUE;
}
return FALSE;
}


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ret=DialogBoxParam (hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,(DLGPROC)DialogProc,0);

return(ret != IDOK);
}



zsb_xt 2005-03-06
  • 打赏
  • 举报
回复
WM_DEVICECHANGE

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧