Package com.sun.jna.platform

# Class WindowUtils

java.lang.Object
com.sun.jna.platform.WindowUtils

public class WindowUtils extends Object
Provides additional features on a Java `Window`.

- Non-rectangular shape (bitmap mask, no antialiasing)
- Transparency (constant alpha applied to window contents or transparent background)
- Fully transparent window (the transparency of all painted pixels is applied to the window).

NOTE: since there is no explicit way to force PopupFactory to use a heavyweight popup, and anything but a heavyweight popup will be clipped by a window mask, an additional subwindow is added to all masked windows to implicitly force PopupFactory to use a heavyweight window and avoid clipping.

NOTE: Neither shaped windows nor transparency currently works with Java 1.4 under X11. This is at least partly due to 1.4 using multiple X11 windows for a single given Java window. It *might* be possible to remedy by applying the window region/transparency to all descendants, but I haven't tried it. In addition, windows must be both displayable and visible before the corresponding native Drawable may be obtained; in later Java versions, the window need only be displayable.

NOTE: If you use `setWindowMask(Window,Shape)` and override `Window.paint(Graphics)` on OS X, you'll need to explicitly set the clip mask on the `Graphics` object with the window mask; only the content pane of the window and below have the window mask automatically applied.

NOTE: On OSX, the property `apple.awt.draggableWindowBackground` is set automatically when a window's background color has an alpha component. That property must be set to its final value before the heavyweight peer for the Window is created. Once `Component.addNotify()` has been called on the component, causing creation of the heavyweight peer, changing this property has no effect.

Author:
  Andreas "PAX" Lück, onkelpax-git[at]yahoo.de
See Also:
  - Apple Technote 2007

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static class`
  `WindowUtils.NativeWindowUtils`
  Window utilities with differing native implementations.
  `protected static class`
  `WindowUtils.RepaintTrigger`
  This can be installed over a `JLayeredPane` in order to listen for repaint requests.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final Shape`
  `MASK_NONE`
  Use this to clear a window mask.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `WindowUtils()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static List<DesktopWindow>`
  `getAllWindows(boolean onlyVisibleWindows)`
  Requests a list of all currently available Desktop windows.
  `static GraphicsConfiguration`
  `getAlphaCompatibleGraphicsConfiguration()`
  Returns a `GraphicsConfiguration` comptible with alpha compositing.
  `static Dimension`
  `getIconSize(WinDef.HICON hIcon)`
  Detects the size of an icon.
  `static String`
  `getProcessFilePath(WinDef.HWND hwnd)`
  Detects the full file path of the process associated with the specified window handle.
  `static BufferedImage`
  `getWindowIcon(WinDef.HWND hwnd)`
  Obtains the set icon for the window associated with the specified window handle.
  `static Rectangle`
  `getWindowLocationAndSize(WinDef.HWND hwnd)`
  Requests the location and size of the window associated with the specified window handle.
  `static String`
  `getWindowTitle(WinDef.HWND hwnd)`
  Tries to obtain the Window's title which belongs to the specified window handle.
  `static boolean`
  `isWindowAlphaSupported()`
  Indicate a window can have a global alpha setting.
  `static void`
  `setComponentMask(Component c, Shape mask)`
  Applies the given mask to the given heavyweight component.
  `static void`
  `setWindowAlpha(Window w, float alpha)`
  Set the overall window transparency.
  `static void`
  `setWindowMask(Window w, Shape mask)`
  Applies the given mask to the given window.
  `static void`
  `setWindowMask(Window w, Icon mask)`
  Applies the given mask to the given window.
  `static void`
  `setWindowTransparent(Window w, boolean transparent)`
  Set the window to be transparent.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### MASK_NONE

    public static final Shape MASK_NONE
    Use this to clear a window mask.

- ## Constructor Details

  - ### WindowUtils

    public WindowUtils()

- ## Method Details

  - ### setWindowMask

    public static void setWindowMask(Window w, Shape mask)
    Applies the given mask to the given window. Does nothing if the operation is not supported. The mask is treated as a bitmap and ignores transparency.

  - ### setComponentMask

    public static void setComponentMask(Component c, Shape mask)
    Applies the given mask to the given heavyweight component. Does nothing if the operation is not supported. The mask is treated as a bitmap and ignores transparency.

  - ### setWindowMask

    public static void setWindowMask(Window w, Icon mask)
    Applies the given mask to the given window. Does nothing if the operation is not supported. The mask is treated as a bitmap and ignores transparency.

  - ### isWindowAlphaSupported

    public static boolean isWindowAlphaSupported()
    Indicate a window can have a global alpha setting.

  - ### getAlphaCompatibleGraphicsConfiguration

    public static GraphicsConfiguration getAlphaCompatibleGraphicsConfiguration()
    Returns a `GraphicsConfiguration` comptible with alpha compositing.

  - ### setWindowAlpha

    public static void setWindowAlpha(Window w, float alpha)
    Set the overall window transparency. An alpha of 1.0 is fully opaque, 0.0 fully transparent. The alpha level is applied equally to all window pixels.

    NOTE: Windows requires that `sun.java2d.noddraw=true` in order for alpha to work.

    NOTE: On OSX, the property `apple.awt.draggableWindowBackground` must be set to its final value before the heavyweight peer for the Window is created. Once `Component.addNotify()` has been called on the component, causing creation of the heavyweight peer, changing this property has no effect.

    See Also:
      - Apple Technote 2007

  - ### setWindowTransparent

    public static void setWindowTransparent(Window w, boolean transparent)
    Set the window to be transparent. Only explicitly painted pixels will be non-transparent. All pixels will be composited with whatever is under the window using their alpha values. On OSX, the property `apple.awt.draggableWindowBackground` must be set to its final value before the heavyweight peer for the Window is created. Once `Component.addNotify()` has been called on the component, causing creation of the heavyweight peer, changing this property has no effect.
    See Also:
      - Apple Technote 2007

  - ### getWindowIcon

    public static BufferedImage getWindowIcon(WinDef.HWND hwnd)
    Obtains the set icon for the window associated with the specified window handle.
    Parameters:
      `hwnd` - The concerning window handle.
    Returns:
      Either the window's icon or `null` if an error occurred.

  - ### getIconSize

    public static Dimension getIconSize(WinDef.HICON hIcon)
    Detects the size of an icon.
    Parameters:
      `hIcon` - The icon handle type.
    Returns:
      Either the requested icon's dimension or an `Dimension` instance of `(0, 0)`.

  - ### getAllWindows

    public static List<DesktopWindow> getAllWindows(boolean onlyVisibleWindows)
    Requests a list of all currently available Desktop windows.
    Parameters:
      `onlyVisibleWindows` - Specifies whether only currently visible windows will be considered (`true`). That are windows which are not minimized. The `WS_VISIBLE` flag will be checked (see: User32.IsWindowVisible(HWND)).
    Returns:
      A list with all windows and some detailed information.

  - ### getWindowTitle

    public static String getWindowTitle(WinDef.HWND hwnd)
    Tries to obtain the Window's title which belongs to the specified window handle.
    Parameters:
      `hwnd` - The concerning window handle.
    Returns:
      Either the title or an empty string of no title was found or an error occurred.

  - ### getProcessFilePath

    public static String getProcessFilePath(WinDef.HWND hwnd)
    Detects the full file path of the process associated with the specified window handle.
    Parameters:
      `hwnd` - The concerning window handle for which the PE file path is required.
    Returns:
      The full file path of the PE file that is associated with the specified window handle.

  - ### getWindowLocationAndSize

    public static Rectangle getWindowLocationAndSize(WinDef.HWND hwnd)
    Requests the location and size of the window associated with the specified window handle.
    Parameters:
      `hwnd` - The concerning window handle.
    Returns:
      The location and size of the window.