2012-06-14 72 views
0

我有以下代碼檢測基於Prolific串行的USB設備的到來和刪除。在Windows中刪除USB設備8

protected override void WndProc(ref Message m) 
    { 
     DBT changeType = (DBT)m.WParam; 
     string portName; 

     if (m.Msg == WM_DEVICECHANGE)// && changeType != DBT.OTHER) 
     { 
      switch (changeType) 
      { 
       case DBT.DEVICEREMOVAL: 
        portName = Marshal.PtrToStringAuto((IntPtr)((long)m.LParam + 12)); 
        // Device Removal 
        break; 
       case DBT.DEVICEARRIVAL: 
        portName = Marshal.PtrToStringAuto((IntPtr)((long)m.LParam + 12)); 
        // Device Arrival 
        break; 
      } 
     } 

     base.WndProc(ref m); 
    } 

    enum DBT 
    { 
     DEVICEARRIVAL = 0x8000, 
     DEVICEREMOVAL = 0x8004, 
     OTHER = 0x0007, 
    } 

我的問題是,它似乎在Windows 8中永遠不會發送去除事件?此代碼完美適用於WinXp,Win2000,Vista & Win7。

在插入和移除設備時監控消息後,Win8似乎永遠不會傳遞正確的移除消息?

下面是結果在Win8下:

檢測:

HWnd=1770298, LParam=0, WParam=7, Result=0, Msg=537 
HWnd=1770298, LParam=98820448, WParam=32768, Result=0, Msg=537 
HWnd=1770298, LParam=0, WParam=7, Result=0, Msg=537 

去除:

HWnd=1770298, LParam=0, WParam=7, Result=0, Msg=537 

我很期待:

檢測:

HWnd=590440, LParam=0, WParam=7, Result=0, Msg=537 
HWnd=590440, LParam=1241588, WParam=32768, Result=0, Msg=537 
HWnd=590440, LParam=0, WParam=7, Result=0, Msg=537 

去除:

HWnd=590440, LParam=0, WParam=7, Result=0, Msg=537 
HWnd=590440, LParam=1241588, WParam=32772, Result=0, Msg=537 

這最後一條消息從未到達的Win8?

+1

是否觸發了任何事件? - 在您的WmdProc方法中加入一個BP,以查看是否發生了任何... – Faraday

+0

請參閱上面的編輯... –

+0

我遇到了同樣的問題。 WM_DEVICECHANGE即將到來,但僅限於代碼DBT_DEVNODES_CHANGED。 用谷歌搜索這個問題引導我到這個職位。我的問題是檢測到USB串行設備的到達和移除,以安全地打開/關閉串行端口並分配/釋放資源。有人告訴我,將PretranslateMessage替換爲直接消息映射可以解決Vista/7中的這個問題,但是由於我使用overriden「nativeEvent」方法,所以我無法檢查它是否適用於我的Qt 5.1項目。 – aiss83

回答

0

我已經通過修改我的USB串行驅動程序來解決這個問題。 在標準usbser.sys上添加Upper Filter'serenum.sys'有助於正確配置,所以問題消失了。

有些事情是這樣的。來自生產代碼的示例。

[Version] 
Signature="$Windows NT$" 
Class=Ports 
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} 
Provider=%MFGNAME% 
LayoutFile=layout.inf 
CatalogFile=%MFGFILENAME%.cat 
DriverVer=08/29/2013,5.1.2600.10 


[Manufacturer] 
%MFGNAME%=DeviceList, NTamd64 

[SourceDisksNames] 

[DestinationDirs] 
DefaultDestDir=12 

;------------------------------------------------------------------------------ 
; Windows 2000/XP/Vista-32bit Sections 
;------------------------------------------------------------------------------ 
[DriverInstall.nt] 
include=mdmcpq.inf 
CopyFiles=DriverCopyFiles.nt 
AddReg=DriverInstall.nt.AddReg 

[DriverInstall.nt.HW] 
AddReg=DriverInstall.nt.HW.AddReg 

[DriverInstall.nt.HW.AddReg] 
HKR,,NTMPDriver,,*ntkern 
HKR,,NTMPDriver,,usbser.sys 
HKR,,PortSubClass, 0x00010000, "01" 
HKR,,"UpperFilters",0x00010000,"serenum" 

[DriverCopyFiles.nt] 
usbser.sys,,,0x20 
serenum.sys,,,0x20 

[DriverInstall.nt.AddReg] 
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" 

[DriverInstall.nt.Services] 
AddService=usbser, 0x00000002, DriverService.nt 
AddService=serenum, 0x00000000, SerenumService.nt 

[DriverService.nt] 
DisplayName="Driver name" 
ServiceType=1 
StartType=3 
ErrorControl=1 
ServiceBinary=%12%\%DRIVERFILENAME%.sys 
LoadOrderGroup = Base 

[SerenumService.nt] 
DisplayName="Filter name" 
ServiceType=1 
StartType=3 
ErrorControl=1 
ServiceBinary=%12%\serenum.sys 
LoadOrderGroup = PNP Filter 

;------------------------------------------------------------------------------ 
; Vista-64bit Sections 
;------------------------------------------------------------------------------ 

[DriverInstall.NTamd64] 
include=mdmcpq.inf 
CopyFiles=DriverCopyFiles.NTamd64 
AddReg=DriverInstall.NTamd64.AddReg 

[DriverCopyFiles.NTamd64] 
usbser.sys,,,0x20 
serenum.sys,,,0x20 

[DriverInstall.NTamd64.AddReg] 
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" 

[DriverInstall.NTamd64.Services] 
AddService=usbser, 0x00000002, DriverService.NTamd64 
AddService=serenum, 0x00000000, SerenumService.NTamd64 

[DriverService.NTamd64] 
DisplayName="Driver display name" 
ServiceType=1 
StartType=3 
ErrorControl=1 
ServiceBinary=%12%\usbser.sys 

[DriverInstall.NTamd64.HW] 
AddReg=DriverInstall.nt.HW.AddReg 

[DriverInstall.NTamd64.HW.AddReg] 
HKR,,NTMPDriver,,*ntkern 
HKR,,NTMPDriver,,usbser.sys 
HKR,,PortSubClass, 0x00010000, "01" 
HKR,,"UpperFilters",0x00010000,"serenum" 

[SerenumService.NTamd64] 
DisplayName="Filter display name" 
ServiceType=1 
StartType=3 
ErrorControl=1 
ServiceBinary=%12%\serenum.sys 

;------------------------------------------------------------------------------ 
; Vendor and Product ID Definitions 
;------------------------------------------------------------------------------ 
; When developing your USB device, the VID and PID used in the PC side 
; application program and the firmware on the microcontroller must match. 
; Modify the below line to use your VID and PID. Use the format as shown below. 
; Note: One INF file can be used for multiple devices with different VID and PIDs. 
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. 
;------------------------------------------------------------------------------ 
;[SourceDisksFiles] 
;[SourceDisksNames] 

[DeviceList] 
%DESCRIPTION%=DriverInstall, USB\VID_XXXX&PID_XXXX 

[DeviceList.NTamd64] 
%DESCRIPTION%=DriverInstall, USB\VID_XXXX&PID_XXXX 

;------------------------------------------------------------------------------ 
; String Definitions 
;------------------------------------------------------------------------------ 
;Modify these strings to customize your device 
;------------------------------------------------------------------------------ 
[Strings] 
FullCompanyName="Your company name" 
FullProductName="Your product name" 
ShortProductName="Short name" 
MFGFILENAME="FileName" 
DRIVERFILENAME ="usbser" 
MFGNAME="Manufacturer name" 
INSTDISK="Installation disk" 
DESCRIPTION="Description of the driver" 
SERVICE="Name of the serenum service" 

您可以檢查Prolific驅動程序來查找這些部分。以及我發現他們,他們使用上部過濾器和Serenum,因此設備插入檢測成功。你也可以從Prolific檢查新的驅動程序。

+0

'serenum'會導致很多其他問題,例如Windows自動爲非鼠標設備加載鼠標驅動程序。我已經看到[其他USB串行驅動程序提供了「驚喜消除事件」配置設置](http://www.ftdichip.com/Support/Knowledgebase/index.html?eventonsurpriseremoval.htm),所以這肯定是在你在自己的驅動程序中的控制。 –

+0

謝謝,本。 我會爲未來的設備編寫自己的驅動程序。使用USB CDC允許我們在Windows,Linux和Mac OS X上使用設備,而不會產生嚴重的費用。 Linux和Mac OS檢測到我們的設備是'tty',只有Windows需要驅動程序。 – aiss83

+0

基於「修改我的usb串行驅動程序」我以爲你的意思是你寫的。無論如何,'serenum'是麻煩。 –