USB插拔检测程序

一、手动添加ON_WM_DEVICECHANGE()消息

 

二、添加头文件#include <Dbt.h>

三、定义设备的GUID

static const GUID GUID_DEVINTERFACE_LIST[] =
{
    // GUID_DEVINTERFACE_USB_DEVICE     USB设备的GUID
    { 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } }
};

四、注册设备,只有注册了该设备,OnDeviceChange才能获得详细的信息,否则收到的nEventType参数都是0007,dwData无数据。

    HDEVNOTIFY hDevNotify;
    for (int i = 0; i < sizeof(GUID_DEVINTERFACE_LIST) / sizeof(GUID); i++)
    {
        DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
        ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
        NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
        NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
        NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
        hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter,               DEVICE_NOTIFY_WINDOW_HANDLE);
        if( !hDevNotify ) 
        {
            AfxMessageBox(CString("Can't register device notification: ") 
                + _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
            return FALSE;
        }
    }
 

五、添加消息响应函数

声明:afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

定义:

BOOL CDeviceChangeDlg::OnDeviceChange(UINT nEventType,DWORD dwData)
{
    DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
    //针对各个事件进行处理.
    switch (nEventType)
    {
    case DBT_DEVICEREMOVECOMPLETE:
        AfxMessageBox(_T("设备移除"));
            break;
    case DBT_DEVICEARRIVAL:
        AfxMessageBox(_T("设备接入"));
            break;
    default:
        break;
    }

   return TRUE;
}

note:

源码请参考:https://download.csdn.net/download/qq_23565865/10809685
---------------------
作者:小雨滴答滴答
来源:CSDN
原文:https://blog.csdn.net/qq_23565865/article/details/84561017
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/qiwu1314/p/10024784.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 pywin32 库来进行 USB插拔回调。具体步骤如下: 1. 导入必要的库 ``` import win32gui import win32con import win32api ``` 2. 定义回调函数 ``` def usb_callback(hwnd, msg, wparam, lparam): if msg == win32con.WM_DEVICECHANGE: if wparam == win32con.DBT_DEVICEARRIVAL: print('USB插入') elif wparam == win32con.DBT_DEVICEREMOVECOMPLETE: print('USB拔出') ``` 3. 注册回调函数 ``` # 获取当前进程的ID current_process_id = win32api.GetCurrentProcessId() # 创建消息过滤器 filter = win32gui_struct.PackDWORD(win32gui_struct.MakeLong(win32con.DBT_DEVICEARRIVAL, win32con.DBT_DEVICEREMOVECOMPLETE)) # 注册回调函数 win32gui.RegisterDeviceNotification(hwnd, filter, win32con.DEVICE_NOTIFY_WINDOW_HANDLE) ``` 4. 循环消息 ``` # 循环消息 while True: msg = win32gui.GetMessage(None, 0, 0) win32gui.TranslateMessage(msg) win32gui.DispatchMessage(msg) ``` 其中,`hwnd` 是窗口句柄,可以使用 `win32gui.CreateWindowEx` 创建窗口来获取。具体代码可以参考下面的例子: ``` import win32gui import win32con import win32api import win32gui_struct def usb_callback(hwnd, msg, wparam, lparam): if msg == win32con.WM_DEVICECHANGE: if wparam == win32con.DBT_DEVICEARRIVAL: print('USB插入') elif wparam == win32con.DBT_DEVICEREMOVECOMPLETE: print('USB拔出') # 创建窗口 hwnd = win32gui.CreateWindowEx( win32con.WS_EX_LEFT, # 扩展风格 win32gui_struct.EmptyString, # 类名 win32gui_struct.EmptyString, # 标题 win32con.WS_DISABLED, # 样式 0, 0, 0, 0, # 位置和大小 None, None, None, None) # 父窗口、菜单、实例句柄、参数 # 获取当前进程的ID current_process_id = win32api.GetCurrentProcessId() # 创建消息过滤器 filter = win32gui_struct.PackDWORD(win32gui_struct.MakeLong(win32con.DBT_DEVICEARRIVAL, win32con.DBT_DEVICEREMOVECOMPLETE)) # 注册回调函数 win32gui.RegisterDeviceNotification(hwnd, filter, win32con.DEVICE_NOTIFY_WINDOW_HANDLE) # 循环消息 while True: msg = win32gui.GetMessage(None, 0, 0) win32gui.TranslateMessage(msg) win32gui.DispatchMessage(msg) ``` 注意,由于该程序需要不断循环消息,因此需要在程序退出前手动结束循环,否则程序将一直运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值