5

SWT プログラムのウィンドウ ID を知りたいです。

標準的な方法で SWT シェルを起動します。作成されたウィンドウの ID を見つけるにはどうすればよいですか? プログラムは、Compiz-Fusion ウィンドウ マネージャーを使用して Fedora 10 で実行されています (違いがある場合)。

私が何を意味するかを説明するのに役立つコード:

public static void main(String[] args) {
  Display display = new Display();
  Shell shell = new Shell();

  // find window ID here??

  shell.open();

  while (!shell.isDisposed()) {
    if(!display.readAndDispatch()) {
      display.sleep();
    }
  }
}

更新 2009 年 3 月 6 日 さまざまなことを調べて試した結果 (以下の提案については VonC に感謝します)、これまでのところ機能しているものに出会いました。それは非常に危険ですが、少なくとも当面は他の仕事に取り掛かることができます.

Control.embeddedHandle から返される ID は、ウィンドウ ID に近いです。予測可能なオフセットだけ異なります。だから私のコードは次のとおりです。

public static void main(String[] args) {
  ...
  Shell shell = new shell(display, SWT.NONE);

  Composite e = new Composite(shell, SWT.EMBEDDED);
  long windowID = e.embeddedHandle - WINDOW_ID_MAGIC_NUMBER;
  e.dispose();
  ....

WINDOW_ID_MAGIC_NUMBER は 5+(埋め込みコンポジットの前にシェルに追加されたウィジェットの数) です。

これまでのところ、私のシステムでは信頼できるようです。別の環境で倒れるかどうかはまだわかりません。

4

2 に答える 2

3

SWT.EMBEDDED スタイルの Composite を作成する場合、SWT/GTK+ Composite.embeddedHandle の下では、XEMBED の子を親にするために使用できる X ウィンドウ ID になります。

Composite embed = new Composite(shell, SWT.EMBEDDED);
System.out.println ("X window ID: " + embed.embeddedHandle);
int hwndChild = OS.GetWindow ( c.handle, OS.GW_CHILD);

これは、XEMBED プロトコルを使用した埋め込みをサポートします。

これは、ハンドルからウィンドウ ID を取得するために使用される JNI コードに似ています。

GtkWidget *widget = (GtkWidget *) handle;
GdkWindow *window = widget->window;
xwinid = GDK_WINDOW_XWINDOW(window);

コードの例はこちら

OSを使った授業例:

org.eclipse.swt.widgets.Treeorg.eclipse.swt.widgets.CoolItem

私が見つけることができるOSは確かにorg.eclipse.swt.internal.win32.OSであり、gtkではありません。内部パッケージにアクセスするため、これは完璧なソリューションではありませんが、どこを見ればよいかがわかります。

あなたの場合、org.eclipse.swt.internal.gtk.OS正しいクラスであり、Tree または CoolItem ソースで GetWindow 関数をどのように使用しているかを調べる必要があります。
他の関数を GTK で呼び出す必要があります。gtk_container_get_children(int container);

冒頭で言及したメッセージへの回答で言われています

X ウィンドウが必要な場合、パブリック SWT API からこれを行う方法はありません (内部を経由する場合でも)。さらに、すべてのコントロールに対してそれを保証できるとは思わない方法があったとしても. これが機能するかどうかはわかりませんが、最も近いのは次のとおりです。

  1. Control.fixedHandle公開 する
  2. を使用OS.GTK_WIDGET_WINDOW (control.fixedHandle)してGdkWindow
  3. OS.gdk_x11_drawable_get_xid (gdkWindow)それをXウィンドウに変換するために使用します

もう 1 つの方法は、 を取得Control.handleしてそれを呼び出すGTK_WIDGET_WINDOW()か、それnullGdkWindow.

ここでの問題は、SWT が GTK+ と対話し、GTK+ が GDK と対話し、次に GDK が X と対話することです。つまり、ユーザーと X ウィンドウの間には 3 つの層があります。

于 2009-03-04T05:11:42.813 に答える