Thanks for raising this. I’ve split this into two separate feature requests because the two behaviours need different implementations.
The modifier/qualifier problem has now been implemented for the next release. Desktop apps now have a new Keyboard module:
https://feedback.objo.dev/feature/290
If key = Key.Down And Keyboard.ShiftDown Then
Print("Shift + Down")
End If
If key = Key.S And (Keyboard.CommandDown Or Keyboard.ControlDown) Then
Print("Save shortcut")
End If
It also supports checking specific keys directly:
If Keyboard.IsKeyDown(Key.LeftShift) And key = Key.Down Then
Print("Left Shift + Down")
End If
Inside KeyDown() and KeyUp() handlers, the keyboard state is taken from the event snapshot, so in your example where Shift is held and the Down key repeats, Keyboard.ShiftDown will remain true for those repeated Down events.
I’ve also added a small example app called Keyboard Shortcuts showing how to use the new module.
I’ve deferred the KeyDown(key As String) As Boolean cancellation request for now. Objo currently queues desktop key events onto the VM/event thread after the platform key event has already been delivered. That means a Boolean return value would be misleading unless the event pipeline is changed so Objo can synchronously mark the original platform event as handled. I’ve logged that separately so it can be designed properly rather than adding an API that only appears to cancel the key press.