JNA Win32获取JInternalFrame的标题

时间:2015-03-31 21:32:25

标签: java jna handle hwnd findwindow

我正在处理JNA并尝试获取JDialog中的JInternalFrame的标题。我可以使用JNA获取所有Windows程序标题,但JInternalFrame的标题不在列表中。

我正在做这样的事情:

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);

...

显示所有Windows标题,但JInternalFrames没有,有人可以帮助我吗?

实际上,我会更具体。我正在使用JNA,因为我正在努力关注正在运行的程序。我无权访问应用程序生产代码,也无法在此计算机上安装任何内容。我只能打电话给我自己的jar程序。我的程序是一个机器人,它填充了特定JInternalFrame中的一些表单。出于某种原因,这个框架在ActionPerformed按钮事件之后失去焦点,并且我想使用我的程序在该框架上再次设置焦点以继续填充过程。我可以通过单击JInternalFrame的任何位置来执行此操作,但这有点冒险,因为如果我错过了在框架内单击我的程序ciuld填写错误的表单。那么,有没有办法使用JNA + JRobot将焦点放在第三方应用程序的JInternalFrame上,或者访问JVM的一些黑暗的力量,:)?我可以将焦点设置为JDialog,但不能将焦点设置为内部框架。谢谢

1 个答案:

答案 0 :(得分:2)

Swing非顶级组件是轻量级组件,因此不是由操作系统创建的,没有HWND窗口句柄,因此无法通过JNA获取。相反,您必须通过调用getAllFrames()上的JDesktopPane来审核JVM,而JInternalFrames会保留您感兴趣的{{1}}。