weixin_44568349 2023-02-20 11:16 采纳率: 0%
浏览 26

WM_DEVICECHANGE无法捕捉到MTP

windows枚举MTP设备
为什么WM_DEVICECHANGE无法捕捉到MTP设备的接入信息?
是我SetupNotifications没有注册吗?但我找不到MTP的GUID
还是有其他方法处理这个问题?
谢谢各位!

  • 写回答

2条回答 默认 最新

  • 提着裤子去拉屎 2023-02-20 11:24
    关注

    WM_DEVICECHANGE消息可以用于捕获USB设备插入和拔出的消息,但是MTP设备在插入时不会触发此消息。这是因为MTP设备不是一个标准的USB存储设备,而是使用基于USB的MTP协议进行通信。

    如果您想枚举MTP设备,可以使用Windows Portable Devices(WPD)API。WPD API提供了一组函数,可以用于检测和枚举连接到计算机上的MTP设备。您可以使用WPD API中的IPortableDeviceManager::GetDevices方法获取连接到计算机上的所有MTP设备的设备ID。

    以下是一个示例代码片段,使用WPD API检测和枚举连接到计算机上的MTP设备:

    #include <Windows.h>
    #include <PortableDeviceApi.h>
    #include <PortableDevice.h>
    #include <vector>
    
    int main()
    {
        HRESULT hr;
        hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    
        // Create the IPortableDeviceManager interface
        IPortableDeviceManager* pPortableDeviceManager;
        hr = CoCreateInstance(CLSID_PortableDeviceManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pPortableDeviceManager));
    
        // Get the list of devices
        DWORD dwNumDevices = 0;
        WCHAR** ppDevices = NULL;
        hr = pPortableDeviceManager->GetDevices(NULL, &dwNumDevices);
    
        if (hr == S_OK && dwNumDevices > 0)
        {
            ppDevices = new WCHAR*[dwNumDevices];
            hr = pPortableDeviceManager->GetDevices(ppDevices, &dwNumDevices);
    
            for (DWORD dwIndex = 0; dwIndex < dwNumDevices; dwIndex++)
            {
                // Create the IPortableDevice interface
                IPortableDevice* pPortableDevice;
                hr = CoCreateInstance(CLSID_PortableDeviceFTM, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pPortableDevice));
    
                // Open the device
                hr = pPortableDevice->Open(ppDevices[dwIndex], NULL);
    
                // Use the device
    
                // Close the device
                pPortableDevice->Close();
                pPortableDevice->Release();
            }
        }
    
        // Clean up
        if (ppDevices != NULL)
        {
            for (DWORD dwIndex = 0; dwIndex < dwNumDevices; dwIndex++)
            {
                CoTaskMemFree(ppDevices[dwIndex]);
            }
            delete[] ppDevices;
        }
        pPortableDeviceManager->Release();
        CoUninitialize();
    
        return 0;
    }
    
    
    

    您需要在代码中添加相应的头文件和库,以及在连接到MTP设备之前初始化COM库和释放COM库。此外,需要添加错误检查和错误处理代码来处理潜在的错误。有用望采纳

    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日

悬赏问题

  • ¥15 机器学习预测遇到的目标函数问题
  • ¥15 python的EOFError该怎么解决?
  • ¥15 Fluent,液体进入旋转区域体积分数不连续
  • ¥15 java linux下将docx文件转pdf
  • ¥15 maven无法下载依赖包
  • ¥15 关于pycharm, Callable[[str],bool]作为方法参数使用时, lambda 类型不提示问题
  • ¥15 layui数据重载无效
  • ¥15 寻找了解qq家园纵横四海的程序猿。
  • ¥15 optisystem
  • ¥15 VB.NET画图时的撤销编程