1

状況は次のとおりです。

1)AとBの2つのトップレベルウィンドウがあります

2)AはBの前にあります

ウィンドウAをBの前に置いたまま、キーボードフォーカスをウィンドウBに送信するにはどうすればよいですか?

4

3 に答える 3

1

gtk_window_set_keep_above(a)続いて?gtk_window_present(b)

于 2010-12-09T00:13:21.333 に答える
1

両方のウィンドウを制御すると仮定していますが、これは Linux のような X11 システム上にあります。そうでない場合は、はるかに困難です。私はこのようなことを 1 つのアプリ内で行いましたが、ここにいくつかの思い出があります。

おそらく、 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+ に渡します。元のイベントを変更するのではなく、イベントを複製する必要がある場合があります。

ウィンドウが別のアプリに属している場合は、gdk_event_send_client_message() を見ることができますが、私は使用したことがありません。

于 2010-12-08T02:53:29.770 に答える
1

直接的でなくても構わない場合は、トップ レベル ウィンドウからその背後にあるウィンドウにキーボード イベントを送信できます。もちろん、バックグラウンドでホバリングして別のプログラムで使用されているキーボード入力を読み取るプログラムを作成するのではなく、両方のウィンドウが作成されていることを前提としています。

于 2010-12-07T19:23:48.960 に答える