【问题标题】:How to hide by code Windows 10 window's icon on task bar如何通过代码隐藏任务栏上的 Windows 10 窗口图标
【发布时间】:2023-01-17 00:56:43
【问题描述】:

为了在使用 JavaFx 的 Java 应用程序中显示 OpenGL,我使用了一个位于应用程序透明区域后面的 GLFW 窗口。这给人一种 OpenGL 视图是应用程序一部分的错觉。

在 Windows 10 下,这个 GLFW 窗口在任务栏中是可见的并且是可选的,这使得它被应用程序的奴役短路并使其失去控制:

我想可以通过代码(我正在考虑通过 JNI 在 C 中)在任务栏中隐藏这个 GLFW 窗口(给出了它的窗口句柄),但我不确定必须在 Windows 操作系统的内部访问什么。

如果有人有想法或可以指导我需要记录的部分。

【问题讨论】:

  • 为什么不直接使用JavaFX 3D Graphics呢?
  • 因为与 OpenGL、Vulkan 或 Metal 相比,它的可能性非常有限。

标签: java javafx windows-10 glfw taskbar


【解决方案1】:

查看管理任务栏按钮段落:https://learn.microsoft.com/en-us/windows/win32/shell/taskbar

这是我设法找到的解决方案,用于处理 c++ 中的类似问题。显然,您需要访问 win32 api。这是你需要对你的 GLFWWindow* win 变量进行隐藏它的任务栏条目:

{   /* signal not appear on task bar */
    auto hwnd = glfwGetWin32Window(win);
    ShowWindow(hwnd, SW_HIDE);
    SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    ShowWindow(hwnd, SW_SHOW);
}

SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW); 是做什么的。该段还提到使用窗口所有权来隐藏窗口的任务栏图标,这可能是您正在寻找的更多内容,但我没有研究过。您应该能够使用 JNI 调用正确的函数。所以你可能会用这样的东西制作一个 dll(注意我不太使用 java 所以以此为起点):

#define GLFW_EXPOSE_NATIVE_WIN32
#include <GLFW/glfw3.h>
#include <GLFW/glfw3native.h>

__declspec( dllexport ) void hide_taskbar_icon(GLFWWindow* win)
{
    glfwHideWindow(win);
    SetWindowLong(glfwGetWin32Window(win), GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    glfwShowWindow(win);
}

那是我从身边得到的最好的祝你好运。

【讨论】:

  • 非常感谢 Martian,这个答案超出了我的预期,让我解决了这个问题。
  • @Graou 你介意为此分享你的 Java 代码吗?
【解决方案2】:

我使用 JNA 将 answer 中的 C++ 代码转换为 Java:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.Pointer;

public class HideTaskbarIcon {
    public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
        Pointer FindWindow(String lpClassName, String lpWindowName);
        int GetWindowLong(Pointer hWnd, int nIndex);
        int SetWindowLong(Pointer hWnd, int nIndex, int dwNewLong);
    }
    public static void hideTaskbarIcon(GLFWWindow window) {
        long handle = glfwGetWin32Window(window);
        Pointer hWnd = User32.INSTANCE.FindWindow(null, new Pointer(handle));
        int currentStyle = User32.INSTANCE.GetWindowLong(hWnd, GWL_EXSTYLE);
        User32.INSTANCE.SetWindowLong(hWnd, GWL_EXSTYLE, currentStyle | WS_EX_TOOLWINDOW);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2010-11-18
    • 2015-12-18
    • 2019-09-09
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多