2010-07-22 98 views
1

我有一個Java應用程序,將運行在Windows 7(使用Swing,應用程序#1)作爲全屏(但不是獨佔模式)運行。我有另一個應用程序(應用程序#2),它顯示一個GUI,通過一個串口來配置一個外部設備,這個串口我沒有源碼,根本無法更改。將外部應用程序嵌入Java應用程序(或僞造)

我想在App#1中嵌入App#2,使它看起來像是父Java應用程序的一部分(隱藏文件 - >退出按鈕並隱藏最小化,最大化和關閉按鈕)。

如果在Java應用程序中不可能實現這種集成,那麼使用Java打開進程並只監視它以保持打開狀態就沒問題。它需要保持窗口設置爲「總是在最前面」,因爲App#1是全屏幕並儘可能多地隱藏MS Windows UI以誘使用戶認爲它不是外部應用程序。是否有某種方法使用JNI或其他方法來管理另一個流程窗口(屏幕位置,標題欄,最小化,最大化,關閉按鈕可見性)以及從Java應用程序中處理狀態?

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

回答

4

以下方案無關的語言,我已經成功地嵌入IE瀏覽器窗口,進入一個Ruby應用程序是這樣的:

  • 首先,改變外部應用程序窗口的風格(你可以使用JNA用於調用WinAPI):

    style = GetWindowLongPtr(APP_HWND,GWL_STYLE);

    style | = WS_CHILD;

    style & =〜WS_CAPTION;

    style & =〜WS_POPUP;

    SetWindowLongPtr(HWND,GWL_STYLE,style);

  • 定義窗口之間的父子關係:

    的setparent(APP_HWND,JAVA_HWND);

  • 收聽移動/調整Java窗口的事件,並在子窗口上應用新的位置。

+0

我以前從來沒有使用過Windows API或JNA。我如何獲得使用ProcessBuilder打開的應用程序的hWnd指針? 。 這是我在SO上找到的一個參考,但是它講述了傳遞一個我認爲我沒有的組件,因爲它是一個外部應用程序。 http://stackoverflow.com/questions/386792/in-java-swing-how-do-you-get-a-win32-window-handle-hwnd-reference-to-a-window – 2010-07-22 18:47:07

+0

下面是一些例子使用JNA檢測Java中的窗口句柄:http://forums.sun.com/thread.jspa?threadID=5423994 通常,您調用WinAPI的方法'EnumWindows',它將返回所有現有的窗口。然後通過窗口標題('GetWindowText'方法)找到相關的一個。 – spektom 2010-07-22 19:07:33

+0

@spektom您是否擁有上述Java應用程序的源代碼?我試圖使用Java小程序在網頁內嵌入桌面應用程序窗口。 – 2012-11-20 05:15:45