'Windows only
Function SetIcon()
?Win32
SendMessageW(GetActiveWindow(), WM_SETICON, 0, LParam(LoadIconW(GetModuleHandleW(Null), 101)))
?
End Function
SuperStrict
' WndProc() based on code by grable at:
' http://www.blitzbasic.com/Community/posts.php?topic=67031
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
Hi,
This is an old bit of code from my library, so I don't know if it needs updating, but it might help you with your question...
Basically, you save the current WndProc and insert your own, calling the old one at the end...Code: [Select]SuperStrict
' WndProc() based on code by grable at:
' http://www.blitzbasic.com/Community/posts.php?topic=67031
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
Hi,OH WOW YES!!!!!!!!!
This is an old bit of code from my library, so I don't know if it needs updating, but it might help you with your question...
Basically, you save the current WndProc and insert your own, calling the old one at the end...Code: [Select]SuperStrict
' WndProc() based on code by grable at:
' http://www.blitzbasic.com/Community/posts.php?topic=67031
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