1

情况如下:

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

2)A在B前面

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

4

3 回答 3

1

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

于 2010-12-07T19:23:48.960 回答
1

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

你可能已经发现你不能只使用gtk_widget_grab_focus()来做到这一点。这仅适用于在窗口本身具有焦点时确定窗口中的哪个小部件具有焦点。

X11 根据窗口层次结构、来自窗口管理器的信息等来确定哪个窗口获得键盘事件。但是,您可以通过 GDK 到处乱搞以获得您想要的结果。

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

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

如果windows属于不同的app,可以看gdk_event_send_client_message(),不过我没用过。

于 2010-12-08T02:53:29.770 回答
1

gtk_window_set_keep_above(a)其次是?gtk_window_present(b)

于 2010-12-09T00:13:21.333 回答