by あひる » 2008年4月09日(水) 00:03
ただネット上のサンプルを無理やり移したものですが、参考になりますでしょうか。
以下のコードはUSBのマウスの着脱(?)を知らせてくれるものです。
まず以下を定義します。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
TypeDef HDEVNOTIFY = VoidPtr
Type DEV_BROADCAST_DEVICEINTERFACE
dbcc_size As DWord
dbcc_devicetype As DWord
dbcc_reserved As DWord
dbcc_classguid As GUID
dbcc_name[1] As Char
End Type
Type PDEV_BROADCAST_HDR
dbch_size As DWord
dbch_devicetype As DWord
dbch_reserved As DWord
End Type
Declare Function RegisterDeviceNotification Lib "User32.dll" Alias "RegisterDeviceNotificationA" (hRecipient As HANDLE, ByRef NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE, Flags As DWord) As HDEVNOTIFY
Declare Function UnregisterDeviceNotification Lib "User32.dll" (hDevNotify As HDEVNOTIFY) As Long
Const DBT_DEVTYP_DEVICEINTERFACE = &h00000005
Const DEVICE_NOTIFY_WINDOW_HANDLE = &h00000000
Const DBT_DEVICEARRIVAL = &h8000
Const DBT_DEVICEREMOVECOMPLETE = &h8004
以下の2つの関数を使用します。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Function RegisterForDeviceNotify(hWnd As HWND) As HDEVNOTIFY
Dim InterfaceClassGuid = [&h378de44c, &h56ef, &h11d1,[&hbc, &h8c, &h00, &ha0, &hc9, &h14, &h05, &hdd]] As GUID'USBマウス
'Dim InterfaceClassGuid = [&h53F5630D, &hB6BF, &h11D0,[&h94, &hF2, &h00, &ha0, &hc9, &h1E, &hFB, &h8B]] As GUID'USBメモリなど
Dim hNotify As HDEVNOTIFY
Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE
NotificationFilter.dbcc_size = SizeOf(DEV_BROADCAST_DEVICEINTERFACE)
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
NotificationFilter.dbcc_classguid = InterfaceClassGuid
hNotify = RegisterDeviceNotification(hWnd, NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE)
RegisterForDeviceNotify = hNotify
End Function
Sub OnDeviceChange(hwnd As HWND, wParam As WPARAM, lParam As LPARAM)
Dim szMsg[128] As Char
Dim lpdb As *PDEV_BROADCAST_HDR
lpdb = lParam As *PDEV_BROADCAST_HDR
Select Case wParam
Case DBT_DEVICEARRIVAL
Select Case lpdb->dbch_devicetype
Case DBT_DEVTYP_DEVICEINTERFACE
OutputDebugString(Ex"Plugged In\n")
End Select
Case DBT_DEVICEREMOVECOMPLETE
Select Case lpdb->dbch_devicetype
Case DBT_DEVTYP_DEVICEINTERFACE
OutputDebugString(Ex"Plugged Out\n")
End Select
End Select
End Sub
使い方としては、グローバル領域で
コード: 全て選択
Dim hDevNotify As HDEVNOTIFY
のようにHDEVNOTIFYを宣言して、あとは監視の開始時に、
コード: 全て選択
hDevNotify = RegisterForDeviceNotify(hMainWnd)
のようにRegisterForDeviceNotifyを呼び出せば
変化が起こったときにWM_DEVICECHANGEが飛んでくるようになります。
そこでOnDeviceChangeを呼び出して着脱を判断します。
監視を終えるには
コード: 全て選択
UnregisterDeviceNotification(hDevNotify)
のようにします。
ただネット上のサンプルを無理やり移したものですが、参考になりますでしょうか。
以下のコードはUSBのマウスの着脱(?)を知らせてくれるものです。
まず以下を定義します。
[hide][code]TypeDef HDEVNOTIFY = VoidPtr
Type DEV_BROADCAST_DEVICEINTERFACE
dbcc_size As DWord
dbcc_devicetype As DWord
dbcc_reserved As DWord
dbcc_classguid As GUID
dbcc_name[1] As Char
End Type
Type PDEV_BROADCAST_HDR
dbch_size As DWord
dbch_devicetype As DWord
dbch_reserved As DWord
End Type
Declare Function RegisterDeviceNotification Lib "User32.dll" Alias "RegisterDeviceNotificationA" (hRecipient As HANDLE, ByRef NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE, Flags As DWord) As HDEVNOTIFY
Declare Function UnregisterDeviceNotification Lib "User32.dll" (hDevNotify As HDEVNOTIFY) As Long
Const DBT_DEVTYP_DEVICEINTERFACE = &h00000005
Const DEVICE_NOTIFY_WINDOW_HANDLE = &h00000000
Const DBT_DEVICEARRIVAL = &h8000
Const DBT_DEVICEREMOVECOMPLETE = &h8004[/code][/hide]
以下の2つの関数を使用します。
[hide][code]Function RegisterForDeviceNotify(hWnd As HWND) As HDEVNOTIFY
Dim InterfaceClassGuid = [&h378de44c, &h56ef, &h11d1,[&hbc, &h8c, &h00, &ha0, &hc9, &h14, &h05, &hdd]] As GUID'USBマウス
'Dim InterfaceClassGuid = [&h53F5630D, &hB6BF, &h11D0,[&h94, &hF2, &h00, &ha0, &hc9, &h1E, &hFB, &h8B]] As GUID'USBメモリなど
Dim hNotify As HDEVNOTIFY
Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE
NotificationFilter.dbcc_size = SizeOf(DEV_BROADCAST_DEVICEINTERFACE)
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
NotificationFilter.dbcc_classguid = InterfaceClassGuid
hNotify = RegisterDeviceNotification(hWnd, NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE)
RegisterForDeviceNotify = hNotify
End Function
Sub OnDeviceChange(hwnd As HWND, wParam As WPARAM, lParam As LPARAM)
Dim szMsg[128] As Char
Dim lpdb As *PDEV_BROADCAST_HDR
lpdb = lParam As *PDEV_BROADCAST_HDR
Select Case wParam
Case DBT_DEVICEARRIVAL
Select Case lpdb->dbch_devicetype
Case DBT_DEVTYP_DEVICEINTERFACE
OutputDebugString(Ex"Plugged In\n")
End Select
Case DBT_DEVICEREMOVECOMPLETE
Select Case lpdb->dbch_devicetype
Case DBT_DEVTYP_DEVICEINTERFACE
OutputDebugString(Ex"Plugged Out\n")
End Select
End Select
End Sub[/code][/hide]
使い方としては、グローバル領域で
[code]Dim hDevNotify As HDEVNOTIFY[/code]
のようにHDEVNOTIFYを宣言して、あとは監視の開始時に、
[code]hDevNotify = RegisterForDeviceNotify(hMainWnd)[/code]
のようにRegisterForDeviceNotifyを呼び出せば
変化が起こったときにWM_DEVICECHANGEが飛んでくるようになります。
そこでOnDeviceChangeを呼び出して着脱を判断します。
監視を終えるには
[code]UnregisterDeviceNotification(hDevNotify)[/code]
のようにします。