Grab keypresses regardless of gadget selected

BlitzPlus Forums/BlitzPlus Programming/Grab keypresses regardless of gadget selected

em22(Posted 2009) [#1]
A while back I was coding a front end for WinUAE and I wanted to grab key presses while the listbox of games was selected (eg, like F1 to turn on fullscreen or F2 to load disc into DF1) but Blitz+ struggled with passing the correct data. (Windows always interpreted the events first)

Anyway, here is a small example using HotKeyEvent which could do exactly what I wanted. If I had found this a few months back it would of saved me from many headaches!


;
; Demo showing how to get keyboard input regardless of what gadget is selected in your main window.
;
; em22 9/9/09
;
; 
; create some stuff to work with

testwindow=CreateWindow("demo window", (ClientWidth(Desktop())/2)-150,(ClientHeight(Desktop())/2)-100, 300 , 200,testwindow,49)
lister=CreateListBox(5,5,288,130,testwindow,6)
tarea=CreateTextArea(5,170,288,20,testwindow,9)
status=CreateLabel("Select and Item then press the Function Keys",5,140,288,20,testwindow,49)
SetGadgetText(tarea,"Click here and press Function buttons") 

;lets just fill our listbox with some stuff
For a = 0 To 15
	AddGadgetItem lister, "Listbox Item "+a
Next

SelectGadgetItem lister,0

;this is where we fix our hotkeyevents - we're going to send the scancode value in eventdata() through eventid() $103 (keydown)

HotKeyEvent 1,0,$803,0,0,0,0,testwindow   ; press escape any time to quit
HotKeyEvent 59,0,$103,59 ; F1 - 
HotKeyEvent 60,0,$103,60
HotKeyEvent 61,0,$103,61
HotKeyEvent 62,0,$103,62 ; thru to 
HotKeyEvent 63,0,$103,63
HotKeyEvent 64,0,$103,64 ; F6

While WaitEvent()<>$803 

Select EventID()

	Case $103 ;
		
		; just some code to deal with the eventdata() could be done better
		
		If EventData()=59 SetGadgetText status,"F1 - Printing "+GadgetItemText (lister, SelectedGadgetItem (lister))

		If EventData()=60 SetGadgetText status,"F2 - Loading "+GadgetItemText (lister, SelectedGadgetItem (lister))

		If EventData()=61 
			Stop 
			SetGadgetText status,"F3 - Adding "+GadgetItemText (lister, SelectedGadgetItem (lister))
			AddGadgetItem lister,TextAreaText (tarea),True
		EndIf

		If EventData()=62 
			oldsel=SelectedGadgetItem (lister)
			If CountGadgetItems (lister)>1 And oldsel >= 0			
				SetGadgetText status,"F4 - Deleted "+GadgetItemText (lister, oldsel) : 
				RemoveGadgetItem lister,oldsel
				SelectGadgetItem lister,oldsel-1
			EndIf 
		EndIf

		If EventData()=63 
			SetGadgetText status,"F5 - Reloaded " : ClearGadgetItems lister
			For a = 0 To 15
				AddGadgetItem lister, "Listbox Item "+a
			Next	
			SelectGadgetItem lister,0
		EndIf		
		
		If EventData()=64 
			SetGadgetText status,"F6 - Bottom of list"
			SelectGadgetItem lister,CountGadgetItems (lister)-1
		EndIf 

	Case $803
		Exit
		
End Select

Wend