2010-12-07 2 views

ответ

1

Я предполагаю, что вы контролируете оба окна, и это на X11-системе, такой как Linux. Если нет, это намного сложнее. Я сделал такие вещи в одном приложении, и вот некоторые воспоминания.

Вы, вероятно, выяснили, что не можете использовать gtk_widget_grab_focus() для этого. Это работает только для определения того, какой виджет внутри окна имеет фокус, когда у самого окна есть фокус.

Это X11, который определяет, какое окно получает событие клавиатуры, основанное на иерархии окон, информация из диспетчера окон и т. Д. Однако вы можете обезопасить себя через GDK, чтобы получить желаемый результат.

Вам нужно узнать о GDK event propagation и, возможно, прочитать некоторые источники GDK. Но я считаю, что, как правило, вам нужно сделать следующее:

  1. Используйте gdk_event_handler_set(), чтобы установить собственный обработчик событий. Вам нужно будет сделать это после инициализации GTK + и привязки к gtk_main_do_event().
  2. Когда вы получаете событие клавиатуры (GdkEventKey), посмотрите на структуру событий X. Если он имеет XID для окна A, замените его на XID для окна B и передайте его GTK +. Возможно, вам придется дублировать событие, а не изменять оригинал.

Если окна принадлежат к разным приложениям, вы можете посмотреть gdk_event_send_client_message(), но я никогда не использовал его.

+0

Фактически я уже сделал шаг 1, но то, что я действительно пропустил, - это то, как я могу сравнить два GdkWindow, я не могу использовать указатели для этого. И не всегда этот GdkWindow является полным, иногда это другое окно, я даже пытался использовать g_object_set_data для добавления имени в окно, но, как я уже упоминал, это окно не всегда является полным. Как я могу получить полный уровень и как я могу получить XID для GdkWindow? Большое спасибо за ваш ответ. – Tarantula 2010-12-08 11:12:13

1

Если вы не против, что это не так, вы можете отправить события клавиатуры из окна верхнего уровня в тот, который находится за ним. Конечно, предполагается, что оба окна создаются вами, а не записывают программу для зависания в фоновом режиме и считывают ввод с клавиатуры, который используется в отдельной программе.