【问题标题】:Embed external application inside Java application (or fake it)在 Java 应用程序中嵌入外部应用程序(或伪造它)
【发布时间】:2023-03-11 06:31:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java java-native-interface external-process


    【解决方案1】:

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

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

      style = GetWindowLongPtr(APP_HWND, GWL_STYLE);

      风格 |= WS_CHILD;

      风格 &= ~WS_CAPTION;

      样式 &= ~WS_POPUP;

      SetWindowLongPtr(HWND, GWL_STYLE, 风格);

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

      SetParent(APP_HWND, JAVA_HWND);

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

    【讨论】:

    • 我以前从未使用过 Windows API 或 JNA。如何获得使用 ProcessBuilder 打开的应用程序的 hWnd 指针? .这是我在 SO 上找到的参考资料,但它谈到了传递一个我认为我没有的组件,因为它是一个外部应用程序。 stackoverflow.com/questions/386792/…
    • 下面是一些使用 JNA 检测 Java 中的窗口句柄的示例:forums.sun.com/thread.jspa?threadID=5423994 通常,您调用 WinAPI 的方法 EnumWindows,它会返回所有现有的窗口。然后通过窗口标题找到相关的(GetWindowText方法)
    • @spektom 你有上面描述的 Java 应用程序的源代码吗?我正在尝试使用 Java 小程序在网页中嵌入桌面应用程序窗口。
    • @spektom 另外,是否可以在不使用 Windows API(不是跨平台的)的情况下做到这一点?
    • @AndersonGreen 如果您正在为跨平台开发,则必须分别实现所有特定于平台的部分,即针对 GTK、Windows 等。我没有源代码Java,但如果您查看 Eclipse 源代码的浏览器嵌入部分,您会发现所有需要的信息:grepcode.com/file/repository.grepcode.com/java/eclipse.org/3.5/…
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多