| This is what I've got so far: 
 
 
' hWnd needs to be set before initializing the event handler. 
' You can get this value with hWnd = GetActiveWindow(), or with hWnd = QueryGadget(Window, QUERY_HWND), where Window is your window's gadget pointer. (May require MaxGUI)
Global hWnd:Int 
Global OldWinProc:Int
OldWinProc = SetWindowLongPtr(hWnd, GWL_WNDPROC, WinProc)  
Function WinProc%(hWnd:Int, Msg:Int, wParam:Int, lParam:Int) "win32"
		
	Select Msg
	
		Case WM_RESIZE
			DebugLog("WM_RESIZE")
		Case WM_MOVE
			DebugLog("WM_MOVE")
		Case WM_CLOSE
			DebugLog("WM_CLOSE")
		Case WM_DESTROY
			DebugLog("WM_DESTROY")
			
			' Restore old winproc.
			SetWindowLong(hwnd, GWL_WNDPROC, OldWinProc) 
		Case WM_KEYDOWN
			DebugLog("WM_KEYDOWN")
			DebugLog("You pressed: " + Chr$(wParam))
	
		Case WM_CREATE
			DebugLog("WM_CREATE")	
	
		Case WM_INITDIALOG
			DebugLog("WM_INITDIALOG")	
		
		Case WM_COMMAND
			DebugLog("WM_COMMAND " + lParam)
	    Case WM_INPUT
	    		dwSize:Int = 40
			lpb:Byte[40]
    
			GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, SizeOf(RAWINPUTHEADER));
    
			RAWINPUT* raw = (RAWINPUT*)lpb;
    
			If (raw->header.dwType == RIM_TYPEMOUSE) 
				Int xPosRelative = raw->data.mouse.lLastX;
				Int yPosRelative = raw->data.mouse.lLastY;
			EndIf
				
		Default
			'DebugLog Msg
					
	End Select
	
	If OldWinProc <> 0 Then Return CallWindowProc(OldWinProc, hWnd, Msg, wParam, lParam)   
	
End Function
Function LOWORD(value)
	Return value & $FFFF
End Function
Function HIWORD(value)
	Return (value Shr 16)
End Function
Type RAWINPUTDEVICE 
   Field usUsagePage:Short
   Field usUsage:Short
   Field dwFlags:Int
   Field hwndTarget:Int
End Type
Const HID_USAGE_PAGE_GENERIC  = $1
Const HID_USAGE_GENERIC_MOUSE = $2
Const RIDEV_INPUTSINK = $100
Global Rid:RAWINPUTDEVICE[1]
    Rid[0].usUsagePage = HID_USAGE_PAGE_GENERIC
    Rid[0].usUsage = HID_USAGE_GENERIC_MOUSE 
    Rid[0].dwFlags = RIDEV_INPUTSINK   
    Rid[0].hwndTarget = hWnd					' hWnd needs to be set by the time we get here, so this should be in an init function.
    RegisterRawInputDevices(Rid, 1, SizeOf(Rid[0])
Extern "Win32"
	Function RegisterRawInputDevices:Int(pRawInputDevices:Byte Ptr, uiNumDevices:Int, cbSize:Int)
	Function GetRawInputData:Int(HRAWINPUT hRawInput, uiCommand:Int, LPVOID pData, PUINT pcbSize, cbSizeHeader:Int)
	
End Extern
 
 Where I'm currently stuck is declaring that second extern at the bottomn.  Then I need to figure out what that C code in the WM_INPUT event is doing...
 
 
 |