Gtk:将焦点发送到顶层窗口而不会丢失第一个顶层窗口

时间:2010-12-07 19:20:00

标签: c++ c gtk gdk

情况如下:

1)我有两个顶层窗户,A和B

2)A在B前面

如何在将窗口A保持在B前面的同时将键盘焦点发送到窗口B?

3 个答案:

答案 0 :(得分:1)

如果你不介意它不是直接的,你可以将键盘事件从顶层窗口发送到它后面的那个。当然,假设两个窗口都是由您创建的,而不是编写程序在后台悬停并读取在单独程序中使用的键盘输入。

答案 1 :(得分:1)

我假设您控制两个窗口,这是在像Linux这样的X11系统上。如果没有,那就更具挑战性了。我在一个应用程序中完成了这样的事情,这里有一些回忆。

您可能已经发现,您不能只使用gtk_widget_grab_focus()来执行此操作。这仅适用于在窗口本身具有焦点时确定窗口中的哪个窗口小部件具有焦点。

X11根据窗口层次结构,窗口管理器中的信息等确定哪个窗口获取键盘事件。但是,您可以通过GDK来获取结果,以获得所需的结果。

您必须了解GDK event propagation,并且可能会阅读一些GDK来源。但我相信,一般来说,你需要做的是:

  1. 使用gdk_event_handler_set()安装自己的事件处理程序。初始化GTK +后,您需要执行此操作,并链接到gtk_main_do_event()。
  2. 当您获得键盘事件(GdkEventKey)时,请查看X事件结构。如果它具有窗口A的XID,则将其替换为窗口B的XID,并将其传递给GTK +。您可能需要复制该事件,而不是修改原始事件。
  3. 如果窗口属于不同的应用程序,您可以查看gdk_event_send_client_message(),但我从未使用过它。

答案 2 :(得分:1)