2014-02-09 96 views
3

我訂閱了通知::RegisterDeviceNotification()msdn)。處理完一些細節後(消息WM_DEVICECHANGEmsdn)等),我有DEV_BROADCAST_DEVICEINTERFACEmsdn)結構。檢測手機或相機的插入

例如,我如何知道插入的設備是手機還是照相機?

我使用Google搜索 Windows便攜式設備msdn)。可以使用DEV_BROADCAST_DEVICEINTERFACE::dbcc_name作爲IPortableDevice::Openmsdn)的參數。有了這個有可能獲得一個設備(msdn)的 「支持」 的內容的列表,例如:

  • WPD_CONTENT_TYPE_IMAGE
  • WPD_CONTENT_TYPE_AUDIO
  • WPD_CONTENT_TYPE_PLAYLIST
  • WPD_CONTENT_TYPE_VIDEO
  • WPD_CONTENT_TYPE_DOCUMENT
  • WPD_CONTENT_TYPE_UNSPECIFIED
  • WPD_CONTENT_TYPE_FOLDER

但我不知道,例如,相機只支持WPD_CONTENT_TYPE_VIDEOWPD_CONTENT_TYPE_IMAGEWPD_CONTENT_TYPE_FOLDER

另一個框架是 Windows圖像採集msdn),但這個東西沒有看到手機(只有掃描儀,也許是別的東西,我不知道)。

+0

你問什麼硬件供應商決定支持?這就是您獲得支持內容列表的原因。 Cach供應商可以選擇他們將要支持的內容,但沒有任何魔術組合。 – Dan

+0

不,我問 - 有沒有辦法檢測手機和相機插入。因爲知道 - 我不知道如何看到他們之間的差異。 Everithing我知道的是,用戶插入設備,它是一個媒體設備.. – grisha

回答

0

例如,如果您有無線鼠標。當您打開鼠標的電源時,它會嘗試將其自身連接到軟件狗或藍牙等。如果這些設備當前未安裝,則必須首先添加它們。觸發器向後倒轉設備鏈,直到通電/斷電事件被有效的USB驅動程序處理。

然後每個階段必須添加一個驅動程序到USB堆棧來處理該設備。堆棧建立回到最後的終點。您將收到每個添加到堆棧的USB驅動程序的通知。但是,您將通過驅動程序初始化異步接收通知。因此,不保證設備在您收到通知時可以使用。

由於這個原因,在通知時確定哪些設備已被添加是不可能的。但是你確實得到了關於類型的信息。

查明設備具體含義的正確方法是枚舉機器上的USB設備。不過要小心。如果您快速列舉,您將錯過剛剛添加的設備。

一個可靠的方法是在收到枚舉機器上的USB設備的通知後等待幾毫秒甚至幾秒鐘。例如,如果手機要求將3個驅動程序添加到堆棧中,則需要等待直到收到全部3個通知,然後等待這3個驅動程序已經初始化,然後手機纔會顯示在枚舉中。

枚舉包括查找註冊表中存在的guid。在驅動程序初始化完成之前,條目不會被添加,然後驅動程序可以向硬件請求其Identifid guid。然後guid被插入到註冊表中。不幸的是,註冊表中的位置對於不同風格的窗口是不同的。

有關windows7的參考資料,請查看HKLM \ SYSTEM \ CurrentControlSet \ Enum \ USB ... 您會看到每臺插入該設備的設備的列表。每個VID_xxxx和PID_xxxx對都是不同的設備。

枚舉「活動」USB設備並插入機器的最佳方法是通過Windows Management Instrumentation。在駕駛員有時間識別設備後,在適當的時間觸發此設置。然後在枚舉回調中檢查VID,PID,製造商,設備名稱等,看看它是否是你想要的。

對不起,我找不到Windows SDK示例,但這裏是一個很好的起點,它展示瞭如何枚舉USB設備以查看是否是XInputDevice。你會想要替換VID和PID,並檢查你想要的設備:http://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx

是的,這可能更簡單,但嘿,如果它很簡單,每個人都會這樣做。

祝你好運!

+0

另一個關鍵點。如果您不讓主線程通過GetMessage()/ PeekMessage()返回,那麼驅動程序堆棧可能無法及時獲得。您應該設置一些內部倒數計時器來觸發枚舉並立即返回。 – Dan