我想找到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的小部件数).
到目前为止,我的系统似乎可靠.我还没有看到它是否会在不同的环境中崩溃.
如果您使用 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 执行此操作(甚至通过内部),而且即使有一种方法,我认为您也无法保证所有控件都能做到这一点。我不确定这是否有效,但您能得到的最接近的结果可能是:
- 公之于众
Control.fixedHandle- 使用
OS.GTK_WIDGET_WINDOW (control.fixedHandle)来获得GdkWindow- 用于
OS.gdk_x11_drawable_get_xid (gdkWindow)将其转换为 X 窗口我想另一种方法可能是获取
Control.handle,然后调用GTK_WIDGET_WINDOW()它,或者继续null调用它的父级,直到找到一个带有 的GdkWindow,然后将其转换为 X 窗口。这里的困难在于,SWT 与 GTK+ 对话,GTK+ 与 GDK 对话,然后 GDK 与 X 对话。因此,您和 X 窗口之间有三层。
| 归档时间: |
|
| 查看次数: |
4298 次 |
| 最近记录: |