来自Java SWT的窗口ID

cur*_*rsa 5 java swt

我想找到SWT程序的窗口ID.

我以标准方式启动SWT shell.然后,我如何找到已创建的窗口的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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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();
  ....
Run Code Online (Sandbox Code Playgroud)

WINDOW_ID_MAGIC_NUMBER是5+(在嵌入式复合之前添加到shell的小部件数).

到目前为止,我的系统似乎可靠.我还没有看到它是否会在不同的环境中崩溃.

Von*_*onC 3

如果您使用 SWT.EMBEDDED 样式创建 Composite ,则在 SWT/GTK+ Composite.embeddedHandle 下将是一个 X 窗口 ID,可用于为 XEMBED 子项设置父级。

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

这支持使用 XEMBED 协议进行嵌入。

这类似于用于从其句柄获取窗口 ID 的 JNI 代码

GtkWidget *widget = (GtkWidget *) handle;
GdkWindow *window = widget->window;
xwinid = GDK_WINDOW_XWINDOW(window);
Run Code Online (Sandbox Code Playgroud)

代码示例在这里。

使用操作系统的类示例:

org.eclipse.swt.widgets.Tree , org.eclipse.swt.widgets.CoolItem ,

我能找到的操作系统确实是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 窗口

我想另一种方法可能是获取Control.handle,然后调用GTK_WIDGET_WINDOW()它,或者继续null调用它的父级,直到找到一个带有 的GdkWindow,然后将其转换为 X 窗口。

这里的困难在于,SWT 与 GTK+ 对话,GTK+ 与 GDK 对话,然后 GDK 与 X 对话。因此,您和 X 窗口之间有三层。