Windows 使窗口不在任务栏显示的几种方式

Windows 使窗口不在任务栏显示的几种方式

本文将介绍三种控制窗口图标是否显示在任务栏的方式:

使用 WS_EX_TOOLWINDOW

使用 ITaskbarList

使用隐藏的所有者窗口

使用 WS_EX_TOOLWINDOW

此方案可以使窗口在 任务栏 和 alt + tab 中隐藏。

优点是代码量少,缺点是会使窗口样式变成工具窗口,无法显示默认的最大化最小化按钮。

在任务栏中隐藏图标

var exStyle = unchecked((int)NativeMethods.GetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE));

exStyle |= ((int)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW);

NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle);

在任务栏中显示图标

var exStyle = unchecked((int)NativeMethods.GetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE));

exStyle &= ~((int)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW);

NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle);

使用 ITaskbarList

此方案可以保持窗口样式的前提下,使窗口在 任务栏 和 alt + tab 中隐藏。

优点是未用到任何未在文档记录的方法,缺点是无法独立控制在 任务栏 和 alt + tab 中显示或隐藏。

初始化

[Guid("56FDF342-FD6D-11D0-958A-006097C9A090"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown),ComImport]

internal interface ITaskbarList

{

void HrInit();

void AddTab(winmdroot.Foundation.HWND hwnd);

void DeleteTab(winmdroot.Foundation.HWND hwnd);

void ActivateTab(winmdroot.Foundation.HWND hwnd);

void SetActiveAlt(winmdroot.Foundation.HWND hwnd);

}

var CLSID_TaskbarList = new Guid("56FDF344-FD6D-11d0-958A-006097C9A090");

var taskbarList = (Windows.Win32.UI.Shell.ITaskbarList)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_TaskbarList)!)!;

taskbarList.HrInit();

在任务栏中隐藏图标

taskbarList.DeleteTab(hWnd);

在任务栏中显示图标

taskbarList.AddTab(hWnd);

使用隐藏的所有者窗口

此方案未在文档中记录,具体用法来自 WPF 源代码。

优点是独立控制 任务栏 中的图标,但保持窗口在 alt + tab 中显示。缺点是此方案会影响窗口所有者,无法应用于设置了所有者的窗口。

首先需要构造一个无 WS_VISIBLE 样式的窗口,并且不要对这个隐藏的窗口调用 ShowWindow。

在任务栏中隐藏图标

static void RefreshWindow(HWND hWnd)

{

PInvoke.SetWindowPos(hWnd, default, 0, 0, 0, 0,

SET_WINDOW_POS_FLAGS.SWP_NOZORDER

| SET_WINDOW_POS_FLAGS.SWP_NOMOVE

| SET_WINDOW_POS_FLAGS.SWP_NOSIZE

| SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE

| SET_WINDOW_POS_FLAGS.SWP_HIDEWINDOW);

PInvoke.SetWindowPos(hWnd, default, 0, 0, 0, 0,

SET_WINDOW_POS_FLAGS.SWP_NOZORDER

| SET_WINDOW_POS_FLAGS.SWP_NOMOVE

| SET_WINDOW_POS_FLAGS.SWP_NOSIZE

| SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE

| SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW);

}

// hiddenWindowHandle 是不显示的窗口

NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, hiddenWindowHandle);

RefreshWindow(hWnd);

在任务栏中显示图标

NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, 0);

RefreshWindow(hWnd);

相关推荐

文儿入围2020YY最具影响力主播,小洲年礼物收入平台第一
mobile365官网是多少

文儿入围2020YY最具影响力主播,小洲年礼物收入平台第一

📅 08-27 👁️ 9808
小猪短租:预订与入住流程全解析
365bet官网提现说维护

小猪短租:预订与入住流程全解析

📅 07-23 👁️ 9054
红警天启的狂怒安卓版
beat365中文官方网站

红警天启的狂怒安卓版

📅 08-12 👁️ 7026