Я предполагаю, что вы контролируете оба окна, и это на X11-системе, такой как Linux. Если нет, это намного сложнее. Я сделал такие вещи в одном приложении, и вот некоторые воспоминания.
Вы, вероятно, выяснили, что не можете использовать gtk_widget_grab_focus() для этого. Это работает только для определения того, какой виджет внутри окна имеет фокус, когда у самого окна есть фокус.
Это X11, который определяет, какое окно получает событие клавиатуры, основанное на иерархии окон, информация из диспетчера окон и т. Д. Однако вы можете обезопасить себя через GDK, чтобы получить желаемый результат.
Вам нужно узнать о GDK event propagation и, возможно, прочитать некоторые источники GDK. Но я считаю, что, как правило, вам нужно сделать следующее:
- Используйте gdk_event_handler_set(), чтобы установить собственный обработчик событий. Вам нужно будет сделать это после инициализации GTK + и привязки к gtk_main_do_event().
- Когда вы получаете событие клавиатуры (GdkEventKey), посмотрите на структуру событий X. Если он имеет XID для окна A, замените его на XID для окна B и передайте его GTK +. Возможно, вам придется дублировать событие, а не изменять оригинал.
Если окна принадлежат к разным приложениям, вы можете посмотреть gdk_event_send_client_message(), но я никогда не использовал его.
Фактически я уже сделал шаг 1, но то, что я действительно пропустил, - это то, как я могу сравнить два GdkWindow, я не могу использовать указатели для этого. И не всегда этот GdkWindow является полным, иногда это другое окно, я даже пытался использовать g_object_set_data для добавления имени в окно, но, как я уже упоминал, это окно не всегда является полным. Как я могу получить полный уровень и как я могу получить XID для GdkWindow? Большое спасибо за ваш ответ. – Tarantula 2010-12-08 11:12:13