XOSC's keyboard capture works just like a DAW's MIDI-learn: enter listen mode, press a key, done. Modifiers (Ctrl / Alt / Shift / Meta) are part of the binding, so Ctrl+F1 and F1 are different bindings.
What gets captured
The binding signature is built from event.code (the physical key, layout-independent) plus modifier flags. That means binding the key labelled "A" on a US keyboard captures the same physical key on an AZERTY keyboard — useful when your prop sends scancode-style input regardless of locale.
A modifier-only press (just Shift, just Ctrl, etc) is ignored while binding so you can't accidentally bind to the wrong thing.
When XOSC isn't focused
The renderer's keydown listener only fires when the XOSC window has keyboard focus. If you need a key to fire OSC even when XOSC is minimised, that's the use case for the global hotkey path — it'll be wired through Electron.globalShortcut in a near-future build. For now, keep XOSC in the foreground (or full-screen on a second monitor).
Tips for prop hardware
Most "USB button" props are keyboard emulators under the hood — Arduino Leonardo, Adafruit Trinket, generic foot pedals. They send a real keystroke, so XOSC's keyboard mode is the right fit. If your prop's letter conflicts with a system shortcut (e.g. Tab, Enter), reprogram it to send a function key like F13–F24 which Windows almost never uses.