【问题标题】:How to get Node handle in javafx8如何在 javafx8 中获取节点句柄
【发布时间】:2018-06-02 15:56:50
【问题描述】:

我们正在 Windows 中构建 JavaFX 应用程序。

我尝试使用与 java.awt.panel 一起使用的 JNA Native.getComponentPointer() 方法,但我无法找到使用 javafx.scene.layout.Pane 的好方法

有谁知道任何方法可以为窗格获取 hWnd 吗?

【问题讨论】:

  • 有吗? AWT 使用本机 OS 库来绘制组件,因此每个 AWT 组件都是 Windows 组件(在 Windows 上),但我认为 JavaFX 绘制自己的组件而不依赖底层工具包...
  • @sillyfly 据我所知,这是正确的。这正是 JavaFX 能够在实际呈现方式方面提供如此多自定义的原因。如果这是由原生组件完成的,那么 CSS 之类的东西就无法正常工作。
  • JavaFX 节点在窗口中呈现。 Windows OS 系统上的所有窗口都有一个hWnd,由本机Windows 工具包使用。但它不会通过任何公共 API 直接公开。
  • @yeyb 我正在努力解决同样的问题。您是否找到了解决此问题或使用 JavaFX 和 JNA 的其他方式的解决方案?

标签: java javafx hwnd


【解决方案1】:

不幸的是,我认为 JavaFX 不可能做到这一点。我能看到的唯一具有本地对等体的是舞台。您可以使用 ui 分析器工具(例如 WinSpy)或 Windows SDK 中的“inspect.exe”或“visualuiaverifynative.exe”自行验证。

来自Mixing Heavyweight and Lightweight Components by Oracle

Java 编程语言中有两种图形组件:重量级和轻量级。重量级组件与它自己的原生屏幕资源(通常称为对等)相关联。 java.awt 包中的组件,例如 Button 和 Label,是重量级组件。

[...]

轻量级组件没有自己的原生屏幕资源,因此它“更轻”。轻量级组件依赖于包含层次结构中祖先的屏幕资源,可能是底层的 Frame 对象。 javax.swing 包中的组件,例如 JButton 和 JLabel,是轻量级组件。

在这种情况下,JavaFX 就像 Swing;一个轻量级的工具包,其中的各种 ui 组件都是用 Java 编写的,并且没有本地对等点。

【讨论】:

    【解决方案2】:

    就我对the doc 的阅读而言,hWnd 和窗口对象之间存在 1:1 的关系。窗格和节点不是Windows,因此尝试获取特定于 hwnd 的节点似乎没有多大意义。

    您最多可以要求包含该节点的窗口的 hwnd。见:

    将答案中的函数应用于链接问题得到:

    Pointer hwnd = getWindowPointer(node.getScene().getWindow());
    

    【讨论】:

    • 谢谢,但我确实需要这个 hwnd,我们正在 Windows 中构建一个 JavaFX 应用程序来处理视频。视频 SDK 需要这个 hwnd 来指向视频播放的位置。如果我在 javaFx 中添加了 awt.Panel,或者我不得不放弃 javaFx,改用 awt
    • 我不明白你的意思。我链接的答案是否没有向您展示如何获得 hWnd?
    • 我不需要窗口句柄,我需要一个组件句柄,但只有重量级组件有句柄。如何在javaFx中获取组件句柄,在javaFx中添加一个awt.Panel?跨度>
    • 这毫无意义。您问如何获得 hWnd。 hWnd 只存在于窗口,它的definition 是“窗口句柄”。它不是“组件句柄”(无论如何,我不知道你的意思)。
    • 对不起。与 java.awt.panel 一起使用的 JNA Native.getComponentPointer() 方法,返回面板指针 --aPointer 。然后使用 new W32API.HWND(aPointer ) 获取面板句柄。如何在 javaFx 中执行类似的操作
    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2011-04-25
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多