Я предполагаю, что вы используете систему с X (org). Если не то, что можно сделать, так и уровень evdev, но это уже другая история.
Две части в вашем вопросе:
- перехват всех ключевых событий -> XGrabKeyboard ()
- отправка ключевых событий в активное приложение: я бы использовал libfakekey, это немного хакерский хакер (он динамически перераспределяет часть текущей таблицы ключей для отправки KeySym, который вы хотите отправить), но это сработало для меня (небольшой совет, дон не забудьте переназначить как нажатия клавиш, так и события отпускания клавиш: p).
Конечно, в вашем приложении, захватывающем клавиатуру, вам придется слушать KeyEvents из X и отправлять оттуда ключи.