2015-03-31 68 views
0

我將與JNA打交道並嘗試獲取JDialog中的JInternalFrame的標題。我可以通過使用JNA獲得所有Windows Programns標題,但JInternalFrame的標題不會在列表中顯示。JNA Win32獲取JInternalFrame的標題

I'm做這樣的事情:

user32.EnumWindows(new User32.WNDENUMPROC() { 

      int count; 

      public boolean callback(HWND hWnd, Pointer userData) { 
       char[] windowText = new char[1024*2]; 
       EnumerateWindows.User32DLL.GetWindowTextW(hWnd, windowText, 
       EnumerateWindows.getMaxTitleLength()); 

       String wText = Native.toString(windowText); 
       wText = (wText.isEmpty()) ? "" : " " + wText; 

       if (!wText.isEmpty()) 
        logger.warn("Window Title:" 
          + wText); 

       return true; 
      } 


     }, null); 

...

所有窗口標題出現,但JInternalFrames不,有人可以幫助我嗎?

其實,我會更具體。我正在使用JNA,因爲我試圖把重點放在生產中運行的程序上。我無權訪問應用程序生產代碼,也無法訪問此計算機上的任何內容。我只能打電話給我自己的jar程序。我的程序是一個機器人,它填充了特定JInternalFrame中的某些表單。出於某種原因,這個框架在ActionPerformed按鈕事件之後失去了焦點,並且我想使用我的程序在此框架上再次設置焦點以繼續填充過程。我可以通過在JInternalFrame的任何位置點擊來做到這一點,但這有點冒險,因爲如果我錯過點擊框架內的內容,我的程序會填寫錯誤的表單。那麼,有沒有辦法將焦點集中在使用JNA + JRobot的第三方應用程序的JInternalFrame上,或者訪問JVM的一些暗部力量,:)?我可以將焦點設置到JDialog,但不是它的內部框架。謝謝

+1

您可以看一下[Abbot](https://abbot.sf.net)如何遍歷Java組件層次結構以查找Swing樹中的所有組件。您需要這樣做才能找到像「JInternalFrame」這樣的輕量級組件(即那些沒有本地對等/ HWND的組件)。 – technomage 2015-04-01 10:06:38

回答

2

Swing非頂層組件是輕量級組件,因此不是由操作系統創建的,沒有HWND窗口句柄,因此無法通過JNA獲取。您將不得不通過JVM,例如通過JDesktopPane調用getAllFrames()來保存您感興趣的JInternalFrames

+0

我嘗試了評論,但是我推斷了尺寸,所以我已經發布了一個答案,其中包含我的限制和更詳細的信息。 – IOSJR 2015-04-01 04:40:22