我有以下代碼檢測基於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?
是否觸發了任何事件? - 在您的WmdProc方法中加入一個BP,以查看是否發生了任何... – Faraday
請參閱上面的編輯... –
我遇到了同樣的問題。 WM_DEVICECHANGE即將到來,但僅限於代碼DBT_DEVNODES_CHANGED。 用谷歌搜索這個問題引導我到這個職位。我的問題是檢測到USB串行設備的到達和移除,以安全地打開/關閉串行端口並分配/釋放資源。有人告訴我,將PretranslateMessage替換爲直接消息映射可以解決Vista/7中的這個問題,但是由於我使用overriden「nativeEvent」方法,所以我無法檢查它是否適用於我的Qt 5.1項目。 – aiss83