在Java应用程序中嵌入外部应用程序(或伪造)

在Java应用程序中嵌入外部应用程序(或伪造),java,java-native-interface,external-process,Java,Java Native Interface,External Process,我有一个java应用程序将在Windows7上运行(使用Swing,App#1),它可以全屏运行(但不是独占模式)。我有另一个应用程序(App#2),它显示一个GUI,通过一个串行端口配置一个外部设备,我没有源代码,也无法更改 我想将App#2嵌入App#1中,使其看起来像是父java应用程序的一部分(隐藏文件-->退出按钮,隐藏最小化、最大化和关闭按钮) 如果这种集成在Java应用程序中是不可能的,我可以使用Java打开流程,并监视它以保持其开放性。它需要将窗口设置为“始终在顶部”,因为App

我有一个java应用程序将在Windows7上运行(使用Swing,App#1),它可以全屏运行(但不是独占模式)。我有另一个应用程序(App#2),它显示一个GUI,通过一个串行端口配置一个外部设备,我没有源代码,也无法更改

我想将App#2嵌入App#1中,使其看起来像是父java应用程序的一部分(隐藏文件-->退出按钮,隐藏最小化、最大化和关闭按钮)

如果这种集成在Java应用程序中是不可能的,我可以使用Java打开流程,并监视它以保持其开放性。它需要将窗口设置为“始终在顶部”,因为App#1是全屏的,并且尽可能多地隐藏外部MS Windows UI,以诱使用户认为它不是外部应用程序。是否有某种方法可以使用JNI或其他方法从Java应用程序内部管理另一个进程窗口(屏幕位置、标题栏、最小化、最大化、关闭按钮可见性)和进程状态


如果需要的话,我很乐意提供更多信息。

以下方案与语言无关,我已通过这种方式将IE窗口嵌入到Ruby应用程序中:

  • 首先,更改外部应用程序窗口的样式(可以使用JNA调用WinAPI):

    样式=GetWindowLongPtr(应用程序样式,GWL样式)

    样式|=WS|U儿童

    样式&=~WS\u标题

    样式&=~WS\u弹出窗口

    SetWindowLongPtr(HWND、GWL_样式、样式)

  • 定义窗口之间的父子关系:

    SetParent(应用程序、JAVA应用程序)

  • 收听Java窗口的移动/调整大小事件,并在子窗口上应用新位置


我以前从未使用过Windows API或JNA。如何获取使用ProcessBuilder打开的应用程序的hWnd指针。这是我在SO上找到的一个引用,但它谈到了传递一个我认为我没有的组件,因为它是一个外部应用程序。下面是一些使用JNA在Java中检测窗口句柄的示例:通常,您调用WinAPI的方法
EnumWindows
,该方法返回所有现有窗口。然后通过窗口标题(
GetWindowText
method)@spektom找到相关的一个。您有上面描述的Java应用程序的源代码吗?我正在尝试使用Java小程序在网页中嵌入桌面应用程序窗口。@spektom还有,不使用Windows API(不是跨平台的)也可以做到这一点吗?@AndersonGreen如果您是为跨平台开发,您必须单独实现所有特定于平台的部分,即GTK、Windows、,等等。我没有Java的源代码,但如果您查看Eclipse源代码中的浏览器嵌入部分,您将找到如何做到这一点所需的所有信息: