2015-03-31 64 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