Is there a way for me to look at events that are not currently in the list? ie: I would like to watch DEVICECHANGED event to monitor when a USB device is plugged or unplpgged.
Adding new events?
BlitzMax Forums/BlitzMax GUI Programming/Adding new events? Can you use CreateEvent to do the check and then EmitEvent?
As far as i know, WM_DEVICECHANGE isnt trapped by MaxGUI. So youd have to either create a hidden window and trap it yourself, or override the window func of a maxgui window and trap it there.
Thanks for the replies, does anyone have any examples? There seem to be many other events that look usefull additions as well.
something like this?
SuperStrict Const WINDOW_FLAGS:Int = WINDOW_TITLEBAR | WINDOW_RESIZABLE Global window:TGadget = CreateWindow( "Test", 64,64, 256,256, Null, WINDOW_FLAGS | WINDOW_CLIENTCOORDS) Global OldWindowFunc:Int = SetWindowFunc( window, WindowFunc) While WaitEvent() Select CurrentEvent.ID Case EVENT_WINDOWCLOSE If CurrentEvent.Source = window Then Exit EndSelect Wend End Function DriveFromMask:String( unitmask:Int) Local i:Int For i = 0 Until 26 If unitmask & $1 Then Exit unitmask :Shr 1 Next Return Chr(Asc("A") + i) EndFunction Function WindowFunc:Int( hwnd:Int, msg:Int, wparam:Int, lparam:Int) "Win32" Local hdr:Int Ptr = Int Ptr(lparam) Select msg Case WM_DEVICECHANGE Select wparam Case DBT_DEVICEARRIVAL If hdr[1] = DBT_DEVTYP_VOLUME Then If hdr[4] & DBTF_MEDIA Then ' cdrom / disk drive Notify "Media inserted into drive " + DriveFromMask( hdr[3]) Else ' other / usb Notify "Inserted volume as drive " + DriveFromMask( hdr[3]) EndIf EndIf Case DBT_DEVICEREMOVECOMPLETE If hdr[1] = DBT_DEVTYP_VOLUME Then If hdr[4] & DBTF_MEDIA Then ' cdrom / disk drive Notify "Media removed from drive " + DriveFromMask( hdr[3]) Else ' other / usb Notify "Removed volume registered as drive " + DriveFromMask( hdr[3]) EndIf EndIf EndSelect ' this MUST be handled, otherwise MaxGUI freezes on window close. Case WM_DESTROY SetWindowLong( hwnd, GWL_WNDPROC, OldWindowFunc) EndSelect Return CallWindowProc( OldWindowFunc, hwnd, msg, wparam, Int(lparam)) EndFunction ' ' device change notification ' Const WM_DEVICECHANGE:Int = 537 Const DBT_NO_DISK_SPACE:Int = $47 Const DBT_CONFIGMGPRIVATE:Int = $7FFF Const DBT_DEVICEARRIVAL:Int = $8000 Const DBT_DEVICEQUERYREMOVE:Int = $8001 Const DBT_DEVICEQUERYREMOVEFAILED:Int = $8002 Const DBT_DEVICEREMOVEPENDING:Int = $8003 Const DBT_DEVICEREMOVECOMPLETE:Int = $8004 Const DBT_DEVICETYPESPECIFIC:Int = $8005 Const DBT_DEVTYP_OEM:Int = 0 Const DBT_DEVTYP_DEVNODE:Int = 1 Const DBT_DEVTYP_VOLUME:Int = 2 Const DBT_DEVTYP_PORT:Int = 3 Const DBT_DEVTYP_NET:Int = 4 Const DBT_DEVTYP_DEVICEINTERFACE:Int = 5 Const DBT_DEVTYP_HANDLE:Int = 6 Const DBT_APPYBEGIN:Int = 0 Const DBT_APPYEND:Int = 1 Const DBT_DEVNODES_CHANGED:Int = 7 Const DBT_QUERYCHANGECONFIG:Int = $17 Const DBT_CONFIGCHANGED:Int = $18 Const DBT_CONFIGCHANGECANCELED:Int = $19 Const DBT_MONITORCHANGE:Int = $1B Const DBT_SHELLLOGGEDON:Int = 32 Const DBT_CONFIGMGAPI32:Int = 34 Const DBT_VXDINITCOMPLETE:Int = 35 Const DBT_VOLLOCKQUERYLOCK:Int = $8041 Const DBT_VOLLOCKLOCKTAKEN:Int = $8042 Const DBT_VOLLOCKLOCKFAILED:Int = $8043 Const DBT_VOLLOCKQUERYUNLOCK:Int = $8044 Const DBT_VOLLOCKLOCKRELEASED:Int = $8045 Const DBT_VOLLOCKUNLOCKFAILED:Int = $8046 Const DBT_USERDEFINED:Int = $FFFF Const DBTF_MEDIA:Int = 1 Const DBTF_NET:Int = 2 Const DEVICE_NOTIFY_WINDOW_HANDLE:Int = 0 Const DEVICE_NOTIFY_SERVICE_HANDLE:Int = 1 Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES:Int = 4 ' ' setting window function ' Const GWL_WNDPROC:Int = -4 Extern "Win32" Function SetWindowLong:Int(HWND:Int,nIndex:Int,dwNewLong:Int) = "SetWindowLongA@12" Function GetWindowLong:Int(HWND:Int,nIndex:Int) = "GetWindowLongA@8" Function CallWindowProc:Int( prevwndproc:Int, hwnd:Int, msg:Int, wparam:Int, lparam:Int) = "CallWindowProcA@20" EndExtern Function SetWindowFunc:Int( window:TGadget, newfunc:Int( hwnd:Int, msg:Int, wparam:Int, lparam:Int)) Local hwnd:Int = QueryGadget( window, QUERY_HWND) Local oldfunc:Int = GetWindowLong( hwnd, GWL_WNDPROC) SetWindowLong( hwnd, GWL_WNDPROC, Int(Byte Ptr newfunc)) Return oldfunc EndFunction
grable, Wow and thats not a "vista wow" many many thanks works exactly as I had hoped.
Am looking to do a similar thing on the Mac now and the above example is windows only! Any ideas on a multi platform solution?