我正在处理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,但不能将焦点设置为内部框架。谢谢
答案 0 :(得分:2)
Swing非顶级组件是轻量级组件,因此不是由操作系统创建的,没有HWND窗口句柄,因此无法通过JNA获取。相反,您必须通过调用getAllFrames()
上的JDesktopPane
来审核JVM,而JInternalFrames
会保留您感兴趣的{{1}}。