📄 windowstrayicon.java
字号:
/***
* Windows Tray Icon
* -----------------
*
* Written by Jan Struyf
*
* jan.struyf@cs.kuleuven.ac.be
* http://jeans.studentenweb.org/java/trayicon/trayicon.html
*
* Please mail me if you
* - 've found bugs
* - like this program
* - don't like a particular feature
* - would like something to be modified
*
* I always give it my best shot to make a program useful and solid, but
* remeber that there is absolutely no warranty for using this program as
* stated in the following terms:
*
* THERE IS NO WARRANTY FOR THIS PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
* LAW. THE COPYRIGHT HOLDER AND/OR OTHER PARTIES WHO MAY HAVE MODIFIED THE
* PROGRAM, PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
* TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
* PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
* REPAIR OR CORRECTION.
*
* IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL ANY COPYRIGHT HOLDER,
* OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM,
* BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
* CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
* PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
* INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
* PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
* PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* May the Force be with you... Just compile it & use it!
*/
package com.jeans.trayicon;
import java.awt.image.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
/**
* WindowsTrayIcon
* A Java Implementation for showing icons in the Windows System Tray
*
* Written by Jan Struyf
* (jan.struyf@cs.kuleuven.ac.be)
* (http://ace.ulyssis.org/~jeans)
*
* Instantiate this class for each icon
* This file comes with native code in TRAYICON.DLL
* The DLL should go in C:/WINDOWS/SYSTEM or in your current directory
*/
public class WindowsTrayIcon {
public final static String TRAY_VERSION = "1.7.9b";
private static TrayIconKeeper m_Keeper;
private static TrayDummyComponent m_Dummy;
private static MouseListener m_MouseHook;
private static Window m_CurrentWindow;
/****************************************************************************************************************
* *
* Initialisation / Termination *
* *
****************************************************************************************************************/
/**
* Init native library - call this method in the main() method of your app
*
* Param appName = the title for the hidden window
* Each app has it's own hidden window that receives the mouse/menu messages for it's Tray Icons
* The window title is used by sendWindowsMessage() and isRunning() to identify an app
*/
public static void initTrayIcon(String appName) {
initTrayIcon(appName, new WindowsTrayIcon());
}
/**
* Free all native resources - call this method before System.exit()
*/
public static void cleanUp() {
if (m_Keeper != null) {
m_Keeper.doNotify();
m_Keeper = null;
}
termTrayIcon();
}
/****************************************************************************************************************
* *
* Constructor *
* *
****************************************************************************************************************/
/**
* Construct a new Tray Icon
* Using a Java Image - This can be loaded from a 16x16 GIF or JPG file
*
* Param image 16x16 icon - make sure it's loaded in memory - use MediaTracker
* Param w the icon width - eg. 16
* Param h the icon height - eg. 16
*
* Exception TrayIconException - if something goes wrong :O(
* - Too many icons allocated
* - Error initializing native code DLL
* - Error setting up Windows notify procedure
* - Error loading icon image
* Exception InterruptedException - if the thread loading the image is interrupted
*/
public WindowsTrayIcon(Image image, int w, int h) throws TrayIconException, InterruptedException {
// Allocate new id for icon (native routine)
m_ID = getFreeId();
if (m_ID == TOOMANYICONS)
throw new TrayIconException("Too many icons allocated");
if (m_ID == DLLNOTFOUND)
throw new TrayIconException("Error initializing native code DLL");
if (m_ID == NOTIFYPROCERR)
throw new TrayIconException("Error setting up Windows notify procedure");
// Store image data and size
setImage(image, w, h);
}
/****************************************************************************************************************
* *
* Methods *
* *
****************************************************************************************************************/
/**
* Change this icon's Image
* Using a Java Image - This can be loaded from a 16x16 GIF or JPG file
*
* Param image 16x16 icon - make sure it's loaded in memory - use MediaTracker
* Param w the icon width
* Param h the icon height
*
* Exception TrayIconException - if something goes wrong :O(
* - Error loading icon image
* Exception InterruptedException - if the thread loading the image is interrupted
*/
public void setImage(Image image, int w, int h) throws TrayIconException, InterruptedException {
try {
// Collect pixel data in array
int[] pixels = new int[w * h];
PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, pixels, 0, w);
pg.grabPixels();
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
freeIcon();
throw new TrayIconException("Error loading icon image");
}
// Send image data to the native library
setIconData(m_ID, w, h, pixels);
} catch (InterruptedException ex) {
freeIcon();
throw ex;
} catch (NullPointerException ex) {
freeIcon();
throw ex;
}
}
/**
* Show/Hide this icon in the Windows System Tray
*
* Param status true = show, false = hide
*/
public void setVisible(boolean status) {
showIcon(m_ID, status);
}
/**
* Test if this icon is currently visible in the Windows System Tray
*
* Returns true if visible
*/
public boolean isVisible() {
return testVisible(m_ID) == 1;
}
/**
* Changes the text for the ToolTip of this icon
* The ToolTip is displayed when the user mouses over the icon
*
* Param tip = the new text for the ToolTip
*/
public void setToolTipText(String tip) {
setToolTip(m_ID, tip);
}
/**
* Display a balloon message for the icon
*/
public final static int BALLOON_NONE = 0;
public final static int BALLOON_INFO = 1;
public final static int BALLOON_WARNING = 2;
public final static int BALLOON_ERROR = 3;
public final static int BALLOON_NOSOUND = 0x10;
public void showBalloon(String msg, String title, int timeout, int flags) throws TrayIconException {
if (showBalloon(m_ID, msg, title, timeout, flags) == 0) {
throw new TrayIconException("Error showing Balloon message");
}
}
/**
* Add an ActionLister to this icon
* Just like with java.awt.Button or javax.swing.JButton
*
* Param listener = your listener
*/
public void addActionListener(ActionListener listener) {
if (m_ActList == null) {
m_ActList = new Vector();
clickEnable(this, m_ID, true);
}
m_ActList.addElement(listener);
}
public void removeActionListener(ActionListener listener) {
m_ActList.removeElement(listener);
}
public void addMouseListener(MouseListener listener) {
if (m_MouseList == null) {
m_MouseList = new Vector();
clickEnable(this, m_ID, true);
}
m_MouseList.addElement(listener);
}
public void removeMouseListener(MouseListener listener) {
m_MouseList.removeElement(listener);
}
public void addBalloonListener(TrayBalloonListener listener) {
if (m_BalloonList == null) {
m_BalloonList = new Vector();
clickEnable(this, m_ID, true);
}
m_BalloonList.addElement(listener);
}
public void removeBalloonListener(TrayBalloonListener listener) {
m_BalloonList.removeElement(listener);
}
/**
* Set new popup menu
* The popup menu is displayed when the user right clicks the icon
* See class TrayIconPopup, TrayIconPopupSimpleItem, ..
*
* Param popup = the popup menu
*/
public void setPopup(TrayIconPopup popup) {
if (popup == null) {
m_Popup = null;
initPopup(m_ID, -1);
} else {
if (m_Popup == null) clickEnable(this, m_ID, true);
int levels = popup.getNbLevels();
initPopup(m_ID, levels);
popup.setTrayIcon(this, m_ID, -1);
m_Popup = popup;
}
}
/**
* Free all native resources for this icon
* On exit use cleanUp()
*/
public void freeIcon() {
clickEnable(this, m_ID, false);
freeIcon(m_ID);
}
public static native void setAlwaysOnTop(Component wnd, boolean onTop);
public final static int UNICODE_CONV_BALLOON = 2;
public final static int UNICODE_CONV_SUPPORT = 1;
public static native void enableUnicodeConversion(int component, boolean enable);
public static native boolean hasUnicodeConversion(int component);
public static native boolean supportsBalloonMessages();
/**
* Return error code from native library - use for debugging
*/
public static native int getLastError();
// No error occured since the last call to getLastError()
// There are a lot errors declared but they are only there for debug reasons
public static final int NOERR = 0;
// The ActionListeners of the icon need to be notified when the user clicks it
// In the Windows API this is accomplished using a Notify Procedure
public static final int NOTIFYPROCERR = -1;
// The DLL has a fixed data structure that can contain up to 100 icons
// Hope that's enough for you
public static final int TOOMANYICONS = -2;
// This happens when C++ is out of memory
public static final int NOTENOUGHMEM = -3;
// Each icon has one unique id number
public static final int WRONGICONID = -4;
// The native code can't locate the DLL
// Try moving it to C:/WINDOWS/SYSTEM or something like that
public static final int DLLNOTFOUND = -5;
// Invocation code can't find your Java VM during callback
public static final int NOVMS = -6;
// Invocation API can't attach native thread to your Java VM
public static final int ERRTHREAD = -7;
// Error in lookup of the notifyListeners() method in this class
// The DLL has to do this when the user clicks one of your icons
public static final int METHODID = -8;
// Not really an error..
// This happens when the user clicks an icon that has no ActionListener yet
public static final int NOLISTENER = -9;
// One of the Invocation JNI Functions returned an error
public static final int JNIERR = -10;
// Error showing balloon
public static final int ERRORBALLOON = -18;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -