[英]JFrame remove taskbar Icon
我有一個JFrame,我最小化托盤使用:
這用於顯示:
Frame.this.Minimized = false;
Frame.this.setVisible(true);
systemTray.remove(systemTrayIcon);
Frame.this.setExtendedState(JFrame.NORMAL);
這是為了隱藏:
if (SystemTray.isSupported()) {
systemTray.add(systemTrayIcon);
Frame.this.setVisible(false);
Frame.this.Minimized = true;
}
Frame.this.setExtendedState(JFrame.ICONIFIED);
但是,我不想將框架設置為不可見。當我將其設置為不可見時,它會刪除我喜歡的任務欄圖標。 有沒有辦法刪除框架的任務欄圖標而不將可見性設置為false?
原因是當我最小化我的應用程序時,我可以發送命令並執行它們,但是第二個我將其可見性設置為false,它會停止執行來自外部應用程序的任何命令。 我需要做的就是在最小化時從任務欄中刪除圖標,並在正常時顯示圖標。
有任何想法嗎?
嘆了口氣井看到,因為已經有相當長的一段時間內沒有答復。我決定用它的C ++ / JNI和反射如下解決:
在Java方面:
package apptotray;
import java.awt.*;
import java.io.File;
import java.nio.file.Paths;
import javax.swing.*;
public class AppToTray {
public static void main(String[] args) {
JFrame frame = new JFrame("Some Window");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JPanel(), BorderLayout.CENTER);
frame.setPreferredSize(new Dimension(500, 500));
frame.pack();
frame.setVisible(true);
System.load(new File("JNI.dll").getAbsolutePath());
try {
System.out.println("Icon is showing..");
Thread.sleep(3000);
} catch (Exception Ex) {
Ex.printStackTrace();
}
removeFromTaskBar(getWindowHandle(frame));
try {
System.out.println("Icon is not showing..");
Thread.sleep(3000);
} catch (Exception Ex) {
Ex.printStackTrace();
}
addToTaskBar(getWindowHandle(frame));
System.out.println("Icon is showing again..");
}
public static native void addToTaskBar(long WindowHandle);
public static native void removeFromTaskBar(long WindowHandle);
public static long getWindowHandle(java.awt.Frame frame) {
return (Long)invokeMethod(invokeMethod(frame, "getPeer"), "getHWnd");
}
protected static Object invokeMethod(Object o, String methodName) {
Class c = o.getClass();
for (java.lang.reflect.Method m : c.getMethods()) {
if (m.getName().equals(methodName)) {
try {
return m.invoke(o);
} catch (IllegalAccessException | IllegalArgumentException | java.lang.reflect.InvocationTargetException Ex) {
Ex.printStackTrace();
break;
}
}
}
return null;
}
}
在JNI / C ++端(Main.cpp):
#include <windows.h>
#include <shobjidl.h>
#include "jni.h"
#if defined _WIN32 || defined _WIN64
extern "C"
{
const GUID CLSID_TaskbarList = {0x56FDF344, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}};
const GUID IID_ITaskbarList = {0x56FDF342, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}};
const GUID IID_ITaskbarList2 = {0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17}};
const GUID IID_ITaskList3 = {0xEA1AFB91, 0x9E28, 0x4B86, {0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF}};
}
#endif
extern "C" JNIEXPORT void JNICALL Java_apptotray_AppToTray_addToTaskBar(JNIEnv *, jclass, jlong WindowHandle)
{
#if defined _WIN32 || defined _WIN64
ITaskbarList* TaskListPtr;
CoInitialize(nullptr);
long Result = !CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_SERVER, IID_ITaskbarList, reinterpret_cast<void**>(&TaskListPtr));
if (Result) TaskListPtr->AddTab(reinterpret_cast<HWND>(WindowHandle));
TaskListPtr->Release();
CoUninitialize();
#endif
}
extern "C" JNIEXPORT void JNICALL Java_apptotray_AppToTray_removeFromTaskBar(JNIEnv *, jclass, jlong WindowHandle)
{
#if defined _WIN32 || defined _WIN64
ITaskbarList* TaskListPtr;
CoInitialize(nullptr);
long Result = !CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_SERVER, IID_ITaskbarList, reinterpret_cast<void**>(&TaskListPtr));
if (Result) TaskListPtr->DeleteTab(reinterpret_cast<HWND>(WindowHandle));
TaskListPtr->Release();
CoUninitialize();
#endif
}
extern "C" bool __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
使用以下代碼編譯DLL:
x86_64-w64-mingw32-g ++。exe -O2 -Wall -DBUILD_DLL -std = c ++ 11 -c C:\\ Users \\ Brandon \\ Desktop \\ JNI \\ main.cpp -o obj \\ Release \\ main.o
x86_64-w64-mingw32-g ++。exe -shared -Wl, - output-def = bin \\ Release \\ libJNI.def -Wl, - out-implib = bin \\ Release \\ libJNI.a -Wl, - dll obj \\ release \\ main.o -o bin \\ Release \\ JNI.dll -s -static -static-libgcc -static-libstdc ++ -lole32 -lshell32 -luser32
或者只是使用代碼塊來完成它。
如果其他人有更好的想法,隨時添加或評論或任何東西..我仍然不能相信我必須使用C ++ / JNI,並反思這樣做..荒謬..這是2013年,Java需要得到該計划。
我知道這已經很晚了,但我花了一個小時試圖自己解決這個問題。 您所要做的就是將您的JFrame更改為JWindow,您就完成了。 我有一個相當復雜的JFrame,我必須刪除的唯一東西是setUndecorated()
和setDefaultCloseOperation()
。 其他一切都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.