使用java处理外部窗口

我需要检查外部窗口(另一个java程序,但不是我正在处理的程序控制)是否使用标题打开,如果打开,则根据Java中的用户命令最大化或最小化它(我只知道窗口的标题,没有别的)。 谷歌只说我可以使用winapi获取窗口句柄并使用句柄操纵它,但我无法找到如何做到这一点。

我可以在这里找到关于如何使用JNI的参考: 在Java Swing中如何获得对窗口的Win32窗口句柄(hwnd)引用? 。 是否可以在不使用JNI的情况下完成此操作?

有人可以帮我理解如何做到这一点。

感谢致敬

我刚刚在JNA中添加了很多与win32相关的窗口函数。 你可以在这里看到详细信息。

 // Find and minimize a window: WinDef.HWND hWnd = User32.INSTANCE.FindWindow("className", "windowName"); User32.INSTANCE.ShowWindow(hWnd, WinUser.SW_MINIMIZE); 

您还可以枚举所有窗口:

 final WinDef.HWND[] windowHandle = new WinDef.HWND[1]; User32.INSTANCE.EnumWindows(new WinUser.WNDENUMPROC() { @Override public boolean callback(WinDef.HWND hwnd, Pointer pointer) { if (matches(hwnd)) { windowHandle[0] = hwnd; return false; } return true; } }, Pointer.NULL); // Minimize or maximize windowHandle[0] here... 

Java没有此API,因此您必须使用JNI。 有关详细信息,请参阅eznme的答案。

您可以使用Windows API获取窗口的句柄,然后调整其大小:

 EnumWindows: http://msdn.microsoft.com/en-us/library/ms633497%28v=VS.85%29.aspx GetNextWindow: http://msdn.microsoft.com/en-us/library/ms633509%28v=VS.85%29.aspx GetWindowText: (to decide whether that is the window you want; if title matches) http://msdn.microsoft.com/en-us/library/ms633520%28v=VS.85%29.aspx FindWindow: (for this you need the exact title beforehand, not just part of it) http://msdn.microsoft.com/en-us/library/ms633499%28v=vs.85%29.aspx ShowWindow: http://msdn.microsoft.com/en-us/library/ms633548%28v=VS.85%29.aspx 

典型的WinAPI界面,使用起来有点笨重但function强大。

如上所述,这在纯Java中是不可能的。 本机执行的示例(您需要将其转换为JNI):

 HWND hwnd = FindWindow( _T("classname"), _T("windowname") ); // Minimize ShowWindow( hwnd, SW_MINIMIZE ); // Maximize ShowWindow( hwnd, SW_MAXIMIZE ); 

您已经拥有窗口名称,但您还应提供类名,因为这样可以更准确地获取窗口。 如果有多个窗口具有相同的windowname,那么您的程序可能会做一些不受欢迎的事情。

您可以使用Spy ++之类的东西来获取类名。 或者也只是通过代码。 确保您的窗口当前是唯一具有匹配windowname的窗口,然后您可以执行以下操作:

 TCHAR lpClassName[256] = {0}; HWND hwnd = FindWindow( _T("classname"), _T("windowname") ); GetClassName( hwnd, lpClassName, _countof( lpClassName ) ); MessageBox( NULL, _T("Class Name"), lpClassName, MB_OK ); 

如果可以使用此处的代码从Java进程本身获取HWND,那么您应该将其传递给本机部分,因为它将保证可靠。