For use of finding info on a device attached or detached (USB or Network Drive)
To test, Unplug or Re-Seat a USB device, or map a network drive and see the results.
Hopefully just one of many examples using USB, but till then Have FUN
DeviceNotify.inc
DemoDeviceNotify.bas
Discussion, Hints, Help can be found at http://www.powerbasic.com/support/pb...528#post307528
And as Requested a zipped version of the program recompiled in PB 8.04
To test, Unplug or Re-Seat a USB device, or map a network drive and see the results.
Hopefully just one of many examples using USB, but till then Have FUN

DeviceNotify.inc
Code:
'************************************************************************************************************* '*** Project: '*** RegisterDeviceInterface '*** Description: '*** Wrapper for watching USB '*** Programmer: '*** Cliff Nichols '*** Based from: '*** www.lvr.com '*** www.powerbasic.com '*** www.msdn.com '*** Post Date: '*** 12-14-07 '*** Last Update: '*** 01-22-09 '*** Changes, Updates, Patches, etc.... '*** Complete Re-Write from previous attempts to understand USB concepts '*** '*** OS Versions: '*** Should work on 95/98/ME, NT/2000/XP/VISTA '*** Tested On: '*** XP/VISTA '*** PB Versions: '*** 7, 8, 9 '*** Based From: '*** Prior versions, Documentation, and Help from others in PB '*** Special Thanks: '*** Kev Peel for SetupApi.INC '*** PierreBellisle for DeviceNotify.bas '*** Walt Decker, José Roca, Knuth Konrad and others for their reminders of concepts that '*** are often overlooked (see "Parameter as Reply" discussion for more) '************************************************************************************************************* 'The complete list 'Device = "1394/1394debug/61883/adapter/apmsupport/avc/battery/biometric/" & _ ' "bluetooth/cdrom/computer/decoder/diskdrive/display/" & _ ' "dot4print/enum1394/fdc/floppydisk/gps/hdc/hidclass/image/" & _ ' "infrared/keyboard/legacydriver/media/mediumchanger/mtd/modem/" & _ ' "monitor/mouse/multifunction/multiportserial/net/netclient/" & _ ' "netservice/nettrans/nodriver/pcmcia/ports/printer/" & _ ' "printer upgrade/pnpprinters/processor/sbp2/scsiadapter/" & _ ' "security accelerator/smartcardreader/sound/system/tapedrive/" & _ ' "unknown/usb/volume/volumesnapshot/wceusbs" #IF NOT %DEF(%DEVICENOTIFY) %DEVICENOTIFY = 1 '*** %WM_DEVICECHANGE/CBWPARAM specifies the event/CBLPARAM specifies data '*** %WM_DEVICECHANGE = &H219& '537 - Notifies application of change to hardware configuration of device or computer. (received through WindowProc) 'wParam - One of the following %DBT_CONFIGCHANGECANCELED = &H19& '25 - Request to change the current configuration (dock or undock) has been canceled %DBT_CONFIGCHANGED = &H18& '24 - Current configuration changed, due to a dock or undock %DBT_CUSTOMEVENT = &H8006& '32774 - Custom event %DBT_DEVICEARRIVAL = &H8000& '32768 - Device or piece of media has been inserted and is now available %DBT_DEVICEQUERYREMOVE = &H8001& '32769 - Permission requested to remove Device or media. (Any application can deny this request and cancel the removal.) %DBT_DEVICEQUERYREMOVEFAILED = &H8002& '32770 - Request to remove device or media canceled. %DBT_DEVICEREMOVECOMPLETE = &H8004& '32772 - Device or Media removed. %DBT_DEVICEREMOVEPENDING = &H8003& '32771 - Device or Media about to be removed. (Cannot be denied) %DBT_DEVICETYPESPECIFIC = &H8005& '32773 - Device-specific event %DBT_DEVNODES_CHANGED = &H7& '7 - Device added or removed from the system. %DBT_QUERYCHANGECONFIG = &H17& '23 - Permission requested to change current configuration (dock or undock) %DBT_USERDEFINED = &HFFFF& '65535 - User-Defined 'lParam - Pointer to structure that contains event-specific data. (Format depends on wParam) 'Drive or media, networked or not %DBTF_MEDIA = 1 'Media comings and goings %DBTF_NET = 2 'Network volume %DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = &H4& 'All Interfaces %DEVICE_NOTIFY_WINDOW_HANDLE = 0 'Notifications sent using WM_POWERBROADCAST with wParam = PBT_POWERSETTINGCHANGE. %DEVICE_NOTIFY_SERVICE_HANDLE = 1 'Notifications sent to HandlerEx callback function with dwControl = SERVICE_CONTROL_POWEREVENT and dwEventType = PBT_POWERSETTINGCHANGE. %GWL_WNDPROC = (-4) 'Sets new address for the window procedure. (Windows NT/2000/XP: Can not change attribute if window does not belong to same process as alling thread.) %UNSAFE_REMOVE = &H1C& 'Unsafe removal of device 'DEV_BROADCAST_HDR Structure %DBT_DEVTYP_OEM = &H0& '0 - Original Equipment Manufacturer(OEM) or Independent Hardware Vendor(IHV) defined device type. This structure is a DEV_BROADCAST_OEM structure. %DBT_DEVTYP_DEVNODE = &H1& '1 - Devnode number (specific to Windows 95) %DBT_DEVTYP_VOLUME = &H2& '2 - Logical volume. This structure is a DEV_BROADCAST_VOLUME structure. %DBT_DEVTYP_PORT = &H3& '3 - Port device (serial or parallel). This structure is a DEV_BROADCAST_PORT structure. %DBT_DEVTYP_NET = &H4& '4 - Network Resource (UNC) %DBT_DEVTYP_DEVICEINTERFACE = &H5& '5 - Class of devices. This structure is a DEV_BROADCAST_DEVICEINTERFACE structure. %DBT_DEVTYP_HANDLE = &H6& '6 - File system handle. This structure is a DEV_BROADCAST_HANDLE structure. '*** EVENT HEADER TYPE DEV_BROADCAST_HDR DbhSize AS DWORD 'Size of Structure (If User-Defined event, this must be size of header, plus size of variable-length data in _DEV_BROADCAST_USERDEFINED structure. DbhDeviceType AS DWORD 'Device Type (Could be Interface/Handle/OEM/Port/Volume) DbhReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says END TYPE '*** DEVICE TYPE INFO TYPE DEV_BROADCAST_OEM DboSize AS DWORD 'Size of Structure DboDeviceType AS DWORD 'Set to %DBT_DEVTYPE_OEM. DboReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DboIdentifier AS DWORD 'OEM-specific identifier for the device. DboSuppfunc AS DWORD 'OEM-specific function value. Possible values depend on the device. END TYPE TYPE DEV_BROADCAST_DEVNODE DbnSize AS DWORD 'Size of Structure DbnDeviceType AS DWORD 'Set to %DBT_DEVTYP_DEVNODE DbnReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DbnDevNode AS DWORD 'OEM-specific identifier for the device. END TYPE TYPE DEV_BROADCAST_VOLUME Dbvsize AS DWORD 'Size of Structure DbvDeviceType AS DWORD 'Set to %DBT_DEVTYP_VOLUME. DbvReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DbvUnitmask AS DWORD 'Logical drive, bit 0 is A:, bit 1 is B:... DbvFlags AS WORD 'If %DBTF_MEDIA (Change affects media in drive). If Not %DBTF_MEDIA (Change affects physical device or drive.), If %DBTF_NET = network volume. END TYPE TYPE DEV_BROADCAST_PORT DbpSize AS DWORD 'Size of Structure DbpDeviceType AS DWORD 'Set to %DBT_DEVTYP_PORT '<--- Set to check if a port device (see DEV_BROADCAST_DEVICEINTERFACE to find interface) DbpReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DbpName AS ASCIIZ * %MAX_PATH 'Device 'Friendly' Name such as "Com1" and "Standard 28800 bps Modem" END TYPE TYPE DEV_BROADCAST_NET DbnSize AS DWORD 'Size of Structure DbnDeviceType AS DWORD 'Set to %DBT_DEVTYP_NET '<--- Set to check if a port device (see DEV_BROADCAST_DEVICEINTERFACE to find interface) DbnReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DbnName AS ASCIIZ * %MAX_PATH 'Device 'Friendly' Name such as "Com1" and "Standard 28800 bps Modem" END TYPE TYPE DEV_BROADCAST_DEVICEINTERFACE DbDiSize AS DWORD 'Size of Structure DbDiDeviceType AS DWORD 'Set to %DBT_DEVTYP_DEVICEINTERFACE. '<--- Set to get Interface Type DbDiReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DbDiClassguid AS GUID 'GUID for Interface Device Class DbDiName AS ASCIIZ * %MAX_PATH 'When returned through %WM_DEVICECHANGE message, converted to ANSI as appropriate. 'Services always receive a Unicode string, both (RegisterDeviceNotificationW or RegisterDeviceNotificationA) END TYPE TYPE DEV_BROADCAST_HANDLE DbhSize AS DWORD 'Size of Structure DbhDeviceType AS DWORD 'Set to %DBT_DEVTYP_HANDLE DbhReserved AS DWORD 'Reserved; do not use. '<--- No idea why, but its what the doc says DbhHandle AS DWORD 'Handle in RegisterDeviceNotification function. DbhHdevNotify AS DWORD 'Handle to device notification, returned by the RegisterDeviceNotification. '*** The following are valid only for DBT_CUSTOMEVENT DbhEventGuid AS GUID 'Custom event GUID DbhNameOffset AS LONG 'The offset to event name. DbhData(0) AS BYTE 'Optional binary data. END TYPE GLOBAL glngPrevDeviceNotifyProc AS LONG 'Original Proc to be notified GLOBAL hDevNotify AS LONG 'Handle to RegisterDeviceNotification function DECLARE SUB AddToList (BYVAL LbString AS STRING) DECLARE FUNCTION GetUdtDeviceEvent( _ DeviceBroadCastHeader AS DEV_BROADCAST_HDR, _ DeviceBroadCastOem AS DEV_BROADCAST_OEM, _ DeviceBroadCasteDevNode AS DEV_BROADCAST_DEVNODE, _ DeviceBroadCastVolume AS DEV_BROADCAST_VOLUME, _ DeviceBroadCastPort AS DEV_BROADCAST_PORT, _ DeviceBroadCastNet AS DEV_BROADCAST_NET, _ DeviceBroadCastDeviceInterface AS DEV_BROADCAST_DEVICEINTERFACE, _ DeviceBroadCastHandle AS DEV_BROADCAST_HANDLE, _ BYVAL lParam AS LONG _ )AS STRING FUNCTION DeviceNotifyProc(BYVAL hWnd AS LONG, BYVAL Msg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG STATIC Message AS STRING LOCAL DeviceBroadCastHeader AS DEV_BROADCAST_HDR LOCAL DeviceBroadCastOem AS DEV_BROADCAST_OEM LOCAL DeviceBroadCasteDevNode AS DEV_BROADCAST_DEVNODE LOCAL DeviceBroadCastVolume AS DEV_BROADCAST_VOLUME LOCAL DeviceBroadCastPort AS DEV_BROADCAST_PORT LOCAL DeviceBroadCastNet AS DEV_BROADCAST_NET LOCAL DeviceBroadCastDeviceInterface AS DEV_BROADCAST_DEVICEINTERFACE LOCAL DeviceBroadCastHandle AS DEV_BROADCAST_HANDLE LOCAL TempBin AS STRING LOCAL i AS LONG LOCAL DriveName AS STRING LOCAL DriveFlags AS STRING STATIC DevNodesChanged AS LONG SELECT CASE Msg CASE %WM_DEVICECHANGE Message = Message + SPACE$(5) + "WM_DEVICECHANGE " SELECT CASE wParam 'Determine Event Type CASE %DBT_CONFIGCHANGECANCELED 'System uses WM_DEVICECHANGE, wParam = DBT_CONFIGCHANGECANCELED, lParam = 0 Message = Message + SPACE$(5) + "wParam = DBT_CONFIGCHANGECANCELED" CASE %DBT_CONFIGCHANGED 'System uses WM_DEVICECHANGE, wParam = DBT_CONFIGCHANGED, lParam = 0 Message = Message + SPACE$(5) + "wParam = DBT_CONFIGCHANGED" CASE %DBT_CUSTOMEVENT 'System uses WM_DEVICECHANGE, wParam = DBT_CUSTOMEVENT, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_CUSTOMEVENT" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE %DBT_DEVICEARRIVAL 'System uses WM_DEVICECHANGE, wParam = DBT_DEVICEARRIVAL, lParam = TBD SELECT CASE DevNodesChanged CASE %FALSE 'Flag not set so set it DevNodesChanged = %TRUE CASE %TRUE 'Flag set END SELECT ' ZeroMemory VARPTR(DeviceBroadCastHeader), SIZEOF(DeviceBroadCastHeader) ' ZeroMemory VARPTR(DeviceBroadCastDeviceInterface), SIZEOF(DeviceBroadCastDeviceInterface) Message = Message + SPACE$(5) + "wParam = DBT_DEVICEARRIVAL" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE %DBT_DEVICEQUERYREMOVE 'System uses WM_DEVICECHANGE, wParam = DBT_DEVICEQUERYREMOVE, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_DEVICEQUERYREMOVE" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE %DBT_DEVICEQUERYREMOVEFAILED 'System uses WM_DEVICECHANGE, wParam = DBT_DEVICEQUERYREMOVEFAILED, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_DEVICEQUERYREMOVEFAILED" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE %DBT_DEVICEREMOVECOMPLETE 'System uses WM_DEVICECHANGE, wParam = DBT_DEVICEREMOVECOMPLETE, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_DEVICEREMOVECOMPLETE" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) SELECT CASE DevNodesChanged CASE %FALSE 'Flag not set CASE %TRUE 'Flag set so unset it DevNodesChanged = %FALSE END SELECT CASE %DBT_DEVICEREMOVEPENDING 'System uses WM_DEVICECHANGE, wParam = DBT_DEVICEREMOVEPENDING, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_DEVICEREMOVEPENDING" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE %DBT_DEVICETYPESPECIFIC 'System uses WM_DEVICECHANGE, wParam = DBT_DEVICETYPESPECIFIC, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_DEVICETYPESPECIFIC" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE %DBT_DEVNODES_CHANGED 'System uses WM_DEVICECHANGE, wParam = DBT_DEVNODES_CHANGED, lParam = 0 Message = Message + SPACE$(5) + "wParam = DBT_DEVNODES_CHANGED" + SPACE$(5) + STR$(lParam) SELECT CASE DevNodesChanged 'Stop 'Idle' %DBT_DEVNODES_CHANGED messages CASE %FALSE '1st time flagged DevNodesChanged = %TRUE CASE %TRUE 'Already showed so ignore till flag is reset Message = "" END SELECT 'Message = Message + space$(5) + Str(glngPrevDeviceNotifyProc) + vbCr + Str(hWnd) CASE %DBT_QUERYCHANGECONFIG 'System uses WM_DEVICECHANGE, wParam = DBT_QUERYCHANGECONFIG, lParam = 0 Message = Message + SPACE$(5) + "wParam = DBT_QUERYCHANGECONFIG" CASE %DBT_USERDEFINED 'System uses WM_DEVICECHANGE, wParam = DBT_USERDEFINED, lParam = TBD Message = Message + SPACE$(5) + "wParam = DBT_USERDEFINED" Message=Message + GetUdtDeviceEvent(DeviceBroadCastHeader, DeviceBroadCastOem, DeviceBroadCasteDevNode, DeviceBroadCastVolume, DeviceBroadCastPort, DeviceBroadCastNet, DeviceBroadCastDeviceInterface, DeviceBroadCastHandle, lParam) CASE ELSE Message = Message + SPACE$(5) + "wParam = " & STR$(wParam) & $TAB & "Device unknown: " & STR$(DeviceBroadCastHeader.DbhDevicetype) END SELECT SELECT CASE Message CASE "" CASE ELSE AddToList Message END SELECT Message = "" END SELECT DeviceNotifyProc = CallWindowProc(glngPrevDeviceNotifyProc, hWnd, Msg, wParam, lParam) ' pass the rest messages to original function END FUNCTION FUNCTION DoRegisterDeviceInterface(hWnd AS LONG, BYREF hDevNotify AS LONG) AS LONG LOCAL Message AS STRING LOCAL NotificationFilter AS DEV_BROADCAST_DEVICEINTERFACE NotificationFilter.DbDiSize = SIZEOF(NotificationFilter) NotificationFilter.DbDiDevicetype = %DBT_DEVTYP_DEVICEINTERFACE hDevNotify = RegisterDeviceNotification(hWnd, VARPTR(NotificationFilter), %DEVICE_NOTIFY_WINDOW_HANDLE OR %DEVICE_NOTIFY_ALL_INTERFACE_CLASSES) IF hDevNotify = 0 THEN Message = Message + SPACE$(5) + "RegisterDeviceNotification failed: " FUNCTION = %False EXIT FUNCTION END IF FUNCTION = %True END FUNCTION FUNCTION GetUdtDeviceEvent( _ DeviceBroadCastHeader AS DEV_BROADCAST_HDR, _ DeviceBroadCastOem AS DEV_BROADCAST_OEM, _ DeviceBroadCasteDevNode AS DEV_BROADCAST_DEVNODE, _ DeviceBroadCastVolume AS DEV_BROADCAST_VOLUME, _ DeviceBroadCastPort AS DEV_BROADCAST_PORT, _ DeviceBroadCastNet AS DEV_BROADCAST_NET, _ DeviceBroadCastDeviceInterface AS DEV_BROADCAST_DEVICEINTERFACE, _ DeviceBroadCastHandle AS DEV_BROADCAST_HANDLE, _ BYVAL lParam AS LONG _ )AS STRING LOCAL Message AS STRING LOCAL TempBin AS STRING LOCAL i AS LONG LOCAL DriveName AS STRING LOCAL DriveFlags AS STRING STATIC DevNodesChanged AS LONG CopyMemory VARPTR(DeviceBroadCastHeader), BYVAL (lParam), SIZEOF(DeviceBroadCastHeader) SELECT CASE DeviceBroadCastHeader.DbhDevicetype 'Determine Device Type CASE %DBT_DEVTYP_OEM 'Original Equipment Manufacturer(OEM) or Independent Hardware Vendor(IHV) defined device type. This structure is a DEV_BROADCAST_OEM structure. Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_OEM" CopyMemory VARPTR(DeviceBroadCastOem), BYVAL (lParam), SIZEOF(DeviceBroadCastOem) Message = Message + SPACE$(5) + "Device Identifier: " & STR$(DeviceBroadCastOem.DboIdentifier) & $TAB & "Device Function: " & STR$(DeviceBroadCastOem.DboSuppFunc) CASE %DBT_DEVTYP_DEVNODE 'Devnode number (specific to Windows 95) '<--- No structure found to pass Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_DEVNODE" CopyMemory VARPTR(DeviceBroadCasteDevNode), BYVAL (lParam), SIZEOF(DeviceBroadCasteDevNode) Message = Message + SPACE$(5) + "Device Node: " & STR$(DeviceBroadCasteDevNode.DbnDevNode) CASE %DBT_DEVTYP_VOLUME 'Logical volume. This structure is a DEV_BROADCAST_VOLUME structure. Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_VOLUME" CopyMemory VARPTR(DeviceBroadCastVolume), BYVAL (lParam), SIZEOF(DeviceBroadCastVolume) TempBin = BIN$(DeviceBroadCastVolume.DbvUnitMask) TempBin = STRREVERSE$(TempBin) FOR i = 1 TO LEN(TempBin) SELECT CASE VAL(MID$(TempBin, i, 1)) CASE 0 'Bit not set CASE 1 'Bit set DriveName = CHR$(64 + i) + ":\" 'Chr(64) = @, chr$(65) = A, Chr(66)= B, etc... EXIT FOR END SELECT NEXT i SELECT CASE DeviceBroadCastVolume.dbvFlags CASE 0 'Local Volume DriveFlags = "Local Drive" CASE %DBTF_MEDIA 'Media Volume DriveFlags = "Media Drive" CASE %DBTF_NET 'Network volume DriveFlags = "Network Drive" END SELECT Message = Message + SPACE$(5) + "Device Name: " & DriveName + SPACE$(5) + "Drive Info:" + DriveFlags CASE %DBT_DEVTYP_PORT 'Port device (serial or parallel). This structure is a DEV_BROADCAST_PORT structure. '#debug print str$(wParam) + space$(5) + str$(%DBT_DEVICEARRIVAL) Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_PORT" CopyMemory VARPTR(DeviceBroadCastPort), BYVAL (lParam), SIZEOF(DeviceBroadCastPort) Message = Message + SPACE$(5) + "Device Name: " & DeviceBroadCastPort.DbpName CASE %DBT_DEVTYP_NET 'Network Resource (UNC) Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_NET" CopyMemory VARPTR(DeviceBroadCastNet), BYVAL (lParam), SIZEOF(DeviceBroadCastNet) Message = Message + SPACE$(5) + "Device Name: " & DeviceBroadCastNet.DbnName CASE %DBT_DEVTYP_DEVICEINTERFACE 'Class of devices. This structure is a DEV_BROADCAST_DEVICEINTERFACE structure. Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_DEVICEINTERFACE" CopyMemory VARPTR(DeviceBroadCastDeviceInterface), BYVAL (lParam), BYVAL (DeviceBroadCastHeader.DbhSize) Message = Message + SPACE$(5) + "Device Name: " & DeviceBroadCastDeviceInterface.DbDiName & $TAB & "GUID: " & GUIDTXT$(DeviceBroadCastDeviceInterface.DbDiClassguid) CASE %DBT_DEVTYP_HANDLE 'File system handle. This structure is a DEV_BROADCAST_HANDLE structure. Message = Message + SPACE$(5) + "Device Type: DBT_DEVTYP_HANDLE" CopyMemory VARPTR(DeviceBroadCastHandle), BYVAL (lParam), SIZEOF(DeviceBroadCastHandle) Message = Message + SPACE$(5) + "Device Handle: " & STR$(DeviceBroadCastHandle.DbhHandle) + SPACE$(5) + "Device Handle Notify: " + STR$(DeviceBroadCastHandle.DbhHdevNotify) Message = Message + SPACE$(5) + "Device Guid: " & GUIDTXT$(DeviceBroadCastHandle.DbhEventGuid) + SPACE$(5) + "Event Offset: " + STR$(DeviceBroadCastHandle.DbhNameOffset) Message = Message + SPACE$(5) + "Binary Data: " & STR$(DeviceBroadCastHandle.DbhData(0)) CASE ELSE Message = Message + SPACE$(5) + "Device Type unknown: " & STR$(DeviceBroadCastHeader.DbhDevicetype) CopyMemory VARPTR(DeviceBroadCastDeviceInterface), BYVAL (lParam), BYVAL (DeviceBroadCastHeader.DbhSize) Message = Message + SPACE$(5) + "Device Name: " & STR$(LEN(DeviceBroadCastDeviceInterface.DbDiName)) & MID$(DeviceBroadCastDeviceInterface.DbDiName, 1, INSTR(DeviceBroadCastDeviceInterface.DbDiName, CHR$(0))) END SELECT FUNCTION = Message END FUNCTION #ENDIF
Code:
#COMPILE EXE #DIM ALL GLOBAL hDlg AS DWORD '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #IF NOT %DEF(%DEVICENOTIFY) #INCLUDE "DeviceNotify.INC" #ENDIF '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ %IDD_DIALOG1 = 101 %TxtDeviceNotify = 102 '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Declarations ** '------------------------------------------------------------------------------ DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION ShowDIALOG1Proc() SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CBCTL CASE %TxtDeviceNotify END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG LOCAL Success AS LONG DIALOG NEW hParent, "Dialog1", 70, 70, 750, 230, %WS_POPUP OR %WS_BORDER _ OR %WS_DLGFRAME OR %WS_THICKFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _ %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD TEXTBOX, hDlg, %TxtDeviceNotify, "Unplug and re-seat USB connection to see results", 5, 5, 740, 225, _ 'Create Textbox %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %WS_HSCROLL OR _ %WS_VSCROLL OR %ES_LEFT OR %ES_MULTILINE OR %ES_AUTOHSCROLL OR _ %ES_AUTOVSCROLL, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR CALL DoRegisterDeviceInterface(hDlg , hDevNotify) '<--- DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE are automatically broadcast for port devices. '<--- so not necessary to RegisterDeviceNotification for DBT_DEVTYP_PORT OR DBT_DEVTYP_VOLUME OR DBT_DEVTYP_OEM glngPrevDeviceNotifyProc = GetWindowLong(hDlg , %GWL_WNDPROC) SetWindowLong hDlg , %GWL_WNDPROC, CODEPTR(DeviceNotifyProc) DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt IF hDevNotify <> 0 THEN '<--- If RegisterDeviceInterface was used, then release it (or the next compile will not find the device) Success = UnregisterDeviceNotification(hDevNotify) END IF FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------ SUB AddToList (BYVAL LbString AS STRING) LOCAL TempText AS STRING STATIC HoldText AS STRING CONTROL GET TEXT hDlg, %TxtDeviceNotify TO TempText 'Get the formatted text SELECT CASE HoldText CASE TempText CASE <> TempText HoldText = TempText END SELECT CONTROL SET TEXT hDlg, %TxtDeviceNotify, HoldText + $CRLF + LbString 'Show the formatted text END SUB
And as Requested a zipped version of the program recompiled in PB 8.04
Comment