📄 windowstrayicon.java
字号:
/****************************************************************************************************************
* *
* Windows messaging code for detecting previous instance *
* *
****************************************************************************************************************/
/**
* Checks if there's an instance with hidden window title = appName running
* Can be used to detect that another instance of your app is already running (so exit..)
*
* Param appName = the title of the hidden window to search for
*/
public static native boolean isRunning(String appName);
/**
* Send a message to another app (message can contain an integer)
* Can be used to detect that another instance of your app is already running
* That instance can for example restore it's window after it receives the windows
* message - see demo app for more info
*
* Param appName = the title of the hidden window to search for
* Param message = the integer message to send (only native int size supported)
*/
public static native int sendWindowsMessage(String appName, int message);
/**
* Set callback method for receiving windows messages
* See sendWindowsMessage() for more information or take a look at the demo app
*
* Param callback = the callback method for this app
*/
public static void setWindowsMessageCallback(TrayIconCallback callback) {
m_WMessageCallback = callback;
}
/**
* Keep TrayIcon alive (make sure application does not exit)
*/
public static void keepAlive() {
if (m_Keeper == null) {
m_Keeper = new TrayIconKeeper();
m_Keeper.start();
}
}
public final static int FLASHW_STOP = 0;
public final static int FLASHW_CAPTION = 1;
public final static int FLASHW_TRAY = 2;
public final static int FLASHW_ALL = FLASHW_CAPTION | FLASHW_TRAY;
public final static int FLASHW_TIMER = 4;
public final static int FLASHW_TIMERNOFG = 12;
public static void flashWindow(Frame wnd) throws TrayIconException {
flashWindow(wnd, FLASHW_ALL | FLASHW_TIMERNOFG, 0, 0);
}
public static void flashWindow(Frame wnd, int flags, int count, int timeout) throws TrayIconException {
flashWindow(wnd.getTitle(), flags, count, timeout);
}
public static void flashWindow(String title, int flags, int count, int timeout) throws TrayIconException {
if (!flashWindowImpl(title, flags, count, timeout)) {
throw new TrayIconException("Flash window not supported");
}
}
public static native boolean flashWindowImpl(String title, int flags, int count, int timeout);
public static void setCurrentWindow(Window wnd) {
m_CurrentWindow = wnd;
}
public static native String getWindowsVersionString();
public static native int getWindowsVersion();
public final static int WIN_VER_UNKNOWN = 0;
public final static int WIN_VER_WIN32 = 1;
public final static int WIN_VER_95 = 2;
public final static int WIN_VER_98 = 3;
public final static int WIN_VER_ME = 4;
public final static int WIN_VER_NT = 5;
public final static int WIN_VER_2K = 6;
public final static int WIN_VER_XP = 7;
public final static int WIN_VER_NET = 8;
public static boolean supportsBallonInfo() {
int version = getWindowsVersion();
return version >= WIN_VER_2K;
}
/****************************************************************************************************************
* *
* Next section is for inter use only -- or for hackers :O) *
* *
****************************************************************************************************************/
// Constructor
private WindowsTrayIcon() {
}
// Each icon has a unique id ranging from 0..99
private int m_ID;
// Each icon can have a popup menu - activated when user right clicks the icon
private TrayIconPopup m_Popup;
// Each icon can have any number of ActionListeners - notified when user clicks (left/right) the icon
private Vector m_ActList, m_MouseList, m_BalloonList;
// Each application can have one WindowsMessageCallback - notified when another app uses sendWindowsMessage
private static TrayIconCallback m_WMessageCallback;
private final static int MOUSE_BTN_UP = 1;
private final static int MOUSE_BTN_DOUBLE = 2;
public static TrayDummyComponent getDummyComponent() {
if (m_Dummy == null) m_Dummy = new TrayDummyComponent();
return m_Dummy;
}
/**
* Private method called by native library when user clicks mouse button
*
* Param button = "Left" or "Right" or "Middle"
*/
private void notifyMouseListeners(int button, int mask, int xp, int yp) {
int clicks = (mask & MOUSE_BTN_DOUBLE) != 0 ? 2 : 1;
boolean up = (mask & MOUSE_BTN_UP) != 0;
if (m_ActList != null && clicks == 1 && up == false) {
ActionEvent evt = null;
if (button == 0) evt = new ActionEvent(this,0,"Left");
else if (button == 1) evt = new ActionEvent(this,0,"Right");
else evt = new ActionEvent(this,0,"Middle");
for (Enumeration enum = m_ActList.elements(); enum.hasMoreElements(); ) {
ActionListener listener = (ActionListener)enum.nextElement();
listener.actionPerformed(evt);
}
}
if (m_MouseList != null) {
int modifiers = 0;
if (button == 0) modifiers |= MouseEvent.BUTTON1_MASK;
else if (button == 1) modifiers |= MouseEvent.BUTTON2_MASK;
else modifiers |= MouseEvent.BUTTON3_MASK;
// (Component source, int id, long when, int modifiers, int x, int y, int clickCount, boolean popupTrigger)
MouseEvent evt = new MouseEvent(getDummyComponent(), 0, 0, modifiers, xp, yp, clicks, button == 1);
for (Enumeration enum = m_MouseList.elements(); enum.hasMoreElements(); ) {
MouseListener listener = (MouseListener)enum.nextElement();
if (up) listener.mouseReleased(evt);
else listener.mousePressed(evt);
}
}
}
/**
* Private method called by native library when something happens with the balloon message
*
*/
private void notifyBalloonListeners(int mask) {
if (m_BalloonList != null) {
TrayBalloonEvent evt = new TrayBalloonEvent(mask);
for (Enumeration enum = m_BalloonList.elements(); enum.hasMoreElements(); ) {
TrayBalloonListener listener = (TrayBalloonListener)enum.nextElement();
listener.balloonChanged(evt);
}
}
}
/**
* Private method called by native library when user selects popup menu item
*
* Param id = id of menu item (each menu item has unique id)
*/
private void notifyMenuListeners(int id) {
if (m_Popup != null) m_Popup.onSelected(id);
}
/**
* Private method called by native library when it receives a sendWindowsMessage event
* See sendWindowsMessage() for more information or take a look at the demo app
*
* Param lParam = parameter send along with windows message
*/
private static int callWindowsMessage(int lParam) {
if (m_WMessageCallback != null) return m_WMessageCallback.callback(lParam);
else return 0;
}
private static void callMouseHook(int xp, int yp) {
if (m_MouseHook != null) {
MouseEvent evt = new MouseEvent(getDummyComponent(), 0, 0, 0, xp, yp, 1, true);
m_MouseHook.mousePressed(evt);
}
}
/**
* Modify property of menu item
*
* Param menuId = the id of the menu item
* Param what = which property to modify
* Param state = true property enabled
*/
void modifyPopup(int menuId, int what, boolean state) {
modifyPopup(m_ID, menuId, what, state);
}
/**
* Init new popup menu - used by setPopup()
*
* Param id = the icon's id
* Param nblevels = the submenu depth of the new popup
*/
static native void initPopup(int id, int nblevels);
// Constants for builing a popup menu
// Used by subclasses of TrayIconPopupItem
final static int POPUP_TYPE_ITEM = 0; // Simple item
final static int POPUP_TYPE_SEPARATOR = 1; // Separator
final static int POPUP_TYPE_CHECKBOX = 2; // Checkbox item
final static int POPUP_TYPE_INIT_LEVEL = 3; // First item of submenu
final static int POPUP_TYPE_DONE_LEVEL = 4; // Last item of submenu
// Enable/Disable and friends
final static int POPUP_MODE_ENABLE = 1;
final static int POPUP_MODE_CHECK = 2;
final static int POPUP_MODE_DEFAULT = 4;
/**
* Add popup menu item - used by setTrayIcon() in subclasses of TrayIconPopupItem
*
* Param id = the icon's id
* Param level = the submenu level
* Param name = the name of the menu item
* Param type = POPUP_TYPE_ITEM or POPUP_TYPE_SEPARATOR or..
*/
static native int subPopup(int id, int level, String name, int type, int extra);
/**
* Modify menu item properties
*
* Param id = the icon's id
* Param menuId = the id of the menu item
* Param what = property to modify
* Param state = on/off
*/
private static native void modifyPopup(int id, int menuId, int what, boolean state);
/**
* Allocate a new id for icon - used in constructor
*/
private static native int getFreeId();
/**
* Set bitmap data for icon - used in constructor and setImage()
*
* Param id = the icon's id
* Param w, h = the images size
* Param pixels = the pixel array
*/
private static native void setIconData(int id, int w, int h, int pixels[]);
/**
* Make Tray Icon visible/invisible - used by setVisible()
*
* Param id = the icon's id
* Param hide = visible/invisible?
*/
private static native void showIcon(int id, boolean hide);
/**
* Test if Tray Icon is in the system tray - used by isVisible()
*
* Param id = the icon's id
*/
private static native int testVisible(int id);
/**
* Enable mouse/menu messages for icon - used by addActionListener() and setPopup()
*
* Param ico = the icons class (this)
* Param id = the icon's id
* Param enable = enable/disable mouse events?
*/
private static native void clickEnable(WindowsTrayIcon ico, int id, boolean enable);
/**
* Set tooltip - used by setToolTip(String tip)
*
* Param id = the icon's id
* Param tip = the new tooltip
*/
private static native void setToolTip(int id, String tip);
/**
* Free all native resources for this icon - used by freeIcon()
*
* Param id = the icon's id
*/
private static native void freeIcon(int id);
private static native void detectAllClicks(int id);
public static native void initJAWT();
public static native void initHook();
public static native void setMouseHookEnabled(int enable);
public static void setMouseClickHook(MouseListener listener) {
m_MouseHook = listener;
setMouseHookEnabled(listener == null ? 0 : 1);
}
private static native void initTrayIcon(String appName, WindowsTrayIcon cls);
private static native int showBalloon(int id, String msg, String title, int timeout, int flags);
private static native void termTrayIcon();
public static Window getCurrentWindow() {
return m_CurrentWindow;
}
// Init the native library
static {
boolean ok = false;
String version = System.getProperty("java.version");
if (version.length() >= 3) {
String v1 = version.substring(0,3);
if (v1.equals("1.1")) {
System.loadLibrary("TrayIcon11");
ok = true;
} else {
System.loadLibrary("TrayIcon12");
ok = true;
}
}
if (!ok) {
System.out.println("Wrong Java VM version: "+version);
System.exit(-1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -