Adding new events?

BlitzMax Forums/BlitzMax GUI Programming/Adding new events?

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.

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?