package com.sun.jna.platform.win32; import static org.junit.Assert.assertNotEquals; import static com.sun.jna.platform.WindowUtilsTest.assertPixelColor; import static com.sun.jna.platform.WindowUtilsTest.getPixelColor; import java.io.File; import java.io.FileInputStream; import java.util.List; import javax.imageio.ImageIO; import javax.swing.JFrame; import java.awt.image.BufferedImage; import java.awt.Rectangle; import java.awt.Dimension; import junit.framework.TestCase; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Pointer; import com.sun.jna.platform.WindowUtils; import com.sun.jna.platform.DesktopWindow; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef.DWORDByReference; import com.sun.jna.platform.win32.WinDef.HICON; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.LPARAM; import com.sun.jna.platform.win32.WinDef.LRESULT; import com.sun.jna.platform.win32.WinDef.WPARAM; import com.sun.jna.platform.win32.WinUser; public class WindowUtilsTest extends TestCase { public void testGetAllWindows() { final List<DesktopWindow> allWindows = WindowUtils.getAllWindows(false); final List<DesktopWindow> allVisibleWindows = WindowUtils .getAllWindows(true); assertTrue("Found no windows", allWindows.size() > 0); assertTrue("Found no visible windows", allVisibleWindows.size() > 0); assertTrue("Expected more non-visible windows than visible windows", allWindows.size() > allVisibleWindows.size()); DesktopWindow explorerProc = null; for (final DesktopWindow dw : allWindows) { if (dw.getFilePath().toLowerCase().endsWith("explorer.exe")) { explorerProc = dw; break; } } assertNotNull("explorer.exe was not found among all windows", explorerProc); explorerProc = null; for (final DesktopWindow dw : allVisibleWindows) { if (dw.getFilePath().toLowerCase().endsWith("explorer.exe")) { explorerProc = dw; break; } } assertNotNull("explorer.exe was not found among visible windows", explorerProc); } public void testGetWindowIcon() throws Exception { final JFrame w = new JFrame(); try { final BufferedImage expectedIcon = ImageIO .read(new FileInputStream(new File(getClass().getResource( "/res/test_icon.png").getPath()))); w.setIconImage(expectedIcon); w.setVisible(true); Pointer p = Native.getComponentPointer(w); assertNotNull("Couldn't obtain window HANDLE from JFrame", p); HWND hwnd = new HWND(p); final BufferedImage obtainedIcon = WindowUtils.getWindowIcon(hwnd); assertTrue(obtainedIcon.getWidth() > 0); assertTrue(obtainedIcon.getHeight() > 0); int[] expectedColors = getPixelColor(expectedIcon, 10, 10); assertPixelColor(obtainedIcon, 10, 10, expectedColors[0], expectedColors[1], expectedColors[2]); expectedColors = getPixelColor(expectedIcon, expectedIcon.getWidth() - 10, 10); assertPixelColor(obtainedIcon, obtainedIcon.getWidth() - 10, 10, expectedColors[0], expectedColors[1], expectedColors[2]); expectedColors = getPixelColor(expectedIcon, expectedIcon.getWidth() - 10, expectedIcon.getHeight() - 10); assertPixelColor(obtainedIcon, obtainedIcon.getWidth() - 10, obtainedIcon.getHeight() - 10, expectedColors[0], expectedColors[1], expectedColors[2]); expectedColors = getPixelColor(expectedIcon, 10, expectedIcon.getHeight() - 10); assertPixelColor(obtainedIcon, 10, obtainedIcon.getHeight() - 10, expectedColors[0], expectedColors[1], expectedColors[2]); } finally { w.dispose(); } } public void testGetWindowLocationAndSize() { final JFrame w = new JFrame(); try { w.setLocation(23, 23); w.setPreferredSize(new Dimension(100, 100)); w.pack(); w.setVisible(true); HWND hwnd = new HWND(); hwnd.setPointer(Native.getComponentPointer(w)); final Rectangle locAndSize = WindowUtils .getWindowLocationAndSize(hwnd); assertEquals(w.getLocation().x, locAndSize.x); assertEquals(w.getLocation().y, locAndSize.y); assertEquals(w.getSize().width, locAndSize.width); assertEquals(w.getSize().height, locAndSize.height); } finally { w.dispose(); } } public void testGetWindowTitle() { final JFrame w = new JFrame("A super unique title by PAX! " + System.currentTimeMillis()); try { w.setVisible(true); HWND hwnd = new HWND(); hwnd.setPointer(Native.getComponentPointer(w)); assertEquals(w.getTitle(), WindowUtils.getWindowTitle(hwnd)); } finally { w.dispose(); } } public void testGetIconSize() throws Exception { final JFrame w = new JFrame(); try { final BufferedImage expectedIcon = ImageIO .read(new FileInputStream(new File(getClass().getResource("/res/test_icon.png").getPath()))); w.setIconImage(expectedIcon); w.setVisible(true); Pointer p = Native.getComponentPointer(w); assertNotNull("Could not obtain native HANDLE for JFrame", p); HWND hwnd = new HWND(p); final DWORDByReference hIconNumber = new DWORDByReference(); LRESULT result = User32.INSTANCE .SendMessageTimeout(hwnd, WinUser.WM_GETICON, new WPARAM(WinUser.ICON_BIG), new LPARAM(0), WinUser.SMTO_ABORTIFHUNG, 500, hIconNumber); assertNotEquals(0, result.intValue()); final HICON hIcon = new HICON(new Pointer(hIconNumber.getValue() .longValue())); assertTrue(WindowUtils.getIconSize(hIcon).width >= 32); assertTrue(WindowUtils.getIconSize(hIcon).height >= 32); assertEquals(WindowUtils.getIconSize(hIcon).width, WindowUtils.getIconSize(hIcon).height); } finally { w.dispose(); } } public void testGetProcessFilePath() { if (!Platform.isWindows()) { return; } final JFrame w = new JFrame(); try { w.setVisible(true); final String searchSubStr = "\\bin\\java"; final HWND hwnd = new HWND(Native.getComponentPointer(w)); assertTrue("Path didn't contain '" + searchSubStr + "': " + WindowUtils.getProcessFilePath(hwnd), WindowUtils.getProcessFilePath(hwnd).toLowerCase() .contains(searchSubStr)); } finally { w.dispose(); } } public static void main(String[] args) { junit.textui.TestRunner.run(WindowUtilsTest.class); } }